跳到主要内容

响应规则

机器人在实际应用中,往往会接收到多种多样的事件类型,为了控制这些事件的处理方式,KiramiBot 使用响应规则来进行管理。

RuleChecker

RuleChecker 是一种返回值为 bool 类型的依赖函数,它支持依赖注入。我们可以根据上一节中添加的配置项,在 weather 插件目录中编写一个响应规则:

config = Config.load_config()

async def is_allow(city: EventPlainText) -> bool:
return city in config.allow_cities

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

在上面的代码中,我们定义了一个函数 is_allow,它会检查查询的城市是否在配置项 allow_cities 中。这个函数就是一个 RuleChecker,它会在每次收到事件时被调用,如果返回 True,则表示事件符合条件,否则不会响应。

提示

on_prefix 辅助函数中的 to_me 参数实际上是通过响应规则实现的,当 to_meTrue 时,会自动添加一个 RuleChecker 来检查消息是否发给了机器人。

Rule

Rule 是多个 RuleChecker 的集合,它会同时调用每个 RuleChecker 进行检查,只有当所有的检查都通过时,规则才匹配成功。例如:

from kirami.rule import Rule
from kirami.typing import Event

async def is_allow(city: EventPlainText) -> bool:
return city in config.allow_cities

async def is_blacklisted(event: Event) -> bool:
return event.get_user_id() not in BLACKLIST

rule = Rule(is_allow, is_blacklisted)

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

在上例中,我们组合了两个 RuleChecker,一个用于检查城市是否允许查询,一个用于检查用户是否在黑名单中,只有当城市允许查询且用户不在黑名单中时,规则才会匹配成功。

合并响应规则

为了更好地复用规则,我们可以将规则进行细分,然后在使用时进行合并。除了使用 Rule 对象来组合多个 RuleChecker,我们还可以对 Rule 对象进行合并。例如:

config = Config.load_config()

async def is_allow(city: EventPlainText) -> bool:
return city in config.allow_cities

async def is_blacklisted(event: Event) -> bool:
return event.get_user_id() not in BLACKLIST

weather = on_prefix(
"天气", "weather", "查天气", rule=Rule(is_allow) & is_blacklisted, to_me=True
)

合并响应规则可以有多种形式,例如:

rule1 = Rule(foo_checker)
rule2 = Rule(bar_checker)

rule = rule1 & rule2
rule = rule1 & bar_checker
rule = foo_checker & rule2

同时,我们也无需担心合并了一个 None 值,Rule 会忽略 None 值。

assert (rule & None) is rule

主动使用响应规则

除了在事件响应器中使用响应规则外,我们还可以主动使用响应规则来判断事件是否符合条件。例如:

rule = Rule(some_checker)

result = await rule(bot, event, state)

只需要传入 Bot 对象、事件和会话状态,Rule 会同时调用所有 RuleChecker 进行检查,并返回结果。

内置响应规则

KiramiBot 内置了一些常用的响应规则,可以直接通过事件响应器辅助函数或者自行合并其他规则使用。内置响应规则列表可以参考事件响应器进阶