跳到主要内容

事件响应器

事件响应器(Matcher)是用于对接收到的事件进行响应的重要工具。通过定义简单的规则,事件响应器可以帮助你捕获特定类型的事件,并执行相应的操作。

在插件开发中,事件响应器是用来捕获并处理特定类型的事件的工具。它会检查事件是否满足一些条件,如果满足,就会触发预先定义的操作。这是插件与用户交互的基础。

事件响应器辅助函数

在 KiramiBot 中,我们提供了许多方便的工具,称为“事件响应器辅助函数”,来帮助你更轻松地创建事件响应器。这些辅助函数不仅简化了代码编写的过程,还提高了代码的可读性。

你可以直接从 kirami 模块中导入并使用这些辅助函数,它们能帮助你简单地创建不同类型的事件响应器,而无需手动编写复杂的代码。

接下来,我们将详细介绍这些辅助函数,并展示如何使用它们来创建你所需的事件响应器。无论你是否有编程经验,这些工具都能够帮助你更轻松地开发插件,让你专注于功能实现而不是纠结于代码细节。

创建事件响应器

在上一节创建插件中,我们创建了一个 weather 插件,现在我们来实现他的功能。

我们直接使用 on_prefix() 辅助函数来创建一个事件响应器:

weather/__init__.py
from kirami import on_prefix

weather = on_prefix("天气")

这样,我们就获得一个名为 weather 的事件响应器了,这个事件响应器会对 天气 开头的消息进行响应。

提示

如果一条消息中包含“@机器人”或以“机器人的昵称”开头,例如 @bot 天气 时,为了方便命令匹配,@bot 会被自动去除,即事件响应器收到的信息内容为 天气。 同时,event.is_tome() 将会返回 True,表示该事件与机器人相关。

为事件响应器添加参数

在辅助函数中,我们可以添加一些参数来更精细地调整事件响应器的行为。例如:

weather/__init__.py
from kirami import on_prefix

weather = on_prefix("天气", "weather", "查天气", to_me=True)

在上述代码中,我们在 on_prefix 辅助函数中添加了两个命令,并将 to_me 设置为 True

这样,我们就获得了一个可以响应 天气weather查天气 三个命令,同时需要私聊或在消息中 @bot 时才会响应的事件响应器。

提示

需要注意的是,不同的辅助函数有不同的可选参数。在使用辅助函数之前,你可以参考编辑器的提示,以了解不同函数的可选参数。

常用辅助函数

通过导入不同的辅助函数,你可以轻松创建不同类型的事件响应器。接下来,我们将介绍一些常用的辅助函数,让你更好地掌握它们的用法。

提示

你可以尝试使用下列的示例代码创建插件,亲身体验一下这些辅助函数的用法。

on_message

on_message 是一个消息事件响应器,它会响应所有消息事件。

from kirami import on_message
from kirami.typing import Matcher

@on_message()
async def _(matcher: Matcher):
await matcher.finish("on_message!")

on_notice

on_notice 是一个通知事件响应器,它会响应所有通知事件。

from kirami import on_notice
from kirami.typing import Matcher

@on_notice()
async def _(matcher: Matcher):
await matcher.finish("on_notice!")

on_request

on_request 是一个请求事件响应器,它会响应所有请求事件。

from kirami import on_request
from kirami.typing import Matcher

@on_request()
async def _(matcher: Matcher):
await matcher.finish("on_request!")

on_command

on_command 是一个消息事件响应器,它会响应所有以指定命令开头的消息事件。

注意

on_command 受到配置项中的 command_start 的影响,需要在命令前额外加上 command_start 才能触发响应。

默认配置下,on_command 只会对以 / 和空命令头开头的消息事件进行响应。

from kirami import on_command
from kirami.typing import Matcher

# 响应所有以 "command" 开头的消息事件
@on_command("command")
async def _(matcher: Matcher):
await matcher.finish("on_command!")
command
KiramiBot Logo
on_command!
command xxx
KiramiBot Logo
on_command!
/command
KiramiBot Logo
on_command!
/command xxx
KiramiBot Logo
on_command!

on_shell_command

on_shell_command 是一个消息事件响应器,它会响应所有以指定命令开头的消息事件,并且支持 shell_like 解析参数。

ArgumentParser 参考文档: argparse

注意

on_shell_command 受到配置项中的 command_start 的影响,需要在命令前额外加上 command_start 才能触发响应。

