| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- """NPC状态管理器 - 定时批量更新NPC对话"""
- import asyncio
- from datetime import datetime
- from typing import Dict, Optional
- from batch_generator import get_batch_generator
- class NPCStateManager:
- """NPC状态管理器
-
- 功能:
- 1. 定时批量生成NPC对话(降低API成本)
- 2. 缓存当前NPC状态
- 3. 提供状态查询接口
- """
-
- def __init__(self, update_interval: int = 30):
- """初始化状态管理器
-
- Args:
- update_interval: 更新间隔(秒),默认30秒
- """
- self.update_interval = update_interval
- self.batch_generator = get_batch_generator()
-
- # 当前状态
- self.current_dialogues: Dict[str, str] = {}
- self.last_update: Optional[datetime] = None
- self.next_update_time: Optional[datetime] = None
-
- # 后台任务
- self._update_task: Optional[asyncio.Task] = None
- self._running = False
-
- print(f"📊 NPC状态管理器初始化完成 (更新间隔: {update_interval}秒)")
-
- async def start(self):
- """启动后台更新任务"""
- if self._running:
- print("⚠️ 状态管理器已在运行")
- return
-
- self._running = True
- print("🚀 启动NPC状态自动更新...")
-
- # 立即执行一次更新
- await self._update_npc_states()
-
- # 启动定时更新任务
- self._update_task = asyncio.create_task(self._auto_update_loop())
-
- async def stop(self):
- """停止后台更新任务"""
- if not self._running:
- return
-
- self._running = False
-
- if self._update_task:
- self._update_task.cancel()
- try:
- await self._update_task
- except asyncio.CancelledError:
- pass
-
- print("🛑 NPC状态自动更新已停止")
-
- async def _auto_update_loop(self):
- """自动更新循环"""
- while self._running:
- try:
- await asyncio.sleep(self.update_interval)
- await self._update_npc_states()
- except asyncio.CancelledError:
- break
- except Exception as e:
- print(f"❌ 自动更新失败: {e}")
- # 继续运行,不中断
-
- async def _update_npc_states(self):
- """更新NPC状态"""
- try:
- print(f"\n🔄 [{datetime.now().strftime('%H:%M:%S')}] 开始批量更新NPC对话...")
-
- # 批量生成对话
- new_dialogues = self.batch_generator.generate_batch_dialogues()
-
- # 更新状态
- self.current_dialogues = new_dialogues
- self.last_update = datetime.now()
- self.next_update_time = datetime.now()
-
- # 打印更新结果
- print("📝 NPC对话已更新:")
- for npc_name, dialogue in new_dialogues.items():
- print(f" - {npc_name}: {dialogue}")
-
- except Exception as e:
- print(f"❌ 更新NPC状态失败: {e}")
-
- def get_current_state(self) -> Dict:
- """获取当前状态"""
- # 计算下次更新倒计时
- if self.last_update:
- elapsed = (datetime.now() - self.last_update).total_seconds()
- next_update_in = max(0, int(self.update_interval - elapsed))
- else:
- next_update_in = self.update_interval
-
- return {
- "dialogues": self.current_dialogues,
- "last_update": self.last_update,
- "next_update_in": next_update_in
- }
-
- def get_npc_dialogue(self, npc_name: str) -> Optional[str]:
- """获取指定NPC的当前对话"""
- return self.current_dialogues.get(npc_name)
-
- async def force_update(self):
- """强制立即更新"""
- print("⚡ 强制更新NPC状态...")
- await self._update_npc_states()
- # 全局单例
- _state_manager = None
- def get_state_manager(update_interval: int = 30) -> NPCStateManager:
- """获取状态管理器单例"""
- global _state_manager
- if _state_manager is None:
- _state_manager = NPCStateManager(update_interval)
- return _state_manager
|