use std::fmt::{Display, Formatter, Result as FmtResult, Write as FmtWrite};
use super::super::{EmojiId, RoleId};
#[cfg(feature="cache")]
use std::mem;
#[cfg(all(feature="cache", feature="model"))]
use super::super::ModelError;
#[cfg(feature="cache")]
use ::CACHE;
#[cfg(feature="cache")]
use ::internal::prelude::*;
#[cfg(all(feature="cache", feature="model"))]
use ::http;
#[cfg(feature="cache")]
use super::super::GuildId;
#[derive(Clone, Debug, Deserialize)]
pub struct Emoji {
pub id: EmojiId,
pub name: String,
pub managed: bool,
pub require_colons: bool,
pub roles: Vec<RoleId>,
}
#[cfg(feature="model")]
impl Emoji {
#[cfg(feature="cache")]
pub fn delete(&self) -> Result<()> {
match self.find_guild_id() {
Some(guild_id) => http::delete_emoji(guild_id.0, self.id.0),
None => Err(Error::Model(ModelError::ItemMissing)),
}
}
#[cfg(feature="cache")]
pub fn edit(&mut self, name: &str) -> Result<()> {
match self.find_guild_id() {
Some(guild_id) => {
let map = json!({
"name": name,
});
match http::edit_emoji(guild_id.0, self.id.0, &map) {
Ok(emoji) => {
mem::replace(self, emoji);
Ok(())
},
Err(why) => Err(why),
}
},
None => Err(Error::Model(ModelError::ItemMissing)),
}
}
#[cfg(feature="cache")]
pub fn find_guild_id(&self) -> Option<GuildId> {
for guild in CACHE.read().unwrap().guilds.values() {
let guild = guild.read().unwrap();
if guild.emojis.contains_key(&self.id) {
return Some(guild.id);
}
}
None
}
#[inline]
pub fn url(&self) -> String {
format!(cdn!("/emojis/{}.png"), self.id)
}
}
impl Display for Emoji {
fn fmt(&self, f: &mut Formatter) -> FmtResult {
f.write_str("<:")?;
f.write_str(&self.name)?;
FmtWrite::write_char(f, ':')?;
Display::fmt(&self.id, f)?;
FmtWrite::write_char(f, '>')
}
}
impl Display for EmojiId {
fn fmt(&self, f: &mut Formatter) -> FmtResult {
Display::fmt(&self.0, f)
}
}
impl From<Emoji> for EmojiId {
fn from(emoji: Emoji) -> EmojiId {
emoji.id
}
}
impl<'a> From<&'a Emoji> for EmojiId {
fn from(emoji: &Emoji) -> EmojiId {
emoji.id
}
}