diff options
Diffstat (limited to 'src/main.rs')
| -rw-r--r-- | src/main.rs | 117 |
1 files changed, 15 insertions, 102 deletions
diff --git a/src/main.rs b/src/main.rs index 7f19b9e..e91c8e6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,72 +1,18 @@ -use std::{sync::Arc, time::Duration}; - -use eyre::{Context as _, Report, Result}; -use log::{info, trace, warn}; -use poise::{ - serenity_prelude::{self as serenity}, - EditTracker, Framework, FrameworkOptions, PrefixFrameworkOptions, -}; -use tokio::signal::ctrl_c; -#[cfg(target_family = "unix")] -use tokio::signal::unix::{signal, SignalKind}; -#[cfg(target_family = "windows")] -use tokio::signal::windows::ctrl_close; - -mod api; +mod client; mod commands; mod consts; -mod handlers; +mod events; +mod http; mod storage; mod utils; -use storage::Storage; - -type Error = Box<dyn std::error::Error + Send + Sync>; -type Context<'a> = poise::Context<'a, Data, Error>; - -#[derive(Clone, Debug, Default)] -pub struct Data { - storage: Option<Storage>, -} - -async fn setup(ctx: &serenity::Context) -> Result<Data, Error> { - let storage = Storage::from_env().ok(); - - if let Some(storage) = storage.as_ref() { - if !storage.clone().is_connected() { - return Err( - "You specified a storage backend but there's no connection! Is it running?".into(), - ); - } - trace!("Storage backend connected!"); - - poise::builtins::register_globally(ctx, &commands::to_vec_global()).await?; - info!("Registered global commands!"); - - // register "extra" commands in guilds that allow it - let guilds = storage.get_opted_guilds().await?; - - for guild in guilds { - poise::builtins::register_in_guild(ctx, &commands::to_vec_optional(), guild).await?; - - info!("Registered guild commands to {}", guild); - } - } else { - warn!("No storage backend was specified. Features requiring storage will be disabled"); - warn!("Registering optional commands globally since there's no storage backend"); - poise::builtins::register_globally(ctx, &commands::to_vec()).await?; - } - - let data = Data { storage }; - - Ok(data) -} +use eyre::{Report, Result}; -async fn handle_shutdown(shard_manager: Arc<serenity::ShardManager>, reason: &str) { - warn!("{reason}! Shutting down bot..."); - shard_manager.shutdown_all().await; - println!("Everything is shutdown. Goodbye!"); -} +use tokio::signal::ctrl_c; +#[cfg(target_family = "unix")] +use tokio::signal::unix::{signal, SignalKind}; +#[cfg(target_family = "windows")] +use tokio::signal::windows::ctrl_close; #[tokio::main] async fn main() -> Result<()> { @@ -74,44 +20,9 @@ async fn main() -> Result<()> { color_eyre::install()?; env_logger::init(); - let token = std::env::var("TOKEN").wrap_err("Couldn't find bot token in environment!")?; - - let intents = - serenity::GatewayIntents::non_privileged() | serenity::GatewayIntents::MESSAGE_CONTENT; - - let options = FrameworkOptions { - commands: commands::to_vec(), - on_error: |error| Box::pin(handlers::error::handle(error)), - - command_check: Some(|ctx| { - Box::pin(async move { Ok(ctx.author().id != ctx.framework().bot_id) }) - }), - - event_handler: |ctx, event, _framework, data| { - Box::pin(handlers::event::handle(ctx, event, data)) - }, - - prefix_options: PrefixFrameworkOptions { - prefix: Some("!".into()), - edit_tracker: Some(Arc::new(EditTracker::for_timespan(Duration::from_secs( - 3600, - )))), - ..Default::default() - }, - - ..Default::default() - }; - - let framework = Framework::builder() - .options(options) - .setup(|ctx, _ready, _framework| Box::pin(setup(ctx))) - .build(); - - let mut client = serenity::ClientBuilder::new(token, intents) - .framework(framework) - .await?; + let mut client = client::get().await?; - let shard_manager = client.shard_manager.clone(); + let shard_manager = client.shard_manager.clone(); // We need this to shut down the bot #[cfg(target_family = "unix")] let mut sigterm = signal(SignalKind::terminate())?; #[cfg(target_family = "windows")] @@ -120,11 +31,13 @@ async fn main() -> Result<()> { tokio::select! { result = client.start() => result.map_err(Report::from), _ = sigterm.recv() => { - handle_shutdown(shard_manager, "Received SIGTERM").await; + client::handle_shutdown(shard_manager, "Received SIGTERM").await; + println!("Everything is shutdown. Goodbye!"); std::process::exit(0); }, _ = ctrl_c() => { - handle_shutdown(shard_manager, "Interrupted").await; + client::handle_shutdown(shard_manager, "Interrupted").await; + println!("Everything is shutdown. Goodbye!"); std::process::exit(130); } } |
