Files
WPSBot/.tasks/2025-10-29_1_add-user-register.md

6.7 KiB
Raw Blame History

背景

文件名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()

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 的问题,以及@前缀处理不完整的问题
  • 阻碍因素:无
  • 状态:未确认

最终审查

[等待实施]