Files
HeXi/hexi/plugins/nonebot_plugin_bf_bot/utils/args.py
T

68 lines
2.2 KiB
Python
Raw Normal View History

"""指令参数解析与展示表(纯函数、无副作用,可单测)。"""
from dataclasses import dataclass
# 游戏代号 -> 中文展示名(回复文案用)
BF_GAME_NAMES = {
"bf3": "战地3",
"bf4": "战地4",
"bf1": "战地1",
"bfv": "战地5",
"bf2042": "战地2042",
"bf6": "战地6",
}
# BF2042 取数失败原因 -> 给用户看的话(detail 只写日志不刷屏)
BF2042_ERROR_HINT = {
"not_found": "未找到该玩家,请检查 EAID 拼写是否正确",
"ext_offline": "查询服务未就绪(取数浏览器未连接),请联系管理员",
"timeout": "访问 tracker.gg 超时,请稍后再试",
"auth": "查询服务登录态异常,请联系管理员",
"error": "tracker.gg 取数失败,请稍后再试",
}
# 子命令关键词 -> (视图, 榜单类型)。不打关键词就是生涯卡
_BF2042_VIEWS = {
"武器": ("list", "weapon"),
"枪械": ("list", "weapon"),
"weapon": ("list", "weapon"),
"weapons": ("list", "weapon"),
"载具": ("list", "vehicle"),
"vehicle": ("list", "vehicle"),
"vehicles": ("list", "vehicle"),
"装备": ("list", "gadget"),
"道具": ("list", "gadget"),
"gadget": ("list", "gadget"),
"gadgets": ("list", "gadget"),
"模式": ("gamemode", ""),
"gamemode": ("gamemode", ""),
}
@dataclass(frozen=True)
class Bf2042Target:
"""BF2042 指令解析结果。
view: career(生涯卡)/ list(榜单卡)/ gamemode(模式明细)
kind: 榜单类型 weapon/vehicle/gadget,仅 view=list 时非空
player: 玩家名;空串 = 未指定,用绑定记录
"""
view: str = "career"
kind: str = ""
player: str = ""
def parse_bf2042_args(input_text: str) -> Bf2042Target:
"""拆出 BF2042 子命令关键词,返回目标。
首个词不是关键词时整串都当玩家名(生涯卡),所以玩家名里有空格也不受影响。
"""
text = (input_text or "").strip()
if not text:
return Bf2042Target()
head, _, rest = text.partition(" ")
view = _BF2042_VIEWS.get(head.lower())
if view is None:
return Bf2042Target(view="career", kind="", player=text)
return Bf2042Target(view=view[0], kind=view[1], player=rest.strip())