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