neptunium_http/endpoints/channel/messages/
create_message.rs1use bon::Builder;
2use reqwest::Method;
3use serde::Serialize;
4
5use neptunium_model::{
6 channel::message::{Message, MessageFlags, embed::MessageEmbed, nonce::Nonce},
7 id::{
8 Id,
9 marker::{ChannelMarker, StickerMarker},
10 },
11};
12
13use crate::{
14 endpoints::{
15 Endpoint,
16 channel::messages::{
17 allowed_mentions::AllowedMentions, attachment::AttachmentRequest,
18 message_reference::MessageReference,
19 },
20 },
21 request::Request,
22};
23
24#[derive(Builder, Serialize, Clone, Debug)]
26pub struct CreateMessageBody {
27 #[serde(skip_serializing_if = "Option::is_none")]
28 #[builder(into)]
29 pub content: Option<String>,
30 #[builder(default = vec![])]
31 pub embeds: Vec<MessageEmbed>,
32 #[builder(default = vec![])]
33 pub attachments: Vec<AttachmentRequest>,
34 #[serde(skip_serializing_if = "Option::is_none")]
35 pub message_reference: Option<MessageReference>,
36 #[serde(skip_serializing_if = "Option::is_none")]
37 pub allowed_mentions: Option<AllowedMentions>,
38 #[builder(default)]
39 pub flags: MessageFlags,
40 #[builder(default = Nonce::generate())]
41 pub nonce: Nonce,
42 #[serde(skip_serializing_if = "Option::is_none")]
43 pub favorite_meme_id: Option<String>, #[serde(skip_serializing_if = "Option::is_none")]
45 pub sticker_ids: Option<Vec<Id<StickerMarker>>>,
46 #[builder(default = false)]
49 #[serde(skip_serializing_if = "std::ops::Not::not")]
50 pub tts: bool,
51}
52
53impl<T: Into<String>> From<T> for CreateMessageBody {
54 fn from(value: T) -> Self {
55 Self {
56 content: Some(value.into()),
57 embeds: vec![],
58 attachments: vec![],
59 message_reference: None,
60 allowed_mentions: None,
61 flags: MessageFlags::empty(),
62 nonce: Nonce::generate(),
63 favorite_meme_id: None,
64 sticker_ids: None,
65 tts: false,
66 }
67 }
68}
69
70#[derive(Builder, Clone, Debug)]
71pub struct CreateMessage {
72 pub channel_id: Id<ChannelMarker>,
73 pub message: CreateMessageBody,
74}
75
76impl Endpoint for CreateMessage {
77 type Response = Message;
78
79 fn into_request(self) -> crate::request::Request {
80 Request::builder()
81 .body(serde_json::to_string(&self.message).unwrap())
82 .method(Method::POST)
83 .path(format!("/channels/{}/messages", self.channel_id))
84 .build()
85 }
86}