adapter-discord
adapter-discord copied to clipboard
event 文本获取错误
event.get_message()
event.get_plaintext()
输入 123&123<123
结果都是 123&123<123
找到了,是这里的问题
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 组的?可选https://github.com/nonebot/adapter-discord/blob/0251686c235a16f43de480ea482fcb17c277a257/nonebot/adapters/discord/message.py#L395-L400
感谢反馈解决!愿意发个PR吗
@paul-sama 麻烦帮忙试试最新 commit 版本
@paul-sama 麻烦帮忙试试最新 commit 版本
嗯,最新版本修复好了