跳转至

扩展:使用 Filter

在 Avilla 中,所有的消息接收事件,除了自己发送的消息(MessageSent),都是通过 MessageReceived 事件获取到的。 而我们经常会有需要监听群组,好友消息等的需求,推广一下,我们也会有各种筛选事件内容的需求, 在 Avilla 中,你可以使用 Filter 实现这一功能。

Filter 类位于 avilla.core.tools.filter,你需要导入以使用:

from avilla.core.tools.filter import Filter

Note

Filter 基于 Broadcast Control 的 Dispatcher 特性实现, 这是相当强大的特性,我们基于其实现了 依赖注入,而且 —— 它本身也是一种依赖注入!

如果想要了解,建议阅读以下文档:

基础使用🔗

根据前文,我们得知 Context 对象 包含了很多信息,并且支持通过声明参数的方式获取。 这对于 Filter 来说真是难得的好事。

Filter 可以通过这样的方式判断 Context.client 是否满足模式 ::group.member

@broadcast.receiver(MessageReceived, dispatcher=[
    Filter.cx.client.follows("::group.member")
])
async def on_message_received(cx: Context):
    ...

这段代码等价于:

@broadcast.receiver(MessageReceived)
async def on_message_received(cx: Context):
    if cx.client.follows("::group.member"):
        ...

这样的写法能显著减少主体逻辑的复杂度,而且其支持组合逻辑。

not_ = lambda x: lambda y: not x(y)

@broadcast.receiver(MessageReceived, dispatcher=[
    Filter.cx.client.all(
        valid_access,
        service_alive,
        validated_user,
        not_(banned),
        ...
    )
])
async def on_message_received(cx: Context):
    ...

具体提供了的运算符方法可以参考我们提供的 API Reference。