# 背景 文件名:2025-10-29_1_add-user-register.md 创建于:2025-10-29_15:42:51 创建者:admin 主分支:main 任务分支:main Yolo模式:Off # 任务描述 在WPS Bot Game项目中添加用户注册系统,让用户可以通过 `.register name` 命令将用户ID与名称绑定。 ## 核心需求 1. 用户可以通过 `.register name` 命令注册或更新自己的名称 2. 这个名称是全局的,所有游戏和功能都可以使用 3. 积分赠送功能需要支持通过用户名查找用户,而不仅仅是用户ID 4. 需要一个全局的用户名称解析机制 ## 问题背景 目前消息传递中的用户ID和用户名不一致,使用起来非常困难。比如赠送积分时指定用户ID太麻烦了。添加注册系统后,可以使用 `.gift username points` 而不是 `.gift 123456 points`。 # 项目概览 ## 项目结构 ``` WPSBotGame/ ├── app.py # FastAPI主应用 ├── config.py # 配置管理 ├── core/ │ ├── database.py # SQLite数据库操作 │ ├── middleware.py # 中间件 │ └── models.py # 数据模型 ├── routers/ │ ├── callback.py # Callback路由处理 │ └── health.py # 健康检查 ├── games/ # 游戏模块 │ ├── base.py # 游戏基类 │ ├── gift.py # 积分赠送系统 │ └── ... # 其他游戏 └── utils/ ├── parser.py # 指令解析 └── message.py # 消息发送 ``` # 分析 ## 当前状态 1. `users` 表已经有 `username` 字段,但没有被充分利用 2. `get_or_create_user()` 可以接收 username 参数,但实际调用时没有传 3. `gift.py` 目前只能通过用户ID进行赠送 4. 缺少通过用户名查找用户的功能 ## 关键技术点 1. **数据库层**: 需要添加根据 username 查找用户的方 2. 需要添加更新用户名的功能 3. **指令解析层**: 需要添加 `.register` 指令的识别 4. **路由层**: 需要添加 register 类型的处理逻辑 5. **应用层**: 需要实现注册逻辑,并修改 gift 功能支持用户名 # 提议的解决方案 ## 方案概述 1. 在 `database.py` 中添加两个方法: - `get_user_by_name(username: str)` - 根据用户名查找用户 - `update_user_name(user_id: int, username: str)` - 更新用户名称 2. 在 `parser.py` 中添加 `.register` 指令映射 3. 在 `callback.py` 中添加 register 类型的处理逻辑 4. 修改 `gift.py` 支持通过用户名赠送积分 5. 创建注册处理逻辑(可以单独文件或集成到 callback) ## 设计决策 - 用户名作为额外的查找方式,但不替代 user_id(保持数据库主键稳定) - 用户名不强制唯一(允许相同昵称) - 注册功能独立于游戏模块,放在顶层处理 # 当前执行步骤:"3. 等待用户确认" # 详细实施计划 ## 文件1: core/database.py ### 添加方法1: get_user_by_name() ```python def get_user_by_name(self, username: str) -> Optional[Dict]: """根据用户名查找用户 Args: username: 用户名 Returns: 用户信息字典,如果不存在返回None """ ``` ### 添加方法2: update_user_name() ```python def update_user_name(self, user_id: int, username: str) -> bool: """更新用户名称 Args: user_id: 用户ID username: 新用户名 Returns: 是否成功 """ ``` ### 添加数据库索引 在 `init_tables()` 方法中添加: ```sql CREATE INDEX IF NOT EXISTS idx_username ON users(username) ``` ## 文件2: utils/parser.py ### 修改 COMMAND_MAP 在现有的 COMMAND_MAP 中添加: ```python '.register': 'register', '.注册': 'register', ``` ## 文件3: routers/callback.py ### 在 handle_command() 中添加处理 在现有游戏类型判断后添加: ```python # 注册系统 if game_type == 'register': return await handle_register_command(command, chat_id, user_id) ``` ### 添加处理函数 ```python async def handle_register_command(command: str, chat_id: int, user_id: int) -> str: """处理注册命令 Args: command: 完整指令 ".register name" chat_id: 会话ID user_id: 用户ID Returns: 注册结果消息 """ ``` ## 文件4: games/gift.py ### 修改 _process_gift_command() 修改参数解析逻辑,支持用户名和用户ID两种格式: ```python def _process_gift_command(self, args: str, sender_id: int) -> str: # 尝试解析为用户名或用户ID parts = args.split(maxsplit=2) if len(parts) < 2: return "❌ 指令格式错误..." # 检查第一部分是用户名还是ID receiver_input = parts[0] if receiver_input.isdigit(): # 是数字,作为用户ID处理 receiver_id = int(receiver_input) else: # 是用户名,通过数据库查找 user = self.db.get_user_by_name(receiver_input) if not user: return f"❌ 未找到用户: {receiver_input}" receiver_id = user['user_id'] # 继续原有的赠送逻辑... ``` ### 更新帮助信息 在 _get_gift_help() 中更新示例: ``` ".gift username 50 生日快乐" ".gift 123456 50" (仍支持用户ID) ``` # 任务进度 ## 2025-10-29_15:42:51 - 已修改:.tasks/2025-10-29_1_add-user-register.md - 更改:创建任务文件 - 原因:开始实施用户注册系统 - 阻碍因素:无 - 状态:未确认 ## 2025-10-29_15:46:38 - 已修改: - core/database.py(添加 get_user_by_name() 和 update_user_name() 方法,添加 username 索引) - utils/parser.py(添加 .register 和 .注册 命令映射) - routers/callback.py(添加 register 命令处理和 handle_register_command() 函数) - games/gift.py(修改 _process_gift_command() 支持用户名查找,更新帮助信息) - 更改: - 数据库层:添加用户名称查询和更新功能 - 命令解析:注册 .register 命令映射 - 路由处理:实现用户注册逻辑 - 赠送系统:支持通过用户名或ID进行积分赠送 - 原因:实现用户注册系统,让用户可以使用名称替代用户ID - 阻碍因素:无 - 状态:未确认 ## 2025-10-29_16:00:48 - 已修改:utils/parser.py - 更改: - 调整 COMMAND_MAP 顺序,将 .register 放在 .r 之前(避免前缀匹配冲突) - 修复 AT_PATTERN 正则表达式:从 `@\s*\S+\s+(.+)` 改为 `@[^\s]+\s+(.+)`(正确提取@后的完整指令) - 原因:修复 .register 被错误识别为 dice 的问题,以及@前缀处理不完整的问题 - 阻碍因素:无 - 状态:未确认 # 最终审查 [等待实施]