user_service.py 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. """
  2. 用户服务模块
  3. """
  4. import uuid
  5. import logging
  6. from typing import Dict, Optional
  7. from datetime import datetime
  8. from database import db_manager
  9. logger = logging.getLogger(__name__)
  10. class UserService:
  11. """用户管理服务"""
  12. async def create_guest_user(self, username: str = "", bot_name: Optional[str] = None) -> Dict:
  13. """
  14. 创建游客用户
  15. Args:
  16. username: 用户名(默认为空字符串)
  17. bot_name: 用户给机器人取的名字(可选)
  18. Returns:
  19. 用户信息字典(包含user_id)
  20. """
  21. try:
  22. # 生成唯一用户ID
  23. user_id = str(uuid.uuid4())
  24. # 插入用户到数据库
  25. query = """
  26. INSERT INTO users
  27. (user_id, username, user_type, bot_name, created_at)
  28. VALUES (%(user_id)s, %(username)s, %(user_type)s, %(bot_name)s, NOW())
  29. """
  30. await db_manager.execute_update(query, {
  31. "user_id": user_id,
  32. "username": username,
  33. "user_type": "guest",
  34. "bot_name": bot_name
  35. })
  36. logger.info(f"✅ 创建游客用户成功: user_id={user_id}, username={username}, bot_name={bot_name}")
  37. return {
  38. "user_id": user_id,
  39. "username": username,
  40. "user_type": "guest",
  41. "bot_name": bot_name,
  42. "created_at": datetime.now().isoformat()
  43. }
  44. except Exception as e:
  45. logger.error(f"❌ 创建用户失败: {e}")
  46. raise
  47. async def get_user(self, user_id: str) -> Optional[Dict]:
  48. """
  49. 获取用户信息
  50. Args:
  51. user_id: 用户ID
  52. Returns:
  53. 用户信息字典,如果不存在返回None
  54. """
  55. try:
  56. query = """
  57. SELECT user_id, username, user_type, bot_name, phone,
  58. is_verified, registered_at, total_messages,
  59. total_rounds, total_speech_duration_ms, last_active_at, created_at
  60. FROM users
  61. WHERE user_id = %(user_id)s
  62. """
  63. user = await db_manager.execute_one(query, {"user_id": user_id})
  64. if user:
  65. # 转换datetime对象为ISO格式字符串
  66. if user.get('created_at'):
  67. user['created_at'] = user['created_at'].isoformat()
  68. if user.get('last_active_at'):
  69. user['last_active_at'] = user['last_active_at'].isoformat()
  70. if user.get('registered_at'):
  71. user['registered_at'] = user['registered_at'].isoformat()
  72. return user
  73. except Exception as e:
  74. logger.error(f"❌ 获取用户信息失败: user_id={user_id}, error={e}")
  75. return None
  76. async def update_user_last_active(self, user_id: str):
  77. """
  78. 更新用户最后活跃时间
  79. Args:
  80. user_id: 用户ID
  81. """
  82. try:
  83. query = """
  84. UPDATE users
  85. SET last_active_at = NOW()
  86. WHERE user_id = %(user_id)s
  87. """
  88. await db_manager.execute_update(query, {"user_id": user_id})
  89. except Exception as e:
  90. logger.warning(f"⚠️ 更新用户活跃时间失败: user_id={user_id}, error={e}")
  91. async def update_username(self, user_id: str, username: str) -> bool:
  92. """
  93. 更新用户名
  94. Args:
  95. user_id: 用户ID
  96. username: 用户名
  97. Returns:
  98. 是否更新成功
  99. """
  100. try:
  101. query = """
  102. UPDATE users
  103. SET username = %(username)s
  104. WHERE user_id = %(user_id)s
  105. """
  106. await db_manager.execute_update(query, {
  107. "user_id": user_id,
  108. "username": username
  109. })
  110. logger.info(f"✅ 更新用户名成功: user_id={user_id}, username={username}")
  111. return True
  112. except Exception as e:
  113. logger.error(f"❌ 更新用户名失败: user_id={user_id}, error={e}")
  114. return False
  115. async def update_bot_name(self, user_id: str, bot_name: str) -> bool:
  116. """
  117. 更新用户给机器人取的名字
  118. Args:
  119. user_id: 用户ID
  120. bot_name: 机器人名字
  121. Returns:
  122. 是否更新成功
  123. """
  124. try:
  125. query = """
  126. UPDATE users
  127. SET bot_name = %(bot_name)s
  128. WHERE user_id = %(user_id)s
  129. """
  130. await db_manager.execute_update(query, {
  131. "user_id": user_id,
  132. "bot_name": bot_name
  133. })
  134. logger.info(f"✅ 更新机器人名字成功: user_id={user_id}, bot_name={bot_name}")
  135. return True
  136. except Exception as e:
  137. logger.error(f"❌ 更新机器人名字失败: user_id={user_id}, error={e}")
  138. return False
  139. async def update_speech_duration(self, user_id: str, duration_ms: int) -> bool:
  140. """
  141. 更新用户累积说话时长
  142. Args:
  143. user_id: 用户ID
  144. duration_ms: 本次说话时长(毫秒)
  145. Returns:
  146. 是否更新成功
  147. """
  148. try:
  149. if duration_ms <= 0:
  150. return True # 时长无效,跳过更新
  151. query = """
  152. UPDATE users
  153. SET total_speech_duration_ms = total_speech_duration_ms + %(duration_ms)s
  154. WHERE user_id = %(user_id)s
  155. """
  156. await db_manager.execute_update(query, {
  157. "user_id": user_id,
  158. "duration_ms": duration_ms
  159. })
  160. logger.info(f"✅ 更新用户说话时长成功: user_id={user_id}, duration_ms={duration_ms}")
  161. return True
  162. except Exception as e:
  163. logger.error(f"❌ 更新用户说话时长失败: user_id={user_id}, error={e}")
  164. return False
  165. # 全局用户服务实例
  166. user_service = UserService()