diff --git a/archive/2.0.0a12/README.md b/archive/2.0.0a13/README.md similarity index 100% rename from archive/2.0.0a12/README.md rename to archive/2.0.0a13/README.md diff --git a/archive/2.0.0a12/advanced/README.md b/archive/2.0.0a13/advanced/README.md similarity index 100% rename from archive/2.0.0a12/advanced/README.md rename to archive/2.0.0a13/advanced/README.md diff --git a/archive/2.0.0a12/advanced/export-and-require.md b/archive/2.0.0a13/advanced/export-and-require.md similarity index 100% rename from archive/2.0.0a12/advanced/export-and-require.md rename to archive/2.0.0a13/advanced/export-and-require.md diff --git a/archive/2.0.0a12/advanced/overloaded-handlers.md b/archive/2.0.0a13/advanced/overloaded-handlers.md similarity index 100% rename from archive/2.0.0a12/advanced/overloaded-handlers.md rename to archive/2.0.0a13/advanced/overloaded-handlers.md diff --git a/archive/2.0.0a12/advanced/permission.md b/archive/2.0.0a13/advanced/permission.md similarity index 100% rename from archive/2.0.0a12/advanced/permission.md rename to archive/2.0.0a13/advanced/permission.md diff --git a/archive/2.0.0a12/advanced/publish-plugin.md b/archive/2.0.0a13/advanced/publish-plugin.md similarity index 100% rename from archive/2.0.0a12/advanced/publish-plugin.md rename to archive/2.0.0a13/advanced/publish-plugin.md diff --git a/archive/2.0.0a12/advanced/runtime-hook.md b/archive/2.0.0a13/advanced/runtime-hook.md similarity index 91% rename from archive/2.0.0a12/advanced/runtime-hook.md rename to archive/2.0.0a13/advanced/runtime-hook.md index f7e26be6..5e98c22a 100644 --- a/archive/2.0.0a12/advanced/runtime-hook.md +++ b/archive/2.0.0a13/advanced/runtime-hook.md @@ -19,7 +19,7 @@ from nonebot import get_driver driver=get_driver() ``` -共分为五种函数: +共分为六种函数: ### 启动准备 @@ -73,6 +73,18 @@ async def handle_api_call(bot: Bot, api: str, data: Dict[str, Any]): pass ``` +### bot api 调用后钩子 + +这个钩子函数会在 `Bot` 调用 API 后运行。 + +```python +from nonebot.adapters import Bot + +@Bot.on_called_api +async def handle_api_result(bot: Bot, exception: Optional[Exception], api: str, data: Dict[str, Any], result: Any): + pass +``` + ## 事件处理钩子 这些钩子函数指的是影响 `nonebot2` 进行 `事件处理` 的函数。 diff --git a/archive/2.0.0a12/advanced/scheduler.md b/archive/2.0.0a13/advanced/scheduler.md similarity index 100% rename from archive/2.0.0a12/advanced/scheduler.md rename to archive/2.0.0a13/advanced/scheduler.md diff --git a/archive/2.0.0a12/api/README.md b/archive/2.0.0a13/api/README.md similarity index 100% rename from archive/2.0.0a12/api/README.md rename to archive/2.0.0a13/api/README.md diff --git a/archive/2.0.0a12/api/adapters/README.md b/archive/2.0.0a13/api/adapters/README.md similarity index 97% rename from archive/2.0.0a12/api/adapters/README.md rename to archive/2.0.0a13/api/adapters/README.md index bd4aab2a..fa3f597e 100644 --- a/archive/2.0.0a12/api/adapters/README.md +++ b/archive/2.0.0a13/api/adapters/README.md @@ -27,7 +27,7 @@ Driver 对象 Config 配置对象 -### `_call_api_hook` +### `_calling_api_hook` * **类型** @@ -42,6 +42,21 @@ Config 配置对象 +### `_called_api_hook` + + +* **类型** + + `Set[T_CalledAPIHook]` + + + +* **说明** + + call_api 后执行的函数 + + + ### _abstract_ `__init__(connection_type, self_id, *, websocket=None)` diff --git a/archive/2.0.0a12/api/adapters/cqhttp.md b/archive/2.0.0a13/api/adapters/cqhttp.md similarity index 100% rename from archive/2.0.0a12/api/adapters/cqhttp.md rename to archive/2.0.0a13/api/adapters/cqhttp.md diff --git a/archive/2.0.0a12/api/adapters/ding.md b/archive/2.0.0a13/api/adapters/ding.md similarity index 100% rename from archive/2.0.0a12/api/adapters/ding.md rename to archive/2.0.0a13/api/adapters/ding.md diff --git a/archive/2.0.0a12/api/adapters/mirai.md b/archive/2.0.0a13/api/adapters/mirai.md similarity index 100% rename from archive/2.0.0a12/api/adapters/mirai.md rename to archive/2.0.0a13/api/adapters/mirai.md diff --git a/archive/2.0.0a12/api/config.md b/archive/2.0.0a13/api/config.md similarity index 100% rename from archive/2.0.0a12/api/config.md rename to archive/2.0.0a13/api/config.md diff --git a/archive/2.0.0a12/api/drivers/README.md b/archive/2.0.0a13/api/drivers/README.md similarity index 100% rename from archive/2.0.0a12/api/drivers/README.md rename to archive/2.0.0a13/api/drivers/README.md diff --git a/archive/2.0.0a12/api/drivers/fastapi.md b/archive/2.0.0a13/api/drivers/fastapi.md similarity index 100% rename from archive/2.0.0a12/api/drivers/fastapi.md rename to archive/2.0.0a13/api/drivers/fastapi.md diff --git a/archive/2.0.0a12/api/drivers/quart.md b/archive/2.0.0a13/api/drivers/quart.md similarity index 100% rename from archive/2.0.0a12/api/drivers/quart.md rename to archive/2.0.0a13/api/drivers/quart.md diff --git a/archive/2.0.0a12/api/exception.md b/archive/2.0.0a13/api/exception.md similarity index 100% rename from archive/2.0.0a12/api/exception.md rename to archive/2.0.0a13/api/exception.md diff --git a/archive/2.0.0a12/api/handler.md b/archive/2.0.0a13/api/handler.md similarity index 100% rename from archive/2.0.0a12/api/handler.md rename to archive/2.0.0a13/api/handler.md diff --git a/archive/2.0.0a12/api/log.md b/archive/2.0.0a13/api/log.md similarity index 100% rename from archive/2.0.0a12/api/log.md rename to archive/2.0.0a13/api/log.md diff --git a/archive/2.0.0a12/api/matcher.md b/archive/2.0.0a13/api/matcher.md similarity index 100% rename from archive/2.0.0a12/api/matcher.md rename to archive/2.0.0a13/api/matcher.md diff --git a/archive/2.0.0a12/api/message.md b/archive/2.0.0a13/api/message.md similarity index 100% rename from archive/2.0.0a12/api/message.md rename to archive/2.0.0a13/api/message.md diff --git a/archive/2.0.0a12/api/nonebot.md b/archive/2.0.0a13/api/nonebot.md similarity index 100% rename from archive/2.0.0a12/api/nonebot.md rename to archive/2.0.0a13/api/nonebot.md diff --git a/archive/2.0.0a12/api/permission.md b/archive/2.0.0a13/api/permission.md similarity index 100% rename from archive/2.0.0a12/api/permission.md rename to archive/2.0.0a13/api/permission.md diff --git a/archive/2.0.0a12/api/plugin.md b/archive/2.0.0a13/api/plugin.md similarity index 100% rename from archive/2.0.0a12/api/plugin.md rename to archive/2.0.0a13/api/plugin.md diff --git a/archive/2.0.0a12/api/rule.md b/archive/2.0.0a13/api/rule.md similarity index 100% rename from archive/2.0.0a12/api/rule.md rename to archive/2.0.0a13/api/rule.md diff --git a/archive/2.0.0a12/api/typing.md b/archive/2.0.0a13/api/typing.md similarity index 89% rename from archive/2.0.0a12/api/typing.md rename to archive/2.0.0a13/api/typing.md index c3ec95bf..756ef946 100644 --- a/archive/2.0.0a12/api/typing.md +++ b/archive/2.0.0a13/api/typing.md @@ -78,6 +78,38 @@ sidebarDepth: 0 +## `T_CallingAPIHook` + + +* **类型** + + `Callable[[Bot, str, Dict[str, Any]], Awaitable[None]]` + + + +* **说明** + + `bot.call_api` 时执行的函数 + + + + +## `T_CalledAPIHook` + + +* **类型** + + `Callable[[Bot, Optional[Exception], str, Dict[str, Any], Any], Awaitable[None]]` + + + +* **说明** + + `bot.call_api` 后执行的函数,参数分别为 bot, exception, api, data, result + + + + ## `T_EventPreProcessor` diff --git a/archive/2.0.0a12/api/utils.md b/archive/2.0.0a13/api/utils.md similarity index 100% rename from archive/2.0.0a12/api/utils.md rename to archive/2.0.0a13/api/utils.md diff --git a/archive/2.0.0a12/guide/README.md b/archive/2.0.0a13/guide/README.md similarity index 100% rename from archive/2.0.0a12/guide/README.md rename to archive/2.0.0a13/guide/README.md diff --git a/archive/2.0.0a12/guide/basic-configuration.md b/archive/2.0.0a13/guide/basic-configuration.md similarity index 100% rename from archive/2.0.0a12/guide/basic-configuration.md rename to archive/2.0.0a13/guide/basic-configuration.md diff --git a/archive/2.0.0a12/guide/cqhttp-guide.md b/archive/2.0.0a13/guide/cqhttp-guide.md similarity index 100% rename from archive/2.0.0a12/guide/cqhttp-guide.md rename to archive/2.0.0a13/guide/cqhttp-guide.md diff --git a/archive/2.0.0a12/guide/creating-a-handler.md b/archive/2.0.0a13/guide/creating-a-handler.md similarity index 100% rename from archive/2.0.0a12/guide/creating-a-handler.md rename to archive/2.0.0a13/guide/creating-a-handler.md diff --git a/archive/2.0.0a12/guide/creating-a-matcher.md b/archive/2.0.0a13/guide/creating-a-matcher.md similarity index 100% rename from archive/2.0.0a12/guide/creating-a-matcher.md rename to archive/2.0.0a13/guide/creating-a-matcher.md diff --git a/archive/2.0.0a12/guide/creating-a-plugin.md b/archive/2.0.0a13/guide/creating-a-plugin.md similarity index 100% rename from archive/2.0.0a12/guide/creating-a-plugin.md rename to archive/2.0.0a13/guide/creating-a-plugin.md diff --git a/archive/2.0.0a12/guide/creating-a-project.md b/archive/2.0.0a13/guide/creating-a-project.md similarity index 100% rename from archive/2.0.0a12/guide/creating-a-project.md rename to archive/2.0.0a13/guide/creating-a-project.md diff --git a/archive/2.0.0a12/guide/ding-guide.md b/archive/2.0.0a13/guide/ding-guide.md similarity index 100% rename from archive/2.0.0a12/guide/ding-guide.md rename to archive/2.0.0a13/guide/ding-guide.md diff --git a/archive/2.0.0a12/guide/end-or-start.md b/archive/2.0.0a13/guide/end-or-start.md similarity index 100% rename from archive/2.0.0a12/guide/end-or-start.md rename to archive/2.0.0a13/guide/end-or-start.md diff --git a/archive/2.0.0a12/guide/getting-started.md b/archive/2.0.0a13/guide/getting-started.md similarity index 100% rename from archive/2.0.0a12/guide/getting-started.md rename to archive/2.0.0a13/guide/getting-started.md diff --git a/archive/2.0.0a12/guide/images/Handle-Event.png b/archive/2.0.0a13/guide/images/Handle-Event.png similarity index 100% rename from archive/2.0.0a12/guide/images/Handle-Event.png rename to archive/2.0.0a13/guide/images/Handle-Event.png diff --git a/archive/2.0.0a12/guide/images/ding/jiaqian.png b/archive/2.0.0a13/guide/images/ding/jiaqian.png similarity index 100% rename from archive/2.0.0a12/guide/images/ding/jiaqian.png rename to archive/2.0.0a13/guide/images/ding/jiaqian.png diff --git a/archive/2.0.0a12/guide/images/ding/test_webhook.png b/archive/2.0.0a13/guide/images/ding/test_webhook.png similarity index 100% rename from archive/2.0.0a12/guide/images/ding/test_webhook.png rename to archive/2.0.0a13/guide/images/ding/test_webhook.png diff --git a/archive/2.0.0a12/guide/images/ding/webhook.png b/archive/2.0.0a13/guide/images/ding/webhook.png similarity index 100% rename from archive/2.0.0a12/guide/images/ding/webhook.png rename to archive/2.0.0a13/guide/images/ding/webhook.png diff --git a/archive/2.0.0a12/guide/installation.md b/archive/2.0.0a13/guide/installation.md similarity index 100% rename from archive/2.0.0a12/guide/installation.md rename to archive/2.0.0a13/guide/installation.md diff --git a/archive/2.0.0a12/guide/loading-a-plugin.md b/archive/2.0.0a13/guide/loading-a-plugin.md similarity index 100% rename from archive/2.0.0a12/guide/loading-a-plugin.md rename to archive/2.0.0a13/guide/loading-a-plugin.md diff --git a/archive/2.0.0a12/guide/mirai-guide.md b/archive/2.0.0a13/guide/mirai-guide.md similarity index 100% rename from archive/2.0.0a12/guide/mirai-guide.md rename to archive/2.0.0a13/guide/mirai-guide.md diff --git a/archive/2.0.0a12/sidebar.config.json b/archive/2.0.0a13/sidebar.config.json similarity index 100% rename from archive/2.0.0a12/sidebar.config.json rename to archive/2.0.0a13/sidebar.config.json diff --git a/docs/.vuepress/versions.json b/docs/.vuepress/versions.json index b159ca74..81fb149d 100644 --- a/docs/.vuepress/versions.json +++ b/docs/.vuepress/versions.json @@ -1,5 +1,5 @@ [ - "2.0.0a12", + "2.0.0a13", "2.0.0a10", "2.0.0a8.post2", "2.0.0a7" diff --git a/docs/advanced/runtime-hook.md b/docs/advanced/runtime-hook.md index f7e26be6..5e98c22a 100644 --- a/docs/advanced/runtime-hook.md +++ b/docs/advanced/runtime-hook.md @@ -19,7 +19,7 @@ from nonebot import get_driver driver=get_driver() ``` -共分为五种函数: +共分为六种函数: ### 启动准备 @@ -73,6 +73,18 @@ async def handle_api_call(bot: Bot, api: str, data: Dict[str, Any]): pass ``` +### bot api 调用后钩子 + +这个钩子函数会在 `Bot` 调用 API 后运行。 + +```python +from nonebot.adapters import Bot + +@Bot.on_called_api +async def handle_api_result(bot: Bot, exception: Optional[Exception], api: str, data: Dict[str, Any], result: Any): + pass +``` + ## 事件处理钩子 这些钩子函数指的是影响 `nonebot2` 进行 `事件处理` 的函数。 diff --git a/docs/api/adapters/README.md b/docs/api/adapters/README.md index bd4aab2a..fa3f597e 100644 --- a/docs/api/adapters/README.md +++ b/docs/api/adapters/README.md @@ -27,7 +27,7 @@ Driver 对象 Config 配置对象 -### `_call_api_hook` +### `_calling_api_hook` * **类型** @@ -42,6 +42,21 @@ Config 配置对象 +### `_called_api_hook` + + +* **类型** + + `Set[T_CalledAPIHook]` + + + +* **说明** + + call_api 后执行的函数 + + + ### _abstract_ `__init__(connection_type, self_id, *, websocket=None)` diff --git a/docs/api/typing.md b/docs/api/typing.md index c3ec95bf..756ef946 100644 --- a/docs/api/typing.md +++ b/docs/api/typing.md @@ -78,6 +78,38 @@ sidebarDepth: 0 +## `T_CallingAPIHook` + + +* **类型** + + `Callable[[Bot, str, Dict[str, Any]], Awaitable[None]]` + + + +* **说明** + + `bot.call_api` 时执行的函数 + + + + +## `T_CalledAPIHook` + + +* **类型** + + `Callable[[Bot, Optional[Exception], str, Dict[str, Any], Any], Awaitable[None]]` + + + +* **说明** + + `bot.call_api` 后执行的函数,参数分别为 bot, exception, api, data, result + + + + ## `T_EventPreProcessor` diff --git a/nonebot/adapters/_base.py b/nonebot/adapters/_base.py index 264f69c7..f4290c36 100644 --- a/nonebot/adapters/_base.py +++ b/nonebot/adapters/_base.py @@ -17,7 +17,7 @@ from pydantic import BaseModel from nonebot.log import logger from nonebot.utils import DataclassEncoder -from nonebot.typing import T_CallingAPIHook +from nonebot.typing import T_CallingAPIHook, T_CalledAPIHook if TYPE_CHECKING: from nonebot.config import Config @@ -39,11 +39,16 @@ class Bot(abc.ABC): """Driver 对象""" config: "Config" """Config 配置对象""" - _call_api_hook: Set[T_CallingAPIHook] = set() + _calling_api_hook: Set[T_CallingAPIHook] = set() """ :类型: ``Set[T_CallingAPIHook]`` :说明: call_api 时执行的函数 """ + _called_api_hook: Set[T_CalledAPIHook] = set() + """ + :类型: ``Set[T_CalledAPIHook]`` + :说明: call_api 后执行的函数 + """ @abc.abstractmethod def __init__(self, @@ -156,7 +161,7 @@ class Bot(abc.ABC): await bot.call_api("send_msg", message="hello world") await bot.send_msg(message="hello world") """ - coros = list(map(lambda x: x(self, api, data), self._call_api_hook)) + coros = list(map(lambda x: x(self, api, data), self._calling_api_hook)) if coros: try: logger.debug("Running CallingAPI hooks...") @@ -166,13 +171,33 @@ class Bot(abc.ABC): "Error when running CallingAPI hook. " "Running cancelled!") - if "self_id" in data: - self_id = data.pop("self_id") - if self_id: - bot = self.driver.bots[str(self_id)] - return await bot._call_api(api, **data) + exception = None + result = None - return await self._call_api(api, **data) + try: + if "self_id" in data and data["self_id"]: + bot = self.driver.bots[str(data["self_id"])] + result = await bot._call_api(api, **data) + else: + result = await self._call_api(api, **data) + except Exception as e: + exception = e + + coros = list( + map(lambda x: x(self, exception, api, data, result), + self._called_api_hook)) + if coros: + try: + logger.debug("Running CalledAPI hooks...") + await asyncio.gather(*coros) + except Exception as e: + logger.opt(colors=True, exception=e).error( + "Error when running CalledAPI hook. " + "Running cancelled!") + + if exception: + raise exception + return result @abc.abstractmethod async def send(self, event: "Event", message: Union[str, "Message", @@ -193,7 +218,12 @@ class Bot(abc.ABC): @classmethod def on_calling_api(cls, func: T_CallingAPIHook) -> T_CallingAPIHook: - cls._call_api_hook.add(func) + cls._calling_api_hook.add(func) + return func + + @classmethod + def on_called_api(cls, func: T_CalledAPIHook) -> T_CalledAPIHook: + cls._called_api_hook.add(func) return func diff --git a/nonebot/matcher.py b/nonebot/matcher.py index 771fcc65..399ae8a4 100644 --- a/nonebot/matcher.py +++ b/nonebot/matcher.py @@ -418,6 +418,7 @@ class Matcher(metaclass=MatcherMeta): def _decorator(func: T_Handler) -> T_Handler: if not hasattr(cls.handlers[-1], "__wrapped__"): parser = cls.handlers.pop() + func_handler = Handler(func) @wraps(func) async def wrapper(bot: "Bot", event: "Event", state: T_State, @@ -427,12 +428,14 @@ class Matcher(metaclass=MatcherMeta): if "_current_key" in state: del state["_current_key"] - func_handler = cls.append_handler(wrapper) + wrapper_handler = cls.append_handler(wrapper) - getter_handler.update_signature(bot=func_handler.bot_type, - event=func_handler.event_type) - parser_handler.update_signature(bot=func_handler.bot_type, - event=func_handler.event_type) + getter_handler.update_signature( + bot=wrapper_handler.bot_type, + event=wrapper_handler.event_type) + parser_handler.update_signature( + bot=wrapper_handler.bot_type, + event=wrapper_handler.event_type) return func diff --git a/nonebot/typing.py b/nonebot/typing.py index a9dccc35..d73865bd 100644 --- a/nonebot/typing.py +++ b/nonebot/typing.py @@ -72,6 +72,22 @@ T_WebSocketDisconnectionHook = Callable[["Bot"], Awaitable[None]] WebSocket 连接断开时执行的函数 """ T_CallingAPIHook = Callable[["Bot", str, Dict[str, Any]], Awaitable[None]] +""" +:类型: ``Callable[[Bot, str, Dict[str, Any]], Awaitable[None]]`` + +:说明: + + ``bot.call_api`` 时执行的函数 +""" +T_CalledAPIHook = Callable[ + ["Bot", Optional[Exception], str, Dict[str, Any], Any], Awaitable[None]] +""" +:类型: ``Callable[[Bot, Optional[Exception], str, Dict[str, Any], Any], Awaitable[None]]`` + +:说明: + + ``bot.call_api`` 后执行的函数,参数分别为 bot, exception, api, data, result +""" T_EventPreProcessor = Callable[["Bot", "Event", T_State], Awaitable[None]] """ diff --git a/packages/nonebot-adapter-cqhttp/nonebot/adapters/cqhttp/bot.py b/packages/nonebot-adapter-cqhttp/nonebot/adapters/cqhttp/bot.py index bea0bcc3..15269b37 100644 --- a/packages/nonebot-adapter-cqhttp/nonebot/adapters/cqhttp/bot.py +++ b/packages/nonebot-adapter-cqhttp/nonebot/adapters/cqhttp/bot.py @@ -58,6 +58,7 @@ async def _check_reply(bot: "Bot", event: "Event"): )) except Exception as e: log("WARNING", f"Error when getting message reply info: {repr(e)}", e) + return # ensure string comparation if str(event.reply.sender.user_id) == str(event.self_id): event.to_me = True diff --git a/pyproject.toml b/pyproject.toml index e73b3a6d..b3a8410b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "nonebot2" -version = "2.0.0-alpha.12" +version = "2.0.0-alpha.13" description = "An asynchronous python bot framework." authors = ["yanyongyu "] license = "MIT"