fix: 修复 send_by_session 的 message_obj 为 None 的错误
fix: 修复 determine_messagee_type 会获取到服务器id的错误,并拆分成两个函数
This commit is contained in:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user