nonebot / nonebot2

跨平台 Python 异步聊天机器人框架 / Asynchronous multi-platform chatbot framework written in Python
https://nonebot.dev
MIT License
5.97k stars 555 forks source link

Bug: 使用`Message.template()`时会出现`NotImplementedError`错误 #1814

Closed SaarChaffee closed 1 year ago

SaarChaffee commented 1 year ago

描述问题:

在我试拼接消息时,当我使用了Message.template("{msg}").format(msg="test")后,控制台直接报了NotImplementedError错误

我有在文档那搜到过这个错误,我有装aiohttp的依赖但是我还没开始调用它,当我把Message.template()注释掉而使用Message([MessageSegment.text()])时又正常了

如何复现?

from nonebot import on_command
from nonebot.adapters import Message
from nonebot.adapters.onebot.v11 import MessageEvent
from nonebot.rule import to_me

resp = on_command("test", rule=to_me(), aliases={"cs"}, priority=5)

@resp.handle()
async def get_pic(event: MessageEvent):
    back: Message = Message()
    back += Message.template("{str}").format(str="test")
    # back += Message([MessageSegment.text("test")])
    await resp.finish(back)

期望的结果

和使用MessageSegment一样正确发送消息

环境信息:

协议端信息:

截图或日志

03-17 00:28:58 [SUCCESS] nonebot | OneBot V11 114514| [message.group.normal]: Message 4396from 9527@[群:1919810] '[at:qq=114514] test'
03-17 00:28:58 [INFO] nonebot | Event will be handled by Matcher(type='message', module=skadi.plugins.picsearch)
03-17 00:28:58 [INFO] nonebot | Matcher(type='message', module=skadi.plugins.picsearch) running complete
03-17 00:28:58 [ERROR] nonebot | Running Matcher(type='message', module=skadi.plugins.picsearch) failed.
Traceback (most recent call last):
  File "D:\Desktop\GitHub\BOT\QQBOT\skadi\main.py", line 7, in <module>
    skadi.run()
  File "D:\Desktop\GitHub\BOT\QQBOT\skadi\skadi\__init__.py", line 34, in run
    nonebot.run()
  File "D:\Desktop\GitHub\BOT\QQBOT\skadi\venv\lib\site-packages\nonebot\__init__.py", line 273, in run
    get_driver().run(*args, **kwargs)
  File "D:\Desktop\GitHub\BOT\QQBOT\skadi\venv\lib\site-packages\nonebot\drivers\fastapi.py", line 187, in run
    uvicorn.run(
  File "D:\Desktop\GitHub\BOT\QQBOT\skadi\venv\lib\site-packages\uvicorn\main.py", line 568, in run
    server.run()
  File "D:\Desktop\GitHub\BOT\QQBOT\skadi\venv\lib\site-packages\uvicorn\server.py", line 59, in run
    return asyncio.run(self.serve(sockets=sockets))
  File "C:\Python\Python38\lib\asyncio\runners.py", line 44, in run
    return loop.run_until_complete(main)
  File "C:\Python\Python38\lib\asyncio\base_events.py", line 603, in run_until_complete
    self.run_forever()
  File "C:\Python\Python38\lib\asyncio\windows_events.py", line 316, in run_forever
    super().run_forever()
  File "C:\Python\Python38\lib\asyncio\base_events.py", line 570, in run_forever
    self._run_once()
  File "C:\Python\Python38\lib\asyncio\base_events.py", line 1859, in _run_once
    handle._run()
  File "C:\Python\Python38\lib\asyncio\events.py", line 81, in _run
    self._context.run(self._callback, *self._args)
  File "D:\Desktop\GitHub\BOT\QQBOT\skadi\venv\lib\site-packages\nonebot\message.py", line 141, in _check_matcher
    await _run_matcher(Matcher, bot, event, state, stack, dependency_cache)
> File "D:\Desktop\GitHub\BOT\QQBOT\skadi\venv\lib\site-packages\nonebot\message.py", line 187, in _run_matcher
    await matcher.run(bot, event, state, stack, dependency_cache)
  File "D:\Desktop\GitHub\BOT\QQBOT\skadi\venv\lib\site-packages\nonebot\internal\matcher\matcher.py", line 732, in run
    await self.simple_run(bot, event, state, stack, dependency_cache)
  File "D:\Desktop\GitHub\BOT\QQBOT\skadi\venv\lib\site-packages\nonebot\internal\matcher\matcher.py", line 707, in simple_run
    await handler(
  File "D:\Desktop\GitHub\BOT\QQBOT\skadi\venv\lib\site-packages\nonebot\dependencies\__init__.py", line 108, in __call__
    return await cast(Callable[..., Awaitable[R]], self.call)(**values)
  File "D:\Desktop\GitHub\BOT\QQBOT\skadi\skadi\plugins\picsearch\__init__.py", line 34, in get_pic
    back += Message.template("{str}").format(str="test")
  File "D:\Desktop\GitHub\BOT\QQBOT\skadi\venv\lib\site-packages\nonebot\internal\adapter\template.py", line 73, in format
    return self._format(args, kwargs)
  File "D:\Desktop\GitHub\BOT\QQBOT\skadi\venv\lib\site-packages\nonebot\internal\adapter\template.py", line 84, in _format
    msg, arg_index = self._vformat(
  File "D:\Desktop\GitHub\BOT\QQBOT\skadi\venv\lib\site-packages\nonebot\internal\adapter\template.py", line 168, in _vformat
    return functools.reduce(self._add, results), auto_arg_index
  File "D:\Desktop\GitHub\BOT\QQBOT\skadi\venv\lib\site-packages\nonebot\internal\adapter\template.py", line 185, in _add
    return a + b
  File "D:\Desktop\GitHub\BOT\QQBOT\skadi\venv\lib\site-packages\nonebot\internal\adapter\message.py", line 174, in __add__
    result += other
  File "D:\Desktop\GitHub\BOT\QQBOT\skadi\venv\lib\site-packages\nonebot\internal\adapter\message.py", line 183, in __iadd__
    self.extend(self._construct(other))
  File "D:\Desktop\GitHub\BOT\QQBOT\skadi\venv\lib\site-packages\nonebot\internal\adapter\message.py", line 170, in _construct
    raise NotImplementedError
NotImplementedError
yanyongyu commented 1 year ago

这个问题是由于Message基类并没有实现相关功能,他只是一个抽象类。通常我们使用具体适配器的Message.template方法来进行format。

由于基类只有str功能,所以实际上就是str.format。你可以直接使用MessageTemplate('{str}')代替基类的template方法。

这边可能可以考虑对基类进行特殊处理或者进行文档特别说明。

SaarChaffee commented 1 year ago

这个问题是由于Message基类并没有实现相关功能,他只是一个抽象类。通常我们使用具体适配器的Message.template方法来进行format。

由于基类只有str功能,所以实际上就是str.format。你可以直接使用MessageTemplate('{str}')代替基类的template方法。

这边可能可以考虑对基类进行特殊处理或者进行文档特别说明。

明白了。

实际上我最初的需求是看到了使用消息模板这里的example可以直接丢图片url进去发图才用的Message.template

那么现在我是把nonebot.adapters换成nonebot.adapters.onebot.v11导入onebot下的Message类就可以正常使用了吗

yanyongyu commented 1 year ago

是的

SaarChaffee commented 1 year ago

是的

感谢

yanyongyu commented 1 year ago

开一下,上面的问题还得解决下,不太符合直觉。