summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJokler <jokler.contact@gmail.com>2017-10-27 18:19:39 +0200
committerJokler <jokler.contact@gmail.com>2017-10-27 18:19:39 +0200
commit2b943fa26f1d3c199cbc03e65c567e5c29887465 (patch)
tree3b5724cc3eeee032fe2b201167a2eace7d5d1499
parent8b481420cd3c0dd02cb5671e753dc5ff4a40e7eb (diff)
downloadfrippy-2b943fa26f1d3c199cbc03e65c567e5c29887465.tar.gz
frippy-2b943fa26f1d3c199cbc03e65c567e5c29887465.zip
Add emoji counting
-rw-r--r--src/plugins/emoji.rs67
1 files changed, 53 insertions, 14 deletions
diff --git a/src/plugins/emoji.rs b/src/plugins/emoji.rs
index 5d37feb..99f6c26 100644
--- a/src/plugins/emoji.rs
+++ b/src/plugins/emoji.rs
@@ -1,43 +1,82 @@
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 current.symbol == c {
+ current.count = 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
}