fix: 修复 send_by_session 的 message_obj 为 None 的错误

fix: 修复 determine_messagee_type 会获取到服务器id的错误,并拆分成两个函数
This commit is contained in:
HakimYu
2025-06-22 20:33:26 +08:00
parent d305ae064d
commit 3d4b651c1f

View File

@@ -1,5 +1,7 @@
import asyncio import asyncio
import discord import discord
from discord.abc import Messageable
from discord.channel import DMChannel
from astrbot.api.platform import ( from astrbot.api.platform import (
Platform, Platform,
AstrBotMessage, AstrBotMessage,
@@ -51,10 +53,37 @@ class DiscordPlatformAdapter(Platform):
self, session: MessageSesion, message_chain: MessageChain self, session: MessageSesion, message_chain: MessageChain
): ):
"""通过会话发送消息""" """通过会话发送消息"""
# 创建一个 message_obj 以便在 event 中使用
message_obj = AstrBotMessage()
if "_" in session.session_id:
session.session_id = session.session_id.split("_")[1]
channel_id_str = session.session_id
channel = None
try:
channel_id = int(channel_id_str)
channel = self.client.get_channel(channel_id)
except (ValueError, TypeError):
logger.warning(f"[Discord] Invalid channel ID format: {channel_id_str}")
if channel:
message_obj.type = self._get_message_type(channel)
message_obj.group_id = self._get_channel_id(channel)
else:
logger.warning(f"[Discord] Can't get channel info for {channel_id_str}, will guess message type.")
message_obj.type = MessageType.GROUP_MESSAGE
message_obj.group_id = session.session_id
message_obj.message_str = message_chain.get_plain_text()
message_obj.sender = MessageMember(user_id=str(self.client_self_id), nickname=self.client.user.display_name)
message_obj.self_id = self.client_self_id
message_obj.session_id = session.session_id
message_obj.message = message_chain
# 创建临时事件对象来发送消息 # 创建临时事件对象来发送消息
temp_event = DiscordPlatformEvent( temp_event = DiscordPlatformEvent(
message_str="", message_str=message_chain.get_plain_text(),
message_obj=None, message_obj=message_obj,
platform_meta=self.meta(), platform_meta=self.meta(),
session_id=session.session_id, session_id=session.session_id,
client=self.client, client=self.client,
@@ -111,18 +140,17 @@ class DiscordPlatformAdapter(Platform):
except Exception as e: except Exception as e:
logger.error(f"[Discord] 适配器运行时发生意外错误: {e}", exc_info=True) logger.error(f"[Discord] 适配器运行时发生意外错误: {e}", exc_info=True)
def _determine_message_type( def _get_message_type(self, channel: Messageable, guild_id: int | None = None) -> MessageType:
self, channel, guild_id=None """根据 channel 对象和 guild_id 判断消息类型"""
) -> tuple[MessageType, str]: if guild_id is not None:
"""判断消息类型和群组ID""" return MessageType.GROUP_MESSAGE
if guild_id is None and ( if isinstance(channel, DMChannel) or getattr(channel, "guild", None) is None:
isinstance(channel, discord.DMChannel) return MessageType.FRIEND_MESSAGE
or getattr(channel, "guild", None) is None return MessageType.GROUP_MESSAGE
):
return MessageType.FRIEND_MESSAGE, ""
gid = guild_id or getattr(channel, "guild", None).id def _get_channel_id(self, channel: Messageable) -> str:
return MessageType.GROUP_MESSAGE, str(gid) """根据 channel 对象获取ID"""
return str(getattr(channel, "id", None))
def _convert_message_to_abm(self, data: dict) -> AstrBotMessage: def _convert_message_to_abm(self, data: dict) -> AstrBotMessage:
"""将普通消息转换为 AstrBotMessage""" """将普通消息转换为 AstrBotMessage"""
@@ -151,7 +179,8 @@ class DiscordPlatformAdapter(Platform):
abm = AstrBotMessage() abm = AstrBotMessage()
abm.type, abm.group_id = self._determine_message_type(message.channel) abm.type = self._get_message_type(message.channel)
abm.group_id = self._get_channel_id(message.channel)
abm.message_str = content abm.message_str = content
abm.sender = MessageMember( abm.sender = MessageMember(
@@ -317,9 +346,8 @@ class DiscordPlatformAdapter(Platform):
# 2. 构建 AstrBotMessage # 2. 构建 AstrBotMessage
abm = AstrBotMessage() abm = AstrBotMessage()
abm.type, abm.group_id = self._determine_message_type( abm.type = self._get_message_type(ctx.channel, ctx.guild_id)
ctx.channel, ctx.guild_id abm.group_id = self._get_channel_id(ctx.channel)
)
abm.message_str = message_str_for_filter abm.message_str = message_str_for_filter
abm.sender = MessageMember( abm.sender = MessageMember(
user_id=str(ctx.author.id), nickname=ctx.author.display_name user_id=str(ctx.author.id), nickname=ctx.author.display_name