state_manager.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. """NPC状态管理器 - 定时批量更新NPC对话"""
  2. import asyncio
  3. from datetime import datetime
  4. from typing import Dict, Optional
  5. from batch_generator import get_batch_generator
  6. class NPCStateManager:
  7. """NPC状态管理器
  8. 功能:
  9. 1. 定时批量生成NPC对话(降低API成本)
  10. 2. 缓存当前NPC状态
  11. 3. 提供状态查询接口
  12. """
  13. def __init__(self, update_interval: int = 30):
  14. """初始化状态管理器
  15. Args:
  16. update_interval: 更新间隔(秒),默认30秒
  17. """
  18. self.update_interval = update_interval
  19. self.batch_generator = get_batch_generator()
  20. # 当前状态
  21. self.current_dialogues: Dict[str, str] = {}
  22. self.last_update: Optional[datetime] = None
  23. self.next_update_time: Optional[datetime] = None
  24. # 后台任务
  25. self._update_task: Optional[asyncio.Task] = None
  26. self._running = False
  27. print(f"📊 NPC状态管理器初始化完成 (更新间隔: {update_interval}秒)")
  28. async def start(self):
  29. """启动后台更新任务"""
  30. if self._running:
  31. print("⚠️ 状态管理器已在运行")
  32. return
  33. self._running = True
  34. print("🚀 启动NPC状态自动更新...")
  35. # 立即执行一次更新
  36. await self._update_npc_states()
  37. # 启动定时更新任务
  38. self._update_task = asyncio.create_task(self._auto_update_loop())
  39. async def stop(self):
  40. """停止后台更新任务"""
  41. if not self._running:
  42. return
  43. self._running = False
  44. if self._update_task:
  45. self._update_task.cancel()
  46. try:
  47. await self._update_task
  48. except asyncio.CancelledError:
  49. pass
  50. print("🛑 NPC状态自动更新已停止")
  51. async def _auto_update_loop(self):
  52. """自动更新循环"""
  53. while self._running:
  54. try:
  55. await asyncio.sleep(self.update_interval)
  56. await self._update_npc_states()
  57. except asyncio.CancelledError:
  58. break
  59. except Exception as e:
  60. print(f"❌ 自动更新失败: {e}")
  61. # 继续运行,不中断
  62. async def _update_npc_states(self):
  63. """更新NPC状态"""
  64. try:
  65. print(f"\n🔄 [{datetime.now().strftime('%H:%M:%S')}] 开始批量更新NPC对话...")
  66. # 批量生成对话
  67. new_dialogues = self.batch_generator.generate_batch_dialogues()
  68. # 更新状态
  69. self.current_dialogues = new_dialogues
  70. self.last_update = datetime.now()
  71. self.next_update_time = datetime.now()
  72. # 打印更新结果
  73. print("📝 NPC对话已更新:")
  74. for npc_name, dialogue in new_dialogues.items():
  75. print(f" - {npc_name}: {dialogue}")
  76. except Exception as e:
  77. print(f"❌ 更新NPC状态失败: {e}")
  78. def get_current_state(self) -> Dict:
  79. """获取当前状态"""
  80. # 计算下次更新倒计时
  81. if self.last_update:
  82. elapsed = (datetime.now() - self.last_update).total_seconds()
  83. next_update_in = max(0, int(self.update_interval - elapsed))
  84. else:
  85. next_update_in = self.update_interval
  86. return {
  87. "dialogues": self.current_dialogues,
  88. "last_update": self.last_update,
  89. "next_update_in": next_update_in
  90. }
  91. def get_npc_dialogue(self, npc_name: str) -> Optional[str]:
  92. """获取指定NPC的当前对话"""
  93. return self.current_dialogues.get(npc_name)
  94. async def force_update(self):
  95. """强制立即更新"""
  96. print("⚡ 强制更新NPC状态...")
  97. await self._update_npc_states()
  98. # 全局单例
  99. _state_manager = None
  100. def get_state_manager(update_interval: int = 30) -> NPCStateManager:
  101. """获取状态管理器单例"""
  102. global _state_manager
  103. if _state_manager is None:
  104. _state_manager = NPCStateManager(update_interval)
  105. return _state_manager