nonebot / adapter-discord

NoneBot2 Discord 适配器 / Discord adapter for nonebot2
20 stars 6 forks source link

event 文本获取错误 #19

Open paul-sama opened 5 months ago

paul-sama commented 5 months ago
event.get_message()
event.get_plaintext()

输入 123&123<123

结果都是 123&amp;123&lt;123

Autuamn commented 4 months ago

找到了,是这里的问题 https://github.com/nonebot/adapter-discord/blob/0251686c235a16f43de480ea482fcb17c277a257/nonebot/adapters/discord/message.py#L315-L322 对于 event.get_message()__str__ 函数为

def __str__(self) -> str:
    return "".join(str(seg) for seg in self)

而对于 event.get_plaintext() 则为 self.get_message().extract_plain_text()

def extract_plain_text(self) -> str:
    """提取消息内纯文本消息"""

    return "".join(str(seg) for seg in self if seg.is_text())

两者都会触发 TextSegment__str__ 函数,会被 escape https://github.com/nonebot/adapter-discord/blob/0251686c235a16f43de480ea482fcb17c277a257/nonebot/adapters/discord/utils.py#L50-L51

Autuamn commented 4 months ago

我还发现了 Message._construct() 函数根本没有触发,导致消息 content 中所有形如 <@474564749217234954> <#1208348399263285308> <:logo:1227276258447065168> 的文本都只会是 TextSegment

原因是处理 message.content 时直接使用了 msg.append(MessageSegment.text(message.content))

并没有调用 _construct()

我想也许要改为 msg.extend(Message(message.content)) https://github.com/nonebot/adapter-discord/blob/0251686c235a16f43de480ea482fcb17c277a257/nonebot/adapters/discord/message.py#L433-L439

Autuamn commented 4 months ago

而对于 Message._construct() 函数中的正则也有个小问题

在匹配形如 <.*<@474564749217234954> 的 content 时,会匹配最外层的 <>,而返回 TextSegment

也许正则要改为 <(?P<type>(@!|@&|@|#|/|:|a:|t:))(?P<param>.+?)> 去掉对 type 组的 ? 可选 https://github.com/nonebot/adapter-discord/blob/0251686c235a16f43de480ea482fcb17c277a257/nonebot/adapters/discord/message.py#L395-L400

CMHopeSunshine commented 4 months ago

而对于 Message._construct() 函数中的正则也有个小问题

在匹配形如 <.*<@474564749217234954> 的 content 时,会匹配最外层的 <>,而返回 TextSegment

也许正则要改为 <(?P<type>(@!|@&|@|#|/|:|a:|t:))(?P<param>.+?)> 去掉对 type 组的 ? 可选

https://github.com/nonebot/adapter-discord/blob/0251686c235a16f43de480ea482fcb17c277a257/nonebot/adapters/discord/message.py#L395-L400

感谢反馈解决!愿意发个PR吗

Autuamn commented 3 months ago

@paul-sama 麻烦帮忙试试最新 commit 版本

paul-sama commented 3 months ago

@paul-sama 麻烦帮忙试试最新 commit 版本

嗯,最新版本修复好了