flow_bot/event/
message.rs1use 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}