use std::collections::HashMap;
use serde::{Deserialize, Serialize};
use time::{serde::rfc3339, OffsetDateTime};
#[serde_with::serde_as]
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct User {
pub id: crate::id::User,
pub username: String,
pub normalized_username: String,
pub alternate_normalized_names: Option<Vec<String>>,
pub email: Option<String>,
#[serde(rename = "registrationDate")]
#[serde(with = "rfc3339")]
pub registration_time: OffsetDateTime,
pub is_verified: bool,
#[serde(default)]
#[serde(with = "crate::util::opt_rfc3339")]
pub account_ban_expiration: Option<OffsetDateTime>,
#[serde(default)]
#[serde(with = "crate::util::opt_rfc3339")]
pub public_ban_expiration: Option<OffsetDateTime>,
pub public_ban_type: Option<crate::model::PublicBanType>,
#[serde(default)]
#[serde(with = "crate::util::opt_rfc3339")]
pub spectator_ban_expiration: Option<OffsetDateTime>,
#[serde(default)]
#[serde(with = "crate::util::opt_rfc3339")]
pub mute_ban_expiration: Option<OffsetDateTime>,
#[serde(default)]
#[serde(with = "crate::util::opt_rfc3339")]
pub listing_ban_expiration: Option<OffsetDateTime>,
#[serde_as(deserialize_as = "serde_with::DefaultOnError")]
pub quota_bytes: Option<u64>,
pub is_locked: bool,
pub supress_ban_evasion: bool,
#[serde_as(deserialize_as = "serde_with::DefaultOnError")]
pub used_bytes: Option<u64>,
#[serde(rename = "2fa_login")]
pub two_factor_login: bool,
#[serde_as(deserialize_as = "serde_with::DefaultOnNull")]
#[serde(default)]
pub tags: Vec<String>,
pub profile: Option<crate::model::UserProfile>,
pub referral_id: Option<String>,
pub patreon_data: Option<crate::model::UserPatreonData>,
pub credits: Option<HashMap<String, f64>>,
#[serde(rename = "NCRdepositAddress")]
pub ncr_deposit_address: Option<String>,
}