use serde::de::{Error as DeError, Visitor};
use serde::{Deserialize, Deserializer};
use std::fmt::{Formatter, Result as FmtResult};
use std::result::Result as StdResult;
pub const PRESET_GENERAL: Permissions = Permissions {
bits: 0b01111100000000000000000010111111,
};
pub const PRESET_TEXT: Permissions = Permissions {
bits: 0b00000000000001111111110001000000,
};
pub const PRESET_VOICE: Permissions = Permissions {
bits: 0b00000011111100000000000000000000,
};
#[deprecated(since="0.1.5", note="Use `permissions::PRESET_GENERAL` instead")]
#[inline(always)]
pub fn general() -> Permissions {
PRESET_GENERAL
}
#[deprecated(since="0.1.5", note="Use `permissions::PRESET_TEXT` instead")]
#[inline(always)]
pub fn text() -> Permissions {
PRESET_TEXT
}
#[deprecated(since="0.1.5", note="Use `permissions::PRESET_VOICE` instead")]
#[inline(always)]
pub fn voice() -> Permissions {
PRESET_VOICE
}
bitflags! {
pub struct Permissions: u64 {
const CREATE_INVITE = 0b00000000000000000000000000000001;
const KICK_MEMBERS = 0b00000000000000000000000000000010;
const BAN_MEMBERS = 0b00000000000000000000000000000100;
const ADMINISTRATOR = 0b00000000000000000000000000001000;
const MANAGE_CHANNELS = 0b00000000000000000000000000010000;
const MANAGE_GUILD = 0b00000000000000000000000000100000;
const ADD_REACTIONS = 0b00000000000000000000000001000000;
const READ_MESSAGES = 0b00000000000000000000010000000000;
const SEND_MESSAGES = 0b00000000000000000000100000000000;
const SEND_TTS_MESSAGES = 0b00000000000000000001000000000000;
const MANAGE_MESSAGES = 0b00000000000000000010000000000000;
const EMBED_LINKS = 0b00000000000000000100000000000000;
const ATTACH_FILES = 0b00000000000000001000000000000000;
const READ_MESSAGE_HISTORY = 0b00000000000000010000000000000000;
const MENTION_EVERYONE = 0b00000000000000100000000000000000;
const USE_EXTERNAL_EMOJIS = 0b00000000000001000000000000000000;
const CONNECT = 0b00000000000100000000000000000000;
const SPEAK = 0b00000000001000000000000000000000;
const MUTE_MEMBERS = 0b00000000010000000000000000000000;
const DEAFEN_MEMBERS = 0b00000000100000000000000000000000;
const MOVE_MEMBERS = 0b00000001000000000000000000000000;
const USE_VAD = 0b00000010000000000000000000000000;
const CHANGE_NICKNAME = 0b00000100000000000000000000000000;
const MANAGE_NICKNAMES = 0b00001000000000000000000000000000;
const MANAGE_ROLES = 0b00010000000000000000000000000000;
const MANAGE_WEBHOOKS = 0b00100000000000000000000000000000;
const MANAGE_EMOJIS = 0b01000000000000000000000000000000;
}
}
#[cfg(feature="model")]
impl Permissions {
pub fn add_reactions(&self) -> bool {
self.contains(self::ADD_REACTIONS)
}
pub fn administrator(&self) -> bool {
self.contains(self::ADMINISTRATOR)
}
pub fn attach_files(&self) -> bool {
self.contains(self::ATTACH_FILES)
}
pub fn ban_members(&self) -> bool {
self.contains(self::BAN_MEMBERS)
}
pub fn change_nickname(&self) -> bool {
self.contains(self::CHANGE_NICKNAME)
}
pub fn connect(&self) -> bool {
self.contains(self::CONNECT)
}
pub fn create_invite(&self) -> bool {
self.contains(self::CREATE_INVITE)
}
pub fn deafen_members(&self) -> bool {
self.contains(self::DEAFEN_MEMBERS)
}
pub fn embed_links(&self) -> bool {
self.contains(self::EMBED_LINKS)
}
pub fn external_emojis(&self) -> bool {
self.contains(self::USE_EXTERNAL_EMOJIS)
}
pub fn kick_members(&self) -> bool {
self.contains(self::KICK_MEMBERS)
}
pub fn manage_channels(&self) -> bool {
self.contains(self::MANAGE_CHANNELS)
}
pub fn manage_emojis(&self) -> bool {
self.contains(self::MANAGE_EMOJIS)
}
pub fn manage_guild(&self) -> bool {
self.contains(self::MANAGE_GUILD)
}
pub fn manage_messages(&self) -> bool {
self.contains(self::MANAGE_MESSAGES)
}
pub fn manage_nicknames(&self) -> bool {
self.contains(self::MANAGE_NICKNAMES)
}
pub fn manage_roles(&self) -> bool {
self.contains(self::MANAGE_ROLES)
}
pub fn manage_webhooks(&self) -> bool {
self.contains(self::MANAGE_WEBHOOKS)
}
pub fn mention_everyone(&self) -> bool {
self.contains(self::MENTION_EVERYONE)
}
pub fn move_members(&self) -> bool {
self.contains(self::MOVE_MEMBERS)
}
pub fn mute_members(&self) -> bool {
self.contains(self::MUTE_MEMBERS)
}
pub fn read_message_history(&self) -> bool {
self.contains(self::READ_MESSAGE_HISTORY)
}
pub fn read_messages(&self) -> bool {
self.contains(self::READ_MESSAGES)
}
pub fn send_messages(&self) -> bool {
self.contains(self::SEND_MESSAGES)
}
pub fn send_tts_messages(&self) -> bool {
self.contains(self::SEND_TTS_MESSAGES)
}
pub fn speak(&self) -> bool {
self.contains(self::SPEAK)
}
pub fn use_external_emojis(&self) -> bool {
self.contains(self::USE_EXTERNAL_EMOJIS)
}
pub fn use_vad(&self) -> bool {
self.contains(self::USE_VAD)
}
}
impl<'de> Deserialize<'de> for Permissions {
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> StdResult<Self, D::Error> {
Ok(Permissions::from_bits_truncate(deserializer.deserialize_u64(U64Visitor)?))
}
}
struct U64Visitor;
impl<'de> Visitor<'de> for U64Visitor {
type Value = u64;
fn expecting(&self, formatter: &mut Formatter) -> FmtResult {
formatter.write_str("an unsigned 64-bit integer")
}
fn visit_i32<E: DeError>(self, value: i32) -> StdResult<u64, E> {
Ok(value as u64)
}
fn visit_i64<E: DeError>(self, value: i64) -> StdResult<u64, E> {
Ok(value as u64)
}
fn visit_u32<E: DeError>(self, value: u32) -> StdResult<u64, E> {
Ok(value as u64)
}
fn visit_u64<E: DeError>(self, value: u64) -> StdResult<u64, E> {
Ok(value)
}
}