flow_bot/event/
message.rs

1use 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}