use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct QrCodeResponse {
pub qrcode: String,
#[serde(rename = "qrcode_img_content")]
pub qrcode_img_content: String,
#[serde(default)]
pub ret: i64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct QrCodeStatusResponse {
pub status: String,
#[serde(default)]
pub bot_token: String,
#[serde(default)]
pub baseurl: String,
#[serde(default)]
pub ret: i64,
}
#[derive(Debug, Clone, Serialize)]
pub struct GetUpdatesRequest {
#[serde(rename = "get_updates_buf")]
pub get_updates_buf: String,
#[serde(rename = "base_info")]
pub base_info: BaseInfo,
}
#[derive(Debug, Clone, Deserialize)]
pub struct GetUpdatesResponse {
#[serde(default)]
pub ret: i64,
#[serde(default)]
pub msgs: Vec<WeChatMessage>,
#[serde(rename = "get_updates_buf", default)]
pub get_updates_buf: String,
#[serde(rename = "longpolling_timeout_ms", default)]
pub longpolling_timeout_ms: i64,
}
#[derive(Debug, Clone, Deserialize)]
pub struct WeChatMessage {
#[serde(rename = "from_user_id", default)]
pub from_user_id: String,
#[serde(rename = "to_user_id", default)]
pub to_user_id: String,
#[serde(rename = "context_token", default)]
pub context_token: String,
#[serde(default)]
pub data: MessageData,
#[serde(rename = "msg_id", default)]
pub msg_id: String,
}
#[derive(Debug, Clone, Default, Deserialize)]
pub struct MessageData {
#[serde(rename = "item_list", default)]
pub item_list: Vec<ContentItem>,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(tag = "type")]
pub enum ContentItem {
#[serde(rename = "1")]
Text {
#[serde(rename = "text_item")]
text_item: TextItem,
},
#[serde(rename = "2")]
Image {
#[serde(rename = "image_item")]
image_item: ImageItem,
},
#[serde(rename = "3")]
File {
#[serde(rename = "file_item")]
file_item: FileItem,
},
#[serde(rename = "4")]
Voice {
#[serde(rename = "voice_item")]
voice_item: VoiceItem,
},
}
#[derive(Debug, Clone, Deserialize)]
pub struct TextItem {
pub text: String,
}
#[derive(Debug, Clone, Deserialize)]
pub struct ImageItem {
#[serde(rename = "cdn_image_url", default)]
pub cdn_image_url: String,
#[serde(rename = "aes_key", default)]
pub aes_key: String,
#[serde(default)]
pub md5: String,
#[serde(rename = "file_size", default)]
pub file_size: i64,
}
#[derive(Debug, Clone, Deserialize)]
pub struct FileItem {
#[serde(rename = "cdn_file_url", default)]
pub cdn_file_url: String,
#[serde(rename = "file_name", default)]
pub file_name: String,
#[serde(rename = "aes_key", default)]
pub aes_key: String,
#[serde(rename = "encrypt_query_param", default)]
pub encrypt_query_param: String,
#[serde(default)]
pub md5: String,
#[serde(rename = "file_size", default)]
pub file_size: i64,
}
#[derive(Debug, Clone, Deserialize)]
pub struct VoiceItem {
#[serde(rename = "cdn_voice_url", default)]
pub cdn_voice_url: String,
#[serde(rename = "aes_key", default)]
pub aes_key: String,
#[serde(rename = "asr_text", default)]
pub asr_text: String,
#[serde(rename = "voice_sec", default)]
pub voice_sec: i64,
}
#[derive(Debug, Clone, Serialize)]
pub struct SendMessageRequest {
pub msg: OutboundMessage,
#[serde(rename = "base_info")]
pub base_info: BaseInfo,
}
#[derive(Debug, Clone, Serialize)]
pub struct OutboundMessage {
#[serde(rename = "from_user_id")]
pub from_user_id: String,
#[serde(rename = "to_user_id")]
pub to_user_id: String,
#[serde(rename = "client_id")]
pub client_id: String,
#[serde(rename = "message_type")]
pub message_type: i64,
#[serde(rename = "message_state")]
pub message_state: i64,
#[serde(rename = "context_token")]
pub context_token: String,
#[serde(rename = "item_list")]
pub item_list: Vec<OutboundContentItem>,
}
#[derive(Debug, Clone, Serialize)]
#[serde(tag = "type")]
pub enum OutboundContentItem {
#[serde(rename = "1")]
Text {
#[serde(rename = "text_item")]
text_item: OutboundTextItem,
},
#[serde(rename = "2")]
Image {
#[serde(rename = "image_item")]
image_item: OutboundMediaItem,
},
#[serde(rename = "3")]
File {
#[serde(rename = "file_item")]
file_item: OutboundMediaItem,
},
#[serde(rename = "4")]
Voice {
#[serde(rename = "voice_item")]
voice_item: OutboundMediaItem,
},
}
#[derive(Debug, Clone, Serialize)]
pub struct OutboundTextItem {
pub text: String,
}
#[derive(Debug, Clone, Serialize)]
pub struct OutboundMediaItem {
#[serde(rename = "md5")]
pub md5: String,
#[serde(rename = "aeskey")]
pub aeskey: String,
#[serde(rename = "file_size")]
pub file_size: i64,
#[serde(rename = "encrypt_query_param")]
pub encrypt_query_param: String,
}
#[derive(Debug, Clone)]
pub struct UploadedMedia {
pub encrypt_query_param: String,
pub aes_key_b64: String,
pub filesize: i64,
pub md5: String,
}
#[derive(Debug, Clone, Serialize)]
pub struct GetUploadUrlRequest {
pub filekey: String,
#[serde(rename = "media_type")]
pub media_type: i64,
#[serde(rename = "to_user_id")]
pub to_user_id: String,
pub rawsize: i64,
pub rawfilemd5: String,
pub filesize: i64,
pub aeskey: String,
#[serde(rename = "no_need_thumb")]
pub no_need_thumb: bool,
#[serde(rename = "base_info")]
pub base_info: BaseInfo,
}
#[derive(Debug, Clone, Deserialize)]
pub struct GetUploadUrlResponse {
#[serde(rename = "upload_full_url", default)]
pub upload_full_url: String,
#[serde(rename = "upload_param", default)]
pub upload_param: String,
#[serde(default)]
pub ret: i64,
#[serde(default)]
pub err_msg: String,
}
#[derive(Debug, Clone, Serialize)]
pub struct SendTypingRequest {
#[serde(rename = "ilink_user_id")]
pub ilink_user_id: String,
#[serde(rename = "typing_ticket")]
pub typing_ticket: String,
pub status: i64,
#[serde(rename = "base_info")]
pub base_info: BaseInfo,
}
#[derive(Debug, Clone, Deserialize)]
pub struct GetConfigResponse {
#[serde(default)]
pub ret: i64,
#[serde(rename = "typing_ticket", default)]
pub typing_ticket: String,
#[serde(flatten)]
pub extra: std::collections::HashMap<String, xbw::all::JsonValue>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct BaseInfo {
#[serde(default, skip_serializing_if = "String::is_empty")]
pub appid: String,
#[serde(default, skip_serializing_if = "String::is_empty")]
pub sub_info: String,
}