GenshinUID/__init__.py
2022-01-23 01:29:26 +08:00

527 lines
20 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 .getDB import (CheckDB, GetAward, GetCharInfo, GetDaily, GetMysInfo, GetAudioInfo,
GetSignInfo, GetSignList, GetWeaponInfo, MysSign, OpenPush,
connectDB, cookiesDB, deletecache, selectDB, get_alots)
from .getImg import draw_abyss0_pic, draw_abyss_pic, draw_event_pic, draw_pic, draw_wordcloud
from .getMes import foods_wiki, artifacts_wiki, enemies_wiki, sign, daily, weapon_wiki, char_wiki, audio_wiki, award, deal_ck
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,math
import threading
import hoshino
import asyncio
import hashlib
import sqlite3
from io import BytesIO
import urllib
import requests
from base64 import b64encode
sv = Service('genshinuid')
bot = get_bot()
FILE_PATH = os.path.dirname(__file__)
FILE2_PATH = os.path.join(FILE_PATH,'mys')
INDEX_PATH = os.path.join(FILE2_PATH, 'index')
Texture_PATH = os.path.join(FILE2_PATH,'texture2d')
@sv.on_prefix('语音')
async def _(bot:HoshinoBot, ev: CQEvent):
message = ev.message.extract_plain_text()
message = message.replace(' ', "")
name = ''.join(re.findall('[\u4e00-\u9fa5]', message))
im = await audio_wiki(name,message)
try:
await bot.send(ev,im)
except Exception as e:
print(e.with_traceback)
await bot.send(ev,"不存在该语音ID或者不存在该角色。")
@sv.on_fullmatch('活动列表')
async def _(bot:HoshinoBot, ev: CQEvent):
img_path = os.path.join(FILE2_PATH,"event.jpg")
while(1):
if os.path.exists(img_path):
f=open(img_path,'rb')
ls_f = base64.b64encode(f.read()).decode()
imgmes = 'base64://' + ls_f
f.close()
im = f"[CQ:image,file={imgmes}]"
break
else:
await draw_event_pic()
await bot.send(ev,im)
@sv.on_fullmatch('御神签')
async def _(bot:HoshinoBot, ev: CQEvent):
qid = ev.sender["user_id"]
raw_data = await get_alots(qid)
im = base64.b64decode(raw_data).decode("utf-8")
await bot.send(ev,im)
@sv.on_prefix('材料')
async def _(bot:HoshinoBot, ev: CQEvent):
message = ev.message.extract_plain_text()
message = message.replace(' ', "")
im = await char_wiki(message,"costs")
await bot.send(ev,im)
@sv.on_prefix('原魔')
async def _(bot:HoshinoBot, ev: CQEvent):
message = ev.message.extract_plain_text()
im = await enemies_wiki(message)
await bot.send(ev,im)
@sv.on_prefix('食物')
async def _(bot:HoshinoBot, ev: CQEvent):
message = ev.message.extract_plain_text()
im = await foods_wiki(message)
await bot.send(ev,im)
@sv.on_prefix('圣遗物')
async def _(bot:HoshinoBot, ev: CQEvent):
message = ev.message.extract_plain_text()
im = await artifacts_wiki(message)
await bot.send(ev,im)
@sv.on_prefix('天赋')
async def _(bot:HoshinoBot, ev: CQEvent):
message = ev.message.extract_plain_text()
name = ''.join(re.findall('[\u4e00-\u9fa5]', message))
num = re.findall(r"[0-9]+", message)
if len(num) == 1:
im = await char_wiki(name,"talents",num[0])
else:
im = "参数不正确。"
await bot.send(ev,im)
@sv.on_prefix('武器')
async def _(bot:HoshinoBot, ev: CQEvent):
message = ev.message.extract_plain_text()
name = ''.join(re.findall('[\u4e00-\u9fa5]', message))
level = re.findall(r"[0-9]+", message)
if len(level) == 1:
im = await weapon_wiki(name,level=level[0])
else:
im = await weapon_wiki(name)
await bot.send(ev,im,at_sender=True)
@sv.on_prefix('角色')
async def _(bot:HoshinoBot, ev: CQEvent):
message = ev.message.extract_plain_text()
message = message.replace(' ', "")
name = ''.join(re.findall('[\u4e00-\u9fa5]', message))
level = re.findall(r"[0-9]+", message)
if len(level) == 1:
im = await char_wiki(name,"char",level=level[0])
else:
im = await char_wiki(name)
await bot.send(ev,im)
@sv.on_prefix('命座')
async def _(bot:HoshinoBot, ev: CQEvent):
message = ev.message.extract_plain_text()
num = int(re.findall(r"\d+", message)[0]) # str
m = ''.join(re.findall('[\u4e00-\u9fa5]', message))
if num<= 0 or num >6:
await bot.send(ev,"你家{}{}命?".format(m,num),at_sender = True)
else:
im = await char_wiki(m, "constellations", num)
await bot.send(ev,im,at_sender=True)
#每日零点清空cookies使用缓存
@sv.scheduled_job('cron', hour='0')
async def delete():
deletecache()
@sv.scheduled_job('cron', hour='2')
async def delete():
await draw_event_pic()
@sv.on_fullmatch('全部重签')
async def _(bot:HoshinoBot, ev: CQEvent):
if ev.user_id not in bot.config.SUPERUSERS:
return
await bot.send(ev,"已开始执行")
await dailysign()
#每日零点半进行米游社签到
@sv.scheduled_job('cron', hour='0',minute="30")
async def dailysign():
await dailysign()
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()
temp_list = []
for row in c_data:
if row[4] == "on":
im = await sign(str(row[0]))
await bot.send_private_msg(user_id = row[2],message = im)
else:
im = await sign(str(row[0]))
message = f"[CQ:at,qq={row[2]}]\n{im}"
for i in temp_list:
if row[4] == i["push_group"]:
i["push_message"] = i["push_message"] + "\n" + message
break
else:
temp_list.append({"push_group":row[4],"push_message":message})
await asyncio.sleep(6+random.randint(0,2))
for i in temp_list:
await bot.send_group_msg(group_id = i["push_group"],message = i["push_message"])
await asyncio.sleep(3+random.randint(0,2))
#每隔半小时检测树脂是否超过设定值
@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('添加 ','')
await deal_ck(mes,userid)
await bot.send_msg(self_id=sid, user_id=userid, group_id=gid, message=f'添加Cookies成功\nCookies属于个人重要信息如果你是在不知情的情况下添加请马上修改米游社账户密码保护个人隐私\n————\n如果需要【开启自动签到】和【开启推送】还需要使用命令“绑定uid”绑定你的uid。\n例如绑定uid123456789。')
except Exception as e:
print(e.with_traceback)
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 Exception as e:
print(e.with_traceback)
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 Exception as e:
print(e.with_traceback)
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 Exception as e:
print(e.with_traceback)
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 Exception as e:
print(e.with_traceback)
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))
qid = ev.sender["user_id"]
at = re.search(r"\[CQ:at,qq=(\d*)\]", message)
if m == "自动签到":
try:
if at and qid in bot.config.SUPERUSERS:
qid = at.group(1)
elif at and at.group(1) != qid:
await bot.send(ev,"你没有权限。",at_sender=True)
return
else:
pass
gid = ev.group_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 Exception as e:
print(e.with_traceback)
await bot.send(ev,"未绑定uid信息",at_sender=True)
elif m == "推送":
try:
if at and qid in bot.config.SUPERUSERS:
qid = at.group(1)
elif at and at.group(1) != qid:
await bot.send(ev,"你没有权限。",at_sender=True)
return
else:
pass
gid = ev.group_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 Exception as e:
print(e.with_traceback)
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))
qid = ev.sender["user_id"]
at = re.search(r"\[CQ:at,qq=(\d*)\]", message)
if m == "自动签到":
try:
if at and qid in bot.config.SUPERUSERS:
qid = at.group(1)
elif at and at.group(1) != qid:
await bot.send(ev,"你没有权限。",at_sender=True)
return
else:
pass
gid = ev.group_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 Exception as e:
print(e.with_traceback)
await bot.send(ev,"未绑定uid信息",at_sender=True)
elif m == "推送":
try:
if at and qid in bot.config.SUPERUSERS:
qid = at.group(1)
elif at and at.group(1) != qid:
await bot.send(ev,"你没有权限。",at_sender=True)
return
else:
pass
gid = ev.group_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 Exception as e:
print(e.with_traceback)
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 award(uid)
await bot.send(ev,im,at_sender=True)
except Exception as e:
print(e.with_traceback)
await bot.send(ev,'未找到绑定信息',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 Exception as e:
print(e.with_traceback)
await bot.send(ev,'未找到绑定信息',at_sender=True)
#群聊内 校验Cookies 是否正常的功能,不正常自动删掉
@sv.on_fullmatch('校验全部Cookies')
async def _(bot:HoshinoBot, ev: CQEvent):
im = await CheckDB()
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 Exception as e:
print(e.with_traceback)
im = "没有找到绑定信息。"
await bot.send(ev,im, at_sender=True)
#群聊内 查询uid 的命令
@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 Exception as e:
print(e.with_traceback)
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 Exception as e:
print(e.with_traceback)
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 Exception as e:
print(e.with_traceback)
await bot.send(ev,'输入错误!')
#群聊内 绑定uid 的命令会绑定至当前qq号上
@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)
#群聊内 绑定米游社通行证 的命令会绑定至当前qq号上和绑定uid不冲突两者可以同时绑定
@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)
#群聊内 绑定过uid/mysid的情况下可以查询默认优先调用米游社通行证多出世界等级一个参数
@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 Exception as e:
print(e.with_traceback)
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 Exception as e:
print(e.with_traceback)
await bot.send(ev,'深渊输入错误!')
elif m == "词云":
try:
im = await draw_wordcloud(uid[0],image,uid[1])
await bot.send(ev,im, at_sender=True)
except Exception as e:
print(e.with_traceback)
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 Exception as e:
print(e.with_traceback)
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 Exception as e:
print(e.with_traceback)
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 Exception as e:
print(e.with_traceback)
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 Exception as e:
print(e.with_traceback)
await bot.send(ev,'输入错误!')