1use serde::{Deserialize, Serialize};
23
24#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
26#[repr(u32)]
27pub enum ContentMessageType {
28 Text = 0,
30 Image = 1,
32 File = 2,
34 Voice = 3,
36 Video = 4,
38 System = 5,
40 Audio = 6,
42 Location = 7,
44 ContactCard = 8,
46 Sticker = 9,
48 Forward = 10,
50}
51
52impl ContentMessageType {
53 pub fn from_u32(value: u32) -> Option<Self> {
54 match value {
55 0 => Some(ContentMessageType::Text),
56 1 => Some(ContentMessageType::Image),
57 2 => Some(ContentMessageType::File),
58 3 => Some(ContentMessageType::Voice),
59 4 => Some(ContentMessageType::Video),
60 5 => Some(ContentMessageType::System),
61 6 => Some(ContentMessageType::Audio),
62 7 => Some(ContentMessageType::Location),
63 8 => Some(ContentMessageType::ContactCard),
64 9 => Some(ContentMessageType::Sticker),
65 10 => Some(ContentMessageType::Forward),
66 _ => None,
67 }
68 }
69
70 pub fn as_u32(self) -> u32 {
71 self as u32
72 }
73
74 pub fn as_str(self) -> &'static str {
76 match self {
77 ContentMessageType::Text => "text",
78 ContentMessageType::Image => "image",
79 ContentMessageType::File => "file",
80 ContentMessageType::Voice => "voice",
81 ContentMessageType::Video => "video",
82 ContentMessageType::System => "system",
83 ContentMessageType::Audio => "audio",
84 ContentMessageType::Location => "location",
85 ContentMessageType::ContactCard => "contact_card",
86 ContentMessageType::Sticker => "sticker",
87 ContentMessageType::Forward => "forward",
88 }
89 }
90}
91
92#[derive(Debug, Clone, Serialize, Deserialize)]
96pub struct MessageSource {
97 #[serde(rename = "type")]
98 pub source_type: String, pub source_id: String,
100}
101
102#[derive(Debug, Clone, Default, Serialize, Deserialize)]
104pub struct MessagePayloadEnvelope {
105 #[serde(default)]
107 pub content: String,
108 pub metadata: Option<serde_json::Value>,
110 pub reply_to_message_id: Option<String>,
112 pub mentioned_user_ids: Option<Vec<u64>>,
114 pub message_source: Option<MessageSource>,
116}
117
118#[derive(Debug, Clone, Serialize, Deserialize)]
122pub struct ImageMetadata {
123 pub file_id: u64,
124 pub url: Option<String>,
125 pub width: Option<u32>,
126 pub height: Option<u32>,
127}
128
129#[derive(Debug, Clone, Serialize, Deserialize)]
131pub struct FileLikeMetadata {
132 pub file_id: u64,
133}
134
135#[derive(Debug, Clone, Serialize, Deserialize)]
137pub struct LocationMetadata {
138 pub latitude: f64,
139 pub longitude: f64,
140}
141
142#[derive(Debug, Clone, Serialize, Deserialize)]
144pub struct ContactCardMetadata {
145 pub user_id: u64,
146}
147
148#[derive(Debug, Clone, Serialize, Deserialize)]
150pub struct StickerMetadata {
151 pub sticker_id: String,
152 pub image_url: String,
153}
154
155#[derive(Debug, Clone, Serialize, Deserialize)]
157pub struct ForwardMessageRef {
158 pub message_id: Option<u64>,
159 pub content: Option<String>,
160 #[serde(flatten)]
161 pub extra: Option<serde_json::Value>,
162}
163
164#[derive(Debug, Clone, Serialize, Deserialize)]
166pub struct ForwardMetadata {
167 pub messages: Vec<ForwardMessageRef>,
168}