68 lines
2.2 KiB
Python
68 lines
2.2 KiB
Python
"""指令参数解析与展示表(纯函数、无副作用,可单测)。"""
|
|||
|
|
|
||
|
|
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())
|