# Hello, event

# 什么是事件(Event)?

事件(Event) 用于处理在无头客户端处广播的各式可观察事件, 并将其通过内置的事件处理机制进行分发.

# 通俗的说法

事件就是我们能看到的 "xxx被禁言了", "xxx群开全群禁言了" 这样的外部发生的状态变化.

我们将类似 "欸, 那个人被禁言辣", "欸, 这个群怎么群名变了" 这样的称为 "作为第三方观察到的外部发生的事件", 而将类似 "机器人又被下管理了", "机器人被口球了" 这样以机器人账号为被执行者的称为 "作为被执行方所观察到的事件".

TIP

其实, 你之前用到的 FriendMessage, GroupMessage, 也是事件的一种特殊类型, 我们称这种特殊事件为 Message

# 如何监听事件

与之前使用的类似 "FriendMessage" 一样, 你只需要将事件的名称传入 Mirai.receiver 即可监听事件.
事件的列表可以在这里看到.

当事件被传达时, event_runner 会实例化一个 EventContextBody(mirai.prototypes.context.EventContextBody) 对象, 设置上下文对象 EventContext(mirai.context.event 或者 mirai.Direct.Event), 并使用 annotations 特性将参数传入事件运行主体运行.

这里是一个监听事件 "MemberJoinEvent" 的实例.

from mirai import (
    Mirai, Plain, At,
    MemberJoinEvent,
    EventContextBody
)
...

@app.receiver("MemberJoinEvent")
async def member_join(app: Mirai, event: MemberJoinEvent):
    await app.sendGroupMessage(
        event.member.group.id,
        [
            At(target=event.member.id),
            Plain(text="欢迎进群!")
        ]
    )

...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

运行这段代码, 当有新成员加入有该机器人的群时, 机器人会发送一条欢迎消息.

# 关于类型推断

因为我们使用了 annotations 的特性, 你可以使用优雅的方式处理事件:

TIP

所有的事件模型都在包 mirai.event.external 内被定义, 同时被公开到 mirai 下, 你可以直接导入:

from mirai import (
    ...
    MemberJoinEvent,
    MemberJoinEvent,
    MemberLeaveEventKick,
    MemberLeaveEventQuit,
    MemberCardChangeEvent,
    ... 
)
1
2
3
4
5
6
7
8
9