summaryrefslogtreecommitdiffstats
path: root/src/plugins/emoji.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/emoji.rs')
-rw-r--r--src/plugins/emoji.rs74
1 files changed, 58 insertions, 16 deletions
diff --git a/src/plugins/emoji.rs b/src/plugins/emoji.rs
index d2ed956..09d5c27 100644
--- a/src/plugins/emoji.rs
+++ b/src/plugins/emoji.rs
@@ -1,43 +1,83 @@
extern crate unicode_names;
+use std::fmt;
+
use irc::client::prelude::*;
use irc::error::Error as IrcError;
use plugin::*;
+struct EmojiHandle {
+ symbol: char,
+ count: i32,
+}
+
+impl fmt::Display for EmojiHandle {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+
+ let name = match unicode_names::name(self.symbol) {
+ Some(sym) => sym.to_string().to_lowercase(),
+ None => String::from("UNKNOWN"),
+ };
+
+ if self.count > 1 {
+ write!(f, "{}x {}", self.count, name)
+ } else {
+ write!(f, "{}", name)
+ }
+ }
+}
+
#[derive(PluginName, Debug)]
pub struct Emoji;
+
impl Emoji {
pub fn new() -> Emoji {
Emoji {}
}
fn emoji(&self, server: &IrcServer, content: &str, target: &str) -> Result<(), IrcError> {
-
- let mut names: Vec<String> = Vec::new();
- for emoji in self.return_emojis(content) {
-
- let name = match unicode_names::name(emoji) {
- Some(v) => format!("{}", v).to_lowercase(),
- None => "UNKNOWN".to_string(),
- };
-
- names.push(name);
- }
+ let names = self.return_emojis(content)
+ .iter()
+ .map(|e| e.to_string())
+ .collect::<Vec<String>>();
server.send_privmsg(target, &names.join(", "))
}
- fn return_emojis(&self, string: &str) -> Vec<char> {
+ fn return_emojis(&self, string: &str) -> Vec<EmojiHandle> {
+ let mut emojis: Vec<EmojiHandle> = Vec::new();
+
+ let mut current = EmojiHandle {
+ symbol: ' ',
+ count: 0,
+ };
- let mut emojis: Vec<char> = Vec::new();
for c in string.chars() {
- if self.is_emoji(&c) {
- emojis.push(c);
+ if !self.is_emoji(&c) {
+ continue;
+ }
+
+ if current.symbol == c {
+ current.count += 1;
+
+ } else {
+ if current.count > 0 {
+ emojis.push(current);
+ }
+
+ current = EmojiHandle {
+ symbol: c,
+ count: 1,
+ }
}
}
+ if current.count > 0 {
+ emojis.push(current);
+ }
+
emojis
}
@@ -67,7 +107,9 @@ impl Plugin for Emoji {
fn execute(&mut self, server: &IrcServer, message: &Message) -> Result<(), IrcError> {
match message.command {
- Command::PRIVMSG(ref target, ref content) => self.emoji(server, content, target),
+ Command::PRIVMSG(_, ref content) => {
+ self.emoji(server, content, message.response_target().unwrap())
+ }
_ => Ok(()),
}
}