Skip to main content

discord_selfbot/models/
user.rs

1use serde::{Deserialize, Serialize};
2use crate::utils::Snowflake;
3
4#[derive(Debug, Clone, Serialize, Deserialize)]
5pub struct User {
6    pub id: Snowflake,
7    pub username: String,
8    #[serde(default)]
9    pub discriminator: String,
10    #[serde(default)]
11    pub global_name: Option<String>,
12    pub avatar: Option<String>,
13    #[serde(default)]
14    pub bot: bool,
15    #[serde(default)]
16    pub system: bool,
17    #[serde(default)]
18    pub mfa_enabled: Option<bool>,
19    pub banner: Option<String>,
20    pub accent_color: Option<u32>,
21    pub locale: Option<String>,
22    pub verified: Option<bool>,
23    pub email: Option<String>,
24    pub flags: Option<u64>,
25    pub premium_type: Option<u8>,
26    pub public_flags: Option<u64>,
27    pub bio: Option<String>,
28}
29
30impl User {
31    pub fn tag(&self) -> String {
32        if self.discriminator == "0" || self.discriminator.is_empty() {
33            self.username.clone()
34        } else {
35            format!("{}#{}", self.username, self.discriminator)
36        }
37    }
38
39    pub fn mention(&self) -> String {
40        format!("<@{}>", self.id)
41    }
42
43    pub fn avatar_url(&self) -> Option<String> {
44        self.avatar.as_ref().map(|hash| {
45            let extension = if hash.starts_with("a_") { "gif" } else { "png" };
46            format!(
47                "https://cdn.discordapp.com/avatars/{}/{}.{}",
48                self.id, hash, extension
49            )
50        })
51    }
52
53    pub fn default_avatar_url(&self) -> String {
54        let index = if self.discriminator == "0" {
55            (self.id.0 >> 22) % 6
56        } else {
57            self.discriminator.parse::<u64>().unwrap_or(0) % 5
58        };
59        format!(
60            "https://cdn.discordapp.com/embed/avatars/{}.png",
61            index
62        )
63    }
64
65    pub fn display_avatar_url(&self) -> String {
66        self.avatar_url().unwrap_or_else(|| self.default_avatar_url())
67    }
68}
69