1use crate::client::Client;
2use serde::{Serialize, Deserialize};
3
4
5#[derive(Debug, Serialize, Deserialize)]
6#[serde(untagged, rename_all = "PascalCase")]
7pub enum MessageContent {
8 Text {
9 #[serde(rename = "Text")]
10 text: String
11 },
12 Location {
13 desc: String,
14 latitude: f64,
15 longitude: f64
16 },
17 Face {
18 index: u32,
19 data: String
20 },
21 Sound {
22 url: String,
24 #[serde(rename = "UUID")]
26 uuid: String,
27 size: u32,
29 second: u32,
31 #[serde(rename = "Download_Flag")]
32 download_flag: u32
34 },
35 Image {
36 #[serde(rename = "UUID")]
37 uuid: String,
38 image_format: u32,
40 image_info_array: Vec<ImageInfo>,
41 },
42 File {
43 url: String,
44 #[serde(rename = "UUID")]
45 uuid: String,
46 file_size: u32,
47 file_name: String,
48 #[serde(rename = "Download_Flag")]
49 download_flag: u32
51 },
52 Video {
53 video_url: String,
54 #[serde(rename = "VideoUUID")]
55 video_uuid: String,
56 video_size: u32,
57 video_second: u32,
58 video_format: String,
59 video_download_flag: u32,
60 thumb_url: String,
61 #[serde(rename = "thumbUUID")]
62 thumb_uuid: String,
63 thumb_size: u32,
64 thumb_width: u32,
65 thumb_height: u32,
66 thumb_format: String,
67 thumb_download_flag: u32
68 },
69 Custom {
70 data: String,
71 desc: String,
72 ext: String,
73 sound: String
74 }
75}
76
77#[derive(Debug, Serialize, Deserialize)]
78#[serde(rename_all = "PascalCase")]
79pub struct ImageInfo {
80 #[serde(rename = "type")]
82 image_type: u32,
83 size: u32,
85 width: u32,
86 height: u32,
87 #[serde(rename = "URL")]
88 url: String
89}
90
91#[derive(Debug, Serialize, Deserialize)]
92pub enum MessageType {
93 TIMTextElem,
94 TIMLocationElem,
95 TIMFaceElem,
96 TIMSoundElem,
97 TIMImageElem,
98 TIMFileElem,
99 TIMVideoFileElem,
100 TIMCustomElem
101}
102
103#[derive(Debug, Serialize, Deserialize)]
104#[serde(rename_all = "PascalCase")]
105pub struct MessageBody {
106 pub msg_type: MessageType,
107 pub msg_content: MessageContent
108}
109
110#[derive(Debug, Serialize, Deserialize)]
111#[serde(untagged)]
112pub enum CallbackPolicy {
113 ForbidBeforeSendMsgCallback,
115 ForbidAfterSendMsgCallback
117}
118
119#[derive(Debug, Serialize, Deserialize)]
120#[serde(untagged)]
121pub enum SendPolicy {
122 NoUnread,
124 NoLastMsg,
126 WithMuteNotifications
128}
129
130
131#[derive(Debug, Serialize, Deserialize)]
132#[serde(rename_all = "PascalCase")]
133pub struct Message {
134 pub sync_other_machine: u32,
136 #[serde(rename = "From_Account")]
137 pub from_account: String,
138 #[serde(rename = "To_Account")]
139 pub to_account: String,
140 #[serde(skip_serializing_if = "Option::is_none")]
142 pub msg_life_time: Option<u32>,
143 #[serde(skip_serializing_if = "Option::is_none")]
145 pub msg_seq: Option<u32>,
146 pub msg_random: u32,
148 #[serde(skip_serializing_if = "Option::is_none")]
149 pub msg_time_stamp: Option<u32>,
150 #[serde(skip_serializing_if = "Vec::is_empty")]
151 pub forbid_callback_control: Vec<CallbackPolicy>,
152 #[serde(skip_serializing_if = "Vec::is_empty")]
153 pub send_msg_control: Vec<SendPolicy>,
154 pub msg_body: Vec<MessageBody>,
155 #[serde(skip_serializing_if = "Option::is_none")]
156 pub cloud_custom_data: Option<String>,
157 }
160
161#[derive(Debug, Deserialize)]
162#[serde(rename_all = "PascalCase")]
163pub struct SendResp {
164 pub msg_time: u64,
165 pub msg_key: String
166}
167
168#[derive(Debug, Serialize, Deserialize)]
169#[serde(rename_all = "PascalCase")]
170pub struct BatchMessage {
171 pub sync_other_machine: bool,
173 #[serde(rename = "From_Account")]
174 pub from_account: String,
175 #[serde(rename = "To_Account")]
176 pub to_account: Vec<String>,
177 #[serde(skip_serializing_if = "Option::is_none")]
179 pub msg_life_time: Option<u32>,
180 #[serde(skip_serializing_if = "Option::is_none")]
182 pub msg_seq: Option<u32>,
183 pub msg_random: u32,
185 #[serde(skip_serializing_if = "Vec::is_empty")]
186 pub send_msg_control: Vec<SendPolicy>,
187 pub msg_body: MessageBody,
188 #[serde(skip_serializing_if = "Option::is_none")]
189 pub cloud_custom_data: Option<String>
190}
191
192#[derive(Debug, Deserialize)]
193#[serde(rename_all = "PascalCase")]
194pub struct SendFailAccount {
195 pub to_account: String,
196 pub error_code: u32
197}
198
199#[derive(Debug, Deserialize)]
200#[serde(rename_all = "PascalCase")]
201pub struct BatchSendResp {
202 pub error_list: Option<Vec<SendFailAccount>>,
203 pub msg_key: String
204}
205
206#[derive(Debug, Deserialize, Serialize)]
207#[serde(rename_all = "PascalCase")]
208pub struct MessageDraw {
209 #[serde(rename = "From_Account")]
210 pub from_account: String,
211 #[serde(rename = "To_Account")]
212 pub to_account: String,
213 pub msg_key: String
214}
215
216pub struct MessageApi<'a> {
217 inner: &'a Client
218}
219
220impl<'a> MessageApi<'a> {
221 define_api!(send, "/v4/openim/sendmsg", Message, SendResp);
222 define_api!(batch_send, "/v4/openim/batchsendmsg", BatchMessage, BatchSendResp);
223 define_api!(draw, "/v4/openim/admin_msgwithdraw", MessageDraw, ());
225 pub fn new(client: &'a Client) -> Self {
234 Self {inner: client}
235 }
236}