from typing import Optional, Dict from services.device_config import device_config_manager, DeviceConfig from services.role_manager import role_manager from services.conversation_history import conversation_history_manager, DeviceConversationHistory from handlers.prompt_sound_handler import send_welcome_sound from utils.logger import session_logger class DeviceService: async def get_device_role(self, device_id: str) -> Dict: """获取设备当前使用的角色""" from handlers.command_handler import get_device_role as handler_get_device_role device_config = await device_config_manager.get_config(device_id, force_refresh=True) selected_role = await handler_get_device_role(device_id) result = { "role_key": selected_role.get("role_key", ""), "name": selected_role.get("name", "未命名角色"), "description": selected_role.get("description", ""), "preferred_language": device_config.preferred_language if device_config else None } if "multilingual" in selected_role: result["languages"] = list(selected_role["multilingual"].keys()) return result async def update_device_role(self, device_id: str, role_key: str, language: Optional[str] = None) -> Dict: """更新设备角色配置""" role = await role_manager.get_role(role_key) if not role: raise ValueError(f"角色 {role_key} 不存在") try: current_config = await device_config_manager.get_config(device_id, force_refresh=True) preserved_language = language or (current_config.preferred_language if current_config else None) device_config = DeviceConfig(selected_role_key=role_key, preferred_language=preserved_language) await device_config_manager.set_config(device_id, device_config) await conversation_history_manager.set_history(device_id, DeviceConversationHistory()) await send_welcome_sound(device_id, role_key, preserved_language) session_logger.info(device_id, "config", f"设备的角色已通过API更新为 {role_key}, 语言: {preserved_language or '默认'}") return { "status": "success", "device_id": device_id, "role_key": role_key, "language": preserved_language } except Exception as e: session_logger.error(device_id, "config", f"通过API更新角色时出错: {str(e)}") raise device_service = DeviceService()