flow_bot/event/
message.rs1use serde::{Deserialize, Serialize};
2
3use crate::message::{
4 self, IntoMessage,
5 segments::{ReplySegment, Segment},
6};
7
8#[derive(Deserialize, Debug, Clone)]
9#[serde(rename_all = "snake_case")]
10pub enum PrivateSubType {
11 Friend,
12 Group,
13 Other,
14}
15
16#[derive(Deserialize, Debug, Clone)]
17#[serde(rename_all = "snake_case")]
18pub enum GroupSubType {
19 Normal,
20 Anonymous,
21 Notice,
22}
23
24#[derive(Deserialize, Debug, Clone)]
25#[serde(rename_all = "snake_case")]
26pub enum SenderSex {
27 Male,
28 Female,
29 Unknown,
30}
31
32#[derive(Deserialize, Debug, Clone)]
33pub struct PrivateSenderInfo {
34 pub user_id: Option<i64>,
35 pub nickname: Option<String>,
36 pub sex: Option<SenderSex>,
37 pub age: Option<i32>,
38}
39
40#[derive(Deserialize, Debug, Clone)]
41pub struct PrivateMessageInfo {
42 pub sub_type: PrivateSubType,
43 pub sender: PrivateSenderInfo,
44}
45
46#[derive(Deserialize, Debug, Clone)]
47#[serde(rename_all = "snake_case")]
48pub enum GroupSenderRole {
49 Owner,
50 Admin,
51 Member,
52}
53
54#[derive(Deserialize, Debug, Clone)]
55pub struct GroupSenderInfo {
56 pub user_id: Option<i64>,
57 pub nickname: Option<String>,
58 pub card: Option<String>,
59 pub sex: Option<SenderSex>,
60 pub age: Option<i32>,
61 pub area: Option<String>,
62 pub level: Option<String>,
63 pub role: Option<GroupSenderRole>,
64 pub title: Option<String>,
65}
66
67#[derive(Serialize, Deserialize, Debug, Clone)]
68pub struct GroupAnonymousInfo {
69 pub id: i64,
70 pub name: String,
71 pub flag: String,
72}
73
74#[derive(Deserialize, Debug, Clone)]
75pub struct GroupMessageInfo {
76 pub sub_type: GroupSubType,
77 pub group_id: i64,
78 pub sender: GroupSenderInfo,
79 pub anonymous: Option<GroupAnonymousInfo>,
80}
81
82#[derive(Deserialize, Debug, Clone)]
83#[serde(tag = "message_type")]
84#[serde(rename_all = "snake_case")]
85pub enum TypedMessageInfo {
86 Group(GroupMessageInfo),
87 Private(PrivateMessageInfo),
88}
89
90#[derive(Deserialize, Debug, Clone)]
91pub struct Message {
92 pub message_id: i32,
93 pub user_id: i64,
94 pub message: message::Message,
95 pub raw_message: String,
96 pub font: i32,
97 #[serde(flatten)]
98 pub info: TypedMessageInfo,
99}
100
101impl Message {
102 pub fn reply<T>(&self, message: T) -> message::Message
103 where
104 T: IntoMessage,
105 {
106 let mut ret = vec![Segment::Reply(ReplySegment {
107 id: self.message_id.to_string(),
108 })];
109
110 ret.extend(message.into_message());
111 ret
112 }
113}