获取事件信息
在 KiramiBot 事件处理流 程中,获取事件信息并做出对应的操作是非常常见的场景。本章节中我们将介绍如何通过依赖注入获取事件信息。
初识依赖注入
在事件处理流程中,事件响应器具有自己独立的上下文,例如:当前响应的事件、收到事件的机器人或者其他处理流程中新增的信息等。这些数据可以根据需要,通过依赖注入的方式传递到事件处理函数中。
相对于传统的信息获取方法,通过依赖注入获取信息的最大特色在于按需取用。如果该事件处理函数不需要任何额外信息即可运行,就无需进行依赖注入。如果事件处理函数需要额外数据,可以通过依赖注入标记所需依赖,这些依赖将在函数运行时被注入。
对于依赖注入,你可以把它想象成外卖订餐。你是客户(事件处理函数),而外卖平台(依赖注入)根据你的需求提供不同的食物(事件信息)。
简而言之,依赖注入就像是外卖平台根 据你的需求将食物送到你手中,让你能够方便地获取所需的信息。这使得事件处理函数能够更灵活地获取所需的上下文数据,让编程更加便捷和可扩展。
使用依赖注入
使用依赖注入获取上下文信息非常简单,我们仅需在事件处理函数的参数中声明所需的依赖即可。在 KiramiBot 中,我们可以直接使用 kirami.depends
模块中定义的参数类型来声明依赖。
例如,我们可以继续改进上一章节中的 weather
插件,使其可以获取到 天气
命令的地名参数,并根据地名返回天气信息。
from kirami import on_prefix
from kirami.depends import EventPlainText
weather = on_prefix("天气", "weather", "查天气", to_me=True)
@weather.handle()
async def handle_function(location: EventPlainText):
# 使用纯文本消息作为地名,并判断是否有效
if location:
await weather.finish(f"今天{location}的天气是...")
else:
await weather.finish("请输入地名")
如上方示例所示,我们使用了 location
作为注入参数名,注入的内容为 EventPlainText
,也就是事件纯文本消息。在这个示例中,我们先会检查获得的参数是否有效,对无效参数则会结束 事件。
on_prefix
会将匹配的开头从消息中去除,例如:天气 上海
的消息会被转换为 上海
,所以 EventPlainText
获取的纯文本消息为 上海
。
我们还可以直接注入事件,它包含了当前事件的所有信息,例如:事件类型、事件消息、事件机器人和事件发起者等。在事件处理函数中,我们可以通过 Event
类型获取事件信息。
from kirami import on_prefix
from kirami.typing import Event
weather = on_prefix("天气", "weather", "查天气", to_me=True)
@weather.handle()
async def handle_function(event: Event):
print(event) # 打印事件信息
KiramiBot 提供了多种依赖注入类型,可以获取不同的信息,具体内容可参考依赖注入。