Open paul-sama opened 5 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
我还发现了 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
而对于 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
而对于
Message._construct()
函数中的正则也有个小问题在匹配形如
<.*<@474564749217234954>
的 content 时,会匹配最外层的 <>,而返回TextSegment
也许正则要改为
<(?P<type>(@!|@&|@|#|/|:|a:|t:))(?P<param>.+?)>
去掉对 type 组的?
可选
感谢反馈解决!愿意发个PR吗
@paul-sama 麻烦帮忙试试最新 commit 版本
@paul-sama 麻烦帮忙试试最新 commit 版本
嗯,最新版本修复好了
输入
123&123<123
结果都是
123&123<123