mirror of
https://github.com/A-Minos/nonebot-plugin-tetris-stats.git
synced 2026-03-05 05:36:54 +08:00
* 忽略 .idea 文件夹 * 新增查分段指令 * 修复未知段位可能导致程序无限死循环的异常 * 我 keys 呢 * 🎨 整理 import * 🎨 规范引号 * 🐛 记得await * ⚡️ 一些优化 * 🐛 多个逗号 * 🚨 修正typing hint * 🐛 返回值是 tuple 哦 * 🐛 少个逗号 * 🐛 你得删前缀啊 * 🐛 怎么能用 is 呢 * 🐛 记得await * 试图匹配查询格式 * 💬 小改返回消息样式 * 🎨 修改变量名 * 🐛 修复查询大写问题 * 🐛 使用 get_db 获取数据库对象 --------- Co-authored-by: scdhh <wallfjjd@gmail.com>
92 lines
3.9 KiB
Python
92 lines
3.9 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 handle_rank_message(message: str) -> str:
|
|
_cmd_aliases = ['io段位', 'iorank']
|
|
# 剔除命令前缀
|
|
for i in _cmd_aliases:
|
|
if match(rf'(?i){i}', message):
|
|
message = sub(rf'(?i){i}', '', message)
|
|
message = message.strip()
|
|
break
|
|
else:
|
|
raise ValueError('预期外行为, 请上报GitHub')
|
|
return message
|
|
|
|
|
|
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):
|
|
# 虽然我也不想这么长 但是似乎确实得这么长
|
|
# TODO 简化正则表达式
|
|
return 'Name', (None, name)
|
|
if name.isdigit() is True:
|
|
return 'QQ', (None, name)
|
|
return None, ('用户名不合法', None)
|
|
return None, ('游戏类型错误', None)
|