use vaidcord::{
Dispatcher, Event, ExtractBag, HandlerResult, Message, Next, Router, User, command,
};
fn make_message(content: &str) -> Message {
Message {
id: "1".to_string(),
channel_id: "2".to_string(),
guild_id: None,
author: User {
id: "42".to_string(),
username: "tester".to_string(),
discriminator: None,
global_name: None,
bot: false,
system: false,
avatar: None,
banner: None,
public_flags: None,
},
content: content.to_string(),
timestamp: None,
edited_timestamp: None,
tts: false,
mention_everyone: false,
mentions: Vec::new(),
embeds: Vec::new(),
attachments: Vec::new(),
components: Vec::new(),
flags: None,
}
}
fn logging(label: &'static str) -> impl for<'a> Fn(&Event, &ExtractBag, Next<'a>) -> HandlerResult {
move |event, bag, next| {
println!("-> {label} (before)");
let result = next.run(event, bag);
println!("<- {label} (after)");
result
}
}
fn main() -> Result<(), vaidcord::Error> {
let mut commands = Router::named("commands");
commands.use_middleware(logging("commands middleware"));
commands.on_message_filtered(
|message: &Message| {
println!(" handler: pong! ({})", message.content);
Ok(())
},
vec![command("ping")],
);
let mut root = Router::named("root");
root.use_middleware(logging("root middleware"));
root.use_middleware(|event: &Event, bag: &ExtractBag, next: Next<'_>| {
if let Some(message) = event.message()
&& message.author.bot
{
println!(" blocked a bot message");
return Ok(());
}
next.run(event, bag)
});
root.include(commands);
let mut dispatcher = Dispatcher::new();
dispatcher.use_middleware(logging("dispatcher middleware"));
dispatcher.include(&root);
println!("dispatcher has {} route(s)\n", dispatcher.route_count());
println!("== dispatching '/ping' ==");
dispatcher.dispatch_message(&make_message("/ping"))?;
println!("\n== dispatching 'hello' (filter rejects; no chain runs) ==");
dispatcher.dispatch_message(&make_message("hello"))?;
Ok(())
}