Skip to content

Commit

Permalink
📝 Docs: 修改文档-指南
Browse files Browse the repository at this point in the history
  • Loading branch information
yixinNB committed Jul 4, 2024
1 parent 45418cc commit 3f2035b
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 41 deletions.
9 changes: 9 additions & 0 deletions website/versioned_docs/version-2.3.1/advanced/matcher.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,15 @@ options:
事件响应器允许继承,你可以通过直接继承 `Matcher` 类来创建一个新的事件响应器。
:::

## 事件响应器辅助函数

NoneBot 中所有事件响应器均继承自 `Matcher` 基类,但直接使用 `Matcher.new()` 方法创建事件响应器过于繁琐且不能记录插件信息。因此,NoneBot 中提供了一系列“事件响应器辅助函数”(下称“辅助函数”)来辅助我们用**最简的方式**创建**带有不同规则预设**的事件响应器,提高代码可读性和书写效率。通常情况下,我们只需要使用辅助函数即可完成事件响应器的创建。

在 NoneBot 中,辅助函数以 `on()``on_<type/rule>()` 形式出现(例如 `on_command()`),调用后根据不同的参数返回一个 `Type[Matcher]` 类型的新事件响应器。

目前 NoneBot 提供了多种功能各异的辅助函数、具有共同命令名称前缀的命令组以及具有共同参数的响应器组,均可以从 `nonebot` 模块直接导入使用,具体内容参考。


## 事件响应器组成

### 事件响应器类型
Expand Down
42 changes: 23 additions & 19 deletions website/versioned_docs/version-2.3.1/tutorial/handler.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -8,24 +8,15 @@ options:
weight: 70
---

# 事件处理
# 事件(消息)处理

import Messenger from "@site/src/components/Messenger";

在我们收到事件,并被某个事件响应器正确响应后,便正式开启了对于这个事件的**处理流程**
在我们收到事件,并被某个事件响应器正确响应后(通过matcher和rule的筛选),便正式开启了对于这个事件的处理流程. 对于初学者, 整个处理流程就是一个协程(async)函数

## 认识事件处理流程

就像我们在解决问题时需要遵循流程一样,处理一个事件也需要一套流程。在事件响应器对一个事件进行响应之后,会依次执行一系列的**事件处理依赖**(通常是函数)。简单来说,事件处理流程并不是一个函数、一个对象或一个方法,而是一整套由开发者设计的流程。

在这个流程中,我们**目前**只需要了解两个概念:函数形式的“事件处理依赖”(下称“事件处理函数”)和“事件响应器操作”。

## 事件处理函数

在事件响应器中,事件处理流程可以由一个或多个“事件处理函数”组成,这些事件处理函数将会按照顺序依次对事件进行处理,直到全部执行完成或被中断。我们可以采用事件响应器的“事件处理函数装饰器”来添加这些“事件处理函数”。

