use crate::client::Client;
use serde::{Serialize, Deserialize};
#[derive(Debug, Serialize, Deserialize)]
#[serde(untagged, rename_all = "PascalCase")]
pub enum MessageContent {
Text {
#[serde(rename = "Text")]
text: String
},
Location {
desc: String,
latitude: f64,
longitude: f64
},
Face {
index: u32,
data: String
},
Sound {
url: String,
#[serde(rename = "UUID")]
uuid: String,
size: u32,
second: u32,
#[serde(rename = "Download_Flag")]
download_flag: u32
},
Image {
#[serde(rename = "UUID")]
uuid: String,
image_format: u32,
image_info_array: Vec<ImageInfo>,
},
File {
url: String,
#[serde(rename = "UUID")]
uuid: String,
file_size: u32,
file_name: String,
#[serde(rename = "Download_Flag")]
download_flag: u32
},
Video {
video_url: String,
#[serde(rename = "VideoUUID")]
video_uuid: String,
video_size: u32,
video_second: u32,
video_format: String,
video_download_flag: u32,
thumb_url: String,
#[serde(rename = "thumbUUID")]
thumb_uuid: String,
thumb_size: u32,
thumb_width: u32,
thumb_height: u32,
thumb_format: String,
thumb_download_flag: u32
},
Custom {
data: String,
desc: String,
ext: String,
sound: String
}
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct ImageInfo {
#[serde(rename = "type")]
image_type: u32,
size: u32,
width: u32,
height: u32,
#[serde(rename = "URL")]
url: String
}
#[derive(Debug, Serialize, Deserialize)]
pub enum MessageType {
TIMTextElem,
TIMLocationElem,
TIMFaceElem,
TIMSoundElem,
TIMImageElem,
TIMFileElem,
TIMVideoFileElem,
TIMCustomElem
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct MessageBody {
pub msg_type: MessageType,
pub msg_content: MessageContent
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(untagged)]
pub enum CallbackPolicy {
ForbidBeforeSendMsgCallback,
ForbidAfterSendMsgCallback
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(untagged)]
pub enum SendPolicy {
NoUnread,
NoLastMsg,
WithMuteNotifications
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct Message {
pub sync_other_machine: u32,
#[serde(rename = "From_Account")]
pub from_account: String,
#[serde(rename = "To_Account")]
pub to_account: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub msg_life_time: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub msg_seq: Option<u32>,
pub msg_random: u32,
#[serde(skip_serializing_if = "Option::is_none")]
pub msg_time_stamp: Option<u32>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub forbid_callback_control: Vec<CallbackPolicy>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub send_msg_control: Vec<SendPolicy>,
pub msg_body: Vec<MessageBody>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cloud_custom_data: Option<String>,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct SendResp {
pub msg_time: u64,
pub msg_key: String
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct BatchMessage {
pub sync_other_machine: bool,
#[serde(rename = "From_Account")]
pub from_account: String,
#[serde(rename = "To_Account")]
pub to_account: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub msg_life_time: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub msg_seq: Option<u32>,
pub msg_random: u32,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub send_msg_control: Vec<SendPolicy>,
pub msg_body: MessageBody,
#[serde(skip_serializing_if = "Option::is_none")]
pub cloud_custom_data: Option<String>
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct SendFailAccount {
pub to_account: String,
pub error_code: u32
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct BatchSendResp {
pub error_list: Option<Vec<SendFailAccount>>,
pub msg_key: String
}
#[derive(Debug, Deserialize, Serialize)]
#[serde(rename_all = "PascalCase")]
pub struct MessageDraw {
#[serde(rename = "From_Account")]
pub from_account: String,
#[serde(rename = "To_Account")]
pub to_account: String,
pub msg_key: String
}
pub struct MessageApi<'a> {
inner: &'a Client
}
impl<'a> MessageApi<'a> {
define_api!(send, "/v4/openim/sendmsg", Message, SendResp);
define_api!(batch_send, "/v4/openim/batchsendmsg", BatchMessage, BatchSendResp);
define_api!(draw, "/v4/openim/admin_msgwithdraw", MessageDraw, ());
pub fn new(client: &'a Client) -> Self {
Self {inner: client}
}
}