"""绑定编排:/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 "修改绑定失败,请稍后再试"