discord-selfbot 0.1.0

Discord selfbot API library for Rust
Documentation
use serde::{Deserialize, Serialize};
use crate::utils::Snowflake;

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct User {
    pub id: Snowflake,
    pub username: String,
    #[serde(default)]
    pub discriminator: String,
    #[serde(default)]
    pub global_name: Option<String>,
    pub avatar: Option<String>,
    #[serde(default)]
    pub bot: bool,
    #[serde(default)]
    pub system: bool,
    #[serde(default)]
    pub mfa_enabled: Option<bool>,
    pub banner: Option<String>,
    pub accent_color: Option<u32>,
    pub locale: Option<String>,
    pub verified: Option<bool>,
    pub email: Option<String>,
    pub flags: Option<u64>,
    pub premium_type: Option<u8>,
    pub public_flags: Option<u64>,
    pub bio: Option<String>,
}

impl User {
    pub fn tag(&self) -> String {
        if self.discriminator == "0" || self.discriminator.is_empty() {
            self.username.clone()
        } else {
            format!("{}#{}", self.username, self.discriminator)
        }
    }

    pub fn mention(&self) -> String {
        format!("<@{}>", self.id)
    }

    pub fn avatar_url(&self) -> Option<String> {
        self.avatar.as_ref().map(|hash| {
            let extension = if hash.starts_with("a_") { "gif" } else { "png" };
            format!(
                "https://cdn.discordapp.com/avatars/{}/{}.{}",
                self.id, hash, extension
            )
        })
    }

    pub fn default_avatar_url(&self) -> String {
        let index = if self.discriminator == "0" {
            (self.id.0 >> 22) % 6
        } else {
            self.discriminator.parse::<u64>().unwrap_or(0) % 5
        };
        format!(
            "https://cdn.discordapp.com/embed/avatars/{}.png",
            index
        )
    }

    pub fn display_avatar_url(&self) -> String {
        self.avatar_url().unwrap_or_else(|| self.default_avatar_url())
    }
}