refactor(discord_adapter): 优化音频处理与心跳机制 feat(plugins/discord-cross): 实现QQ与Discord消息互通功能 fix(events/base): 添加platform字段到基础事件模型
81 lines
3.4 KiB
Python
81 lines
3.4 KiB
Python
# -*- 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] 跨平台消息订阅已停止") |