discord-kurante/src/passive/desu.rs

96 lines
3.0 KiB
Rust
Raw Normal View History

use super::{PassiveResponder, PassiveResponse};
use crate::util::debug_say_owned;
2020-05-02 07:06:43 +00:00
use futures::future::BoxFuture;
2020-05-02 05:04:51 +00:00
use lazy_static::lazy_static;
2020-05-02 17:45:50 +00:00
use log::trace;
2020-05-02 07:30:16 +00:00
use rand::seq::SliceRandom;
use rand::thread_rng;
use rand::Rng;
2020-05-02 02:17:53 +00:00
use regex::Regex;
use serenity::model::channel::Message;
use serenity::prelude::Context;
2020-05-02 02:17:53 +00:00
2020-05-02 07:06:43 +00:00
lazy_static! {
2020-05-02 17:45:50 +00:00
#[derive(Debug)]
static ref FUFUFU_REGEX: Regex = Regex::new("(?i:fu){3,}").unwrap();
#[derive(Debug)]
2020-05-02 07:30:16 +00:00
static ref DESU_REGEX: Regex = Regex::new("(?i:desu)|(?:です)").unwrap();
2020-05-02 07:06:43 +00:00
}
2020-05-02 07:30:16 +00:00
pub(crate) struct DesuResponder;
2020-05-02 07:06:43 +00:00
impl PassiveResponder for DesuResponder {
fn get_message(
&self,
received_msg: String,
ctx: Context,
message: Message,
) -> Option<PassiveResponse<'_>> {
let fufufu_match = FUFUFU_REGEX.is_match(&received_msg);
let desu_match = DESU_REGEX.is_match(&received_msg) && thread_rng().gen::<f32>() < 0.1;
2020-05-02 17:45:50 +00:00
if fufufu_match || desu_match {
trace!(
"Responding to `{}` because one of the following matched: fufufu={}, desu={}",
received_msg,
2020-05-02 17:45:50 +00:00
fufufu_match,
desu_match
);
Some(DESU_ACTIONS.choose(&mut thread_rng()).unwrap().clone()(
ctx, message,
))
} else {
None
2020-05-02 07:06:43 +00:00
}
}
}
2020-05-02 02:17:53 +00:00
2020-05-02 07:06:43 +00:00
type DesuAction<'r, T> = &'r (dyn Fn(Context, Message) -> T + Sync);
const DESU_ACTIONS: &[DesuAction<BoxFuture<Result<Option<Message>, serenity::Error>>>] = &[
&|ctx, msg| Box::pin(debug_say_owned(msg, ctx, "です。")),
&|ctx, msg| Box::pin(debug_say_owned(msg, ctx, "desu~")),
&|ctx, msg| Box::pin(debug_say_owned(msg, ctx, "desu.")),
2020-05-02 07:06:43 +00:00
&|ctx, msg| {
Box::pin(debug_say_owned(
msg,
2020-05-02 07:06:43 +00:00
ctx,
r#"
2020-05-02 02:17:53 +00:00
```
      
          
            
           
              
             
              
              
             
```"#,
2020-05-02 07:06:43 +00:00
))
},
&|ctx, msg| {
// https://imgur.com/a/yOb5n
// One day.
Box::pin(debug_say_owned(
msg,
ctx,
"https://www.youtube.com/watch?v=60mLvBWOMb4",
))
2020-05-02 07:06:43 +00:00
},
&|ctx, msg| Box::pin(send_desu_image(ctx, msg)),
2020-05-02 02:17:53 +00:00
];
async fn send_desu_image(ctx: Context, msg: Message) -> Result<Option<Message>, serenity::Error> {
Ok(Some(
msg.channel_id
.send_message(ctx, |m| {
m.add_file(serenity::http::AttachmentType::Bytes {
data: std::borrow::Cow::from(&include_bytes!("../../res/desu.jpg")[..]),
filename: "desu.jpg".to_string(),
})
})
.await?,
))
}