tcloud_im_api/api/
message.rs

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        // 语音地址
23        url: String,
24        // 语音标记
25        #[serde(rename = "UUID")]
26        uuid: String,
27        // 语音大小: bytes
28        size: u32,
29        // 语音长度:秒
30        second: u32,
31        #[serde(rename = "Download_Flag")]
32        // 语音下载方式标记。目前 Download_Flag 取值只能为2,表示可通过Url字段值的 URL 地址直接下载语音。
33        download_flag: u32
34    },
35    Image {
36        #[serde(rename = "UUID")]
37        uuid: String,
38        // 图片格式。JPG = 1,GIF = 2,PNG = 3,BMP = 4,其他 = 255。
39        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 取值只能为2,表示可通过Url字段值的 URL 地址直接下载语音。
50        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    // 图片类型: 1-原图,2-大图,3-缩略图。
81    #[serde(rename = "type")]
82    image_type: u32,
83    //图片数据大小,单位:字节。
84    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    /// 禁止发消息前回调
114    ForbidBeforeSendMsgCallback,
115    /// 禁止发消息后回调
116    ForbidAfterSendMsgCallback 
117}
118
119#[derive(Debug, Serialize, Deserialize)]
120#[serde(untagged)]
121pub enum SendPolicy {
122    /// 该条消息不计入未读数
123    NoUnread,
124    /// 该条消息不更新会话列表
125    NoLastMsg,
126    /// 该条消息的接收方对发送方设置的免打扰选项生效(默认不生效)
127    WithMuteNotifications
128}
129
130
131#[derive(Debug, Serialize, Deserialize)]
132#[serde(rename_all = "PascalCase")]
133pub struct Message {
134    /// 1: sync 2:no_sync
135    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    ///0-604800 None: 7天,0:不发送离线
141    #[serde(skip_serializing_if = "Option::is_none")]
142    pub msg_life_time: Option<u32>,
143    ///去重及排序
144    #[serde(skip_serializing_if = "Option::is_none")]
145    pub msg_seq: Option<u32>,
146    /// 消息随机数,后台用于同一秒内的消息去重。请确保该字段填的是随机数
147    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    //暂不实现
158    //pub offline_push_info: Option<OfflinePushInfo>,
159}
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    /// 1: sync 2:no_sync
172    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    ///0-604800 None: 7天,0:不发送离线
178    #[serde(skip_serializing_if = "Option::is_none")]
179    pub msg_life_time: Option<u32>,
180    ///去重及排序
181    #[serde(skip_serializing_if = "Option::is_none")]
182    pub msg_seq: Option<u32>,
183    /// 消息随机数,后台用于同一秒内的消息去重。请确保该字段填的是随机数
184    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    // 撤回
224    define_api!(draw, "/v4/openim/admin_msgwithdraw", MessageDraw, ());
225    // define_api!(import, "v4/openim/importmsg", BatchMessage, BatchSendResp);
226    // // 查询消息
227    // define_api!(roamnsg, "v4/openim/admin_getroammsg", BatchMessage, BatchSendResp);
228    // // 设置为已读
229    // define_api!(mark_read, "v4/openim/admin_set_msg_read", BatchMessage, BatchSendResp);
230    // // 未读计数
231    // define_api!(unread_count, "v4/openim/get_c2c_unread_msg_num", BatchMessage, BatchSendResp);
232
233    pub fn new(client: &'a Client) -> Self {
234        Self {inner: client}
235    }
236}