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"