响应规则
机器人在实际应用中,往往会接收到多种多样的事件类型,为了控制这些事件的处理方式,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_me
为 True
时,会自动添加一个 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 内置了一些常用的响应规则,可以直接通过事件响应器辅助函数或者自行合并其他规则使用。内置响应规则列表可以参考事件响应器进阶