use serde::{Deserialize, Serialize};
use super::{
Anime, Character, Color, Format, Image, Manga, NotificationOption, Person, Status, Studio,
};
use crate::{Client, Result};
#[derive(Debug, Default, Clone, PartialEq, Deserialize, Serialize)]
#[serde(rename_all(deserialize = "camelCase"))]
pub struct User {
pub id: i32,
pub name: String,
pub about: Option<String>,
pub avatar: Option<Image>,
#[serde(rename = "bannerImage")]
pub banner: Option<String>,
pub donator_badge: String,
pub donator_tier: i32,
#[serde(skip)]
pub favourites: Favourites,
pub is_blocked: Option<bool>,
pub is_follower: Option<bool>,
pub is_following: Option<bool>,
pub media_list_options: Option<MediaListOptions>,
pub options: Option<Options>,
#[serde(rename = "siteUrl")]
pub url: String,
pub statistics: UserStatisticTypes,
pub unread_notification_count: Option<i32>,
pub created_at: i64,
pub updated_at: i64,
#[serde(skip)]
pub(crate) client: Client,
#[serde(default)]
pub(crate) is_full_loaded: bool,
}
impl User {
pub async fn load_full(self) -> Result<Self> {
if !self.is_full_loaded {
self.client.get_user(self.id).await
} else {
panic!("This user is already full loaded")
}
}
}
#[derive(Debug, Default, Clone, PartialEq, Deserialize, Serialize)]
#[serde(rename_all(deserialize = "camelCase"))]
pub struct Options {
pub title_language: Option<UserTitleLanguage>,
#[serde(default)]
pub display_adult_content: bool,
#[serde(default)]
pub airing_notifications: bool,
pub profile_color: Color,
pub notifications_options: Option<Vec<NotificationOption>>,
pub timezone: Option<String>,
#[serde(default)]
pub activity_merge_time: i32,
#[serde(default)]
pub staff_name_language: UserStaffNameLanguage,
#[serde(default)]
pub restrict_messages_to_following: bool,
pub disabled_list_activity: Option<Vec<ListActivityOption>>,
}
#[derive(Debug, Default, Clone, PartialEq, Deserialize, Serialize)]
#[serde(rename_all(deserialize = "SCREAMING_SNAKE_CASE"))]
pub enum UserTitleLanguage {
#[default]
Romaji,
English,
Native,
RomajiStylised,
EnglishStylised,
NativeStylised,
}
#[derive(Debug, Default, Clone, PartialEq, Deserialize, Serialize)]
#[serde(rename_all(deserialize = "SCREAMING_SNAKE_CASE"))]
pub enum UserStaffNameLanguage {
RomajiWestern,
#[default]
Romaji,
Native,
}
#[derive(Debug, Default, Clone, PartialEq, Deserialize, Serialize)]
#[serde(rename_all(deserialize = "camelCase"))]
pub struct ListActivityOption {
pub status: Status,
pub disabled: bool,
}
#[derive(Debug, Default, Clone, PartialEq, Deserialize, Serialize)]
#[serde(rename_all(deserialize = "camelCase"))]
pub struct MediaListOptions {
pub row_order: String,
pub anime_list: MediaListTypeOptions,
pub manga_list: MediaListTypeOptions,
}
#[derive(Debug, Default, Clone, PartialEq, Deserialize, Serialize)]
#[serde(rename_all(deserialize = "camelCase"))]
pub struct MediaListTypeOptions {
pub section_order: Vec<String>,
pub split_completed_section_by_format: bool,
pub custom_lists: Vec<String>,
pub advanced_scoring: Vec<String>,
pub advanced_scoring_enabled: bool,
}
#[derive(Debug, Default, Clone, PartialEq, Deserialize, Serialize)]
pub struct Favourites {
pub anime: Vec<Anime>,
pub manga: Vec<Manga>,
pub characters: Vec<Character>,
pub staff: Vec<Person>,
pub studios: Vec<Studio>,
}
#[derive(Debug, Default, Clone, PartialEq, Deserialize, Serialize)]
#[serde(rename_all(deserialize = "camelCase"))]
pub struct UserStatisticTypes {
pub anime: UserStatistics,
pub manga: UserStatistics,
}
#[derive(Debug, Default, Clone, PartialEq, Deserialize, Serialize)]
#[serde(rename_all(deserialize = "camelCase"))]
pub struct UserStatistics {
pub count: i32,
pub standard_deviation: Option<f32>,
pub minutes_watched: Option<i32>,
pub episodes_watched: Option<i32>,
pub chapters_read: Option<i32>,
pub volumes_read: Option<i32>,
pub formats: Option<Vec<UserFormatStatistic>>,
pub statuses: Vec<UserStatusStatistic>,
}
#[derive(Debug, Default, Clone, PartialEq, Deserialize, Serialize)]
#[serde(rename_all(deserialize = "camelCase"))]
pub struct UserFormatStatistic {
pub count: i32,
pub minutes_watched: Option<i32>,
pub chapters_read: Option<i32>,
#[serde(default)]
pub media_ids: Vec<i32>,
pub format: Format,
}
#[derive(Debug, Default, Clone, PartialEq, Deserialize, Serialize)]
#[serde(rename_all(deserialize = "camelCase"))]
pub struct UserStatusStatistic {
pub count: i32,
pub minutes_watched: Option<i32>,
pub chapters_read: Option<i32>,
#[serde(default)]
pub media_ids: Vec<i32>,
pub status: Status,
}