Files
oxspeak_server/src/permissions.rs
T
2026-07-13 01:38:36 +02:00

112 lines
3.6 KiB
Rust

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)
}
}