discord_selfbot/models/
user.rs1use 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