use std::fmt::{
Display,
Formatter,
Result as FmtResult,
Write as FmtWrite
};
use super::super::id::{EmojiId, RoleId};
#[cfg(all(feature = "cache", feature = "model"))]
use internal::prelude::*;
#[cfg(all(feature = "cache", feature = "model"))]
use std::mem;
#[cfg(all(feature = "cache", feature = "model"))]
use super::super::ModelError;
#[cfg(all(feature = "cache", feature = "model"))]
use super::super::id::GuildId;
#[cfg(all(feature = "cache", feature = "model"))]
use {CACHE, http};
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct Emoji {
#[serde(default)]
pub animated: bool,
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().guilds.values() {
let guild = guild.read();
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 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 }
}