use bitflags::bitflags; use serde::{Deserialize, Serialize}; bitflags! { /// Permissions applicables au serveur. #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default, Serialize, Deserialize)] #[serde(transparent)] pub struct ServerPermission: u64 { /// Modifier les paramètres généraux du serveur. const MANAGE_SERVER = 1 << 0; /// Créer, modifier et supprimer des rôles. const MANAGE_ROLES = 1 << 1; /// Créer, modifier et supprimer des catégories. const MANAGE_CATEGORIES = 1 << 2; /// Créer, modifier et supprimer des canaux. const MANAGE_CHANNELS = 1 << 3; /// Expulser un membre du serveur. const KICK_MEMBERS = 1 << 4; /// Bannir un membre du serveur. const BAN_MEMBERS = 1 << 5; /// Modifier le profil ou les rôles d'un membre. const MANAGE_MEMBERS = 1 << 6; /// Voir la liste des membres du serveur. const VIEW_MEMBERS = 1 << 7; } } bitflags! { /// Permissions applicables aux canaux texte et aux ressources qui leur sont liées. #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default, Serialize, Deserialize)] #[serde(transparent)] pub struct ChannelPermission: u64 { // Permission communes / texte /// Voir le canal et son contenu. const READ_CHANNEL = 1 << 0; /// Envoyer un nouveau message. const SEND_MESSAGE = 1 << 1; /// Modifier ses propres messages. const EDIT_OWN_MESSAGE = 1 << 2; /// Supprimer ses propres messages. const DELETE_OWN_MESSAGE = 1 << 3; /// Modifier les messages des autres utilisateurs. const EDIT_OTHERS_MESSAGES = 1 << 4; /// Supprimer les messages des autres utilisateurs. const DELETE_OTHERS_MESSAGES = 1 << 5; /// Ajouter des réactions aux messages. const ADD_REACTIONS = 1 << 6; /// Utiliser des aperçus de liens ou des pièces jointes. const ATTACH_FILES = 1 << 7; /// Modifier les paramètres du canal. const MANAGE_CHANNEL = 1 << 8; /// Épingler ou désépingler des messages. const MANAGE_MESSAGES = 1 << 10; // Permissions vocales (30-45 réservées) const JOIN_VOICE = 1 << 30; const SPEAK = 1 << 31; const STREAM = 1 << 32; const MUTE_SELF = 1 << 33; const MUTE_OTHERS = 1 << 34; const MOVE_OTHERS = 1 << 35; const DISCONNECT_OTHERS = 1 << 36; const MANAGE_VOICE_CHANNEL = 1 << 37; } } /// Ensemble des permissions calculées pour un utilisateur. #[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)] pub struct PermissionSet { pub server: ServerPermission, pub channel: ChannelPermission, } impl PermissionSet { pub const fn new(server: ServerPermission, channel: ChannelPermission) -> Self { Self { server, channel } } /// Permissions par défaut accordées à un membre standard. pub const DEFAULT: Self = Self::new( ServerPermission::VIEW_MEMBERS, ChannelPermission::from_bits_retain( ChannelPermission::READ_CHANNEL.bits() | ChannelPermission::SEND_MESSAGE.bits() | ChannelPermission::EDIT_OWN_MESSAGE.bits() | ChannelPermission::DELETE_OWN_MESSAGE.bits() | ChannelPermission::ADD_REACTIONS.bits(), ), ); /// Vérifie si l'ensemble contient la permission demandée. pub const fn contains(&self, required: Self) -> bool { self.server.contains(required.server) && self.channel.contains(required.channel) } }