qq_bot/restful/
send_message.rs1use multipart::Form;
2use reqwest::{multipart, multipart::Part};
3use serde_json::Value;
4
5use super::*;
6
7#[derive(Debug)]
11pub struct SendMessageRequest {
12 pub content: String,
13 pub msg_id: String,
14 pub user_id: u64,
15 pub image_bytes: Vec<u8>,
16}
17#[derive(Serialize, Deserialize)]
18struct MessageReferenceR {
19 message_reference: MessageReference,
20}
21
22#[derive(Serialize, Deserialize)]
23pub struct MessageReference {
24 message_id: String,
26 ignore_get_message_error: bool,
28}
29
30impl SendMessageRequest {
31 pub fn end_point(channel_id: u64) -> String {
32 if cfg!(debug_assertions) {
33 format!("https://sandbox.api.sgroup.qq.com/channels/{channel_id}/messages",)
34 }
35 else {
36 format!("https://api.sgroup.qq.com/channels/{channel_id}/messages",)
37 }
38 }
39 pub async fn send_error(&self, bot: &impl QQBotProtocol, channel_id: u64) {
40 todo!()
41 }
42 pub async fn send(&self, bot: &impl QQBotProtocol, channel_id: u64) -> QQResult {
43 let url = Url::from_str(&Self::end_point(channel_id))?;
44 let image_part = Part::bytes(self.image_bytes.clone()).file_name("file_image");
45 let _ = MessageReferenceR {
47 message_reference: MessageReference { message_id: self.msg_id.to_string(), ignore_get_message_error: true },
48 };
49 let content = format!("<@!{}> {}", self.user_id, self.content);
50 let form = Form::new().text("content", content).text("msg_id", self.msg_id.to_string()).part("file_image", image_part);
51 let response = bot.build_request(Method::POST, url).multipart(form).send().await?;
52 if response.status().as_u16() > 300 {
53 println!("{:#?}", response.json::<Value>().await?)
54 }
55 Ok(())
57 }
58}
59
60pub struct SendArkRequest {}
61#[derive(Serialize, Deserialize)]
83pub struct Ark {
84 pub ark: ArkBody,
85}
86
87#[derive(Serialize, Deserialize)]
88pub struct ArkBody {
89 pub template_id: i64,
90 pub kv: Vec<Kv>,
91}
92
93#[derive(Serialize, Deserialize)]
94pub struct Kv {
95 pub key: String,
96 pub value: String,
97}