mirror of
https://github.com/A-Minos/nonebot-plugin-tetris-stats.git
synced 2026-03-05 05:36:54 +08:00
80 lines
3.4 KiB
Python
80 lines
3.4 KiB
Python
from re import match, sub
|
||
|
||
|
||
async def handleBindMessage(message: str, gameType: str) -> tuple[str | None, tuple]:
|
||
'''返回值为tuple[gameType, tuple[message, user]]'''
|
||
_CMD_ALIASES = {'IO': ['io绑定', 'iobind'],
|
||
'TOP': ['top绑定', 'topbind']}
|
||
# 剔除命令前缀
|
||
for i in _CMD_ALIASES[gameType]:
|
||
if match(rf'(?i){i}', message):
|
||
message = sub(rf'(?i){i}', '', message)
|
||
message = message.strip()
|
||
break
|
||
else:
|
||
raise ValueError(
|
||
'[TETRIS STATS] MessageAnalyzer.handleBindMessage: 预期外行为,请上报GitHub')
|
||
if message == '' or message.isspace():
|
||
return (None, ('用户名为空', None))
|
||
else:
|
||
return await checkName(message, gameType)
|
||
|
||
|
||
async def handleStatsQueryMessage(message: str, gameType: 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']
|
||
# 剔除命令前缀
|
||
for i in _CMD_ALIASES[gameType]:
|
||
if match(rf'(?i){i}', message):
|
||
message = sub(rf'(?i){i}', '', message)
|
||
message = message.strip()
|
||
break
|
||
if message == '' or message.isspace():
|
||
return (None, ('用户名为空', None))
|
||
else:
|
||
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 checkName(message, gameType)
|
||
|
||
|
||
async def checkName(name: str, gameType: str) -> tuple[str | None, tuple]:
|
||
'''返回值为tuple[gameType, tuple[message, user]]'''
|
||
if gameType == 'IO':
|
||
if match(r'^[a-f0-9]{24}$', name):
|
||
return ('ID', (None, name))
|
||
elif match(r'^[a-zA-Z0-9_-]{3,16}$', name):
|
||
return ('Name', (None, name.lower()))
|
||
else:
|
||
return (None, ('用户名不合法', None))
|
||
elif gameType == 'TOP':
|
||
if match(r'^[a-zA-Z0-9_]{1,16}$', name):
|
||
return ('Name', (None, name))
|
||
else:
|
||
return (None, ('用户名不合法', None))
|
||
elif gameType == '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))
|
||
elif name.isdigit() is True:
|
||
return ('QQ', (None, name))
|
||
else:
|
||
return (None, ('用户名不合法', None))
|
||
else:
|
||
return (None, ('游戏类型错误', None))
|