默认配置下,on_shell_command 只会对以 / 和空命令头开头的消息事件进行响应。

from kirami import on_shell_command
from kirami.rule import ArgumentParser
from kirami.typing import Matcher

# 创建一个参数解析器
parser = ArgumentParser()
parser.add_argument("arg", type=str, help="arg help")

# 响应所有以 "shell" 开头的消息事件
@on_shell_command("shell", parser=parser)
async def _(matcher: Matcher):
await matcher.finish("on_shell_command!")
shell
KiramiBot Logo
on_shell_command!
shell xxx
KiramiBot Logo
on_shell_command!
/shell
KiramiBot Logo
on_shell_command!
/shell xxx
KiramiBot Logo
on_shell_command!

on_startswith

on_startswith 是一个消息事件响应器,它会响应所有以指定内容开头的消息事件。

from kirami import on_startswith
from kirami.typing import Matcher

# 响应所有以 "start" 开头的消息事件
@on_startswith("start")
async def _(matcher: Matcher):
await matcher.finish("on_startswith!")
start
KiramiBot Logo
on_startswith!
startxxx
KiramiBot Logo
on_startswith!

on_endswith

on_endswith 是一个消息事件响应器,它会响应所有以指定内容结尾的消息事件。

from kirami import on_endswith
from kirami.typing import Matcher

# 响应所有以 "end" 结尾的消息事件
@on_endswith("end")
async def _(matcher: Matcher):
await matcher.finish("on_endswith!")
end
KiramiBot Logo
on_endswith!
xxxend
KiramiBot Logo
on_endswith!

on_fullmatch

on_fullmatch 是一个消息事件响应器,它会响应所有与指定内容完全一致的消息事件。

from kirami import on_fullmatch
from kirami.typing import Matcher

# 响应所有完全匹配 "full" 的消息事件
@on_fullmatch("full")
async def _(matcher: Matcher):
await matcher.finish("on_fullmatch!")
full
KiramiBot Logo
on_fullmatch!

on_keyword

on_keyword 是一个消息事件响应器,它会响应所有包含指定内容的消息事件。

from kirami import on_keyword
from kirami.typing import Matcher

# 响应所有包含 "key" 的消息事件
@on_keyword("key")
async def _(matcher: Matcher):
await matcher.finish("on_keyword!")
key
KiramiBot Logo
on_keyword!
xxxkeyxxx
KiramiBot Logo
on_keyword!

on_regex

on_regex 是一个消息事件响应器,它会响应所有匹配指定正则表达式的消息事件。

from kirami import on_regex
from kirami.typing import Matcher

# 响应所有匹配 "regex" 的消息事件
@on_regex(r"regex")
async def _(matcher: Matcher):
await matcher.finish("on_regex!")
regex
KiramiBot Logo
on_regex!
xxxregexxxx
KiramiBot Logo
on_regex!

on_prefix

on_prefix 是一个消息事件响应器,它会响应所有以指定内容开头的消息事件。

提示

与普通的 on_startswith 不同的是,on_prefix 会将匹配的开头从消息中去除。

from kirami import on_prefix
from kirami.typing import Matcher

# 响应所有以 "prefix" 开头的消息事件
@on_prefix("prefix")
async def _(matcher: Matcher):
await matcher.finish("on_prefix!")
prefix
KiramiBot Logo
on_prefix!
prefixxxx
KiramiBot Logo
on_prefix!

on_suffix

on_suffix 是一个消息事件响应器,它会响应所有以指定内容结尾的消息事件。

提示

与普通的 on_endswith 不同的是,on_suffix 会将匹配的结尾从消息中去除。

from kirami import on_suffix
from kirami.typing import Matcher

# 响应所有以 "suffix" 结尾的消息事件
@on_suffix("suffix")
async def _(matcher: Matcher):
await matcher.finish("on_suffix!")
suffix
KiramiBot Logo
on_suffix!
xxxsuffix
KiramiBot Logo
on_suffix!

on_time

on_time 是一个定时事件响应器,它会在指定时间到达时响应。

注意

on_time 无法使用 Matcher 对象直接发送消息,因为它是由 Bot 自身事件触发,而不是外部事件。

from kirami import on_time

# 每隔 10 秒响应一次
@on_time("interval", seconds=10)
async def _():
print("on_time!")