Skip to main content

flow_bot/event/
message.rs

1use async_trait::async_trait;
2use serde::{Deserialize, Serialize};
3
4use crate::base::context::BotContext;
5use crate::base::extract::FromEvent;
6use crate::event::{BotEvent, TypedEvent};
7use crate::message::{
8    self, IntoMessage,
9    segments::{ReplySegment, Segment},
10};
11
12#[derive(Deserialize, Debug, Clone)]
13#[serde(rename_all = "snake_case")]
14pub enum PrivateSubType {
15    Friend,
16    Group,
17    Other,
18}
19
20#[derive(Deserialize, Debug, Clone)]
21#[serde(rename_all = "snake_case")]
22pub enum GroupSubType {
23    Normal,
24    Anonymous,
25    Notice,
26}
27
28#[derive(Deserialize, Debug, Clone)]
29#[serde(rename_all = "snake_case")]
30pub enum SenderSex {
31    Male,
32    Female,
33    Unknown,
34}
35
36#[derive(Deserialize, Debug, Clone)]
37pub struct PrivateSenderInfo {
38    pub user_id: Option<i64>,
39    pub nickname: Option<String>,
40    pub sex: Option<SenderSex>,
41    pub age: Option<i32>,
42}
43
44#[derive(Deserialize, Debug, Clone)]
45pub struct PrivateMessageInfo {
46    pub sub_type: PrivateSubType,
47    pub sender: PrivateSenderInfo,
48}
49
50#[derive(Deserialize, Debug, Clone)]
51#[serde(rename_all = "snake_case")]
52pub enum GroupSenderRole {
53    Owner,
54    Admin,
55    Member,
56}
57
58#[derive(Deserialize, Debug, Clone)]
59pub struct GroupSenderInfo {
60    pub user_id: Option<i64>,
61    pub nickname: Option<String>,
62    pub card: Option<String>,
63    pub sex: Option<SenderSex>,
64    pub age: Option<i32>,
65    pub area: Option<String>,
66    pub level: Option<String>,
67    pub role: Option<GroupSenderRole>,
68    pub title: Option<String>,
69}
70
71#[derive(Serialize, Deserialize, Debug, Clone)]
72pub struct GroupAnonymousInfo {
73    pub id: i64,
74    pub name: String,
75    pub flag: String,
76}
77
78#[derive(Deserialize, Debug, Clone)]
79pub struct GroupMessageInfo {
80    pub sub_type: GroupSubType,
81    pub group_id: i64,
82    pub sender: GroupSenderInfo,
83    pub anonymous: Option<GroupAnonymousInfo>,
84}
85
86#[derive(Deserialize, Debug, Clone)]
87#[serde(tag = "message_type")]
88#[serde(rename_all = "snake_case")]
89pub enum TypedMessageInfo {
90    Group(GroupMessageInfo),
91    Private(PrivateMessageInfo),
92}
93
94#[derive(Deserialize, Debug, Clone)]
95pub struct Message {
96    pub message_id: i32,
97    pub user_id: i64,
98    pub message: message::Message,
99    pub raw_message: String,
100    pub font: i32,
101    #[serde(flatten)]
102    pub info: TypedMessageInfo,
103}
104
105impl Message {
106    pub fn reply<T>(&self, message: T) -> message::Message
107    where
108        T: IntoMessage,
109    {
110        let mut ret = vec![Segment::Reply(ReplySegment {
111            id: self.message_id.to_string(),
112        })];
113
114        ret.extend(message.into_message());
115        ret
116    }
117}
118
119#[async_trait]
120impl FromEvent for Message {
121    async fn from_event(_: BotContext, event: BotEvent) -> Option<Self> {
122        if let TypedEvent::Message(message) = &event.event {
123            Some((**message).clone())
124        } else {
125            None
126        }
127    }
128}
129
130#[async_trait]
131impl FromEvent for PrivateMessageInfo {
132    async fn from_event(_: BotContext, event: BotEvent) -> Option<Self> {
133        if let TypedEvent::Message(ref msg) = event.event {
134            match &msg.info {
135                TypedMessageInfo::Private(info) => Some(info.clone()),
136                _ => None,
137            }
138        } else {
139            None
140        }
141    }
142}
143
144#[async_trait]
145impl FromEvent for GroupMessageInfo {
146    async fn from_event(_: BotContext, event: BotEvent) -> Option<Self> {
147        if let TypedEvent::Message(ref msg) = event.event {
148            match &msg.info {
149                TypedMessageInfo::Group(info) => Some(info.clone()),
150                _ => None,
151            }
152        } else {
153            None
154        }
155    }
156}