use super::{post_send, Part};
use crate::{error::CommonResponse, wechat::WxApiRequestBuilder, SdkResult};
use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize, Deserialize)]
pub struct SendMsg {
pub touser: String,
pub msgtype: MsgType,
#[serde(default)]
pub text: Option<TextContent>,
#[serde(default)]
pub image: Option<MediaId>,
#[serde(default)]
pub link: Option<Link>,
#[serde(default)]
pub miniprogrampage: Option<MiniProgrampage>,
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum MsgType {
Text,
Image,
Link,
Miniprogrampage,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct TextContent {
pub content: String,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct MediaId {
pub media_id: String,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct Link {
pub title: String,
pub description: String,
pub url: String,
pub thumb_url: String,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct MiniProgrampage {
pub title: String,
pub pagepath: String,
pub thumb_media_id: String,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct SetTyping {
pub touser: String,
pub command: Command,
}
#[derive(Debug, Serialize, Deserialize)]
pub enum Command {
Typing,
CancelTyping,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct MediaResult {
#[serde(rename = "type")]
pub type_: String,
pub media_id: String,
pub created_at: i64,
}
pub struct CustomerMessageModule<'a, T: WxApiRequestBuilder>(pub(crate) &'a T);
impl<'a, T: WxApiRequestBuilder> CustomerMessageModule<'a, T> {
pub async fn get_temp_media(&self, media_id: &str) -> SdkResult<Vec<u8>> {
let url = "https://api.weixin.qq.com/cgi-bin/media/get";
let builder = self.0.wx_get(url).await?.query(&("media_id", media_id));
let bytes = builder.send().await?.bytes().await?;
Ok(bytes.to_vec())
}
pub async fn send(&self, data: &SendMsg) -> SdkResult<()> {
let url = "https://api.weixin.qq.com/cgi-bin/message/custom/send";
post_send(self.0, url, data).await
}
pub async fn set_typing(&self, data: &SetTyping) -> SdkResult<()> {
let url = "https://api.weixin.qq.com/cgi-bin/message/custom/typing";
post_send(self.0, url, data).await
}
pub async fn upload_temp_media(&self, data: Part) -> SdkResult<MediaResult> {
let url = "https://api.weixin.qq.com/cgi-bin/media/upload?type=image";
let part = reqwest::multipart::Part::bytes(data.data)
.file_name(data.filename)
.mime_str(&data.content_type);
let form = reqwest::multipart::Form::new().part(data.name, part.unwrap());
let builder = self.0.wx_post(url).await?.multipart(form);
let res: CommonResponse<MediaResult> = builder.send().await?.json().await?;
res.into()
}
}