diff --git a/src/desu.jpg b/src/desu.jpg new file mode 100644 index 0000000..35e927a Binary files /dev/null and b/src/desu.jpg differ diff --git a/src/passive/fufufu.rs b/src/passive/fufufu.rs index fe4156f..93f7ccf 100644 --- a/src/passive/fufufu.rs +++ b/src/passive/fufufu.rs @@ -1,19 +1,39 @@ -use crate::simple_responder; +use futures::future::BoxFuture; use lazy_static::lazy_static; use regex::Regex; use serenity::async_trait; use serenity::model::channel::Message; use serenity::prelude::{Context, EventHandler}; -// Yes, the blocks are necessary, rustc is bugged; check macro declaration -// for more info. -simple_responder!(FufufuResponder, r"(?:[fF][uU]){3,}", { get_desu() }); +lazy_static! { + static ref REGEX: Regex = Regex::new("(?:[fF][uU]){3,}").unwrap(); +} -const DESU_STRINGS: &[&str] = &[ - "です。", - "desu~", - "desu.", - r#" +pub(crate) struct FufufuResponder; + +#[async_trait] +impl EventHandler for FufufuResponder { + async fn message(&self, ctx: Context, message: Message) { + if REGEX.is_match(&message.content_safe(ctx.clone()).await) { + use rand::seq::SliceRandom; + use rand::thread_rng; + let random_action = DESU_ACTIONS.choose(&mut thread_rng()).unwrap().clone(); + let random_action = random_action(ctx, message); + random_action.await.unwrap(); + } + } +} + +type DesuAction<'r, T> = &'r (dyn Fn(Context, Message) -> T + Sync); + +const DESU_ACTIONS: &[DesuAction>>] = &[ + &|ctx, msg| Box::pin(msg.channel_id.say(ctx, "です。")), + &|ctx, msg| Box::pin(msg.channel_id.say(ctx, "desu~")), + &|ctx, msg| Box::pin(msg.channel_id.say(ctx, "desu.")), + &|ctx, msg| { + Box::pin(msg.channel_id.say( + ctx, + r#" ``` ででででででででででで      すす      ででで     すすすすすすすすす @@ -25,16 +45,22 @@ const DESU_STRINGS: &[&str] = &[     でで          すす      でで        すす ```"#, + )) + }, + &|ctx, msg| { + // https://imgur.com/a/yOb5n + // One day. + Box::pin( + msg.channel_id + .say(ctx, "https://www.youtube.com/watch?v=60mLvBWOMb4"), + ) + }, + &|ctx, msg| { + Box::pin(msg.channel_id.send_message(ctx, |m| { + m.add_file(serenity::http::AttachmentType::Bytes { + data: std::borrow::Cow::from(&include_bytes!("../desu.jpg")[..]), + filename: "desu.jpg".to_string(), + }) + })) + }, ]; - -fn get_desu() -> &'static str { - use rand::seq::SliceRandom; - use rand::thread_rng; - - DESU_STRINGS.choose(&mut thread_rng()).unwrap() - // // https://imgur.com/a/yOb5n - // messageList.add(channel -> channel.sendMessage(new MessageBuilder() - // .setContent("https://www.youtube.com/watch?v=60mLvBWOMb4").build())); - // messageList.add(channel -> channel.sendFile(Desu.class.getResourceAsStream("/desu/desu.jpg"), "desu.jpg")); - // messageList.add(channel -> channel.sendMessage("desu~")); -}