#[macro_use] extern crate lazy_static; use commands::*; use config::CONFIG; use serenity::model::channel::Message; use serenity::model::id::ChannelId; use serenity::prelude::*; mod commands; mod config; pub fn main() { print_commands(); Client::new(&config::CONFIG.secret, Handler) .expect("Error creating client") .start() .expect("Could not connect to discord"); } pub struct Handler; impl EventHandler for Handler { fn message(&self, ctx: Context, msg: Message) { if !msg.content.starts_with(&CONFIG.prefix) { return; } if let Some(command) = find_matching(&msg.content, &CONFIG) { let response = match command.execute(&msg) { Err(e) => e, Ok(()) => String::from("Done."), }; send(msg.channel_id, &response, &ctx); } } } pub fn send(target: ChannelId, message: &str, ctx: &Context) { if let Err(cause) = target.say(&ctx.http, message) { println!("Could not send message: {}", cause); } } #[cfg(test)] mod tests { use super::commands::*; use super::config::*; use super::*; #[test] fn find_matching_test() { let cmd = Command::new("ls -l", "show_files", vec![1234567890]); let cfg = Config { prefix: String::from(">"), secret: String::from("1qay2wsx3edc45fv"), commands: vec![cmd.clone()], }; assert_eq!(find_matching(&">show_files", &cfg), Some(&cmd)); assert_eq!(find_matching(&">show something else", &cfg), None); let cfg = Config { prefix: String::from("!!"), ..cfg }; assert_eq!(find_matching(&">show_files", &cfg), None); assert_eq!(find_matching(&"!!show_files", &cfg), Some(&cmd)); } }