6.7 KiB
6.7 KiB
背景
文件名: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与名称绑定。
核心需求
- 用户可以通过
.register name命令注册或更新自己的名称 - 这个名称是全局的,所有游戏和功能都可以使用
- 积分赠送功能需要支持通过用户名查找用户,而不仅仅是用户ID
- 需要一个全局的用户名称解析机制
问题背景
目前消息传递中的用户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 # 消息发送
分析
当前状态
users表已经有username字段,但没有被充分利用get_or_create_user()可以接收 username 参数,但实际调用时没有传gift.py目前只能通过用户ID进行赠送- 缺少通过用户名查找用户的功能
关键技术点
- 数据库层: 需要添加根据 username 查找用户的方
- 需要添加更新用户名的功能
- 指令解析层: 需要添加
.register指令的识别 - 路由层: 需要添加 register 类型的处理逻辑
- 应用层: 需要实现注册逻辑,并修改 gift 功能支持用户名
提议的解决方案
方案概述
- 在
database.py中添加两个方法:get_user_by_name(username: str)- 根据用户名查找用户update_user_name(user_id: int, username: str)- 更新用户名称
- 在
parser.py中添加.register指令映射 - 在
callback.py中添加 register 类型的处理逻辑 - 修改
gift.py支持通过用户名赠送积分 - 创建注册处理逻辑(可以单独文件或集成到 callback)
设计决策
- 用户名作为额外的查找方式,但不替代 user_id(保持数据库主键稳定)
- 用户名不强制唯一(允许相同昵称)
- 注册功能独立于游戏模块,放在顶层处理
当前执行步骤:"3. 等待用户确认"
详细实施计划
文件1: core/database.py
添加方法1: get_user_by_name()
def get_user_by_name(self, username: str) -> Optional[Dict]:
"""根据用户名查找用户
Args:
username: 用户名
Returns:
用户信息字典,如果不存在返回None
"""
添加方法2: update_user_name()
def update_user_name(self, user_id: int, username: str) -> bool:
"""更新用户名称
Args:
user_id: 用户ID
username: 新用户名
Returns:
是否成功
"""
添加数据库索引
在 init_tables() 方法中添加:
CREATE INDEX IF NOT EXISTS idx_username ON users(username)
文件2: utils/parser.py
修改 COMMAND_MAP
在现有的 COMMAND_MAP 中添加:
'.register': 'register',
'.注册': 'register',
文件3: routers/callback.py
在 handle_command() 中添加处理
在现有游戏类型判断后添加:
# 注册系统
if game_type == 'register':
return await handle_register_command(command, chat_id, user_id)
添加处理函数
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两种格式:
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 的问题,以及@前缀处理不完整的问题
- 阻碍因素:无
- 状态:未确认
最终审查
[等待实施]