顾名思义,“事件处理函数装饰器”是一个[装饰器(decorator)](https://docs.python.org/zh-cn/3/glossary.html#term-decorator),那么它的使用方法也同[函数定义](https://docs.python.org/zh-cn/3/reference/compound_stmts.html#function-definitions)中所展示的包装用法相同。例如:
详细内容请访问后续文档

## 写一个事件处理函数
```python {6-8} title=weather/__init__.py
from nonebot.rule import to_me
from nonebot.plugin import on_command
Expand All @@ -34,16 +25,20 @@ weather = on_command("天气", rule=to_me(), aliases={"weather", "查天气"}, p

@weather.handle()
async def handle_function():
pass # do something here
pass # 处理事件(消息)
```
`@weather.handle()`是一个[装饰器(decorator)](https://docs.python.org/zh-cn/3/glossary.html#term-decorator), 用于将handle_function和weather(Matcher)在nonebot登记

`weather` 响应器被触发之后,将会依次调用 `weather` 响应器的事件处理函数,即 用`handle_function` 来对事件进行处理。

如上方示例所示,我们使用 `weather` 响应器的 `handle` 装饰器装饰了一个函数 `handle_function``handle_function` 函数会被添加到 `weather` 的事件处理流程中。在 `weather` 响应器被触发之后,将会依次调用 `weather` 响应器的事件处理函数,即 `handle_function` 来对事件进行处理
深入: 在事件响应器中,事件处理流程可以由一个或多个“事件处理函数”组成,这些事件处理函数将会按照顺序依次对事件进行处理,直到全部执行完成或被中断。我们可以采用事件响应器的“事件处理函数装饰器”来添加这些“事件处理函数”

## 事件响应器操作
深入: 就像我们在解决问题时需要遵循流程一样,处理一个事件也需要一套流程。在事件响应器对一个事件进行响应之后,会依次执行一系列的**事件处理依赖**(通常是函数)。简单来说,事件处理流程并不是一个函数、一个对象或一个方法,而是一整套由开发者设计的流程。

在事件处理流程中,我们可以使用事件响应器操作来进行一些交互或改变事件处理流程,例如向机器人用户发送消息或提前结束事件处理流程等。
### 回复/发送消息
#### 方式一: 事件响应器操作

事件响应器操作与事件处理函数装饰器类似,通常作为事件响应器 `Matcher`[类方法](https://docs.python.org/zh-cn/3/library/functions.html#classmethod)存在,因此事件响应器操作的调用方法也是 `Matcher.func()` 的形式。不过不同的是,事件响应器操作并不是装饰器,因此并不需要@进行标注
我们可以使用事件响应器操作来进行一些交互或改变事件处理流程(操作Matcher),例如向机器人用户发送消息或提前结束事件处理流程等

```python {8,9} title=weather/__init__.py
from nonebot.rule import to_me
Expand Down Expand Up @@ -81,7 +76,16 @@ except MatcherException:
except Exception as e:
pass # do something here
```

:::

目前 NoneBot 提供了多种事件响应器操作,其中包括用于机器人用户交互与流程控制两大类,进阶使用方法可以查看[会话控制](../appendices/session-control.mdx)

深入: 请参考**事件响应器操作**

#### 方式二: 通过event指定发送方
```python
target_qq_id=1660000000
@on_message(is_type(PrivateMessageEvent), priority=10).handle()
async def auto_reply(bot: Bot, event: Event, state: T_State):
await bot.send_private_msg(user_id=target_qq_id,message=event.get_message())
```
57 changes: 35 additions & 22 deletions website/versioned_docs/version-2.3.1/tutorial/matcher.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,51 +8,64 @@ options:
weight: 60
---

# 事件响应器
# 事件(消息)响应器

事件响应器(Matcher)是对接收到的事件进行响应的基本单元,所有的事件响应器都继承自 `Matcher` 基类。

在 NoneBot 中,事件响应器可以通过一系列特定的规则**筛选****具有某种特征的事件**,并按照**特定的流程**交由**预定义的事件处理依赖**进行处理。例如,在[快速上手](../quick-start.mdx)中,我们使用了内置插件 `echo` ,它定义的事件响应器能响应机器人用户发送的“/echo hello world”消息,提取“hello world”信息并作为回复消息发送。
Matcher用于将消息和规则进行匹配/检查/筛选, 当消息匹配时执行`@matcher_obj.handle()`装饰的函数

## 事件响应器辅助函数
# 定义响应规则(Matcher/Rule/事件响应器辅助函数)

NoneBot 中所有事件响应器均继承自 `Matcher` 基类,但直接使用 `Matcher.new()` 方法创建事件响应器过于繁琐且不能记录插件信息。因此,NoneBot 中提供了一系列“事件响应器辅助函数”(下称“辅助函数”)来辅助我们用**最简的方式**创建**带有不同规则预设**的事件响应器,提高代码可读性和书写效率。通常情况下,我们只需要使用辅助函数即可完成事件响应器的创建。
事件响应器辅助函数具体细节已移至[事件响应器进阶](../advanced/matcher.md)

在 NoneBot 中,辅助函数以 `on()``on_<type/rule>()` 形式出现(例如 `on_command()`),调用后根据不同的参数返回一个 `Type[Matcher]` 类型的新事件响应器。
响应器(Matcher)对消息进行初筛, 常用的有

目前 NoneBot 提供了多种功能各异的辅助函数、具有共同命令名称前缀的命令组以及具有共同参数的响应器组,均可以从 `nonebot` 模块直接导入使用,具体内容参考[事件响应器进阶](../advanced/matcher.md)
- on_message() 处理所有消息(无限制)
- on_command() 匹配指令例如"/echo hello world"中匹配"/echo"
- on_regex() 对整个消息文本进行正则表达式匹配

## 创建事件响应器
Rule对消息进行二次筛选, 常用的有:

在上一节[创建插件](./create-plugin.md#创建插件)中,我们创建了一个 `weather` 插件,现在我们来实现他的功能。
- to_me() 私聊或 `@bot``@全体成员` 时才会响应

我们直接使用 `on_command()` 辅助函数来创建一个事件响应器:
经过Matcher和Rule筛选的消息会触发函数进行处理

```python {3} title=weather/__init__.py
from nonebot import on_command

weather = on_command("天气")
```
## 在哪导入

这样,我们就获得一个名为 `weather` 的事件响应器了,这个事件响应器会对 `/天气` 开头的消息进行响应。
**matcher**
编辑器中输入`from nonebot import on`以后, 大部分编辑器已经能够给出代码提示

:::tip 提示
如果一条消息中包含“@机器人”或以“机器人的昵称”开始,例如 `@bot /天气` 时,协议适配器会将 `event.is_tome()` 判断为 `True` ,同时也会自动去除 `@bot`,即事件响应器收到的信息内容为 `/天气`,方便进行命令匹配。
:::
示例`from nonebot import on_message, on_regex`

### 为事件响应器添加参数
**rule**
示例`from nonebot.rule import to_me`

在辅助函数中,我们可以添加一些参数来对事件响应器进行更加精细的调整,例如事件响应器的优先级、匹配规则等。例如:
## on_command示例

```python {4} title=weather/__init__.py
```python {3} title=weather/__init__.py
from nonebot import on_command
from nonebot.rule import to_me

weather = on_command("天气", rule=to_me(), aliases={"weather", "查天气"}, priority=10, block=True)
```

这样,我们就获得了一个可以响应 `天气``weather``查天气` 三个命令,需要私聊或 `@bot` 时才会响应,优先级为 10 ,阻断事件传播的事件响应器了。这些内容的意义和使用方法将会在后续的章节中一一介绍。
:::tip 提示
如果一条消息中包含“@机器人”或以“机器人的昵称”开始,例如 `@bot /天气` 时,协议适配器会将 `event.is_tome()`(is to me)
判断为 `True` ,同时也会自动去除 `@bot`,即事件响应器收到的信息内容为 `/天气`,方便进行命令匹配。
:::

这样,我们就获得了一个可以响应 `天气``weather``查天气`(aliases可以设置命令的别名) 三个命令的响应规则,需要私聊或 `@bot`
`@全体成员` 时才会响应,优先级为 10 (越小越先),阻断事件传播(block=True, 不响应优先级值更大的matcher)
的事件响应器了。这些内容的意义和使用方法将会在后续的章节中一一介绍。

:::tip 提示
需要注意的是,不同的辅助函数有不同的可选参数,在使用之前可以参考[事件响应器进阶](../advanced/matcher.md)或编辑器的提示。
:::

## on_regex示例

```
on_regex(r"^1$", flags=re.IGNORECASE, priority=5, block=True)
```

这段代码会将所有消息进行正则表达式匹配, 当消息文本为"1"的时候(匹配"^1$")满足该matcher

0 comments on commit 3f2035b

Please sign in to comment.