66 lines
1.8 KiB
Rust
66 lines
1.8 KiB
Rust
#[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));
|
|
}
|
|
}
|