# -*- coding: utf-8 -*- """ 跨平台消息互通插件订阅模块 """ import json import asyncio from core.utils.logger import logger from core.managers.redis_manager import redis_manager from .config import config from .sender import forward_discord_to_qq, forward_qq_to_discord async def cross_platform_subscription_loop(): """Redis 跨平台消息订阅循环""" if redis_manager.redis is None: logger.warning("[CrossPlatform] Redis 未初始化,无法启动订阅") return try: pubsub = redis_manager.redis.pubsub() await pubsub.subscribe(config.CROSS_PLATFORM_CHANNEL) logger.success("[CrossPlatform] 已订阅 Redis 跨平台频道") async for message in pubsub.listen(): if message["type"] == "message": try: data = json.loads(message["data"]) platform = data.get("platform", "") message_data = data.get("data", {}) logger.info(f"[CrossPlatform] 收到跨平台消息: {platform}") if platform == "discord": await forward_discord_to_qq( discord_username=message_data.get("username", "Unknown"), discord_discriminator=message_data.get("discriminator", ""), content=message_data.get("content", ""), channel_id=message_data.get("channel_id", 0), attachments=message_data.get("attachments", []) ) elif platform == "qq": await forward_qq_to_discord( qq_nickname=message_data.get("nickname", "Unknown"), qq_user_id=message_data.get("user_id", 0), group_name=message_data.get("group_name", ""), group_id=message_data.get("group_id", 0), content=message_data.get("content", ""), attachments=message_data.get("attachments", []), embed=message_data.get("embed") ) except json.JSONDecodeError as e: logger.error(f"[CrossPlatform] 解析消息失败: {e}") except Exception as e: logger.error(f"[CrossPlatform] 处理跨平台消息失败: {e}") except Exception as e: logger.error(f"[CrossPlatform] 订阅循环异常: {e}") _subscription_task = None async def start_cross_platform_subscription(): """启动跨平台消息订阅""" global _subscription_task if _subscription_task is None and config.ENABLE_CROSS_PLATFORM: _subscription_task = asyncio.create_task(cross_platform_subscription_loop()) logger.success("[CrossPlatform] 跨平台消息订阅已启动") async def stop_cross_platform_subscription(): """停止跨平台消息订阅""" global _subscription_task if _subscription_task: _subscription_task.cancel() try: await _subscription_task except asyncio.CancelledError: pass _subscription_task = None logger.info("[CrossPlatform] 跨平台消息订阅已停止")