mirror of
https://github.com/A-Minos/nonebot-plugin-tetris-stats.git
synced 2026-03-05 05:36:54 +08:00
代码规范:使用PEP8推荐的命名规范 删除Request模块,改为每个游戏的processor单独实现,因为每个游戏的api请求都不太一样 对于io_data_processor: 1. 引入了playwright以应对api套的cloudflare五秒盾 对于top_data_processor: 1. 添加了lxml和pandas的stubs库,并修复了所有type hint错误 对于sql: 1. 使用全局变量保存数据库连接对象,理论上运行一次只会连接一次数据库 2. 移动初始化数据库的hook函数到sql.py 其他: 优化代码 版本推进
76 lines
3.5 KiB
Python
76 lines
3.5 KiB
Python
from re import match, sub
|
|
|
|
|
|
async def handle_bind_message(message: str, game_type: str) -> tuple[str | None, tuple]:
|
|
'''返回值为tuple[gameType, tuple[message, user]]'''
|
|
_cmd_aliases = {'IO': ['io绑定', 'iobind'],
|
|
'TOP': ['top绑定', 'topbind']}
|
|
# 剔除命令前缀
|
|
for i in _cmd_aliases[game_type]:
|
|
if match(rf'(?i){i}', message):
|
|
message = sub(rf'(?i){i}', '', message)
|
|
message = message.strip()
|
|
break
|
|
else:
|
|
raise ValueError('预期外行为, 请上报GitHub')
|
|
if message == '' or message.isspace():
|
|
return (None, ('用户名为空', None))
|
|
return await check_name(message, game_type)
|
|
|
|
|
|
async def handle_stats_query_message(message: str, game_type: str) -> tuple[str | None, tuple]:
|
|
'''返回值为tuple[gameType, tuple[message, user]]'''
|
|
_cmd_aliases = {'IO': ['io查', 'iostats'],
|
|
'TOS': ['tos查', 'tostats', 'tosstats', '茶服查', '茶服stats'],
|
|
'TOP': ['top查', 'topstats']}
|
|
_me = ['我', '自己', '我等', '卑人', '愚', '老身', '爷', '老娘', '本姑娘', '本大爷', '鄙人', '寡人',
|
|
'小生', '贫僧', '本人', '孤', '吾', '俺', '咱', '私', 'me', '洒家', '在下', '偶', '人家',
|
|
'本小姐', '老夫', '老子', '朕', '本尊', '僕', '拙者', '妾', '儂', '自分', '吾輩', '我輩', '某',
|
|
'己等', '俺等', '此方', '哥', '姐', '劳资', '本宝宝', '余', '本喵', 'watashi', 'i', 'myself',
|
|
'self', 'oneself']
|
|
# 剔除命令前缀
|
|
for i in _cmd_aliases[game_type]:
|
|
if match(rf'(?i){i}', message):
|
|
message = sub(rf'(?i){i}', '', message)
|
|
message = message.strip()
|
|
break
|
|
if message == '' or message.isspace():
|
|
return (None, ('用户名为空', None))
|
|
if message.startswith('[CQ:at,qq='):
|
|
try:
|
|
user = int(str(message).split('[CQ:at,qq=')[1].split(']')[0])
|
|
except ValueError:
|
|
return (None, ('QQ号码不合法', None))
|
|
else:
|
|
return ('AT', (None, user))
|
|
elif message in _me:
|
|
# 会不会有人叫本姑娘 本大爷这种或许可以成为id的名字呢
|
|
# TODO: 在判断是否可能是查自己的情况的时候 也去判断是否能成立为一个UserName
|
|
return ('ME', (None, None))
|
|
else:
|
|
return await check_name(message, game_type)
|
|
|
|
|
|
async def check_name(name: str, game_type: str) -> tuple[str | None, tuple]:
|
|
'''返回值为tuple[gameType, tuple[message, user]]'''
|
|
if game_type == 'IO':
|
|
if match(r'^[a-f0-9]{24}$', name):
|
|
return ('ID', (None, name))
|
|
if match(r'^[a-zA-Z0-9_-]{3,16}$', name):
|
|
return ('Name', (None, name.lower()))
|
|
return (None, ('用户名不合法', None))
|
|
if game_type == 'TOP':
|
|
if match(r'^[a-zA-Z0-9_]{1,16}$', name):
|
|
return ('Name', (None, name))
|
|
return (None, ('用户名不合法', None))
|
|
if game_type == 'TOS':
|
|
if (match(r'^(?!\.)(?!com[0-9]$)(?!con$)(?!lpt[0-9]$)(?!nul$)(?!prn$)[^\-][^\+][^\|\*\?\\\s\!:<>/$"]*[^\.\|\*\?\\\s\!:<>/$"]+$', name)
|
|
and name.isdigit() is False
|
|
and 2 <= len(name) <= 18):
|
|
# 虽然我也不想这么长 但是似乎确实得这么长
|
|
return ('Name', (None, name))
|
|
if name.isdigit() is True:
|
|
return ('QQ', (None, name))
|
|
return (None, ('用户名不合法', None))
|
|
return (None, ('游戏类型错误', None))
|