GenshinUID/__init__.py
2021-10-24 01:38:57 +08:00

415 lines
16 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from .getImg import draw_pic,draw_abyss_pic,draw_abyss0_pic
from .getDB import connectDB,selectDB,cookiesDB,cacheDB,deletecache,CheckDB,TransDB,OpenPush,GetMysInfo,GetDaily,GetSignList,MysSign,GetSignInfo,OpCookies
from nonebot import *
from hoshino import Service,R,priv,util
from hoshino.typing import MessageSegment,CQEvent, HoshinoBot
import requests,random,os,json,re,time,datetime,string,base64
import hoshino
import asyncio
import hashlib
import sqlite3
from io import BytesIO
import urllib
sv = Service('genshinuid')
bot = get_bot()
FILE_PATH = os.path.dirname(__file__)
FILE2_PATH = os.path.join(FILE_PATH,'mys')
Texture_PATH = os.path.join(FILE2_PATH,'texture2d')
daily_im = '''
==============
(还剩{}补充满)
==============
原粹树脂:{}/160
每日委托:{}/4
探索派遣:{}/{}
========
{}'''
@sv.scheduled_job('cron', hour='0')
async def delete():
deletecache()
@sv.scheduled_job('cron', hour='0',minute="30")
async def dailysign():
conn = sqlite3.connect('ID_DATA.db')
c = conn.cursor()
cursor = c.execute("SELECT * FROM NewCookiesTable WHERE StatusB != ?",("off",))
c_data = cursor.fetchall()
for row in c_data:
im = await sign(str(row[0]))
if row[4] == "on":
await bot.send_private_msg(user_id = row[2],message = im)
else:
await bot.send_group_msg(group_id = row[4],message = f"[CQ:at,qq={row[2]}]" + "\n" + im)
@sv.scheduled_job('interval', minutes=30)
async def push():
daily_data = await daily()
if daily_data != None:
for i in daily_data:
if i['gid'] == "on":
await bot.send_private_msg(user_id = i['qid'],message = i['message'])
else:
await bot.send_group_msg(group_id = i['gid'],message = f"[CQ:at,qq={i['qid']}]" + "\n" + i['message'])
else:
pass
@bot.on_message('private')
async def setting(ctx):
message = ctx['raw_message']
sid=int(ctx["self_id"])
userid=int(ctx["sender"]["user_id"])
gid=0
if '添加 ' in message:
try:
mes = message.replace('添加 ','')
aid = re.search(r"account_id=(\d*)", mes)
mysid_data = aid.group(0).split('=')
mysid = mysid_data[1]
cookie = ';'.join(filter(lambda x: x.split('=')[0] in ["cookie_token", "account_id"], [i.strip() for i in mes.split(';')]))
mys_data = await GetMysInfo(mysid,cookie)
mys_data = mys_data[0]
uid = mys_data['data']['list'][0]['game_role_id']
await cookiesDB(uid,cookie,userid)
await bot.send_msg(self_id=sid, user_id=userid, group_id=gid, message=f'添加Cookies成功Cookies属于个人重要信息如果你是在不知情的情况下添加请马上修改米游社账户密码保护个人隐私')
except:
await bot.send_msg(self_id=sid, user_id=userid, group_id=gid, message=f'校验失败请输入正确的Cookies')
elif '开启推送' in message:
try:
uid = await selectDB(userid,mode = "uid")
im = await OpenPush(int(uid[0]),userid,"on","StatusA")
await bot.send_msg(self_id=sid, user_id=userid, group_id=gid, message=im)
except:
await bot.send_msg(self_id=sid, user_id=userid, group_id=gid, message="未找到uid绑定记录。")
elif '关闭推送' in message:
try:
uid = await selectDB(userid,mode = "uid")
im = await OpenPush(int(uid[0]),userid,"off","StatusA")
await bot.send_msg(self_id=sid, user_id=userid, group_id=gid, message=im)
except:
await bot.send_msg(self_id=sid, user_id=userid, group_id=gid, message="未找到uid绑定记录。")
elif '开启自动签到' in message:
try:
uid = await selectDB(userid,mode = "uid")
im = await OpenPush(int(uid[0]),userid,"on","StatusB")
await bot.send_msg(self_id=sid, user_id=userid, group_id=gid, message=im)
except:
await bot.send_msg(self_id=sid, user_id=userid, group_id=gid, message="未找到uid绑定记录。")
elif '关闭自动签到' in message:
try:
uid = await selectDB(userid,mode = "uid")
im = await OpenPush(int(uid[0]),userid,"off","StatusA")
await bot.send_msg(self_id=sid, user_id=userid, group_id=gid, message=im)
except:
await bot.send_msg(self_id=sid, user_id=userid, group_id=gid, message="未找到uid绑定记录。")
@sv.on_prefix('开启')
async def _(bot:HoshinoBot, ev: CQEvent):
message = ev.message.extract_plain_text()
m = ''.join(re.findall('[\u4e00-\u9fa5]',message))
if m == "自动签到":
try:
gid = ev.group_id
qid = ev.sender["user_id"]
uid = await selectDB(ev.sender['user_id'],mode = "uid")
im = await OpenPush(int(uid[0]),ev.sender['user_id'],str(gid),"StatusB")
await bot.send(ev,im,at_sender=True)
except:
await bot.send(ev,"未绑定uid信息",at_sender=True)
elif m == "推送":
try:
gid = ev.group_id
qid = ev.sender["user_id"]
uid = await selectDB(ev.sender['user_id'],mode = "uid")
im = await OpenPush(int(uid[0]),ev.sender['user_id'],str(gid),"StatusA")
await bot.send(ev,im,at_sender=True)
except:
await bot.send(ev,"未绑定uid信息",at_sender=True)
@sv.on_prefix('关闭')
async def _(bot:HoshinoBot, ev: CQEvent):
message = ev.message.extract_plain_text()
m = ''.join(re.findall('[\u4e00-\u9fa5]',message))
if m == "自动签到":
try:
gid = ev.group_id
qid = ev.sender["user_id"]
uid = await selectDB(ev.sender['user_id'],mode = "uid")
im = await OpenPush(int(uid[0]),ev.sender['user_id'],"off","StatusB")
await bot.send(ev,im,at_sender=True)
except:
await bot.send(ev,"未绑定uid信息",at_sender=True)
elif m == "推送":
try:
gid = ev.group_id
qid = ev.sender["user_id"]
uid = await selectDB(ev.sender['user_id'],mode = "uid")
im = await OpenPush(int(uid[0]),ev.sender['user_id'],"off","StatusA")
await bot.send(ev,im,at_sender=True)
except:
await bot.send(ev,"未绑定uid信息",at_sender=True)
@sv.on_fullmatch('签到')
async def _(bot:HoshinoBot, ev: CQEvent):
try:
qid = ev.sender["user_id"]
uid = await selectDB(ev.sender['user_id'],mode = "uid")
uid = uid[0]
im = await sign(uid)
await bot.send(ev,im,at_sender=True)
except:
pass
@sv.on_fullmatch('优化Cookies')
async def _(bot:HoshinoBot, ev: CQEvent):
try:
im = await OpCookies()
await bot.send(ev,im,at_sender=True)
except:
pass
@sv.on_fullmatch('校验全部Cookies')
async def _(bot:HoshinoBot, ev: CQEvent):
im = await CheckDB()
await bot.send(ev,im)
@sv.on_fullmatch('迁移Cookies')
async def _(bot:HoshinoBot, ev: CQEvent):
im = await TransDB()
await bot.send(ev,im)
@sv.on_fullmatch('当前状态')
async def _(bot:HoshinoBot, ev: CQEvent):
try:
uid = await selectDB(ev.sender['user_id'],mode = "uid")
uid = uid[0]
mes = await daily("ask",uid)
im = mes[0]['message']
except:
im = "没有找到绑定信息。"
await bot.send(ev,im, at_sender=True)
@sv.on_prefix('uid')
async def _(bot:HoshinoBot, ev: CQEvent):
image = re.search(r"\[CQ:image,file=(.*),url=(.*)\]", str(ev.message))
message = ev.message.extract_plain_text()
uid = re.findall(r"\d+", message)[0] # str
m = ''.join(re.findall('[\u4e00-\u9fa5]',message))
if m == "深渊":
try:
if len(re.findall(r"\d+", message)) == 2:
floor_num = re.findall(r"\d+", message)[1]
im = await draw_abyss_pic(uid,ev.sender['nickname'],floor_num,image)
await bot.send(ev, im, at_sender=True)
else:
im = await draw_abyss0_pic(uid,ev.sender['nickname'],image)
await bot.send(ev, im, at_sender=True)
except:
await bot.send(ev,'深渊输入错误!')
elif m == "上期深渊":
try:
if len(re.findall(r"\d+", message)) == 2:
floor_num = re.findall(r"\d+", message)[1]
im = await draw_abyss_pic(uid,ev.sender['nickname'],floor_num,image,2,"2")
await bot.send(ev, im, at_sender=True)
else:
im = await draw_abyss0_pic(uid,ev.sender['nickname'],image,2,"2")
await bot.send(ev, im, at_sender=True)
except:
await bot.send(ev,'深渊输入错误!')
else:
try:
im = await draw_pic(uid,ev.sender['nickname'],image,2)
await bot.send(ev, im, at_sender=True)
except:
await bot.send(ev,'输入错误!')
@sv.on_prefix('绑定uid')
async def _(bot:HoshinoBot, ev: CQEvent):
message = ev.message.extract_plain_text()
uid = re.findall(r"\d+", message)[0] # str
await connectDB(ev.sender['user_id'],uid)
await bot.send(ev,'绑定uid成功', at_sender=True)
@sv.on_prefix('绑定mys')
async def _(bot:HoshinoBot, ev: CQEvent):
message = ev.message.extract_plain_text()
mys = re.findall(r"\d+", message)[0] # str
await connectDB(ev.sender['user_id'],None,mys)
await bot.send(ev,'绑定米游社id成功', at_sender=True)
@sv.on_prefix('查询')
async def _(bot, ev):
image = re.search(r"\[CQ:image,file=(.*),url=(.*)\]", str(ev.message))
at = re.search(r"\[CQ:at,qq=(\d*)\]", str(ev.raw_message.strip()))
message = ev.message.extract_plain_text()
if at:
qid = at.group(1)
mi =await bot.get_group_member_info(group_id=ev.group_id, user_id=qid)
nickname = mi["nickname"]
uid = await selectDB(qid)
else:
nickname = ev.sender['nickname']
uid = await selectDB(ev.sender['user_id'])
m = ''.join(re.findall('[\u4e00-\u9fa5]',message))
if uid:
if m == "深渊":
try:
if len(re.findall(r"\d+", message)) == 1:
floor_num = re.findall(r"\d+", message)[0]
im = await draw_abyss_pic(uid[0],nickname,floor_num,image,uid[1])
await bot.send(ev, im, at_sender=True)
else:
im = await draw_abyss0_pic(uid[0],nickname,image,uid[1])
await bot.send(ev, im, at_sender=True)
except:
await bot.send(ev,'输入错误!')
elif m == "上期深渊":
try:
if len(re.findall(r"\d+", message)) == 1:
floor_num = re.findall(r"\d+", message)[0]
im = await draw_abyss_pic(uid[0],nickname,floor_num,image,uid[1],"2")
await bot.send(ev, im, at_sender=True)
else:
im = await draw_abyss0_pic(uid[0],nickname,image,uid[1],"2")
await bot.send(ev, im, at_sender=True)
except:
await bot.send(ev,'深渊输入错误!')
elif m == "":
try:
bg = await draw_pic(uid[0],nickname,image,uid[1])
await bot.send(ev, bg, at_sender=True)
except:
await bot.send(ev,'输入错误!')
else:
pass
else:
await bot.send(ev,'未找到绑定记录!')
@sv.on_prefix('mys')
async def _(bot:HoshinoBot, ev: CQEvent):
image = re.search(r"\[CQ:image,file=(.*),url=(.*)\]", str(ev.message))
message = ev.message.extract_plain_text()
uid = re.findall(r"\d+", message)[0] # str
m = ''.join(re.findall('[\u4e00-\u9fa5]',message))
if m == "深渊":
try:
if len(re.findall(r"\d+", message)) == 2:
floor_num = re.findall(r"\d+", message)[1]
im = await draw_abyss_pic(uid,ev.sender['nickname'],floor_num,image,3)
await bot.send(ev, im, at_sender=True)
else:
im = await draw_abyss0_pic(uid,ev.sender['nickname'],image,3)
await bot.send(ev, im, at_sender=True)
except:
await bot.send(ev,'深渊输入错误!')
elif m == "上期深渊":
try:
if len(re.findall(r"\d+", message)) == 1:
floor_num = re.findall(r"\d+", message)[0]
im = await draw_abyss_pic(uid,ev.sender['nickname'],floor_num,image,3,"2")
await bot.send(ev, im, at_sender=True)
else:
im = await draw_abyss0_pic(uid,ev.sender['nickname'],image,3,"2")
await bot.send(ev, im, at_sender=True)
except:
await bot.send(ev,'深渊输入错误!')
else:
try:
im = await draw_pic(uid,ev.sender['nickname'],image,3)
await bot.send(ev, im, at_sender=True)
except:
await bot.send(ev,'输入错误!')
@sv.on_prefix('UID')
async def _(bot:HoshinoBot, ev: CQEvent):
image = re.search(r"\[CQ:image,file=(.*),url=(.*)\]", str(ev.message))
message = ev.message.extract_plain_text()
uid = re.findall(r"\d+", message)[0] # str
try:
im = await draw_pic(uid,ev.sender['nickname'],image,1)
await bot.send(ev, im, at_sender=True)
except:
await bot.send(ev,'输入错误!')
async def sign(uid):
sign_data = await MysSign(uid)
sign_info = await GetSignInfo(uid)
sign_info = sign_info['data']
sign_list = await GetSignList()
status = sign_data['message']
getitem = sign_list['data']['awards'][int(sign_info['total_sign_day'])-1]['name']
getnum = sign_list['data']['awards'][int(sign_info['total_sign_day'])-1]['cnt']
get_im = f"本次签到获得{getitem}x{getnum}"
if status == "OK" and sign_info['is_sign'] == True:
mes_im = "签到成功"
else:
mes_im = status
sign_missed = sign_info['sign_cnt_missed']
im = "\n" + mes_im +"!" + "\n" + get_im + "\n" + f"本月漏签次数:{sign_missed}"
return im
async def daily(mode = "push",uid = None):
temp_list = []
conn = sqlite3.connect('ID_DATA.db')
c = conn.cursor()
if mode == "push":
cursor = c.execute("SELECT * FROM NewCookiesTable WHERE StatusA != ?",("off",))
c_data = cursor.fetchall()
elif mode == "ask":
c_data = ([uid,0,0,0,0,0,0],)
for row in c_data:
raw_data = await GetDaily(str(row[0]))
dailydata = raw_data["data"]
resin_num = dailydata["current_resin"]
task_num = dailydata["finished_task_num"]
travel_num = dailydata["current_expedition_num"]
max_travel_num = dailydata["max_expedition_num"]
travel_data = dailydata["expeditions"]
if resin_num >= row[6] :
re_time = dailydata["resin_recovery_time"]
m, s = divmod(int(re_time), 60)
h, m = divmod(m, 60)
time = "%02d小时%02d分钟%02d" % (h, m, s)
travel_str = ''
for i in travel_data:
name = i["avatar_side_icon"].split('/')[-1].split('.')[0].split('_')[-1]
statu = i['status']
if statu == "Finished":
travel_str = travel_str + f"{name} : 完成\n"
else:
remain_time = i['remained_time']
m1, s1 = divmod(int(remain_time), 60)
h1, m1 = divmod(m1, 60)
remain_time_str = "还剩%02d小时%02d分钟%02d" % (h1, m1, s1)
travel_str = travel_str + f"{name} : {remain_time_str}\n"
send_mes = daily_im.format(time,resin_num,task_num,travel_num,max_travel_num,travel_str)
if row[1] != 0:
send_mes = "你的树脂快满了!" + send_mes
temp_list.append({"qid":row[2],"gid":row[3],"message":send_mes})
return temp_list