Files
HeXi/hexi/plugins/nonebot_plugin_bf_bot/services/binding.py
T
sansenhoshiandClaude Code a31aab00e8 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>
2026-10-13 17:53:06 +08:00

117 lines
4.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""绑定编排:/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 "修改绑定失败,请稍后再试"