use std::sync::Arc; use serenity::prelude::*; use structopt::StructOpt; use discord::command_framework; use discord::event_handler::Handler; use game::global_data::GlobalData; use crate::config::{Args, BotConfig}; use crate::game::listener::Listeners; use crate::game::role::Role; mod config; mod discord; mod error; mod game; mod imgur; mod messages; #[tokio::main] async fn main() { let args: Args = Args::from_args(); let bot_cfg: BotConfig = BotConfig::new(&args.cfg_path).expect("Unable to parse cfg"); let mut global_data = GlobalData::new(bot_cfg.clone()); if global_data.game_state_exists() { println!("Resuming game..."); global_data .load_game_state() .expect("Unable to open saved game state."); } let mut listeners = Listeners::default(); Role::Spy.register_role_listener(&mut listeners); let mut client = Client::builder(&bot_cfg.discord_config.token, GatewayIntents::all()) .event_handler(Handler {}) .framework(command_framework()) .type_map_insert::(Arc::new(Mutex::new(global_data))) .type_map_insert::(Arc::new(Mutex::new(listeners))) .await .expect("Err creating client"); if let Err(why) = client.start().await { println!("Client error: {:?}", why); } }