use serde::{Serialize, Deserialize};
use serde_json::{Value};
use crate::{session::SessionStore, request::{RequestType}, WechatCommonResponse, LabradorResult, WechatCpClient, WechatCpNewArticle, WechatMpNewsArticle};
use crate::wechat::cp::method::{CpMessageMethod, WechatCpMethod};
#[derive(Debug, Clone)]
pub struct WechatCpMessage<'a, T: SessionStore> {
client: &'a WechatCpClient<T>,
}
#[allow(unused)]
impl<'a, T: SessionStore> WechatCpMessage<'a, T> {
#[inline]
pub fn new(client: &WechatCpClient<T>) -> WechatCpMessage<T> {
WechatCpMessage {
client,
}
}
pub async fn send(&self, mut req: WechatCpMessageRequest) -> LabradorResult<WechatCpMessageResponse> {
let agent_id = req.agent_id.unwrap_or_default();
if agent_id == 0 {
req.agent_id = self.client.agent_id;
}
let v= self.client.post(WechatCpMethod::Message(CpMessageMethod::Send), vec![], req, RequestType::Json).await?.json::<Value>()?;
WechatCommonResponse::parse::<WechatCpMessageResponse>(v)
}
pub async fn send_linked_corp_message(&self, mut req: WechatCpLinkedCorpMessage) -> LabradorResult<WechatCpLinkedCorpMessageResponse> {
let agent_id = req.agent_id.unwrap_or_default();
if agent_id == 0 {
req.agent_id = self.client.agent_id;
}
let v = self.client.post(WechatCpMethod::Message(CpMessageMethod::LinkedCorpSend), vec![], req, RequestType::Json).await?.json::<Value>()?;
WechatCommonResponse::parse::<WechatCpLinkedCorpMessageResponse>(v)
}
pub async fn send_school_contact_message(&self, mut req: WechatCpSchoolContactMessage) -> LabradorResult<WechatCpSchoolContactMessageResponse> {
let agent_id = req.agentid.unwrap_or_default();
if agent_id == 0 {
req.agentid = self.client.agent_id;
}
let v = self.client.post(WechatCpMethod::Message(CpMessageMethod::LinkedCorpSend), vec![], req, RequestType::Json).await?.json::<Value>()?;
WechatCommonResponse::parse::<WechatCpSchoolContactMessageResponse>(v)
}
pub async fn get_statistics(&self, req: WechatCpLinkedCorpMessage) -> LabradorResult<WechatCpMessageSendStatistics> {
let v = self.client.post(WechatCpMethod::Message(CpMessageMethod::Statistics), vec![], req, RequestType::Json).await?.json::<Value>()?;
WechatCommonResponse::parse::<WechatCpMessageSendStatistics>(v)
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WechatCpMessageRequest {
pub to_user: String,
pub to_party: Option<String>,
pub to_tag: Option<String>,
pub agent_id: Option<i32>,
pub msg_type: String,
pub content: String,
pub media_id: Option<String>,
pub thumb_media_id: Option<String>,
pub title: Option<String>,
pub description: Option<String>,
pub music_url: Option<String>,
pub hq_music_url: Option<String>,
pub safe: Option<String>,
pub url: Option<String>,
pub btn_txt: Option<String>,
pub app_id: Option<String>,
pub page: Option<String>,
pub task_id: Option<String>,
pub card_type: Option<String>,
pub source_icon_url: Option<String>,
pub source_desc: Option<String>,
pub action_menu_desc: Option<String>,
pub task_buttons: Option<Vec<TaskCardButton>>,
pub emphasis_first_item: Option<u8>,
pub source_desc_color: Option<u8>,
pub enable_id_trans: Option<u8>,
pub enable_duplicate_check: Option<u8>,
pub duplicate_check_interval: Option<u8>,
pub content_items: Option<Value>,
pub articles: Option<Vec<WechatCpNewArticle>>,
pub mpnews_articles: Option<Vec<WechatMpNewsArticle>>,
pub action_menu_action_list: Option<Vec<ActionMenuItem>>,
pub main_title: Option<String>,
pub main_title_desc: Option<String>,
pub card_image_url: Option<String>,
pub emphasis_content_title: Option<String>,
pub emphasis_content_desc: Option<String>,
pub sub_title_text: Option<String>,
pub vertical_contents: Option<Vec<VerticalContent>>,
pub horizontal_contents: Option<Vec<HorizontalContent>>,
pub jumps: Option<Vec<TemplateCardJump>>,
pub card_action_type: Option<u8>,
pub card_action_url: Option<String>,
pub card_action_appid: Option<String>,
pub card_action_pagepath: Option<String>,
pub buttons: Option<Vec<TemplateCardButton>>,
pub checkbox_question_key: Option<String>,
pub checkbox_mode: Option<u8>,
pub options: Option<Vec<CheckboxOption>>,
pub submit_button_text: Option<String>,
pub submit_button_key: Option<String>,
pub selects: Option<Vec<MultipleSelect>>,
pub quote_area: Option<QuoteArea>,
pub card_image_aspect_ratio: Option<f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct QuoteArea {
#[serde(rename="type")]
pub r#type: Option<u8>,
pub url: Option<String>,
pub appid: Option<String>,
pub pagepath: Option<String>,
pub title: Option<String>,
pub quote_text: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TaskCardButton {
pub key: Option<String>,
pub name: Option<String>,
pub color: Option<String>,
pub bold: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ActionMenuItem {
pub text: Option<String>,
pub key: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VerticalContent {
pub title: Option<String>,
pub desc: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HorizontalContent {
#[serde(rename="type")]
pub r#type: Option<u8>,
pub keyname: Option<String>,
pub value: Option<String>,
pub url: Option<String>,
pub media_id: Option<String>,
pub userid: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TemplateCardJump {
#[serde(rename="type")]
pub r#type: Option<u8>,
pub title: Option<String>,
pub url: Option<String>,
pub appid: Option<String>,
pub pagepath: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TemplateCardButton {
pub text: Option<String>,
pub style: Option<u8>,
pub key: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CheckboxOption {
pub id: String,
pub text: String,
pub is_checked: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MultipleSelect {
pub question_key: Option<String>,
pub title: Option<String>,
pub selected_id: Option<String>,
pub options: Option<Vec<CheckboxOption>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WechatCpMessageSendStatistics {
pub statistics: Option<Vec<StatisticItem>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct StatisticItem {
pub app_name: Option<String>,
pub agentid: Option<i32>,
pub count: Option<i32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WechatCpLinkedCorpMessage {
pub is_to_all: Option<u8>,
pub to_users: Option<Vec<String>>,
pub to_parties: Option<Vec<String>>,
pub to_tags: Option<Vec<String>>,
pub agent_id: Option<i32>,
pub msg_type: String,
pub content: String,
pub media_id: Option<String>,
pub thumb_media_id: Option<String>,
pub title: Option<String>,
pub description: Option<String>,
pub url: Option<String>,
pub appid: Option<String>,
pub page: Option<String>,
pub emphasis_first_item: Option<u8>,
pub content_items: Option<Value>,
pub btn_txt: Option<String>,
pub articles: Option<Vec<WechatCpNewArticle>>,
pub mp_news_articles: Option<Vec<WechatMpNewsArticle>>,
pub is_safe: Option<u8>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WechatCpSchoolContactMessage {
pub recv_scope: Option<u8>,
pub to_parent_userid: Option<Vec<String>>,
pub to_student_userid: Option<Vec<String>>,
pub to_party: Option<Vec<String>>,
pub to_all: Option<u8>,
pub agentid: Option<i32>,
pub msgtype: String,
pub content: String,
pub enable_id_trans: Option<u8>,
pub enable_duplicate_check: Option<u8>,
pub duplicate_check_interval: Option<u8>,
pub media_id: Option<String>,
pub thumb_media_id: Option<String>,
pub title: Option<String>,
pub description: Option<String>,
pub url: Option<String>,
pub appid: Option<String>,
pub pagepath: Option<String>,
pub articles: Option<Vec<WechatCpNewArticle>>,
pub mp_news_articles: Option<Vec<WechatMpNewsArticle>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WechatCpLinkedCorpMessageResponse {
pub invaliduser: Option<Vec<String>>,
pub invalidparty: Option<Vec<String>>,
pub invalidtag: Option<Vec<String>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WechatCpSchoolContactMessageResponse {
pub invalid_parent_userid: Option<Vec<String>>,
pub invalid_student_userid: Option<Vec<String>>,
pub invalid_party: Option<Vec<String>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WechatCpMessageResponse {
pub invaliduser: Option<String>,
pub invalidparty: Option<String>,
pub invalidtag: Option<String>,
pub msgid: Option<String>,
}