From 088736fcdf5258cd2bd80f13f287190cc0927bb4 Mon Sep 17 00:00:00 2001 From: Ewait Date: Sat, 21 Jan 2023 01:03:37 +0800 Subject: [PATCH 01/16] fix(api): cut afd user id for 0:6 --- code/endpoints/ApiHandler.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/endpoints/ApiHandler.py b/code/endpoints/ApiHandler.py index b352923..b97d1d7 100644 --- a/code/endpoints/ApiHandler.py +++ b/code/endpoints/ApiHandler.py @@ -155,8 +155,8 @@ async def afd_request(request,bot): if 'plan_title' in params['data']['order']: text =f"商品 {params['data']['order']['plan_title']}\n" user_id = params['data']['order']['user_id'] - user_id = user_id[:6] - text+=f"用户 {params['data']['order']['user_id']}\n" + user_id = user_id[0:6] + text+=f"用户 {user_id}\n" for i in params['data']['order']['sku_detail']: text+=f"发电了{i['count']}个 {i['name']}\n" text+=f"共计 {params['data']['order']['total_amount']} 猿" From cb42ec2ad153fb58c3e2e32f4ca73a21682a6f2d Mon Sep 17 00:00:00 2001 From: Ewait Date: Sun, 22 Jan 2023 19:09:40 +0800 Subject: [PATCH 02/16] fix(ValFileUpd): add 'errorCode' check in price res --- code/endpoints/ValFileUpd.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/endpoints/ValFileUpd.py b/code/endpoints/ValFileUpd.py index 21c7dfe..c2251bd 100644 --- a/code/endpoints/ValFileUpd.py +++ b/code/endpoints/ValFileUpd.py @@ -67,7 +67,8 @@ async def update_price(msg: Message,userdict): global ValPriceList # 调用api获取价格列表 prices = await fetch_item_price_all(userdict) - if "Offers" not in prices:#键值不在,获取错误 + if "errorCode" in prices:#键值不在,获取错误 + print(f"ERR! [{GetTime()}] update_item_price:\n{prices}") raise Exception("KeyError, fetch price failed!") ValPriceList.value = prices # 所有价格的列表 # 写入文件 From 0f76e08d8054fa76822f17d9feef2eaa4a8dd840 Mon Sep 17 00:00:00 2001 From: Ewait Date: Sun, 22 Jan 2023 20:30:06 +0800 Subject: [PATCH 03/16] feat(api): add /shop-draw for only img-drwaw with shop list --- code/api.py | 24 +++++++-- code/endpoints/ApiHandler.py | 99 ++++++++++++++++++++++-------------- 2 files changed, 82 insertions(+), 41 deletions(-) diff --git a/code/api.py b/code/api.py index f2cfd79..4eb1050 100644 --- a/code/api.py +++ b/code/api.py @@ -2,7 +2,7 @@ import traceback from aiohttp import web from endpoints.Gtime import GetTime -from endpoints.ApiHandler import base_img_request,tfa_code_requeset,afd_request +from endpoints.ApiHandler import tfa_code_requeset,afd_request,login_img_request,img_draw_request # 初始化节点 routes = web.RouteTableDef() @@ -14,13 +14,25 @@ def hello_world(request): # put application's code here print(f"[{GetTime()}] [request] /") return web.Response(body=json.dumps({'code':0,'message': 'Hello! Use path /shop-url or /shop-img to get valorant daily shop','info':'在path后添加/shop-img或者/shop-url来获取每日商店,前者会直接跳转,后者返回一个带图片url的json。示例: /shop-url?account=Riot账户&passwd=Riot密码&img_src=可选参数,自定义背景图'},ensure_ascii=False), status=200, content_type='application/json') +# 提供4个皮肤uuid,返回图片 +@routes.get('/shop-draw') +async def get_dailshop_img(request): + print(f"[{GetTime()}] [request] /shop-url") + try: + ret = await img_draw_request(request) + return web.Response(body=json.dumps(ret,ensure_ascii=False), content_type='application/json') + except: + err_cur = traceback.format_exc() + print(f"[{GetTime()}] [Api] ERR in /shop-url\n{err_cur}") + return web.Response(body=json.dumps({'code':200,'message': 'unkown err','info':f'未知错误','except':f'{err_cur}'},ensure_ascii=False), content_type='application/json') + # 直接跳转图片 @routes.get('/shop-img') async def get_dailshop_img(request): print(f"[{GetTime()}] [request] /shop-img") try: - ret = await base_img_request(request) + ret = await login_img_request(request) if ret['code']==0: return web.Response(headers={'Location': ret['message']},status=303) # 303是直接跳转到图片 else: @@ -35,7 +47,7 @@ async def get_dailshop_img(request): async def get_dailshop_img(request): print(f"[{GetTime()}] [request] /shop-url") try: - ret = await base_img_request(request) + ret = await login_img_request(request) return web.Response(body=json.dumps(ret,ensure_ascii=False), content_type='application/json') except: err_cur = traceback.format_exc() @@ -70,4 +82,8 @@ async def aifadian_webhook(request): print(f"[API Start] starting at {GetTime()}") app = web.Application() app.add_routes(routes) -#web.run_app(app, host='127.0.0.1', port=14726) \ No newline at end of file +if __name__ == '__main__': + try: + web.run_app(app, host='127.0.0.1', port=14726) + except: + print(traceback.format_exc()) \ No newline at end of file diff --git a/code/endpoints/ApiHandler.py b/code/endpoints/ApiHandler.py index b97d1d7..9f13e04 100644 --- a/code/endpoints/ApiHandler.py +++ b/code/endpoints/ApiHandler.py @@ -47,12 +47,66 @@ async def check_token_rate(token:str): -# 基本操作 -async def base_img_request(request): +# 基本画图操作 +async def base_img_request(params,list_shop,vp1='0',rp1='0'): + # 自定义背景 + if 'img_src' in params: + img_src = params['img_src'] + else: + img_src = img_bak_169 # 默认背景16-9 + if 'img_ratio'in params and params['img_ratio']=='1': + img_src = img_bak_11 # 默认背景1-1 + + # 开始画图 + start = time.perf_counter() + if 'img_ratio' in params and params['img_ratio']=='1': + ret = await get_shop_img_11(list_shop,bg_img_src=img_src) + else:# 只有16-9的图片需获取vp和r点 + ret = await get_shop_img_169(list_shop,vp=vp1,rp=rp1,bg_img_src=img_src) + # 打印计时 + print(f"[{GetTime()}] [IMGdraw]",format(time.perf_counter() - start, '.2f'))# 结果为浮点数,保留两位小数 + + start = time.perf_counter() + if ret['status']: + bg = ret['value'] + img_src_ret = await kook_create_asset(api_bot_token,bg) # 上传图片 + if img_src_ret['code']==0: + print(f"[{GetTime()}] [Api] kook_create_asset success {format(time.perf_counter() - start, '.2f')}") + dailyshop_img_src = img_src_ret['data']['url'] + print(f'[{GetTime()}] [img-url] {dailyshop_img_src}') + return {'code':0,'message':dailyshop_img_src,'info':'商店图片获取成功'} + else: + print(f'[{GetTime()}] [Api] kook_create_asset failed') + return {'code':200,'message': 'img upload err','info':'图片上传错误'} + else: #出现图片违规或者url无法获取 + err_str = ret['value'] + print(f'[{GetTime()}] [ERR]',err_str) + return {'code':200,'message': 'img src err','info':'自定义图片获取失败'} + +# 画图接口(仅画图) +async def img_draw_request(request): + params = request.rel_url.query + if "list_shop" not in params or 'token' not in params: + print(f"ERR! [{GetTime()}] params needed: token/list_shop") + return {'code': 400, 'message': 'params needed: token/list_shop','info':'缺少参数!示例: /shop-draw?token=api凭证&list_shop=四个皮肤uuid的list&vp=vp(可选)&rp=rp(可选)&img_src=自定义背景图(可选)','docs':'https://github.com/Aewait/Kook-Valorant-Bot/blob/main/docs/valorant-shop-img-api.md'} + + list_shop = params['list_shop'] + token = params['token'] + ck_ret = await check_token_rate(token) + if not ck_ret['status']: + return {'code': 200, 'message': ck_ret['message'],'info':ck_ret['info']} + # vp和rp必须同时给予,只给一个不算 + if 'vp' not in params or 'rp' not in params: + return await base_img_request(params,list_shop) + else: + return await base_img_request(params,list_shop,params['vp'],params['rp']) + +# 登录+画图 +async def login_img_request(request): params = request.rel_url.query if 'account' not in params or 'passwd' not in params or 'token' not in params: print(f"ERR! [{GetTime()}] params needed: token/account/passwd") - return {'code': 400, 'message': 'params needed: token/account/passwd','info':'缺少参数!示例: /shop-img?token=api凭证&account=Riot账户&passwd=Riot密码&img_src=自定义背景图(可选)'} + return {'code': 400, 'message': 'params needed: token/account/passwd','info':'缺少参数!示例: /shop-img?token=api凭证&account=Riot账户&passwd=Riot密码&img_src=自定义背景图(可选)','docs':'https://github.com/Aewait/Kook-Valorant-Bot/blob/main/docs/valorant-shop-img-api.md'} account=params['account'] passwd=params['passwd'] @@ -86,48 +140,19 @@ async def base_img_request(request): resp = await fetch_daily_shop(userdict) #获取每日商店 print(f'[{GetTime()}] [Api] fetch_daily_shop success') list_shop = resp["SkinsPanelLayout"]["SingleItemOffers"] # 商店刷出来的4把枪 - - # 自定义背景 - if 'img_src' in params: - img_src = params['img_src'] - else: - img_src = img_bak_169 # 默认背景16-9 - if 'img_ratio'in params and params['img_ratio']=='1': - img_src = img_bak_11 # 默认背景1-1 - - # 开始画图 - start = time.perf_counter() - if 'img_ratio' in params and params['img_ratio']=='1': - ret = await get_shop_img_11(list_shop,bg_img_src=img_src) - else: + res_vprp={'vp':'0','rp':'0'} # 先初始化为0 + if 'img_ratio' not in params or params['img_ratio']!='1': res_vprp = await fetch_vp_rp_dict(userdict) # 只有16-9的图片需获取vp和r点 - ret = await get_shop_img_169(list_shop,vp=res_vprp['vp'],rp=res_vprp['rp'],bg_img_src=img_src) - # 打印计时 - print(f"[{GetTime()}] [IMGdraw]",format(time.perf_counter() - start, '.2f'))# 结果为浮点数,保留两位小数 + # 不管什么情况,都请求这个 + return await base_img_request(params,list_shop,res_vprp['vp'],res_vprp['rp']) - start = time.perf_counter() - if ret['status']: - bg = ret['value'] - img_src_ret = await kook_create_asset(api_bot_token,bg) # 上传图片 - if img_src_ret['code']==0: - print(f"[{GetTime()}] [Api] kook_create_asset success {format(time.perf_counter() - start, '.2f')}") - dailyshop_img_src = img_src_ret['data']['url'] - print(f'[{GetTime()}] [img-url] {dailyshop_img_src}') - return {'code':0,'message':dailyshop_img_src,'info':'商店图片获取成功'} - else: - print(f'[{GetTime()}] [Api] kook_create_asset failed') - return {'code':200,'message': 'img upload err','info':'图片上传错误'} - else: #出现图片违规或者url无法获取 - err_str = ret['value'] - print(f'[{GetTime()}] [ERR]',err_str) - return {'code':200,'message': 'img src err','info':'自定义图片获取失败'} # 邮箱验证的post async def tfa_code_requeset(request): params = request.rel_url.query if 'account' not in params or 'vcode' not in params or 'token' not in params: print(f"ERR! [{GetTime()}] params needed: token/account/vcode") - return {'code': 400, 'message': 'params needed: token/account/vcode','info':'缺少参数!示例: /tfa?token=api凭证&account=Riot账户&vcode=邮箱验证码'} + return {'code': 400, 'message': 'params needed: token/account/vcode','info':'缺少参数!示例: /tfa?token=api凭证&account=Riot账户&vcode=邮箱验证码','docs':'https://github.com/Aewait/Kook-Valorant-Bot/blob/main/docs/valorant-shop-img-api.md'} account=params['account'] vcode=params['vcode'] From 07b47d141a3f6677fd708fcef0a159c098f2921f Mon Sep 17 00:00:00 2001 From: Ewait Date: Sun, 22 Jan 2023 20:34:31 +0800 Subject: [PATCH 04/16] feat(api): add indent,sort_keys in json.dumps --- code/api.py | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/code/api.py b/code/api.py index 4eb1050..fa00206 100644 --- a/code/api.py +++ b/code/api.py @@ -12,19 +12,22 @@ @routes.get('/') def hello_world(request): # put application's code here print(f"[{GetTime()}] [request] /") - return web.Response(body=json.dumps({'code':0,'message': 'Hello! Use path /shop-url or /shop-img to get valorant daily shop','info':'在path后添加/shop-img或者/shop-url来获取每日商店,前者会直接跳转,后者返回一个带图片url的json。示例: /shop-url?account=Riot账户&passwd=Riot密码&img_src=可选参数,自定义背景图'},ensure_ascii=False), status=200, content_type='application/json') + return web.Response(body=json.dumps({ + 'code':0, + 'message': 'Hello! Use path /shop-url or /shop-img to get valorant daily shop','info':'在path后添加/shop-img或者/shop-url来获取每日商店,前者会直接跳转,后者返回一个带图片url的json。示例: /shop-url?account=Riot账户&passwd=Riot密码&img_src=可选参数,自定义背景图','docs':'https://github.com/Aewait/Kook-Valorant-Bot/blob/main/docs/valorant-shop-img-api.md' + },indent=2, sort_keys=True,ensure_ascii=False), status=200, content_type='application/json') # 提供4个皮肤uuid,返回图片 @routes.get('/shop-draw') async def get_dailshop_img(request): - print(f"[{GetTime()}] [request] /shop-url") + print(f"[{GetTime()}] [request] /shop-draw") try: ret = await img_draw_request(request) - return web.Response(body=json.dumps(ret,ensure_ascii=False), content_type='application/json') + return web.Response(body=json.dumps(ret,indent=2, sort_keys=True,ensure_ascii=False), content_type='application/json') except: err_cur = traceback.format_exc() print(f"[{GetTime()}] [Api] ERR in /shop-url\n{err_cur}") - return web.Response(body=json.dumps({'code':200,'message': 'unkown err','info':f'未知错误','except':f'{err_cur}'},ensure_ascii=False), content_type='application/json') + return web.Response(body=json.dumps({'code':200,'message': 'unkown err','info':f'未知错误','except':f'{err_cur}'},indent=2, sort_keys=True,ensure_ascii=False), content_type='application/json') # 直接跳转图片 @@ -36,11 +39,11 @@ async def get_dailshop_img(request): if ret['code']==0: return web.Response(headers={'Location': ret['message']},status=303) # 303是直接跳转到图片 else: - return web.Response(body=json.dumps(ret,ensure_ascii=False), content_type='application/json') + return web.Response(body=json.dumps(ret,indent=2, sort_keys=True,ensure_ascii=False), content_type='application/json') except: err_cur = traceback.format_exc() print(f"[{GetTime()}] [Api] ERR in /shop-img\n{err_cur}") - return web.Response(body=json.dumps({'code':200,'message': 'unkown err','info':f'未知错误','except':f'{err_cur}'},ensure_ascii=False), content_type='application/json') + return web.Response(body=json.dumps({'code':200,'message': 'unkown err','info':f'未知错误','except':f'{err_cur}'},indent=2, sort_keys=True,ensure_ascii=False), content_type='application/json') # 获取图片url @routes.get('/shop-url') @@ -48,22 +51,22 @@ async def get_dailshop_img(request): print(f"[{GetTime()}] [request] /shop-url") try: ret = await login_img_request(request) - return web.Response(body=json.dumps(ret,ensure_ascii=False), content_type='application/json') + return web.Response(body=json.dumps(ret,indent=2, sort_keys=True,ensure_ascii=False), content_type='application/json') except: err_cur = traceback.format_exc() print(f"[{GetTime()}] [Api] ERR in /shop-url\n{err_cur}") - return web.Response(body=json.dumps({'code':200,'message': 'unkown err','info':f'未知错误','except':f'{err_cur}'},ensure_ascii=False), content_type='application/json') + return web.Response(body=json.dumps({'code':200,'message': 'unkown err','info':f'未知错误','except':f'{err_cur}'},indent=2, sort_keys=True,ensure_ascii=False), content_type='application/json') @routes.post('/tfa') async def post_tfa_code(request): print(f"[{GetTime()}] [request] /tfa") try: ret = await tfa_code_requeset(request) - return web.Response(body=json.dumps(ret,ensure_ascii=False), content_type='application/json') + return web.Response(body=json.dumps(ret,indent=2, sort_keys=True,ensure_ascii=False), content_type='application/json') except: err_cur = traceback.format_exc() print(f"[{GetTime()}] [Api] ERR in /tfa\n{err_cur}") - return web.Response(body=json.dumps({'code':200,'message': 'unkown err','info':f'未知错误','except':f'{err_cur}'},ensure_ascii=False), content_type='application/json') + return web.Response(body=json.dumps({'code':200,'message': 'unkown err','info':f'未知错误','except':f'{err_cur}'},indent=2, sort_keys=True,ensure_ascii=False), content_type='application/json') from main import bot # 爱发电的wh @@ -72,11 +75,11 @@ async def aifadian_webhook(request): print(f"[{GetTime()}] [request] /afd") try: ret = await afd_request(request,bot) - return web.Response(body=json.dumps(ret,ensure_ascii=False), content_type='application/json') + return web.Response(body=json.dumps(ret,indent=2, sort_keys=True,ensure_ascii=False), content_type='application/json') except: err_cur = traceback.format_exc() print(f"[{GetTime()}] [Api] ERR in /afd\n{err_cur}") - return web.Response(body=json.dumps({"ec":0,"em":"err ouccer"},ensure_ascii=False), content_type='application/json') + return web.Response(body=json.dumps({"ec":0,"em":"err ouccer"},indent=2, sort_keys=True,ensure_ascii=False), content_type='application/json') print(f"[API Start] starting at {GetTime()}") From 538e32b82f11d55dca488224566dee7aa5719f43 Mon Sep 17 00:00:00 2001 From: Ewait Date: Sun, 22 Jan 2023 20:44:38 +0800 Subject: [PATCH 05/16] docs(api): update api docs --- docs/valorant-shop-img-api.md | 50 ++++++++++++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 4 deletions(-) diff --git a/docs/valorant-shop-img-api.md b/docs/valorant-shop-img-api.md index 4351d85..e626a96 100644 --- a/docs/valorant-shop-img-api.md +++ b/docs/valorant-shop-img-api.md @@ -11,8 +11,9 @@ Api是一个网页链接,能够方便的被用户使用或被开发者调用 | 接口 | 说明 | 状态 | | ---------- | --------------------- | -------- | -| /shop-img | 直接返回并跳转商店的图片 | 正常 | -| /shop-url | 以`json`格式返回商店图片url | 正常 | +| /shop-img | 登录,直接返回并跳转商店的图片 | 正常 | +| /shop-url | 登录,以`json`格式返回商店图片url | 正常 | +| /shop-draw | 无需登录,提供4个皮肤uuid 返回图片url | 开放测试 | | /tfa | 邮箱验证接口,需和`/shop-url`接口配合使用 | 正常 | @@ -75,7 +76,7 @@ https://val.outpost54.top/shop-img?token=API的密钥&account=账户&passwd=密 注:只有`code 0`才是获取正常,`200/400` 都是有错误,会返回错误的原因。 -### 3.1 /shop-url +### 3.1 shop-url 如果你是开发者,请使用`/shop-url`来获取`json`格式的结果 @@ -105,7 +106,7 @@ https://val.outpost54.top/shop-url } ~~~ -### 3.2 /tfa +### 3.2 tfa 此接口用于两步验证,适用于开启了邮箱验证的用户; @@ -134,6 +135,47 @@ https://val.outpost54.top/tfa } ~~~ +### 3.3 shop-draw + +这个接口更加适合在本地管理用户的登录信息,本地调用riot api获取用户商店皮肤/vp/rp后,再调用,直接返回图片url + +请求方法:`GET` + +| params参数 | 说明 | 是否必填 | +| ---------- | --------------------- | -------- | +| token | API token | 是 | +| list_shop | 4个皮肤uuid组成的dict | 是 | +| vp | vp | 否 | +| rp | rp | 否 | +| img_src | 自定义背景图的url链接 | 否 | +| img_ratio | 自定义背景图比例,值为1代表正方形 | 否 | + +其中 `list_shop` 为riot商店返回值中的以下字段,传入 `["SkinsPanelLayout"]["SingleItemOffers"]` 即可 + +```json +{ + "SkinsPanelLayout":{ + "SingleItemOffers":[ + "4875e120-4d7d-aa2a-71c5-c0851c4af00d", + "5ac106cd-45ef-a26f-2058-f382f20c64db", + "c7695ce7-4fc9-1c79-64b3-8c8f9e21571c", + "f35f6e13-4b7b-da38-c0de-5c91fffd584b" + ], + "SingleItemOffersRemainingDurationInSeconds":60193 + } +} +``` + +vp/rp只有16-9的图片需要,如果设置了`img_ratio`为1,则无需给予vp/rp参数 + +返回示例 +~~~json +{ + "code": 0, + "message": "https://img.kaiheila.cn/attachments/2022-10/12/1GaII87UTd0zk0k0.png", + "info": "商店图片获取成功" +} +~~~ ## 4.Python示例代码 From 6cbb60bc4c3cc7b5ba4118f59c8ac5d3ae024bfa Mon Sep 17 00:00:00 2001 From: Ewait Date: Mon, 23 Jan 2023 08:25:05 +0800 Subject: [PATCH 06/16] refactor(main): delete login rate limited def in main refactor(main): del useless code in vip-shop,move pos of weather feat(kookapi): add bot offline def, use in kill cmd refactor(main): move pos of def replace_illegal_img --- code/endpoints/KookApi.py | 10 ++- code/main.py | 155 +++++++++----------------------------- 2 files changed, 46 insertions(+), 119 deletions(-) diff --git a/code/endpoints/KookApi.py b/code/endpoints/KookApi.py index 6422dc9..279fada 100644 --- a/code/endpoints/KookApi.py +++ b/code/endpoints/KookApi.py @@ -76,7 +76,7 @@ async def kook_create_asset(bot_token:str,bg): imgByte = imgByteArr.getvalue() data = aiohttp.FormData() data.add_field('file',imgByte) - url = "https://www.kookapp.cn/api/v3/asset/create" + url = kook_base_url+"/api/v3/asset/create" kook_headers = {f'Authorization': f"Bot {bot_token}"} body = {'file':data} async with aiohttp.ClientSession() as session: @@ -84,6 +84,14 @@ async def kook_create_asset(bot_token:str,bg): res = json.loads(await response.text()) return res +# 下线机器人 +async def bot_offline(): + url = kook_base_url+"/api/v3/user/offline" + async with aiohttp.ClientSession() as session: + async with session.post(url, headers=kook_headers) as response: + res = json.loads(await response.text()) + return res + ##########################################icon############################################## from typing import Union diff --git a/code/main.py b/code/main.py index 00e47b1..1f951d9 100644 --- a/code/main.py +++ b/code/main.py @@ -24,7 +24,7 @@ from endpoints.BotLog import logging, log_bot_list, log_bot_user, APIRequestFailed_Handler, BaseException_Handler from endpoints.Other import weather from endpoints.KookApi import (icon_cm, status_active_game, - status_active_music, status_delete, guild_view, upd_card) + status_active_music, status_delete, bot_offline, upd_card) from endpoints.GrantRoles import (Color_GrantRole,Color_SetGm,Color_SetMsg,THX_Sponser) from endpoints.Val import * from endpoints.EzAuth import auth2fa,authflow,auth2faWait,Get2faWait_Key,User2faCode @@ -80,6 +80,8 @@ async def KillBot(msg:Message,*arg): # 保存所有文件 await Save_All_File(False) await msg.reply(f"[kill] 保存全局变量成功") + res = await bot_offline() # 调用接口下线bot + print(f"[kill] bot-off: {res}") os._exit(0) # 退出程序 ########################################################################################## @@ -191,6 +193,21 @@ async def roll(msg: Message, t_min: int = 1, t_max: int = 100, n: int = 1,*args) #发送错误信息到指定频道 await bot.client.send(debug_ch, err_str) +# 返回天气 +@bot.command(name='we') +async def Weather(msg: Message, city: str = "err"): + logging(msg) + if city == "err": + await msg.reply(f"函数参数错误,城市: `{city}`\n") + return + + try: + await weather(msg, city) + except Exception as result: + await BaseException_Handler("Weather",traceback.format_exc(),msg,bot,None,None,"建议加入帮助频道找我康康到底是啥问题") + err_str = f"ERR! [{GetTime()}] Weather\n```\n{traceback.format_exc()}\n```" + #发送错误信息到指定频道 + await bot.client.send(debug_ch, err_str) ################################以下是给用户上色功能的内容######################################## @@ -264,33 +281,6 @@ async def TLOFF(msg: Message): logging(msg) await Close_TL(msg) - -######################################## Other ################################################ - -# 返回历史上的今天 -@bot.command(name='hs') -async def History(msg: Message): - logging(msg) - #await history(msg) - await msg.reply(f"抱歉,`hs` 功能已被取消!") - - -# 返回天气 -@bot.command(name='we') -async def Weather(msg: Message, city: str = "err"): - logging(msg) - if city == "err": - await msg.reply(f"函数参数错误,城市: `{city}`\n") - return - - try: - await weather(msg, city) - except Exception as result: - await BaseException_Handler("Weather",traceback.format_exc(),msg,bot,None,None,"建议加入帮助频道找我康康到底是啥问题") - err_str = f"ERR! [{GetTime()}] Weather\n```\n{traceback.format_exc()}\n```" - #发送错误信息到指定频道 - await bot.client.send(debug_ch, err_str) - ########################################################################################### ####################################以下是游戏相关代码区##################################### ########################################################################################### @@ -404,6 +394,23 @@ async def dx(msg: Message): illegal_img_11 = "https://img.kookapp.cn/assets/2022-09/a1k6QGZMiW0rs0rs.png" illegal_img_169 = "https://img.kookapp.cn/assets/2022-09/CVWFac7CJG0zk0k0.png" +#替换掉违规图片(传入list的下标) +async def replace_illegal_img(user_id: str, num: int): + """ + user_id: kook user_id + num: VipShopBgDict list index + """ + try: + global VipShopBgDict + img_str = VipShopBgDict['bg'][user_id]["background"][num] + VipShopBgDict['bg'][user_id]["background"][num] = illegal_img_169 + VipShopBgDict['bg'][user_id]["status"] = False #需要重新加载图片 + print(f"[Replace_img] Au:{user_id} [{img_str}]") #写入文件后打印log信息 + except Exception as result: + err_str = f"ERR! [{GetTime()}] replace_illegal_img\n```\n{traceback.format_exc()}\n```" + print(err_str) + await bot.client.send(debug_ch, err_str) #发送消息到debug频道 + # 新建vip的uuid,第一个参数是天数,第二个参数是数量 @bot.command(name="vip-a") @@ -485,24 +492,6 @@ async def list_vip_user(msg: Message, *arg): await msg.reply(err_str) -#替换掉违规图片(传入list的下标) -async def replace_illegal_img(user_id: str, num: int): - """ - user_id: kook user_id - num: VipShopBgDict list index - """ - try: - global VipShopBgDict - img_str = VipShopBgDict['bg'][user_id]["background"][num] - VipShopBgDict['bg'][user_id]["background"][num] = illegal_img_169 - VipShopBgDict['bg'][user_id]["status"] = False #需要重新加载图片 - print(f"[Replace_img] Au:{user_id} [{img_str}]") #写入文件后打印log信息 - except Exception as result: - err_str = f"ERR! [{GetTime()}] replace_illegal_img\n```\n{traceback.format_exc()}\n```" - print(err_str) - await bot.client.send(debug_ch, err_str) #发送消息到debug频道 - - async def check_vip_img(): print("[BOT.TASK] check_vip_img start!") try: @@ -730,14 +719,8 @@ async def vip_shop_bg_set_s(msg: Message, num: str = "err", *arg): icon_num = VipShopBgDict['bg'][msg.author_id]["background"][num] VipShopBgDict['bg'][msg.author_id]["background"][num] = VipShopBgDict['bg'][msg.author_id]["background"][0] VipShopBgDict['bg'][msg.author_id]["background"][0] = icon_num - VipShopBgDict['bg'][msg.author_id]['status'] = False #修改图片之后,因为8点bot存储了商店图,所以需要重新获取新的背景 - - # #进行缩放+贴上图后保存 - # bg_vip = resize_vip(1280,720,bg_vip) - # bg_vip = bg_vip.convert('RGBA') - # # alpha_composite才能处理透明的png。参数1是底图,参数2是需要粘贴的图片 - # finalImg = Image.alpha_composite(bg_vip, bg_main_169) - # finalImg.save(f'./log/img_temp_vip/bg/{msg.author_id}.png') + VipShopBgDict['bg'][msg.author_id]['status'] = False + #修改图片之后,因为8点bot存储了商店图,所以需要重新获取 以新的背景图为背景 的商店图片 else: await msg.reply("请提供正确返回的图片序号,可以用`/vip-shop`进行查看") return @@ -921,7 +904,6 @@ async def vip_time_add(msg:Message,vday:int=1,*arg): # 预加载用户的riot游戏id和玩家uuid(登录后Api获取) from endpoints.FileManage import UserTokenDict - # 用来存放auth对象(无法直接保存到文件) UserAuthDict = {} # 用来存放已保存cookie的用户id(保存在文件中) @@ -962,63 +944,6 @@ def get_login_rate_cm(time_diff=None): return cm -#检查是否存在用户请求超速 -async def check_user_login_rate(msg: Message): - """ - Returns: - - True: UserRatelimitError - - False: good_to_go - """ - global login_dict #检查用户请求次数,避免超速 - if msg.author_id in login_dict: - time_stap = time.time() - time_diff = time_stap - login_dict[msg.author_id]['time'] - if login_dict[msg.author_id]['nums'] >= 3 and time_diff <= 70.0: - # 思路是第一次请求超速后,要过70s才能执行下一次 - if login_dict[msg.author_id]['nums'] == 3: #第一次请求超速 - login_dict[msg.author_id]['time'] = time_stap #更新时间戳 - time_diff = 0 #更新diff - - login_dict[msg.author_id]['nums'] += 1 - time_remain = format(70.0 - time_diff, '.1f') #剩余需要等待的时间 - text = f"用户登录请求超速,请在 {time_remain}s 后重试" - cm0 = CardMessage() - c = Card(color='#fb4b57') #卡片侧边栏颜色 - c.append(Module.Section(Element.Text(text, Types.Text.KMD), Element.Image(src=icon_cm.powder, size='sm'))) - c.append( - Module.Context( - Element.Text(f"raise UserRatelimitError, please try again after {time_remain}s", Types.Text.KMD))) - cm0.append(c) - await msg.reply(cm0) - return True - elif time_diff > 70.0: #请求次数超限,但是已经过了70s - login_dict[msg.author_id]['nums'] = 1 #重置为1 - login_dict[msg.author_id]['time'] = time_stap - return False - else: # login_dict[msg.author_id]['nums']<3 and time_diff<=60.0 - login_dict[msg.author_id]['nums'] += 1 - return False - else: - login_dict[msg.author_id] = {'time': time.time(), 'nums': 1} - return False - -# 全局请求超速 -async def check_global_login_rate(msg:Message): - if login_rate_limit['limit']: - time_stap = time.time() - time_diff = time_stap - login_rate_limit['time'] - if time_diff <= 240.0: #240s内无法使用login - ret_cm = get_login_rate_cm(time_diff) - await msg.reply(ret_cm) - print(f"Login - Au:{msg.author_id} - raise global_login_rate_limit") - return False - else: #超过240s,解除限制 - login_rate_limit['limit'] = False - login_rate_limit['time'] = time_stap - return True - return True - - # 登录,保存用户的token @bot.command(name='login') async def login_authtoken(msg: Message, user: str = 'err', passwd: str = 'err',tfa=0,*arg): @@ -1041,12 +966,6 @@ async def login_authtoken(msg: Message, user: str = 'err', passwd: str = 'err',t global login_rate_limit, UserTokenDict, UserAuthDict cm0 = CardMessage() c = Card(color='#fb4b57') #卡片侧边栏颜色 - - # if await check_global_login_rate(msg):# 全局请求超速 - # return - # if await check_user_login_rate(msg):# 用户请求超速 - # print(f"Login - Au:{msg.author_id} - raise user_login_rate_limit") - # return text = "正在尝试获取您的riot账户token" c.append(Module.Section(Element.Text(text, Types.Text.KMD), Element.Image(src=icon_cm.val_logo_gif, size='sm'))) c.append(Module.Context(Element.Text("小憩一下,很快就好啦!", Types.Text.KMD))) From 128ffb28017306f06b04b15535515e177df348d2 Mon Sep 17 00:00:00 2001 From: Ewait Date: Mon, 23 Jan 2023 08:49:51 +0800 Subject: [PATCH 07/16] feat(kookapi): add get_card for basic reply card --- code/endpoints/KookApi.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/code/endpoints/KookApi.py b/code/endpoints/KookApi.py index 279fada..1c34d17 100644 --- a/code/endpoints/KookApi.py +++ b/code/endpoints/KookApi.py @@ -2,6 +2,7 @@ import aiohttp import io from khl import Bot,ChannelPrivacyTypes +from khl.card import Card,CardMessage,Module,Element,Types from endpoints.FileManage import config # 下方更新卡片消息需要bot @@ -142,4 +143,16 @@ async def upd_card(msg_id: str, result = await bot.client.gate.request('POST', 'message/update', data=data) else: result = await bot.client.gate.request('POST', 'direct-message/update', data=data) - return result \ No newline at end of file + return result + +# 获取常用的卡片消息 +async def get_card(text:str,sub_text:str,img_url:str='err',card_color='#fb4b57',img_sz='sm'): + cm = CardMessage() + c = Card(color=card_color) + if img_url != 'err': + c.append(Module.Section(Element.Text(text, Types.Text.KMD), Element.Image(src=img_url, size=img_sz))) + else: + c.append(Module.Section(Element.Text(text, Types.Text.KMD))) + c.append(Module.Context(Element.Text(sub_text, Types.Text.KMD))) + cm.append(c) + return cm \ No newline at end of file From e91dcae47b9ce118a72d38d01666e65306825311 Mon Sep 17 00:00:00 2001 From: Ewait Date: Mon, 23 Jan 2023 09:33:58 +0800 Subject: [PATCH 08/16] fix(kookapi): add default params for get_card --- code/endpoints/KookApi.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/code/endpoints/KookApi.py b/code/endpoints/KookApi.py index 1c34d17..1139e9e 100644 --- a/code/endpoints/KookApi.py +++ b/code/endpoints/KookApi.py @@ -146,13 +146,14 @@ async def upd_card(msg_id: str, return result # 获取常用的卡片消息 -async def get_card(text:str,sub_text:str,img_url:str='err',card_color='#fb4b57',img_sz='sm'): +async def get_card(text:str,sub_text='e',img_url='e',card_color='#fb4b57',img_sz='sm'): cm = CardMessage() c = Card(color=card_color) - if img_url != 'err': + if img_url != 'e': c.append(Module.Section(Element.Text(text, Types.Text.KMD), Element.Image(src=img_url, size=img_sz))) else: c.append(Module.Section(Element.Text(text, Types.Text.KMD))) - c.append(Module.Context(Element.Text(sub_text, Types.Text.KMD))) + if sub_text != 'e': + c.append(Module.Context(Element.Text(sub_text, Types.Text.KMD))) cm.append(c) return cm \ No newline at end of file From 05708d855803b00247582f056b5dbcf75c8a5221 Mon Sep 17 00:00:00 2001 From: Ewait Date: Mon, 23 Jan 2023 09:35:32 +0800 Subject: [PATCH 09/16] feat(main): login use get_card, add GloginRate check --- code/main.py | 106 ++++++++++++++++++++------------------------------- 1 file changed, 42 insertions(+), 64 deletions(-) diff --git a/code/main.py b/code/main.py index 1f951d9..badd489 100644 --- a/code/main.py +++ b/code/main.py @@ -24,7 +24,7 @@ from endpoints.BotLog import logging, log_bot_list, log_bot_user, APIRequestFailed_Handler, BaseException_Handler from endpoints.Other import weather from endpoints.KookApi import (icon_cm, status_active_game, - status_active_music, status_delete, bot_offline, upd_card) + status_active_music, status_delete, bot_offline, upd_card,get_card) from endpoints.GrantRoles import (Color_GrantRole,Color_SetGm,Color_SetMsg,THX_Sponser) from endpoints.Val import * from endpoints.EzAuth import auth2fa,authflow,auth2faWait,Get2faWait_Key,User2faCode @@ -410,7 +410,7 @@ async def replace_illegal_img(user_id: str, num: int): err_str = f"ERR! [{GetTime()}] replace_illegal_img\n```\n{traceback.format_exc()}\n```" print(err_str) await bot.client.send(debug_ch, err_str) #发送消息到debug频道 - + # 新建vip的uuid,第一个参数是天数,第二个参数是数量 @bot.command(name="vip-a") @@ -908,18 +908,27 @@ async def vip_time_add(msg:Message,vday:int=1,*arg): UserAuthDict = {} # 用来存放已保存cookie的用户id(保存在文件中) UserCookieDict = {} -#用于限制用户操作,一分钟只能3次 -login_dict = {} #全局的速率限制,如果触发了速率限制的err,则阻止所有用户login login_rate_limit = {'limit': False, 'time': time.time()} #用来存放用户每天的商店(早八会清空) UserShopDict = {} + #检查皮肤评分的错误用户(违规用户) def check_rate_err_user(user_id:str): """(user_id in SkinRateDict['err_user']) """ return (user_id in SkinRateDict['err_user']) +# 检查全局用户登录速率 +async def check_GloginRate(): + global login_rate_limit + if login_rate_limit['limit']: + if (time.time() - login_rate_limit['time'])>180: + login_rate_limit['limit'] = False#超出180s解除 + else:#未超出240s + raise auth_exceptions.RiotRatelimitError + return True + #查询当前有多少用户登录了 @bot.command(name="ckau") async def check_UserAuthDict_len(msg: Message): @@ -930,20 +939,6 @@ async def check_UserAuthDict_len(msg: Message): await msg.reply(res) -#遇到全局速率限制统一获取卡片消息 -def get_login_rate_cm(time_diff=None): - if time_diff != None: - text = f"阿狸的登录请求超速!请在 {format(240.0-time_diff, '.1f')}s 后重试" - else: - text = f"阿狸的登录请求超速!请在 240.0s 后重试" - cm = CardMessage() - c = Card(color='#fb4b57') - c.append(Module.Section(Element.Text(text, Types.Text.KMD), Element.Image(src=icon_cm.lagging, size='sm'))) - c.append(Module.Context(Element.Text("raise RiotRatelimitError, please try again later", Types.Text.KMD))) - cm.append(c) - return cm - - # 登录,保存用户的token @bot.command(name='login') async def login_authtoken(msg: Message, user: str = 'err', passwd: str = 'err',tfa=0,*arg): @@ -964,12 +959,10 @@ async def login_authtoken(msg: Message, user: str = 'err', passwd: str = 'err',t return try: global login_rate_limit, UserTokenDict, UserAuthDict - cm0 = CardMessage() - c = Card(color='#fb4b57') #卡片侧边栏颜色 + await check_GloginRate() # 无须接收此函数返回值,直接raise text = "正在尝试获取您的riot账户token" - c.append(Module.Section(Element.Text(text, Types.Text.KMD), Element.Image(src=icon_cm.val_logo_gif, size='sm'))) - c.append(Module.Context(Element.Text("小憩一下,很快就好啦!", Types.Text.KMD))) - cm0.append(c) + text_sub = "小憩一下,很快就好啦!" + cm0 = await get_card(text,text_sub,icon_cm.val_logo_gif) send_msg = await msg.reply(cm0) #记录消息id用于后续更新 # 获取用户的token @@ -995,60 +988,50 @@ async def login_authtoken(msg: Message, user: str = 'err', passwd: str = 'err',t UserTokenDict[msg.author_id]['TagLine'] = res_gameid[0]['TagLine'] UserAuthDict[msg.author_id] = { "auth":res_auth,"2fa":tfa} #将对象插入 - info_text = "当前token有效期为2~3天,有任何问题请[点我](https://kook.top/gpbTwZ)" - if tfa: - info_text = "由于后台实现的限制,您每次登录的时候都需要提供验证码,见谅T.T\n有任何问题请[点我](https://kook.top/gpbTwZ)" - - cm = CardMessage() + # 发送登录成功的信息 + info_text = "当前cookie有效期为2~3天,有任何问题请[点我](https://kook.top/gpbTwZ)" text = f"登陆成功!欢迎回来,{UserTokenDict[msg.author_id]['GameName']}#{UserTokenDict[msg.author_id]['TagLine']}" - c = Card(color='#fb4b57') - c.append(Module.Section(Element.Text(text, Types.Text.KMD), Element.Image(src=icon_cm.correct, size='sm'))) - c.append(Module.Context(Element.Text(info_text, Types.Text.KMD))) - cm.append(c) + cm = await get_card(text,info_text,icon_cm.correct) await upd_card(send_msg['msg_id'], cm, channel_type=msg.channel_type) - # 如果是vip用户,则执行下面的代码 if await vip_ck(msg.author_id): global VipShopBgDict #因为换了用户,所以需要修改状态码重新获取商店 if msg.author_id in VipShopBgDict['bg']: VipShopBgDict['bg'][msg.author_id]['status']=False - # 现在2fa用户也能保存登录信息了 - cookie_path = f"./log/cookie/{msg.author_id}.cke"#用于保存cookie的路径 + # 用于保存cookie的路径,保存vip用户登录信息 + cookie_path = f"./log/cookie/{msg.author_id}.cke" res_auth._cookie_jar.save(cookie_path)#保存 # 全部都搞定了,打印登录信息 print( - f"Login - Au:{msg.author_id} - {UserTokenDict[msg.author_id]['GameName']}#{UserTokenDict[msg.author_id]['TagLine']}" + f"[Login] Au:{msg.author_id} - {UserTokenDict[msg.author_id]['GameName']}#{UserTokenDict[msg.author_id]['TagLine']}" ) except auth_exceptions.RiotAuthenticationError as result: print(f"ERR! [{GetTime()}] login - {result}") - cm = CardMessage() - c = Card(color='#fb4b57') text = f"当前的账户密码真的对了吗?" - c.append(Module.Section(Element.Text(text, Types.Text.KMD), Element.Image(src=icon_cm.dont_do_that, size='sm'))) - c.append(Module.Context(Element.Text(f"Make sure username and password are correct\n`{result}`", Types.Text.KMD))) - cm.append(c) + text_sub = f"Make sure username and password are correct\n`{result}`" + cm = await get_card(text,text_sub,icon_cm.dont_do_that) await upd_card(send_msg['msg_id'], cm, channel_type=msg.channel_type) except auth_exceptions.RiotMultifactorError as result: print(f"ERR! [{GetTime()}] login - {result}") text = f"若您开始了邮箱双重验证,请使用「/login 账户 密码 1」来登录" - cm = CardMessage() - c = Card(color='#fb4b57') - c.append(Module.Section(Element.Text(text, Types.Text.KMD), Element.Image(src=icon_cm.that_it, size='sm'))) - c.append(Module.Context(Element.Text("Please use `/login accout passwd 1` for 2fa", Types.Text.KMD))) - cm.append(c) + text_sub = f"Please use `/login accout passwd 1` for 2fa" + cm = await get_card(text,text_sub,icon_cm.that_it) await upd_card(send_msg['msg_id'], cm, channel_type=msg.channel_type) except auth_exceptions.RiotRatelimitError as result: - print(f"ERR! [{GetTime()}] login - riot_auth.auth_exceptions.RiotRatelimitError") + err_str = f"ERR! [{GetTime()}] login - riot_auth.auth_exceptions.RiotRatelimitError" #更新全局速率限制 login_rate_limit['limit'] = True login_rate_limit['time'] = time.time() - ret_cm = get_login_rate_cm() #这里是第一个出现速率限制err的用户 - await upd_card(send_msg['msg_id'], ret_cm, channel_type=msg.channel_type) + err_str+=f" - set login_rate_limit = True" + print(err_str) + #这里是第一个出现速率限制err的用户,更新消息提示 + cm = await get_card("阿狸的请求超速!请在3分钟后重试","RiotRatelimitError, please try again later",icon_cm.lagging) + await upd_card(send_msg['msg_id'], cm, channel_type=msg.channel_type) except client_exceptions.ClientResponseError as result: - err_str = f"[Login] aiohttp ERR!\n```\n{traceback.format_exc()}\n```\n" + err_str = f"ERR! [{GetTime()}] login aiohttp ERR!\n```\n{traceback.format_exc()}\n```\n" if 'auth.riotgames.com' and '403' in str(result): Login_Forbidden = True err_str+= f"[Login] 403 err! set Login_Forbidden = True" @@ -1056,26 +1039,21 @@ async def login_authtoken(msg: Message, user: str = 'err', passwd: str = 'err',t err_str+= f"[Login] 404 err! network err, try again" else: err_str+= f"[Login] Unkown aiohttp ERR!" - + # 打印+发送消息 print(err_str) await bot.client.send(debug_ch,err_str) - await upd_card(send_msg['msg_id'], ret_cm, channel_type=msg.channel_type) + cm = await get_card(err_str) + await upd_card(send_msg['msg_id'], cm, channel_type=msg.channel_type) except KeyError as result: print(f"ERR! [{GetTime()}] login - KeyError:{result}") - cm = CardMessage() - c = Card(color='#fb4b57') + text = f"遇到未知的KeyError,请[联系](https://kook.top/gpbTwZ)阿狸的主人哦~" + text_sub=f"Unkown KeyError, please contact bot developer" if '0' in str(result): text = f"遇到不常见的KeyError,可能👊Api服务器炸了" - c.append(Module.Section(Element.Text(text, Types.Text.KMD), Element.Image(src=icon_cm.that_it, size='sm'))) - c.append(Module.Context(Element.Text("KeyError, maybe API Offline", Types.Text.KMD))) - cm.append(c) - await upd_card(send_msg['msg_id'], cm, channel_type=msg.channel_type) - else: - text = f"遇到未知的KeyError,请[联系](https://kook.top/gpbTwZ)阿狸的主人哦~" - c.append(Module.Section(Element.Text(text, Types.Text.KMD), Element.Image(src=icon_cm.that_it, size='sm'))) - c.append(Module.Context(Element.Text("Unkown KeyError, please contact bot developer", Types.Text.KMD))) - cm.append(c) - await upd_card(send_msg['msg_id'], cm, channel_type=msg.channel_type) + text_sub=f"KeyError, maybe Roit API Offline" + # 发送卡片消息 + cm = await get_card(text,text_sub,icon_cm.that_it) + await upd_card(send_msg['msg_id'], cm, channel_type=msg.channel_type) except requester.HTTPRequester.APIRequestFailed as result: #卡片消息发送失败 await APIRequestFailed_Handler("login",traceback.format_exc(),msg,bot,send_msg,cm) except Exception as result: # 其他错误 From f5896e42f59653c75d9b4f5590e365518bbc739f Mon Sep 17 00:00:00 2001 From: Ewait Date: Mon, 23 Jan 2023 09:49:51 +0800 Subject: [PATCH 10/16] feat(main): move global value pos --- code/main.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/code/main.py b/code/main.py index badd489..be1c82b 100644 --- a/code/main.py +++ b/code/main.py @@ -944,7 +944,7 @@ async def check_UserAuthDict_len(msg: Message): async def login_authtoken(msg: Message, user: str = 'err', passwd: str = 'err',tfa=0,*arg): print(f"[{GetTime()}] Au:{msg.author_id}_{msg.author.username}#{msg.author.identify_num} = /login {tfa}") log_bot_user(msg.author_id) #这个操作只是用来记录用户和cmd总数的 - global Login_Forbidden + global Login_Forbidden,login_rate_limit, UserTokenDict, UserAuthDict if not isinstance(msg, PrivateMessage): # 不是私聊的话,禁止调用本命令 await msg.reply(f"为了避免您的账户信息泄漏,请「私聊」使用本命令!\n用法:`/login 账户 密码`") return @@ -958,11 +958,10 @@ async def login_authtoken(msg: Message, user: str = 'err', passwd: str = 'err',t await Login_Forbidden_send(msg) return try: - global login_rate_limit, UserTokenDict, UserAuthDict + # 检查全局登录速率 await check_GloginRate() # 无须接收此函数返回值,直接raise - text = "正在尝试获取您的riot账户token" - text_sub = "小憩一下,很快就好啦!" - cm0 = await get_card(text,text_sub,icon_cm.val_logo_gif) + # 发送开始登录的提示消息 + cm0 = await get_card("正在尝试获取您的riot账户token","小憩一下,很快就好啦!",icon_cm.val_logo_gif) send_msg = await msg.reply(cm0) #记录消息id用于后续更新 # 获取用户的token @@ -1007,7 +1006,6 @@ async def login_authtoken(msg: Message, user: str = 'err', passwd: str = 'err',t print( f"[Login] Au:{msg.author_id} - {UserTokenDict[msg.author_id]['GameName']}#{UserTokenDict[msg.author_id]['TagLine']}" ) - except auth_exceptions.RiotAuthenticationError as result: print(f"ERR! [{GetTime()}] login - {result}") text = f"当前的账户密码真的对了吗?" From dc6247514cc1ae48fa7f30f99a8af48b1202acf7 Mon Sep 17 00:00:00 2001 From: Ewait Date: Mon, 23 Jan 2023 09:51:38 +0800 Subject: [PATCH 11/16] feat(help): update vhelp --- code/endpoints/Help.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/endpoints/Help.py b/code/endpoints/Help.py index 4814494..44c2e51 100644 --- a/code/endpoints/Help.py +++ b/code/endpoints/Help.py @@ -47,8 +47,8 @@ def help_val(): c3.append(Module.Section(Element.Text(text, Types.Text.KMD))) c3.append(Module.Divider()) help_1 = "「/bundle 皮肤名」 查询皮肤系列包含什么枪械\n" - help_1 += "「/lead」 显示出当前游戏的排行榜。可提供参数1前多少位,参数2过滤胜场。如`/lead 20 30`代表排行榜前20位胜场超过30的玩家\n" help_1 += "「/login 账户 密码」请`私聊`使用,登录您的riot账户\n" + help_1 += "「/login 账户 密码 1」邮箱验证登录,请`私聊`使用\n" help_1 += "「/shop」 查询您的每日商店\n" help_1 += "「/night」查询您的夜市(未完工)\n" help_1 += "「/uinfo」查询当前装备的卡面/称号/剩余vp和r点\n" From 967bc59aa96f879c7c1cc0101e5e26437c958193 Mon Sep 17 00:00:00 2001 From: Ewait Date: Mon, 23 Jan 2023 09:53:56 +0800 Subject: [PATCH 12/16] fix(main): del /login-t cmd --- code/main.py | 18 ------------------ screenshot/log.png | Bin 7804 -> 8011 bytes 2 files changed, 18 deletions(-) diff --git a/code/main.py b/code/main.py index be1c82b..7ec2def 100644 --- a/code/main.py +++ b/code/main.py @@ -1172,24 +1172,6 @@ async def check_re_auth(def_name: str = "", msg: Union[Message, str] = ''): return False -# 测试是否已登陆 -@bot.command(name="login-t") -async def login_test(msg: Message, *arg): - logging(msg) - if Login_Forbidden: - await Login_Forbidden_send(msg) - return - try: - if msg.author_id in UserAuthDict: - reau = await check_re_auth("测试登录", msg) - if reau == False: return #如果为假说明重新登录失败 - - await msg.reply( - f"您当前已登录账户 `{UserTokenDict[msg.author_id]['GameName']}#{UserTokenDict[msg.author_id]['TagLine']}`") - except Exception as result: # 其他错误 - await BaseException_Handler("login-t",traceback.format_exc(),msg,bot) - - # 退出登录 @bot.command(name='logout') async def logout_authtoken(msg: Message, *arg): diff --git a/screenshot/log.png b/screenshot/log.png index c6c264a2ec01910458fcfc2454885c638263a152..1aa9108258ba308aa1b147b5767b516246c5fc3e 100644 GIT binary patch literal 8011 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 OL*%3t5hapF@BRZkbxz*^ literal 7804 zcmbt(cQjn#+wJJ1&x9a)MxsRTz0VLKgotPvC4%Td^cI9cfDIgFCwbpH<0R%#@2afMS zNx|POfykc_2)nu#Qq|BW6_*z5HiSRxu;6>~i-Gi=!8P5?_6YvMA{w_$H+x>|pHMyj_9^PY!b#5gkhPgl)Cy+c$N3Vsb{s=JAmyLMpSY3gS+eZ&D zq|YkX9z=R89o@M5>+_2}eC;}4M#F4IKY!=?nO~E|mW3z;B1+XJLgk^EK<`S#6k){_ z@l;V@Vlq%>0;9Ow{!5A72H2jmb+IdH!12IT+Z0&?V|M{LyW3Q2dgwHKZ5==jdR zWW-vE49vGhE;>`t@yJD&i0j-a&E$bnQ&USgjtb-#6@6M;TVv>s3GrF@5#?1{jPp6e zkA2P0kH%p7(iK_k9Fu%tUrXqwH;DU^#d&^yxXGR(<(y4GM0)SpGtoy4KB6a}{s$cJK&FUeMvnMkLrUK1w^J?Jsud7U)@2IO2JuouLzc}ynZW_uzkxkR>>gqy7 zwq>FHcYCGzMlo|_gB4k)&y-G!3DZQjI?N<`*$QFOTW=WEA zW_I`R*jY-nAZ<{x>tn@>3-R-Z_5ZzZ;rKO8WG9T|jHU(WMMix`ZKcqNUx)jC%nNN| z8I(SvT3!F0QPk5)Jc?5~S!eC!6?hdtom3e(GJJLDOMx{FMBKLLUWwzg`sv$u?)+Q7 zhiUFi;L&_SNym!P_iSFg9r(x-9R+o%kvCc<>K+*b z{}4cU^wNJ6KdOg>yYT1)SgAG>xyhwn4|_Y|6ajvxa1ot0|JLt1!e4}A<~-%pmBwr< zRw;~YTgs~NPgrRpnFHuiFQ#4M@{}Ovjeb{Yl}|-5(3dY?+B-P>^AB9^N#;asOxH_i zZpH{VVNN#dY2UwpKi=ps?cnG*65I0jrZ%GbCAn@MjopnVn%`?GAA6ULlM5E`eqqP; zr)X1${<7t&F?3jqVc>SaLQ+_|O+UGWh(- z?1fTahBC*tpRO*=uc4vA-@mCKGQsBx#|K++Z{NNRDVLO#T>15h@-mUQnpq7e%AB}V zeMkA!H^<);6gcjZi5Mub>luf#=PP!6T5XR=*FD+ec>XkoiJs%(6c;(ZC;|cRR zcM?dc_ZAukr=Xx17$1kmb%gnEH9i!q2|U@yOpy(tFLa!UyL=MzZ81(Ed*2QG$A%ER$x>_2)9}v zEn2HmKHrJsM4aw@QO5Jvd*MuB@SwAG3r!nMO_lUtQ5pm4@Tih{b0JB(*v~{z;)4#i zc==MnyUtaN_dn~XmY^HmHpWE*_9yH(5qqmcnt_48a?_+ehCpT2lZgjUE@Ax%3xW#C^Ya{;^ovorz4|+HR zB{e_Hn2|6;;Zvs4Wm|!|n#w3-4n?TBySon@ZIVzjaPsky&j#$i_PbjcZqXD_=Z6E} zfO2rS1+MVPdlWX_!Wp2m*$}OtZ{IFyZb5b`zH3h+`A&IFQG0#Yc_OODv?ypxRYCl1 z?9VCJ=GP#j4F@y+5SJpui@~^{+z;0z>|w7oxBwase7(0xF^ZZY{WQ$RE^k2*d_s1TsO{x_VOsK5Yya?hVD{m~*>Z|&C`QD8-w8k2;JZ6e<@k__Ly47)h7|%~mGgum z!|Oc$5<*M<1BQwkSW5T32r~SSk;R?wE;T14oY%2_$*+y)7z*JrbsC}+oP;hntaGV3 zC+G5bmdo#Et(^oY;XOoBdbfQP2qxnD|2m2eIjja!v&z6aJ3I4AN;&{qzDZAy-PmwS zmG#gNyl-F-8b!x*Ji;RHC4hl~)I!`mcH&B(>@2j`dafGya9ES6C~>Kruyqmg1Yh{& z$g0IxsZG8uAv*UMZQVk^huu!~PlD)CJN!AgaeMjxtjUT}69&)3?oUl*qOV*lCOp3o zBA(6$9}i`yAdM^S^|9{Si9#gs`7l}~2n-F>iu*=arz)Db z?A{A=;&DrlbwEJ@F_L*27R;gyH5PquV350J^JS-s~lCG*P&RY+^hCDkp`8+h||U{rTj)c zUJEjpqwIF;opo$iKh@H@iqAQ(xA~sNH-P^WPDZ%FWB1a10dHa()x;Y6=v7jyu+dpF z2Qo3`i=%#3CUQ?nbmS>|9vqwyfiipIk?z5S-HXKp$8%NQC0HEhx~OxTw_F-v z0UtB+K&3t)MzIanwr|&`o?+Ti)&w7=4rN(snj!pR&%X?<)^yZ-df)0&V@A!qAS;z} zmpaL-{t>mC`)5SIGHHP@nQu{Jc53N}OHIL86+!8zz`fAR;I7OzH_sxfiO6U|F!31~ zv=Eu+YxEkitWodY(dT~ol9QPUL5A-vcC61-G&P~w9Ow^LFtyX0nV~{r59aCA@{kPt zl#MVUUr}baie9YximAoe@!JuH2Ngj_Aqx~`coeov`X`Hg3?KP>g=Qr!OG`zgLuwrDi?8I;@z>(IfZvWTl=z#h@qj4*U z-1MqH(|vbERjY@`q2e0nb_fGXAE1n<-sdZ7x4fzLh^6257${iyb64-rx@)4EYS4ib zwr}Pg#d!y>{pv3Kan|0bMlFs8(+Vv4N1lGp_IxAXh(dIu z++0z}TqhjmUrA+)Z3NXXG!g@Xsv?JhB<|i>#1I>&t8s(i1ch zV0gYpw#~S9PYJQr3SElx%RyQDr(%1mwp34;VGWAiCkHQa|4a#ePq^JG8lz<3y7I8g zxrq$VINPwh-u=MP&=MPey*B8~Z$K<-l6>gAG_wO*$0JluT4%?$LB_quK+#E{HpP|L zu1}2cJ=AsGc?|}oJyw@S#a+?a@(LHBDN7Z8NrlhV^-6LLlRgX^^S&}8aRpg9EGzqL zf!J?vg#e)jc*^lUjuO$jGMMwcJBCPN#&2B^Z~FK#7lWWFan2wZRt5%F(0;3*N|ig1 z8hwTBdC^#-Cmiod9=gJL=Vl3p=_Dq`o(ztfy%(a%C$IXYXdXPgX-e)zk!Cbd#ii9U zSy3w#TQgGqs4+IO*1Hx5fyA=P5+YgwI;el>?(S~;DCwy7VbGCB=hRX)?)pCmV;q7B zjbDlX6glocZDS|fM%~M> z@|pylEMnJno$lt7&pOG!Y?TWUfM%XEK|+#}O0C-|^7HaI6FQMqRaG`pDNkpc0(Ych z$in~<4+8064`_~!2-AXdpL741MeyCnKVMx(WKT|-A`tF!X%beg;XWVRe=q^n!YHsJ zx-jiM`zbpcQ9j{hXl#6&goFf%{Db%76Bifn8x_@=GB7p0Gcq!=cYd-pw9p>&6cn^g z#Y7%ZBr~5ybt13x&5+(eT?o7UPClm_vq-zMl2bF0e~p@pL>*pvYf1TW)U`f4VVVhC~j79+5HoDZ)nixPkgM67WeBSWo4%MGXW3#3cv3aJjL7z=}@m&cANq zgm&vJzWbkH@Ik;fkw|1+UEPjEjFlWKSi)RRoDw3YU5!@hkW*4ZVxaXUWv7kU;8yU( ziBHN;5$EWY!sx#B^^#`Y2M;b^ex-$s<5k6Ts-ZGaLj;Qc`?)iX{zJ$3^;JOmbHwfX z27rL_-AvVz0nyYzBERUSA-)W0fiLIsQuL>Z>#$yaPd$?66A*6*gaQ4_YM1FQ>%JQ| zl9Q8d%8c!S`TzmI&b#HQZ&9^X3O9760a0yr1%h7se^=4}|2q8tc!wTm_5WR|Q?yme zZ(Qg&TB+K(P%<+!+m9BS7@C=BgEA2H2fEu1WIr{6>Y5rTxKF;j%ld(Vfj#LRmC9;N zdO#<--f#Wfc&dzcnyic>rD9TPZ*TVm9LFf}aVR9Bj=FRT$BBT!0bSQg-|6JZ076PV zF!qpNNQlOyBrA&m#E|#atyb6I6SGtWUoq}|QRlFBYXUe>s~uDCN}tkRkcF_xdvO9? z1L!-2iOa#}^nXvDbVYybrLOn-id!I?y!`z4XU(=|8lQoB%j*`+0_!n!l422H&>qG& zqJ@E2Hy3({#Q#UPCrl`^_&0JiBGp9m4BGIHjXTNi50aixxc^wt%oR1!JgAX z{P#Bq;8|uhE`S%(nz~F?JJ+rk*T*L(um0Ulk#;reHgE8OC-CTLxVQ*`kc9wdZewF( z39tz8xHqOQeW|hzXXWK$hXG2{b`fT=89Nv#BpQoIzV1xoV z4PZuAQMZ6uAO{i`=GuHVy5$G*i-C403P(=iGz<(3R7mxZNeaH@n|Pj#fGcCgj~qSx zlUHC9b=kb|5p7Qp;%nlzAsCUsyVhh3LC6sjHOaEf&~h~JK&F$8-6O4VkMO_?^SOlmTdh? zUfF+NpuD1DaCrES_t{HEGz4zd{Xx)Yr=9WHY~VpwdHI!k?=20WzPWW%0kZnjU1qY5%FFV7yV01MC7K>`~=wfi{|tO1m2CWkt**^^YrP{wUb^f_B-|sm+12~L&=zuq9T;LyBG!v`W_PU z@gp>fu_z5Bvfd5paM8|upbaW}nSXi=)cJ?^@i~|A! z9S?NF^0F;Ny1hR5;+&U{Prtj+tcC_jFXAi`d>#OUp9Ax0?)^hF0o)1*CYiwF%FT-C z=;%|W{*tC+3KJ6(PDD?Jvhsqvjt_9~9NfxHi}XhliE=v@qwA;1si2(4xVBomuQ(hhhgR$*P)#~l-t-KsGbsjvQa&reFs9Av7 zc=+C;#)SLlDePC+)fvajMPF=9 z*C%2ypy2Y*yFLm?q=dsTF9JcRvekINe(7g|v9SEG8PpXL`7S+O_wL=hV4Qu?a&?alwS%Ml{Y?a>G;3s%DC)3%mQFC0%%9s2K8r5z#It4?kUCYz95j8cx14 zQox9TvPd~Wc@I{z0bAhbk`wG=nbNow0I1yu;qsEXVg=L1*9q z+`M_S7MxL;Pz@t(v6sjOk{vicp(76Mpzp0jm_+OcGBMqv^KGH*>OZ7DxP`rvl8O4c zwR?10JcaYBiiOGul3Z0p+Ho0k4$qho-}DVKsMdD9{uY|#N1z=PR0=8Py;D$q<>{bH z+@Sm7Pimkd3)^2lNEEh+7_=vb&x5XXwzWXa@A!D0nasJ@SxTim2>x(j-L1q%;AN8MiqIWNsi!9du5byfo;XLqMTnjhu_%nf}KJna&nwf(s49A;2bCvAc^O~XeV=7b7(K!fSM}oYkk*ob7CHp{;&#fxQSC) z*@P3YHG*31@^8C`5W!$KqFe+|_32TK8B*%d5BQjJAQT0;80eqMUs(u@?m@mw$lxk| zDTh%HV0V7DHU_9QB|=SK|IIOak8p{_wc&+U0(Tbh!ftD8w|Vp{GM0`7fVl)LxY>&{ zivrvo37h7j?xZTSCIJRY;6tnYyyfjybz$Sv<+Sib=l$4agf``J>W7&Ki#K3tZ1vXyu_e(d8lQUufgc#T+y|%k_ zBqn)+3^5kIMM>QR_xt`dqFu2l6p;OmiBKi?(sz+8?IPI$z1C%U2aMI2gX^@9qYpTn zUBMnhVmC>_NdD+ZtX#NwFf*SX*jU0qFAh7DA&|>$5irt>O3-YTx`Ba>astU286{|C zpdT?%K=)ldT6fKrA|;~AifwEtRMtf8t(@XZSs9dvd)5B7|V z^m^Vtb#nTVjfxq*x}l||<+J)J@w5w69N2`?2(b0mR5@3=irQJv>{@ZYOZP;b+*mtk z(^IZ(=HKX>Q;QfGdyNw!bubutg@rW%X&!9!_nwx7(JJo24DR12Qp)k)tRn+@f?#R) z-#=4x2}UhhZW$oukP@42EV)qo$$!>^=6Ppzh?qDV-G`@L38}K=$V}0c-s=y?qcd~Z zLMu&+ij)#eU+Ml>>$p|PsuaNF>+9 Date: Mon, 23 Jan 2023 09:59:17 +0800 Subject: [PATCH 13/16] refactor(main): use fetch_vp_rp_dict for getting player currenciese --- code/main.py | 35 ++++++++--------------------------- 1 file changed, 8 insertions(+), 27 deletions(-) diff --git a/code/main.py b/code/main.py index 7ec2def..d4cddc4 100644 --- a/code/main.py +++ b/code/main.py @@ -1330,11 +1330,9 @@ async def get_daily_shop(msg: Message, *arg): upload_flag=False #有缓存图,直接使用本地已有链接 dailyshop_img_src = VipShopBgDict['cache'][msg.author_id]['cache_img'] elif is_vip and (msg.author_id in VipShopBgDict['bg']): #本地缓存路径不存在,或者缓存过期 - play_currency = await fetch_valorant_point(userdict)#获取用户的vp和rp - vp = play_currency["Balances"]["85ad13f7-3d1b-5128-9eb2-7cd8ee0b5741"] #vp - rp = play_currency["Balances"]["e59aa87c-4cbf-517a-5983-6e81511be9b7"] #R点 + play_currency = await fetch_vp_rp_dict(userdict)#获取用户的vp和rp background_img = ('err' if msg.author_id not in VipShopBgDict['bg'] else VipShopBgDict['bg'][msg.author_id]["background"][0]) - img_ret = await get_shop_img_169(list_shop,vp=vp,rp=rp,bg_img_src=background_img) + img_ret = await get_shop_img_169(list_shop,vp=play_currency['vp'],rp=play_currency['rp'],bg_img_src=background_img) else:# 普通用户/没有自定义图片的vip用户 img_ret = await get_shop_img_11(list_shop) @@ -1545,19 +1543,6 @@ async def open_night_market(msg: Message, *arg): print(err_str) -# 获取vp和r点剩余 -async def get_user_vp(msg: Message, userdict, *arg): - #userdict = UserTokenDict[msg.author_id] - resp = await fetch_valorant_point(userdict) - #print(resp) - vp = resp["Balances"]["85ad13f7-3d1b-5128-9eb2-7cd8ee0b5741"] #vp - rp = resp["Balances"]["e59aa87c-4cbf-517a-5983-6e81511be9b7"] #R点 - text = f"(emj)r点(emj)[3986996654014459/X3cT7QzNsu03k03k] RP {rp}" - text += " " - text += f"(emj)vp(emj)[3986996654014459/qGVLdavCfo03k03k] VP {vp}\n" - return text - - # 获取玩家卡面(添加point的别名) @bot.command(name='uinfo', aliases=['point', 'UINFO', 'POINT']) async def get_user_card(msg: Message, *arg): @@ -1628,11 +1613,12 @@ async def get_user_card(msg: Message, *arg): c.append(Module.Section(Element.Text(text, Types.Text.KMD))) #cm.append(c) - #获取玩家的vp和r点剩余 - text = await get_user_vp(msg, userdict) + #获取玩家的vp和r点剩余的text + resp = await fetch_vp_rp_dict(userdict) + text = f"(emj)r点(emj)[3986996654014459/X3cT7QzNsu03k03k] RP {resp['rp']} " + text += f"(emj)vp(emj)[3986996654014459/qGVLdavCfo03k03k] VP {resp['vp']}\n" c.append(Module.Section(Element.Text(text, Types.Text.KMD))) cm.append(c) - #await msg.reply(cm) await upd_card(send_msg['msg_id'], cm, channel_type=msg.channel_type) print(f"[{GetTime()}] Au:{msg.author_id} uinfo reply successful!") @@ -1675,12 +1661,10 @@ async def get_bundle(msg: Message, *arg): name = " ".join(arg) # 补全函数名 name = zhconv.convert(name, 'zh-tw') #将名字繁体化 # 不能一来就在武器列表里面找,万一用户输入武器名,那就会把这个武器的所有皮肤都找出来,和该功能的需求不符合 - # bundlelist = await fetch_bundles_all() for b in ValBundleList: #在本地查找 if name in b['displayName']: # 确认在捆绑包里面有这个名字之后,在查找武器(这里不能使用displayName,因为有些捆绑包两个版本的名字不一样) weapenlist = await fetch_bundle_weapen_byname(name) - #print(weapenlist) cm = CardMessage() c = Card(Module.Section(Element.Text(f"已为您查询到 `{name}` 相关捆绑包", Types.Text.KMD))) for b in ValBundleList: @@ -1692,7 +1676,6 @@ async def get_bundle(msg: Message, *arg): res_price = fetch_item_price_bylist(w['lv_uuid']) if res_price != None: # 有可能出现返回值里面找不到这个皮肤的价格的情况,比如冠军套 price = res_price['Cost']['85ad13f7-3d1b-5128-9eb2-7cd8ee0b5741'] - #text += f"{w['displayName']} \t- vp {price}\n" text += '%-28s\t- vp%5s\n' % (w['displayName'], price) else: # 找不到价格就直接插入武器名字 text += f"{w['displayName']}\n" @@ -2036,12 +2019,10 @@ async def auto_skin_notify(): #直接获取商店图片 draw_time = time.time() #开始计算画图需要的时间 img_shop_path = f"./log/img_temp_vip/shop/{vip}.png" - play_currency = await fetch_valorant_point(userdict)#获取用户的vp和rp - vp = play_currency["Balances"]["85ad13f7-3d1b-5128-9eb2-7cd8ee0b5741"] #vp - rp = play_currency["Balances"]["e59aa87c-4cbf-517a-5983-6e81511be9b7"] #R点 + play_currency = await fetch_vp_rp_dict(userdict)#获取用户的vp和rp # 设置用户背景图,如果在则用,否则返回err background_img = ('err' if vip not in VipShopBgDict['bg'] else VipShopBgDict['bg'][vip]["background"][0]) - img_ret = await get_shop_img_169(list_shop,vp=vp,rp=rp,bg_img_src=background_img) + img_ret = await get_shop_img_169(list_shop,vp=play_currency['vp'],rp=play_currency['rp'],bg_img_src=background_img) if img_ret['status']: bg_shop = img_ret['value'] bg_shop.save(img_shop_path, format='PNG') From 862d9a899bab0bf35083014c5e97dad4ccbdf86a Mon Sep 17 00:00:00 2001 From: Ewait Date: Mon, 23 Jan 2023 10:35:12 +0800 Subject: [PATCH 14/16] feat(main): add __name__ in main --- code/main.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/main.py b/code/main.py index d4cddc4..af5eaed 100644 --- a/code/main.py +++ b/code/main.py @@ -2502,5 +2502,6 @@ async def loading_channel_cookie(): # 开机的时候打印一次时间,记录重启时间 print(f"[BOT] Start at: [%s]" % start_time) -# 开机 -# bot.run() \ No newline at end of file +# 开机 (如果是主文件就开机) +if __name__ == '__main__': + bot.run() \ No newline at end of file From cb0594e3193b014ee6367227d4022ddb94da735a Mon Sep 17 00:00:00 2001 From: Ewait Date: Mon, 23 Jan 2023 11:34:13 +0800 Subject: [PATCH 15/16] feat(botlog): add pm-block-check for APIRequestFailed_Handler --- code/endpoints/BotLog.py | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/code/endpoints/BotLog.py b/code/endpoints/BotLog.py index 304db8f..d1c8500 100644 --- a/code/endpoints/BotLog.py +++ b/code/endpoints/BotLog.py @@ -3,7 +3,7 @@ import traceback from khl import Message, PrivateMessage, Bot from khl.card import Card, CardMessage, Element, Module, Types, Struct -from endpoints.KookApi import guild_list, guild_view, upd_card, icon_cm +from endpoints.KookApi import guild_list, guild_view, upd_card, get_card, icon_cm from PIL import Image, ImageDraw, ImageFont from copy import deepcopy @@ -114,8 +114,8 @@ async def log_bot_list(msg:Message): async def APIRequestFailed_Handler(def_name:str,excp,msg:Message,bot:Bot,send_msg=None,cm:CardMessage=None): err_str = f"ERR! [{GetTime()}] {def_name} APIRequestFailed\n{excp}" print(err_str) - cm0 = CardMessage() - c = Card(color='#fb4b57') + text = f"啊哦,出现了一些问题" + text_sub= 'e' if "引用不存在" in excp:#引用不存在的时候,直接向频道或者用户私聊重新发送消息 if isinstance(msg, PrivateMessage): cur_user = await bot.client.fetch_user(msg.author_id) @@ -124,17 +124,18 @@ async def APIRequestFailed_Handler(def_name:str,excp,msg:Message,bot:Bot,send_ms cur_ch = await bot.client.fetch_public_channel(msg.ctx.channel.id) await bot.send(cur_ch,cm) print(f"[APIRequestFailed.Handler] Au:{msg.author_id} 引用不存在, cm_send success!") + return elif "json没有通过验证" in excp: - print(f"ERR! Au:{msg.author_id} json.dumps(cm)") - print(json.dumps(cm)) - text = f"啊哦,发送的消息出现了一些问题" - c.append(Module.Section(Element.Text(text, Types.Text.KMD), Element.Image(src=icon_cm.lagging, size='sm'))) - c.append(Module.Context(Element.Text(f"卡片消息json没有通过验证或者不存在", Types.Text.KMD))) - cm0.append(c) - if send_msg != None: # 非none则执行更新消息,而不是直接发送 - await upd_card(send_msg['msg_id'], cm0, channel_type=msg.channel_type) - else: - await msg.reply(cm0) + print(f"ERR! Au:{msg.author_id} json.dumps(cm) = {json.dumps(cm)}") + text_sub = f"卡片消息json没有通过验证或者不存在" + elif "屏蔽" in excp: + text_sub = f"阿狸无法向您发出私信,请检查你的隐私设置" + + cm0 = await get_card(text,text_sub,icon_cm.lagging) + if send_msg != None: # 非none则执行更新消息,而不是直接发送 + await upd_card(send_msg['msg_id'], cm0, channel_type=msg.channel_type) + else: + await msg.reply(cm0) # 基础错误的处理,带login提示(部分命令不需要这个提示) async def BaseException_Handler(def_name:str,excp,msg:Message,bot:Bot,send_msg=None,cm:CardMessage=None,help="您可能需要重新执行/login操作"): From 1357073964d93531d2b55d59642d426a0c63c786 Mon Sep 17 00:00:00 2001 From: Ewait Date: Mon, 23 Jan 2023 11:35:03 +0800 Subject: [PATCH 16/16] refactor(main): use get_card,BaseException_Handler in notify cmd --- code/main.py | 94 ++++++++++++++-------------------------------------- 1 file changed, 24 insertions(+), 70 deletions(-) diff --git a/code/main.py b/code/main.py index af5eaed..884b53d 100644 --- a/code/main.py +++ b/code/main.py @@ -51,6 +51,8 @@ #在bot一开机的时候就获取log频道作为全局变量 debug_ch = None cm_send_test = None +NOTIFY_NUM = 3 # 非vip用户皮肤提醒栏位 +RATE_LIMITED_TIME = 180 # 全局登录速率超速等待秒数 #记录开机时间 start_time = GetTime() @@ -2181,28 +2183,18 @@ async def add_skin_notify(msg: Message, *arg): # 检查用户的提醒栏位 vip_status = await vip_ck(msg.author_id) if msg.author_id in SkinNotifyDict['data'] and not vip_status: - if len(SkinNotifyDict['data'][msg.author_id]) > 2: - cm = CardMessage() - c = Card(color='#fb4b57') - c.append( - Module.Section(Element.Text(f"您的皮肤提醒栏位已满", Types.Text.KMD), - Element.Image(src=icon_cm.rgx_broken, size='sm'))) - c.append( - Module.Context( - Element.Text(f"想解锁更多栏位,可以来[支持一下](https://afdian.net/a/128ahri?tab=shop)阿狸呢!", Types.Text.KMD))) - cm.append(c) + if len(SkinNotifyDict['data'][msg.author_id]) > NOTIFY_NUM: + cm = await get_card(f"您的皮肤提醒栏位已满", + f"想解锁更多栏位,可以来[支持一下](https://afdian.net/a/128ahri?tab=shop)阿狸呢!", + icon_cm.rgx_broken) await msg.reply(cm) return #用户没有登录 if msg.author_id not in UserAuthDict: - cm = CardMessage() - text = "您尚未登陆!请「私聊」使用login命令进行登录操作\n" - c = Card(color='#fb4b57') - c.append( - Module.Section(Element.Text(text, Types.Text.KMD), Element.Image(src=icon_cm.whats_that, size='sm'))) - c.append(Module.Context(Element.Text("「/login 账户 密码」请确认您知晓这是一个风险操作\n设置了皮肤提醒之后,请勿切换已登录的账户", Types.Text.KMD))) - cm.append(c) + cm = await get_card("您尚未登陆!请「私聊」使用login命令进行登录操作", + f"「/login 账户 密码」请确认您知晓这是一个风险操作", + icon_cm.whats_that) await msg.reply(cm) return @@ -2238,18 +2230,9 @@ async def add_skin_notify(msg: Message, *arg): Module.Section(Element.Text(text + "\n\n使用 `/sts 序号` 来选择", Types.Text.KMD))) cm.append(c) await msg.reply(cm) - - except Exception as result: - err_str = f"ERR! [{GetTime()}] addskin\n```\n{traceback.format_exc()}\n```" - print(err_str) - cm2 = CardMessage() - c = Card(Module.Header(f"很抱歉,发生了一些错误"), Module.Divider()) - c.append(Module.Section(Element.Text(f"{err_str}\n您可能需要重新执行login操作", Types.Text.KMD))) - c.append(Module.Divider()) - c.append(Module.Section('有任何问题,请加入帮助服务器与我联系', Element.Button('帮助', 'https://kook.top/gpbTwZ', - Types.Click.LINK))) - cm2.append(c) - await msg.reply(cm2) + + except Exception as result: # 其他错误 + await BaseException_Handler("notify-add",traceback.format_exc(),msg,bot,None,cm) #选择皮肤(这个命令必须跟着上面的命令用) @@ -2269,21 +2252,8 @@ async def select_skin_notify(msg: Message, n: str = "err", *arg): # 先发送一个私聊消息,作为测试(避免有人开了不给私信) user_test = await bot.client.fetch_user(msg.author_id) - try: - await user_test.send(f"这是一个私信测试。请不要修改您的私信权限,以免notify功能无法正常使用") - except requester.HTTPRequester.APIRequestFailed as result: - err_str = f"ERR! [{GetTime()}] notify-sts Au:{msg.author_id}\n" - if '屏蔽' in str(result):#如果用户不允许bot私信,则发送提示信息 - err_str+=f"```\n{result}\n```\nreply to inform user" - await msg.reply(f"阿狸无法向您发起私信,请修改您的隐私设置,或者私聊阿狸使用相关命令\n{err_str}") - else: - err_str+=f"```\n{traceback.format_exc()}\n```\n" - await msg.reply(err_str) - #发送信息到日志频道 - await bot.client.send(debug_ch, err_str) - print(err_str) - return - + await user_test.send(f"这是一个私信测试。请不要修改您的私信权限,以免notify功能无法正常使用") + # 测试通过,继续后续插入 S_skin = UserStsDict[msg.author_id][num] if msg.author_id not in SkinNotifyDict['data']: SkinNotifyDict['data'][msg.author_id] = {} @@ -2299,28 +2269,14 @@ async def select_skin_notify(msg: Message, n: str = "err", *arg): print(f"[sts] Au:{msg.author_id} ", text) else: await msg.reply(f"您需要(重新)执行 `/notify-a` 来设置提醒皮肤") - except requester.HTTPRequester.APIRequestFailed as result: - err_str = f"ERR! [{GetTime()}] select_skin_inform\n```\n{result}\n```" - print(err_str) - cm2 = CardMessage() - c = Card(Module.Header(f"很抱歉,发生了一些错误"), Module.Divider()) - c.append(Module.Section(Element.Text(f"{err_str}\n您是否开启了不允许私信?请检查您的私信权限设置\n这会影响notify功能的使用", Types.Text.KMD))) - c.append(Module.Divider()) - c.append(Module.Section('有任何问题,请加入帮助服务器与我联系', Element.Button('帮助', 'https://kook.top/gpbTwZ', - Types.Click.LINK))) - cm2.append(c) - await msg.reply(cm2) - except Exception as result: - err_str = f"ERR! [{GetTime()}] select_skin_inform\n```\n{traceback.format_exc()}\n```" - print(err_str) - cm2 = CardMessage() - c = Card(Module.Header(f"很抱歉,发生了一些错误"), Module.Divider()) - c.append(Module.Section(Element.Text(f"{err_str}\n您可能需要重新执行操作", Types.Text.KMD))) - c.append(Module.Divider()) - c.append(Module.Section('有任何问题,请加入帮助服务器与我联系', Element.Button('帮助', 'https://kook.top/gpbTwZ', - Types.Click.LINK))) - cm2.append(c) - await msg.reply(cm2) + except requester.HTTPRequester.APIRequestFailed as result: #消息发送失败 + err_str = f"ERR! [{GetTime()}] sts\n```\n{traceback.format_exc()}\n```\n" + await bot.client.send(debug_ch, err_str) + await APIRequestFailed_Handler("sts",traceback.format_exc(),msg,bot,None) + except Exception as result: # 其他错误 + err_str = f"ERR! [{GetTime()}] sts\n```\n{traceback.format_exc()}\n```\n" + await bot.client.send(debug_ch, err_str) + await BaseException_Handler("sts",traceback.format_exc(),msg,bot,None) # 显示当前设置好了的皮肤通知 @@ -2341,9 +2297,8 @@ async def list_skin_notify(msg: Message, *arg): await msg.reply(text) except Exception as result: err_str = f"ERR! [{GetTime()}] notify-list\n```\n{traceback.format_exc()}\n```" - print(err_str) - await msg.reply(err_str) await bot.client.send(debug_ch, err_str) + await BaseException_Handler("notify-list",traceback.format_exc(),msg,bot,None) # 删除已有皮肤通知 @@ -2367,9 +2322,8 @@ async def delete_skin_notify(msg: Message, uuid: str = "err", *arg): return except Exception as result: err_str = f"ERR! [{GetTime()}] notify-del\n```\n{traceback.format_exc()}\n```" - print(err_str) - await msg.reply(err_str) await bot.client.send(debug_ch, err_str) + await BaseException_Handler("notify-del",traceback.format_exc(),msg,bot,None) #当出现某些问题的时候,通知人员