Skip to content
Snippets Groups Projects
Commit 532d97f5 authored by Stephen D's avatar Stephen D
Browse files

react typo fix & order matters

parent 3fe2e1a9
No related branches found
No related tags found
No related merge requests found
...@@ -119,6 +119,7 @@ dependencies = [ ...@@ -119,6 +119,7 @@ dependencies = [
"bigdecimal", "bigdecimal",
"diesel", "diesel",
"dotenv", "dotenv",
"itertools",
"phf", "phf",
"png", "png",
"rand 0.8.3", "rand 0.8.3",
...@@ -253,6 +254,12 @@ version = "0.4.6" ...@@ -253,6 +254,12 @@ version = "0.4.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "134951f4028bdadb9b84baf4232681efbf277da25144b9b0ad65df75946c422b" checksum = "134951f4028bdadb9b84baf4232681efbf277da25144b9b0ad65df75946c422b"
[[package]]
name = "either"
version = "1.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797"
[[package]] [[package]]
name = "encoding_rs" name = "encoding_rs"
version = "0.8.25" version = "0.8.25"
...@@ -602,6 +609,15 @@ version = "2.3.0" ...@@ -602,6 +609,15 @@ version = "2.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "47be2f14c678be2fdcab04ab1171db51b2762ce6f0a8ee87c8dd4a04ed216135" checksum = "47be2f14c678be2fdcab04ab1171db51b2762ce6f0a8ee87c8dd4a04ed216135"
[[package]]
name = "itertools"
version = "0.10.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473"
dependencies = [
"either",
]
[[package]] [[package]]
name = "itoa" name = "itoa"
version = "0.4.6" version = "0.4.6"
......
...@@ -21,3 +21,4 @@ reqwest = { version = "0.10", features = ["json"] } ...@@ -21,3 +21,4 @@ reqwest = { version = "0.10", features = ["json"] }
serde_json = "1.0" serde_json = "1.0"
rusttype = "0.4.3" rusttype = "0.4.3"
rand = "0.8" rand = "0.8"
itertools = "0.10"
use crate::handlers::LineHandler; use crate::handlers::LineHandler;
use itertools::Itertools;
use phf::phf_map; use phf::phf_map;
use serenity::async_trait; use serenity::async_trait;
use serenity::model::channel::{Message, ReactionType}; use serenity::model::channel::{Message, ReactionType};
...@@ -14,36 +15,53 @@ static EMOJI_MAP: phf::Map<&'static str, &'static str> = phf_map! { ...@@ -14,36 +15,53 @@ static EMOJI_MAP: phf::Map<&'static str, &'static str> = phf_map! {
"mango" => "🥭", "mango" => "🥭",
"banana" => "🍌", "banana" => "🍌",
"bee" => "🐝", "bee" => "🐝",
"hose" => "🐎", "horse" => "🐎",
}; };
fn map_lookup(msg: &str) -> Option<&'static str> {
// We lose the O(1) benefits of the hashmap
// But whatever. It doesn't need to be fast
for (k, v) in EMOJI_MAP.entries() {
if msg.contains(k) {
return Some(v);
}
}
None
}
#[derive(Default)]
pub struct ReactHandler; pub struct ReactHandler;
#[async_trait] #[async_trait]
impl LineHandler for ReactHandler { impl LineHandler for ReactHandler {
async fn message(&self, ctx: &Context, msg: &Message) { async fn message(&self, ctx: &Context, msg: &Message) {
for (key, value) in EMOJI_MAP.entries() { // Kind of convoluted, but allows us to react in the correct order.
let msg_lower = format!(" {} ", msg.content.to_lowercase()); let groups = msg
if msg_lower.contains(&format!(" {} ", key)) .content
|| msg_lower.contains(&format!(" {}s ", key)) .chars()
{ .map(|c| match c {
let reaction_type = match ReactionType::from_str(value) { '!' | '?' | ',' | '.' => ' ',
Ok(x) => x, _ => c,
Err(x) => { })
println!("Could not react: {}", x); .group_by(|c| *c == ' ');
return; let reacts: Vec<_> = groups
} .into_iter()
}; .filter_map(|(_, c)| map_lookup(&c.collect::<String>().to_lowercase()))
if let Err(e) = msg.react(&ctx, reaction_type).await { .unique()
println!("Error reacting: {}", e); .collect();
for r in reacts {
let reaction_type = match ReactionType::from_str(r) {
Ok(x) => x,
Err(x) => {
println!("Could not react: {}", x);
return;
} }
};
if let Err(e) = msg.react(&ctx, reaction_type).await {
println!("Error reacting: {}", e);
} }
} }
} }
} }
impl Default for ReactHandler {
fn default() -> Self {
Self
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment