nonebot / adapter-satori

NoneBot2 Satori 适配器 / Satori Protocol adapter for nonebot2
MIT License
84 stars 5 forks source link

[Bug]: 接收到带有at机器人的命令无法通过nonebot.rule自带的to_me()响应规则检查 #17

Closed LiXDL closed 6 months ago

LiXDL commented 6 months ago

确认项

操作系统

Windows

Python 版本

3.12.2

NoneBot 版本

2.2.1

适配器

0.10.5

协议端

Chronocat

描述问题

使用on_command(..., rule=to_me(), ...)构建的事件响应器无法被带有at机器人的命令消息触发
我同时尝试使用用@bot /cmd arg@bot cmd arg的形式发送指令,都无法触发

复现步骤

参见截图中的实例

期望的结果

No response

截图或日志

  1. 带有rule=to_me()的事件响应器和处理函数: image image
  2. 尝试触发命令,失败(中间是打印的event.message.content)image
  3. 不带rule=to_me()的事件响应器和处理函数: image image
  4. 尝试触发命令,成功: image

Nonebot 配置项

No response

RF-Tar-Railt commented 6 months ago

at bot的消息长啥样

LiXDL commented 6 months ago

QQ里面是这样的: image

Chronocat日志里面是这样的:

image
RF-Tar-Railt commented 6 months ago

我是说nb收到的,那个日志里面是怎么显示的

LiXDL commented 6 months ago
image

↑这个样子的,nb里面好像没法看到被at的用户。

LiXDL commented 6 months ago
image

又试了试,NB日志里也没法直接看到回复消息,如果带了at也会阻止触发本来可用的命令。

RF-Tar-Railt commented 6 months ago

消息事件有一个original_message,你同时把get_message()的内容和original_message的内容打印一下看看 同时测试一下at bot和at他人

LiXDL commented 6 months ago

image image ↑如图所示

log level设定到trace会提示Rule conditions not met for Matcher,对应上面构造的那个带有rule=to_me的事件响应器。

RF-Tar-Railt commented 6 months ago

image image ↑如图所示

log level设定到trace会提示Rule conditions not met for Matcher,对应上面构造的那个带有rule=to_me的事件响应器。

你是at的bot吗,你打印一下bot的self_id看看

LiXDL commented 6 months ago

image 是的哇,我这个测试群里只有我自己的号和这个bot了😭

RF-Tar-Railt commented 6 months ago

你把消息事件数据发一下,转成dict(用event.dict())

LiXDL commented 6 months ago

如下

{'argv': None,
 'button': None,
 'channel': {'id': 测试群号,
             'name': 'Backup',
             'parent_id': None,
             'type': <ChannelType.TEXT: 0>},
 'guild': {'avatar': 'https://p.qlogo.cn/gh/测试群号/测试群号/640',
           'id': 测试群号,
           'name': 'Backup'},
 'id': 54,
 'login': None,
 'member': {'avatar': None,
            'joined_at': None,
            'name': None,
            'nick': None,
            'user': None},
 'message': {'channel': None,
             'content': '<at id="3668701134" name="神秘虾头男"/> repeat_raw 打印dict',
             'created_at': None,
             'guild': None,
             'id': '7361076614359645153',
             'member': None,
             'updated_at': None,
             'user': None},
 'operator': None,
 'original_message': [{'data': {'id': '3668701134', 'name': '神秘虾头男'},
                       'type': 'at'},
                      {'data': {'styles': {}, 'text': ' repeat_raw 打印dict'},
                       'type': 'text'}],
 'platform': 'chronocat',
 'reply': None,
 'role': None,
 'self_id': '3668701134',
 'timestamp': datetime.datetime(2024, 4, 23, 22, 56, 46),
 'to_me': True,
 'type': 'message-created',
 'user': {'avatar': 'http://thirdqq.qlogo.cn/headimg_dl?dst_uin=我的QQ号&spec=640',
          'id': 我的QQ号,
          'is_bot': None,
          'name': '潇洒',
          'nick': None}}
RF-Tar-Railt commented 6 months ago

如下

{'argv': None,
 'button': None,
 'channel': {'id': 测试群号,
             'name': 'Backup',
             'parent_id': None,
             'type': <ChannelType.TEXT: 0>},
 'guild': {'avatar': 'https://p.qlogo.cn/gh/测试群号/测试群号/640',
           'id': 测试群号,
           'name': 'Backup'},
 'id': 54,
 'login': None,
 'member': {'avatar': None,
            'joined_at': None,
            'name': None,
            'nick': None,
            'user': None},
 'message': {'channel': None,
             'content': '<at id="3668701134" name="神秘虾头男"/> repeat_raw 打印dict',
             'created_at': None,
             'guild': None,
             'id': '7361076614359645153',
             'member': None,
             'updated_at': None,
             'user': None},
 'operator': None,
 'original_message': [{'data': {'id': '3668701134', 'name': '神秘虾头男'},
                       'type': 'at'},
                      {'data': {'styles': {}, 'text': ' repeat_raw 打印dict'},
                       'type': 'text'}],
 'platform': 'chronocat',
 'reply': None,
 'role': None,
 'self_id': '3668701134',
 'timestamp': datetime.datetime(2024, 4, 23, 22, 56, 46),
 'to_me': True,
 'type': 'message-created',
 'user': {'avatar': 'http://thirdqq.qlogo.cn/headimg_dl?dst_uin=我的QQ号&spec=640',
          'id': 我的QQ号,
          'is_bot': None,
          'name': '潇洒',
          'nick': None}}

?你这tome已经是True了啊

LiXDL commented 6 months ago

但是并不会触发带有rule=to_me()的响应器,就是我最开始那个截图里面定义的repeat_raw;包括没有指定rule的普通响应器也没有办法通过@bot /cmd arg这种形式触发。 莫非satori adapter设计的就是这样吗。

LiXDL commented 6 months ago

明天下班了我再测测

RF-Tar-Railt commented 6 months ago

我这边to_me是正常的

LiXDL commented 6 months ago

太奇怪了,所有部分的event.is_tome()evaluate出来都是true,但是就是无法通过rule checker。 我看nb官方实例是允许/cmd@bot cmd这种调用方法的,在第一种我能用的情况下第二种就是用不了。

RF-Tar-Railt commented 6 months ago

太奇怪了,所有部分的event.is_tome()evaluate出来都是true,但是就是无法通过rule checker。 我看nb官方实例是允许/cmd@bot cmd这种调用方法的,在第一种我能用的情况下第二种就是用不了。

你不应该是@bot /cmd吗

LiXDL commented 6 months ago

太奇怪了,所有部分的event.is_tome()evaluate出来都是true,但是就是无法通过rule checker。 我看nb官方实例是允许/cmd@bot cmd这种调用方法的,在第一种我能用的情况下第二种就是用不了。

你不应该是@bot /cmd吗

64467e3f6a2e0f2cbb425ce30e938f07_720 但是也不行。

RF-Tar-Railt commented 6 months ago

太奇怪了,所有部分的event.is_tome()evaluate出来都是true,但是就是无法通过rule checker。 我看nb官方实例是允许/cmd@bot cmd这种调用方法的,在第一种我能用的情况下第二种就是用不了。

你不应该是@bot /cmd吗

64467e3f6a2e0f2cbb425ce30e938f07_720 但是也不行。

你能debug吗,调试进tome的rule里看看

LiXDL commented 6 months ago

image image 我之前在nb的源码这里放print测试了一下,确实拿到的就是satori的MessageEvent object,然后也调用的is_tome()这个函数,结果为True。

RF-Tar-Railt commented 6 months ago

image image 我之前在nb的源码这里放print测试了一下,确实拿到的就是satori的MessageEvent object,然后也调用的is_tome()这个函数,结果为True。

event.get_message()得到的消息带了at吗

LiXDL commented 6 months ago

带了: image image

RF-Tar-Railt commented 6 months ago

带了: image image

那就是这个问题了,at bot自己的话这个at应该要被去掉的

你去bot.py文件那里有个check_at_me,你调试一下看看

LiXDL commented 6 months ago

带了: image image

那就是这个问题了,at bot自己的话这个at应该要被去掉的

你去bot.py文件那里有个check_at_me,你调试一下看看

是satori adapter里的bot.py对_check_at_me的实现部分吗?

RF-Tar-Railt commented 6 months ago

带了: image image

那就是这个问题了,at bot自己的话这个at应该要被去掉的 你去bot.py文件那里有个check_at_me,你调试一下看看

是satori adapter里的bot.py对_check_at_me的实现部分吗?

对 记得print(repr(message))

LiXDL commented 6 months ago

image

奇怪,看起来这部分调用确实是把前面的at移除了,但是进到我的自定义hook和最终插件里的时候又回来了

RF-Tar-Railt commented 6 months ago

你hook怎么整的

LiXDL commented 6 months ago

你hook怎么整的

就是用来忽略bot自己发出去的消息,避免触发响应器(本来是预留给在部分群禁用bot的功能的

@event_preprocessor
async def silence_preprocessor(bot: SatoriBot, event: SatoriMessageEvent):
    if event.user.id == bot.self_id:
        raise IgnoredException("Self message. Ignored.")
    #   Only effective for group messages
    if event.guild is None:
        return

    group_id = event.guild.id

    logger.critical(f"In event_preprocessor: {repr(event.get_message())}")
    # pprint.pprint(event.dict())
    # print(event.is_tome())
RF-Tar-Railt commented 6 months ago

好,我这边复现了

LiXDL commented 6 months ago

太强了大哥! 我明天上班,晚上再来继续努力。

RF-Tar-Railt commented 6 months ago

太强了大哥! 我明天上班,晚上再来继续努力。

临时解决方案,async def silence_preprocessor(bot: SatoriBot, event):

把event的类型去掉就没有出现这个问题