discord-selfbot 0.1.0

Discord selfbot API library for Rust
Documentation
use serde::{Deserialize, Serialize};
use crate::utils::Snowflake;
use super::user::User;
use super::embed::Embed;
use super::poll::Poll;

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Message {
    pub id: Snowflake,
    pub channel_id: Snowflake,
    pub author: User,
    pub content: String,
    pub timestamp: String,
    pub edited_timestamp: Option<String>,
    pub tts: bool,
    pub mention_everyone: bool,
    pub mentions: Vec<User>,
    pub mention_roles: Vec<Snowflake>,
    pub attachments: Vec<Attachment>,
    pub embeds: Vec<Embed>,
    pub reactions: Option<Vec<Reaction>>,
    pub nonce: Option<serde_json::Value>,
    pub pinned: bool,
    pub webhook_id: Option<Snowflake>,
    #[serde(rename = "type")]
    pub message_type: u8,
    pub activity: Option<MessageActivity>,
    pub application: Option<serde_json::Value>,
    pub application_id: Option<Snowflake>,
    pub message_reference: Option<MessageReference>,
    pub flags: Option<u32>,
    pub referenced_message: Option<Box<Message>>,
    pub interaction: Option<serde_json::Value>,
    pub thread: Option<serde_json::Value>,
    pub components: Option<Vec<serde_json::Value>>,
    pub sticker_items: Option<Vec<serde_json::Value>>,
    pub poll: Option<Poll>,
    pub guild_id: Option<Snowflake>,
    pub member: Option<serde_json::Value>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Attachment {
    pub id: Snowflake,
    pub filename: String,
    pub description: Option<String>,
    pub content_type: Option<String>,
    pub size: u64,
    pub url: String,
    pub proxy_url: String,
    pub height: Option<u32>,
    pub width: Option<u32>,
    pub ephemeral: Option<bool>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Reaction {
    pub count: u32,
    pub me: bool,
    pub emoji: ReactionEmoji,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ReactionEmoji {
    pub id: Option<Snowflake>,
    pub name: Option<String>,
    pub animated: Option<bool>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MessageActivity {
    #[serde(rename = "type")]
    pub activity_type: u8,
    pub party_id: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MessageReference {
    pub message_id: Option<Snowflake>,
    pub channel_id: Option<Snowflake>,
    pub guild_id: Option<Snowflake>,
    pub fail_if_not_exists: Option<bool>,
}

#[derive(Debug, Default, Clone)]
pub struct MessageBuilder {
    content: Option<String>,
    embeds: Vec<Embed>,
    tts: bool,
    nonce: Option<String>,
    reply_to: Option<Snowflake>,
    poll: Option<Poll>,
    activity: Option<MessageActivity>,
}

impl MessageBuilder {
    pub fn new() -> Self {
        Self::default()
    }

    pub fn content<S: Into<String>>(mut self, content: S) -> Self {
        self.content = Some(content.into());
        self
    }

    pub fn embed(mut self, embed: Embed) -> Self {
        self.embeds.push(embed);
        self
    }

    pub fn embeds(mut self, embeds: Vec<Embed>) -> Self {
        self.embeds = embeds;
        self
    }

    pub fn tts(mut self, tts: bool) -> Self {
        self.tts = tts;
        self
    }

    pub fn reply_to(mut self, message_id: Snowflake) -> Self {
        self.reply_to = Some(message_id);
        self
    }

    pub fn poll(mut self, poll: Poll) -> Self {
        self.poll = Some(poll);
        self
    }

    pub fn activity(mut self, activity: MessageActivity) -> Self {
        self.activity = Some(activity);
        self
    }

    pub fn build(self) -> serde_json::Value {
        let mut json = serde_json::json!({
            "tts": self.tts,
        });

        if let Some(content) = self.content {
            json["content"] = serde_json::json!(content);
        }

        if !self.embeds.is_empty() {
            json["embeds"] = serde_json::json!(self.embeds);
        }

        if let Some(nonce) = self.nonce {
            json["nonce"] = serde_json::json!(nonce);
        }

        if let Some(reply_to) = self.reply_to {
            json["message_reference"] = serde_json::json!({
                "message_id": reply_to.to_string(),
            });
        }

        if let Some(poll) = self.poll {
            json["poll"] = serde_json::to_value(poll).unwrap();
        }

        if let Some(activity) = self.activity {
            json["activity"] = serde_json::to_value(activity).unwrap();
        }

        json
    }
}