| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199 |
- """
- 用户服务模块
- """
- import uuid
- import logging
- from typing import Dict, Optional
- from datetime import datetime
- from database import db_manager
- logger = logging.getLogger(__name__)
- class UserService:
- """用户管理服务"""
-
- async def create_guest_user(self, username: str = "", bot_name: Optional[str] = None) -> Dict:
- """
- 创建游客用户
-
- Args:
- username: 用户名(默认为空字符串)
- bot_name: 用户给机器人取的名字(可选)
-
- Returns:
- 用户信息字典(包含user_id)
- """
- try:
- # 生成唯一用户ID
- user_id = str(uuid.uuid4())
-
- # 插入用户到数据库
- query = """
- INSERT INTO users
- (user_id, username, user_type, bot_name, created_at)
- VALUES (%(user_id)s, %(username)s, %(user_type)s, %(bot_name)s, NOW())
- """
-
- await db_manager.execute_update(query, {
- "user_id": user_id,
- "username": username,
- "user_type": "guest",
- "bot_name": bot_name
- })
-
- logger.info(f"✅ 创建游客用户成功: user_id={user_id}, username={username}, bot_name={bot_name}")
-
- return {
- "user_id": user_id,
- "username": username,
- "user_type": "guest",
- "bot_name": bot_name,
- "created_at": datetime.now().isoformat()
- }
-
- except Exception as e:
- logger.error(f"❌ 创建用户失败: {e}")
- raise
-
- async def get_user(self, user_id: str) -> Optional[Dict]:
- """
- 获取用户信息
-
- Args:
- user_id: 用户ID
-
- Returns:
- 用户信息字典,如果不存在返回None
- """
- try:
- query = """
- SELECT user_id, username, user_type, bot_name, phone,
- is_verified, registered_at, total_messages,
- total_rounds, total_speech_duration_ms, last_active_at, created_at
- FROM users
- WHERE user_id = %(user_id)s
- """
-
- user = await db_manager.execute_one(query, {"user_id": user_id})
-
- if user:
- # 转换datetime对象为ISO格式字符串
- if user.get('created_at'):
- user['created_at'] = user['created_at'].isoformat()
- if user.get('last_active_at'):
- user['last_active_at'] = user['last_active_at'].isoformat()
- if user.get('registered_at'):
- user['registered_at'] = user['registered_at'].isoformat()
-
- return user
-
- except Exception as e:
- logger.error(f"❌ 获取用户信息失败: user_id={user_id}, error={e}")
- return None
-
- async def update_user_last_active(self, user_id: str):
- """
- 更新用户最后活跃时间
-
- Args:
- user_id: 用户ID
- """
- try:
- query = """
- UPDATE users
- SET last_active_at = NOW()
- WHERE user_id = %(user_id)s
- """
- await db_manager.execute_update(query, {"user_id": user_id})
- except Exception as e:
- logger.warning(f"⚠️ 更新用户活跃时间失败: user_id={user_id}, error={e}")
-
- async def update_username(self, user_id: str, username: str) -> bool:
- """
- 更新用户名
-
- Args:
- user_id: 用户ID
- username: 用户名
-
- Returns:
- 是否更新成功
- """
- try:
- query = """
- UPDATE users
- SET username = %(username)s
- WHERE user_id = %(user_id)s
- """
- await db_manager.execute_update(query, {
- "user_id": user_id,
- "username": username
- })
- logger.info(f"✅ 更新用户名成功: user_id={user_id}, username={username}")
- return True
- except Exception as e:
- logger.error(f"❌ 更新用户名失败: user_id={user_id}, error={e}")
- return False
-
- async def update_bot_name(self, user_id: str, bot_name: str) -> bool:
- """
- 更新用户给机器人取的名字
-
- Args:
- user_id: 用户ID
- bot_name: 机器人名字
-
- Returns:
- 是否更新成功
- """
- try:
- query = """
- UPDATE users
- SET bot_name = %(bot_name)s
- WHERE user_id = %(user_id)s
- """
- await db_manager.execute_update(query, {
- "user_id": user_id,
- "bot_name": bot_name
- })
- logger.info(f"✅ 更新机器人名字成功: user_id={user_id}, bot_name={bot_name}")
- return True
- except Exception as e:
- logger.error(f"❌ 更新机器人名字失败: user_id={user_id}, error={e}")
- return False
-
- async def update_speech_duration(self, user_id: str, duration_ms: int) -> bool:
- """
- 更新用户累积说话时长
-
- Args:
- user_id: 用户ID
- duration_ms: 本次说话时长(毫秒)
-
- Returns:
- 是否更新成功
- """
- try:
- if duration_ms <= 0:
- return True # 时长无效,跳过更新
-
- query = """
- UPDATE users
- SET total_speech_duration_ms = total_speech_duration_ms + %(duration_ms)s
- WHERE user_id = %(user_id)s
- """
- await db_manager.execute_update(query, {
- "user_id": user_id,
- "duration_ms": duration_ms
- })
- logger.info(f"✅ 更新用户说话时长成功: user_id={user_id}, duration_ms={duration_ms}")
- return True
- except Exception as e:
- logger.error(f"❌ 更新用户说话时长失败: user_id={user_id}, error={e}")
- return False
- # 全局用户服务实例
- user_service = UserService()
|