diff options
Diffstat (limited to 'src/main.rs')
| -rw-r--r-- | src/main.rs | 191 |
1 files changed, 4 insertions, 187 deletions
diff --git a/src/main.rs b/src/main.rs index daafbf4..6c2d651 100644 --- a/src/main.rs +++ b/src/main.rs @@ -12,8 +12,6 @@ #[macro_use] extern crate envconfig_derive; use std::{ - default::Default, - fs::File, thread, time::{ Duration, @@ -21,29 +19,10 @@ use std::{ }, }; -use chrono::Datelike; -use fnv::{FnvHashMap, FnvHashSet}; use log::{ - debug, error, info, - trace, - warn, }; -use serenity::{ - framework::StandardFramework, - model::{ - gateway::Ready, - id::{ChannelId, MessageId}, - }, - prelude::*, -}; - -use dotenv::dotenv; -use lazy_static::lazy_static; -use envconfig::Envconfig; - -use self::commands::register_commands; pub use self::util::*; pub use self::config::*; @@ -68,174 +47,12 @@ mod commands; mod util; mod audio; mod config; -mod log; +mod log_setup; +mod bot; pub type Error = anyhow::Error; - pub type Result<T> = anyhow::Result<T>; -lazy_static! { - pub static ref CONFIG: Config = { - dotenv().ok(); - - Config::init().unwrap() - }; -} - -struct Handler; -impl EventHandler for Handler { - fn ready(&self, ctx: Context, r: Ready) { - let guild = r.guilds.iter() - .find(|g| g.id() == CONFIG.discord.guild()); - - if guild.is_none() { - info!("bot isn't in configured guild. join here: {:?}", OAUTH_URL.as_str()); - } - - #[cfg(debug_assertions)] { - let _ = guild.map(|g| g.id().edit_nickname(ctx, Some("thulani (dev)"))); - } - - #[cfg(not(debug_assertions))] { - let _ = guild.map(|g| g.id().edit_nickname(ctx, Some("thulani"))); - } - } - - fn message_delete(&self, ctx: Context, channel_id: ChannelId, deleted_message_id: MessageId) { - MESSAGE_WATCH.lock() - .remove(&deleted_message_id) - .iter() - .for_each(|id| { - if let Err(e) = channel_id.delete_message(&ctx, id) { - error!("deleting message: {}", e); - } - }); - } -} - -lazy_static! { - static ref MESSAGE_WATCH: Mutex<FnvHashMap<MessageId, MessageId>> = Mutex::new(FnvHashMap::default()); - static ref PREFIXES: Vec<&'static str> = vec!["!thulani ", "!thulan ", "!thulando madando ", "!thulando "]; - static ref RESTRICTED_PREFIXES: Vec<&'static str> = vec!["!todd ", "!toddbert ", "!toddlani "]; -} - - -fn run() -> Result<()> { - let token = &CONFIG.discord.auth.token; - let mut client = Client::new(token, Handler)?; - - audio::VoiceManager::register(&mut client); - audio::PlayQueue::register(&mut client); - - let all_prefixes = { - let mut all_prefixes: Vec<&'static str> = vec![]; - all_prefixes.extend(PREFIXES.iter()); - all_prefixes.extend(RESTRICTED_PREFIXES.iter()); - all_prefixes - }; - - let restrict_ids = File::open("restrict.json") - .map_err(Error::from) - .and_then(|f| serde_json::from_reader::<_, Vec<u64>>(f).map_err(Error::from)); - - if let Err(ref e) = restrict_ids { - warn!("opening restrict file: {}", e); - } - - let restrict_ids = restrict_ids - .unwrap_or_default() - .into_iter() - .collect::<FnvHashSet<_>>(); - - let mut framework = StandardFramework::new() - .configure(|c| c - .allow_dm(false) - .with_whitespace(true) - .prefixes(all_prefixes) - .ignore_bots(true) - .on_mention(None) - .owners(vec![CONFIG.discord.owner()].into_iter().collect()) - .case_insensitivity(true) - ) - .before(move |ctx, message, cmd| { - debug!("got command '{}' from user '{}' ({})", cmd, message.author.name, message.author.id); - if !message.guild_id.map_or(false, |x| x == CONFIG.discord.guild()) { - info!("rejecting command '{}' from user '{}': wrong guild", cmd, message.author.name); - return false; - } - - if message.author.id == CONFIG.discord.owner() { - return true; - } - - let restricted_prefix = RESTRICTED_PREFIXES.iter().any(|prefix| message.content.starts_with(prefix)); - if !restricted_prefix { - return true; - } - - const PERMITTED_WEEKDAY: chrono::Weekday = chrono::Weekday::Tue; - - let restricted_user = restrict_ids.contains(&message.author.id.0); - let flip_restriction_day = chrono::Local::now().weekday() == PERMITTED_WEEKDAY; - - if restricted_user == flip_restriction_day { - return true; - } - - let reason = if !flip_restriction_day { - "restricted prefix".to_owned() - } else { - format!("it is {:?}", PERMITTED_WEEKDAY) - }; - - info!("rejecting command '{}' from user '{}': {}", cmd, message.author.name, reason); - - match ctx.send_result(message.channel_id, "no", message.tts) { - Err(e) => error!("sending restricted prefix response: {}", e), - Ok(msg_id) => { - let mut mp = MESSAGE_WATCH.lock(); - mp.insert(message.id, msg_id); - } - } - - return false; - }) - .after(|ctx, msg, cmd, err| { - match err { - Ok(()) => { - trace!("command '{}' completed successfully", cmd); - }, - - Err(e) => { - if let Err(e) = msg.react(&ctx, "❌") { - error!("reacting to failed message: {}", e); - } - - if let Err(e) = ctx.send(msg.channel_id, "BANIC", msg.tts) { - error!("sending BANIC: {}", e); - } - - error!("error encountered handling command '{}': {:?}", cmd, e); - } - } - }) - .bucket("Standard", |b| b.delay(1).limit(20).time_span(60)); - - framework = register_commands(framework); - - client.with_framework(framework); - - let shard_manager = client.shard_manager.clone(); - ctrlc::set_handler(move || { - info!("shutting down"); - shard_manager.lock().shutdown_all(); - }).expect("unable to create SIGINT/SIGTERM handlers"); - - client.start()?; - - Ok(()) -} - fn main() { const BACKOFF_FACTOR: f64 = 2.0; const MAX_BACKOFFS: usize = 3; @@ -245,7 +62,7 @@ fn main() { info!("starting"); - log::init().expect("initializing logging"); + log_setup::init().expect("initializing logging"); let mut backoff_count: usize = 0; @@ -253,7 +70,7 @@ fn main() { let start = Instant::now(); info!("starting bot"); - match run() { + match bot::run() { Err(e) => { error!("error encountered running client: {:?}", e); }, |
