mod config; mod discord; mod error; mod imgur; mod insult_compliment; mod inventory; mod user; use crate::config::{Args, BotConfig, Channel, GlobalData}; use crate::discord::emoji_race::RaceMessage; use crate::discord::unrecognised_command_hook; use magick_rust::magick_wand_genesis; use serenity::framework::standard::macros::{command, group, help, hook}; use serenity::framework::standard::StandardFramework; use serenity::prelude::*; use songbird::SerenityInit; use std::sync::Once; use structopt::StructOpt; const BAD_APPLE: &str = include_str!("assets/bad_apple.txt"); static START: Once = Once::new(); #[tokio::main] async fn main() { let args: Args = Args::from_args(); let cfg = match BotConfig::new(&args.cfg_path) { Ok(cfg) => cfg, Err(err) => { println!("Unable to open config: {}", err); return; } }; START.call_once(|| { magick_wand_genesis(); }); let global_data = match GlobalData::new(args, cfg).await { Ok(global_data) => global_data, Err(err) => { println!("Error parsing config: {}", err); return; } }; let framework = StandardFramework::new() .configure(|c| c.with_whitespace(true).prefix("!").ignore_bots(true)) .group(&discord::color::COLOR_GROUP) .group(&discord::album::ALBUM_GROUP) .group(&discord::celeryman::CELERYMAN_GROUP) .group(&discord::joke::JOKE_GROUP) .group(&discord::admin::ADMIN_GROUP) .group(&discord::story::STORY_GROUP) .group(&discord::fren_coin::FRENCOIN_GROUP) .group(&discord::emoji_race::EMOJIRACE_GROUP) .group(&discord::motivate::MOTIVATE_GROUP) .group(&discord::voices::VOICES_GROUP) .group(&discord::shop::SHOP_GROUP) .unrecognised_command(unrecognised_command_hook) .bucket("bad_apple", |b| b.delay(60 * 10)) .await .help(&discord::MY_HELP) .after(discord::after); let story_channel = Channel::::new(); let race_channel = Channel::::new(); let intents = GatewayIntents::all(); let mut client = Client::builder(&global_data.cfg.bot_token, intents) .framework(framework) .register_songbird() .type_map_insert::(global_data) .type_map_insert::>(story_channel) .type_map_insert::>(race_channel) .event_handler(discord::Handler) .await .expect("Unable to create client."); if let Err(err) = client.start().await { println!("Client error: {:?}", err); } }