use crate::model::file::File;
use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct User {
#[serde(rename = "_id")]
pub id: String,
pub online: bool,
pub discriminator: String,
pub relationship: RelationshipStatus,
#[serde(skip_serializing_if = "Vec::is_empty", default)]
pub relations: Vec<Relationship>,
pub username: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub avatar: Option<File>,
#[serde(skip_serializing_if = "crate::model::if_zero_u32", default)]
pub badges: u32,
#[serde(skip_serializing_if = "Option::is_none")]
pub bot: Option<BotInformation>,
#[serde(skip_serializing_if = "Option::is_none")]
pub display_name: Option<String>,
#[serde(skip_serializing_if = "crate::model::if_zero_u32", default)]
pub flags: u32,
#[serde(skip_serializing_if = "crate::model::if_false", default)]
pub privileged: bool,
pub status: Option<UserStatus>,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct BotInformation {
#[serde(rename = "owner")]
pub owner_id: String,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct UserStatus {
pub text: Option<String>,
pub presence: Option<Presence>,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub enum Presence {
Online,
Idle,
Focus,
Busy,
Invisible,
}
#[derive(Debug, Serialize, Deserialize, Default, PartialEq, Clone)]
pub enum RelationshipStatus {
#[default]
None,
User,
Friend,
Outgoing,
Incoming,
Blocked,
BlockedOther,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct Relationship {
pub user_id: String,
pub status: RelationshipStatus,
}
#[derive(Debug, Serialize)]
pub struct DataUserProfile {
pub content: Option<String>,
pub background: Option<String>,
}
#[derive(Debug, Serialize)]
pub enum FieldsUser {
Avatar,
StatusText,
StatusPresence,
ProfileContent,
ProfileBackground,
DisplayName,
Internal,
}
#[derive(Default, Serialize)]
pub struct DataEditUser {
pub display_name: Option<String>,
pub avatar: Option<String>,
pub status: Option<UserStatus>,
pub profile: Option<DataUserProfile>,
pub badges: Option<i32>,
pub flags: Option<i32>,
pub remove: Option<Vec<FieldsUser>>,
}
impl DataEditUser {
pub fn new() -> Self {
Self::default()
}
}
impl User {
pub fn to_string(&self) -> String {
format!("<@{}>", self.id)
}
}