discord-kurante/src/passive/mod.rs

94 lines
2.8 KiB
Rust
Raw Normal View History

2020-05-02 02:27:40 +00:00
use ahhhh::YellResponder;
2020-05-13 19:29:51 +00:00
use all_caps::AllCapsResponder;
2020-05-02 02:27:40 +00:00
use best_doctor::BestDoctorResponder;
2020-05-02 07:30:16 +00:00
use desu::DesuResponder;
use futures::future::BoxFuture;
use rand::{rngs::OsRng, seq::IteratorRandom};
2020-05-02 07:06:32 +00:00
use reee::ReeeResponder;
2020-05-02 02:17:53 +00:00
use serenity::async_trait;
use serenity::model::channel::Message;
use serenity::prelude::{Context, EventHandler};
2020-05-02 02:27:40 +00:00
mod ahhhh;
2020-05-13 19:29:51 +00:00
mod all_caps;
2020-05-02 02:17:53 +00:00
mod best_doctor;
2020-05-02 07:30:16 +00:00
mod desu;
2020-05-02 07:06:32 +00:00
mod reee;
2020-05-02 02:17:53 +00:00
pub(crate) struct Handler {
responders: Vec<Box<dyn PassiveResponder + Send + Sync>>,
2020-05-02 02:17:53 +00:00
}
impl Default for Handler {
fn default() -> Self {
Self {
2020-05-02 02:27:40 +00:00
responders: vec![
2020-05-02 05:04:51 +00:00
Box::new(BestDoctorResponder),
2020-05-02 07:30:16 +00:00
Box::new(DesuResponder),
2020-05-02 05:04:51 +00:00
Box::new(YellResponder),
2020-05-02 07:06:32 +00:00
Box::new(ReeeResponder),
2020-05-13 19:29:51 +00:00
Box::new(AllCapsResponder),
2020-05-02 02:27:40 +00:00
],
2020-05-02 02:17:53 +00:00
}
}
}
#[async_trait]
impl EventHandler for Handler {
async fn message(&self, ctx: Context, message: Message) {
let received_msg = message.content_safe(ctx.clone()).await;
let valid_responses = self.responders.iter().filter_map(|responder| {
responder.get_message(received_msg.clone(), ctx.clone(), message.clone())
});
if let Some(fut) = valid_responses.choose(&mut OsRng) {
if let Err(err) = fut.await {
log::warn!("Got an error while sending a passive response: {}", err);
}
2020-05-02 02:17:53 +00:00
}
}
}
2020-05-02 05:04:51 +00:00
#[macro_export]
macro_rules! simple_responder {
// $phrase should be `expr`, see https://github.com/dtolnay/async-trait/issues/46
// above issue is blocked on rustc bug, see https://github.com/rust-lang/rust/issues/43081
($name:tt, $regex:expr, $phrase:tt) => {
2020-05-02 17:45:50 +00:00
lazy_static::lazy_static! {
#[derive(Debug)]
static ref REGEX: regex::Regex = regex::Regex::new($regex).unwrap();
2020-05-02 05:04:51 +00:00
}
pub(crate) struct $name;
impl crate::passive::PassiveResponder for $name {
fn get_message(
2020-05-02 17:45:50 +00:00
&self,
received_msg: String,
2020-05-02 17:45:50 +00:00
ctx: serenity::prelude::Context,
message: serenity::model::channel::Message,
) -> Option<crate::passive::PassiveResponse<'_>> {
if REGEX.is_match(&received_msg) {
log::trace!("{} matched regex {:?}", received_msg, REGEX);
Some(Box::pin(crate::util::debug_say_owned(
message, ctx, $phrase,
)))
} else {
None
2020-05-02 05:04:51 +00:00
}
}
}
};
}
type PassiveResponse<'a> = BoxFuture<'a, Result<Option<Message>, serenity::Error>>;
trait PassiveResponder {
fn get_message(
&self,
received_msg: String,
ctx: Context,
message: Message,
) -> Option<PassiveResponse>;
}