use crate::{stream::StreamFormat, user}; #[cfg(feature = "rocket")] use rocket::{FromFormField, UriDisplayQuery}; use serde::{Deserialize, Serialize}; use std::{collections::HashMap, fmt::Display}; #[derive(Debug, Clone, Serialize, Deserialize)] pub struct User { pub name: String, pub display_name: String, pub password: Vec, pub admin: bool, pub theme: Theme, pub permissions: PermissionSet, } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct NodeUserData { pub watched: WatchedState, } #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "snake_case")] pub enum WatchedState { None, Progress(f64), Watched, } #[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq)] #[cfg_attr(feature = "rocket", derive(FromFormField, UriDisplayQuery))] #[serde(rename_all = "snake_case")] pub enum Theme { Dark, Light, Purple, } impl Theme { pub const LIST: &'static [(Theme, &'static str)] = &[ (Theme::Dark, "Dark"), (Theme::Light, "Light"), (Theme::Purple, "Purple"), ]; } #[derive(Debug, Clone, Serialize, Deserialize, Default)] pub struct PermissionSet(pub HashMap); #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash)] #[serde(rename_all = "snake_case")] pub enum UserPermission { Admin, // ManageUsers, // GenerateInvite, ManageSelf, AccessNode(String), StreamFormat(StreamFormat), Transcode, FederatedContent, } impl UserPermission { pub const ALL_ENUMERABLE: &'static [UserPermission] = { use UserPermission::*; &[ Admin, Transcode, ManageSelf, FederatedContent, StreamFormat(user::StreamFormat::Original), ] }; pub fn default_value(&self) -> bool { use user::StreamFormat::*; use UserPermission::*; matches!( self, Transcode | ManageSelf | FederatedContent | StreamFormat(Jhls | HlsMaster | HlsVariant | Matroska | Segment | Webvtt) ) } } impl Display for UserPermission { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.write_str(&match self { UserPermission::ManageSelf => format!("manage self (password, display name, etc.)"), UserPermission::FederatedContent => format!("access to federated content"), UserPermission::Admin => format!("administrative rights"), UserPermission::StreamFormat(StreamFormat::Original) => { format!("downloading the original media") } UserPermission::StreamFormat(StreamFormat::Matroska) => { format!("downloading a remuxed WebM/Matroska version of the media ") } UserPermission::StreamFormat(x) => { format!("downloading media via {x:?}") } UserPermission::Transcode => format!("transcoding"), // UserPermission::ManageUsers => format!("management of all users"), // UserPermission::GenerateInvite => format!("inviting new users"), UserPermission::AccessNode(s) => format!("access to library node {s:?}"), }) } } impl Default for NodeUserData { fn default() -> Self { Self { watched: WatchedState::None, } } }