Skip to main content

neptunium_http/endpoints/channel/messages/
create_message.rs

1use 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/// [Source](https://github.com/fluxerapp/fluxer/blob/03813bbe17db008452f0f1be3090a7d2970a5447/packages/schema/src/domains/message/MessageRequestSchemas.tsx#L247)
25#[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>, // TODO make this be Id<...>
44    #[serde(skip_serializing_if = "Option::is_none")]
45    pub sticker_ids: Option<Vec<Id<StickerMarker>>>,
46    // #[serde(skip_serializing_if = "Option::is_none")]
47    // pub tts: Option<bool>,
48    #[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}