refactor(bf-bot): 插件重构为 handlers/services/utils 分层,资源归入 res/

- 旧平铺模块(data/data_utils/database_op/image_builder*/get_bf6_data/
  gametools_bf6/bf6_data/img_utils)拆分为 handlers(绑定/查询)、
  services(fetchers/processing/query)、utils(渲染/参数)分层;
  新增 repository.py / config.py / paths.py
- 字体/图片/模板资源迁入 res/,新增 BF2042 卡面素材(bg/object_icon 等)
- browser_ext/:BF2042 扩展捕获桥(WS 直连兜底通道)源码入库
- 新增 hexi/web/src/plugins/bf_bot 前端管理页
- 新增 tests:test_bf_bot_helpers / repository / tracker_api

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
sansenhoshiandClaude Code committed 2026-10-13 17:53:06 +08:00
1 parent 614e1d7e00
commit a31aab00e8
752 files changed
+6241 -2506

No files matched your search

@@ -0,0 +1,116 @@
"""绑定编排:/bfbind、/unbind、/update_bind 的业务流程。
只做数据操作与文案产出(返回给用户的字符串),不直接发消息。
"""
from __future__ import annotations
import sqlite3
from nonebot import logger
from ..repository import UserManager
from .fetchers.gametools import (
get_player_info_by_ea_id,
get_player_info_by_name,
player_display_name,
)
_PLATFORM = "pc"
async def bind(qq_id: str, player_name: str) -> str:
"""绑定 QQ ↔ EAID;已绑/被他人占用/查无此人都给出对应提示。"""
manager = UserManager()
user_record = manager.get_user_by_qq(qq_id)
if user_record:
info = await get_player_info_by_ea_id(
user_record["ea_player_id"], user_record["ea_user_id"], _PLATFORM
)
name = player_display_name(info, user_record["ea_player_name"])
return f"您已经将账号绑定到: {name},如果你需要更改绑定请发送 修改绑定 EAID "
player_name = (player_name or "").strip()
if not player_name:
return "请提供要绑定的 EAID,例如:绑定 YourEAID"
user_info = await get_player_info_by_name(player_name, _PLATFORM)
if "errors" in user_info:
return "未找到玩家,请检查是否拼写正确"
player_id = user_info["personaId"]
user_id = user_info["userId"]
player_name = player_display_name(user_info, player_name)
logger.info(f"QQ号:{qq_id},EA双ID:{player_id}-{user_id}")
# 检测ea账号是否被绑定至其他qq(EA 三字段 UNIQUE,靠这里预检兜住)
bind_record = manager.get_user_by_ea_id(user_id)
if bind_record:
return (
f"您的EA账号 {bind_record['ea_player_name']} 已经绑定到: "
f"{bind_record['qq_id']},请您确认绑定的EAID"
)
try:
record = manager.add_user(qq_id, player_name, player_id, user_id, "[]", "[]")
except sqlite3.IntegrityError as err:
logger.warning(f"绑定撞 UNIQUE 约束:{err}")
return "该 EA 账号已被绑定,请确认绑定的 EAID"
logger.info(f"插入数据返回结果:{record}")
if record > 0:
return f"您已经成功绑定至: {player_name}"
return "绑定失败,请稍后再试"
async def unbind(qq_id: str) -> str:
manager = UserManager()
user_record = manager.get_user_by_qq(qq_id)
if not user_record:
return "未查询到绑定记录"
info = await get_player_info_by_ea_id(
user_record["ea_player_id"], user_record["ea_user_id"], _PLATFORM
)
name = player_display_name(info, user_record["ea_player_name"])
rows = manager.delete_user_by_qq(qq_id)
if rows > 0:
return f"您已经与: {name} 成功解除绑定,如果你需要重新绑定请发送 修改绑定 EAID "
return "解绑失败,请稍后再试"
async def update_bind(qq_id: str, player_name: str) -> str:
manager = UserManager()
user_record = manager.get_user_by_qq(qq_id)
if not user_record:
return (
f"未查询到绑定记录: {player_name},如果需要绑定,"
f"请@机器人并发送 绑定 {player_name} "
)
player_name = (player_name or "").strip()
if not player_name:
return "请提供要换绑的 EAID,例如:修改绑定 YourEAID"
user_info = await get_player_info_by_name(player_name, _PLATFORM)
if "errors" in user_info:
return "未找到玩家,请检查是否拼写正确"
player_id = user_info["personaId"]
user_id = user_info["userId"]
player_name = player_display_name(user_info, player_name)
logger.info(f"QQ号:{qq_id},EA双ID:{player_id}-{user_id}")
# 与 bind 相同的占用预检;绑给同一个 QQ 时视为无操作继续
bind_record = manager.get_user_by_ea_id(user_id)
if bind_record and str(bind_record["qq_id"]) != str(qq_id):
return (
f"您的EA账号 {bind_record['ea_player_name']} 已经绑定到: "
f"{bind_record['qq_id']},请您确认绑定的EAID"
)
try:
record = manager.update_user(qq_id, player_name, player_id, user_id, "[]", "[]")
except sqlite3.IntegrityError as err:
logger.warning(f"换绑撞 UNIQUE 约束:{err}")
return "该 EA 账号已被绑定,请确认绑定的 EAID"
logger.info(f"修改数据返回结果:{record}")
if record > 0:
return f"您已经成功从:{user_record['ea_player_name']}修改绑定至: {player_name}"
return "修改绑定失败,请稍后再试"