Skip to main content

mirai/message/
event.rs

1//! You can use [fetch_newest_message] which in [receive] mod to receive EventPacket.
2//!
3//! # EventPacket
4//!
5//! [`EventPacket`] is the event which you received from the server, but it just a wrapper.
6//!
7//! The most commonly used event is: [`MessageEvent`]. [`MessageEvent`] has two primary variant:
8//!
9//! * GroupMessage: the message from a group, it contains a sender ([`GroupMember`]) and a group struct ([`Group`])
10//! * FriendMessage: the message from a friend, it just contains a sender ([`FriendMember`])
11//!
12//! Other event variant information can found in [this](https://github.com/mamoe/mirai-api-http/blob/master/EventType.md).
13
14use serde::Deserialize;
15use serde_json::Value;
16
17use crate::Target;
18use crate::message::{MessageChain, MessageID, TimeStamp};
19use crate::message::element::{GroupMember, FriendMember, Group};
20
21#[serde(tag = "type")]
22#[derive(Debug, Clone, Deserialize)]
23pub enum MessageEvent {
24    GroupMessage {
25        #[serde(rename = "messageChain")]
26        message_chain: MessageChain,
27        sender: GroupMember,
28    },
29
30    FriendMessage {
31        #[serde(rename = "messageChain")]
32        message_chain: MessageChain,
33        sender: FriendMember,
34    },
35}
36
37#[serde(tag = "type")]
38#[derive(Clone, Debug, Deserialize)]
39pub enum RecallEvent {
40    GroupRecallEvent {
41        #[serde(rename = "authorId")]
42        author_id: Target,
43        #[serde(rename = "messageId")]
44        message_id: MessageID,
45        time: TimeStamp,
46        group: Group,
47        operator: Option<GroupMember>,          // Bot is operator if this field is None, the same as below
48    },
49    FriendRecallEvent {
50        #[serde(rename = "authorId")]
51        author_id: Target,
52        #[serde(rename = "messageId")]
53        message_id: MessageID,
54        time: TimeStamp,
55        operator: Target,
56    },
57}
58
59#[derive(Clone, Debug, Deserialize)]
60pub enum BotLoginEventKind {
61    BotOnlineEvent,
62    BotOfflineEventActive,
63    BotOfflineEventForce,
64    BotOfflineEventDropped,
65    BotReloginEvent,
66}
67
68#[derive(Debug, Clone, Deserialize)]
69pub struct BotLoginEvent {
70    #[serde(rename = "type")]
71    kind: BotLoginEventKind,
72    qq: Target,
73}
74
75#[derive(Clone, Debug, Deserialize)]
76pub enum BotGroupEventKind {
77    BotJoinGroupEvent,
78    BotLeaveEventActive,
79    BotLeaveEventKick,
80}
81
82#[derive(Debug, Clone, Deserialize)]
83pub struct BotGroupEvent {
84    #[serde(rename = "type")]
85    kind: BotGroupEventKind,
86    group: Group,
87}
88
89#[serde(tag = "type")]
90#[derive(Clone, Debug, Deserialize)]
91pub enum BotMuteEvent {
92    BotMuteEvent {
93        #[serde(rename = "durationSeconds")]
94        duration: u32,
95        operator: GroupMember,
96    },
97    BotUnmuteEvent {
98        operator: GroupMember
99    },
100}
101
102#[derive(Debug, Clone, Deserialize)]
103pub enum GroupChangeEventKind {
104    GroupNameChangeEvent,
105    GroupEntranceAnnouncementChangeEvent,
106    GroupMuteAllEvent,
107    GroupAllowAnonymousChatEvent,
108    GroupAllowMemberInviteEvent,
109}
110
111#[serde(untagged)]
112#[derive(Clone, Debug, Deserialize)]
113pub enum ChangeType {
114    String {
115        origin: String,
116        current: String,
117    },
118    Bool {
119        origin: bool,
120        current: bool,
121    },
122}
123
124#[derive(Clone, Debug, Deserialize)]
125pub struct GroupChangeEvent {
126    #[serde(rename = "type")]
127    kind: GroupChangeEventKind,
128    #[serde(flatten)]
129    change: ChangeType,
130    group: Group,
131    operator: Option<GroupMember>,
132}
133
134#[serde(untagged)]
135#[derive(Debug, Clone, Deserialize)]
136pub enum EventPacket {
137    MessageEvent(MessageEvent),
138    BotLoginEvent(BotLoginEvent),
139    BotMuteEvent(BotMuteEvent),
140    RecallEvent(RecallEvent),
141    GroupChangeEvent(GroupChangeEvent),
142
143    Unsupported(Value),
144}