diff options
| author | seth <[email protected]> | 2024-08-09 23:35:41 -0400 |
|---|---|---|
| committer | GitHub <[email protected]> | 2024-08-09 23:35:41 -0400 |
| commit | b643a6a235b0c1c9902b97421f24eff2b0d0a5ac (patch) | |
| tree | 350794c0e9330fb77367838313bc6bb97278a0aa /src/main.rs | |
| parent | 372780546b508684839916e5ad54c9e90456a94f (diff) | |
tree-wide: end of summer cleanup (#214)
* api: refactor & rename module to http
* client: split from main.rs
* tree-wide: use eyre::Report as error
* nix: alejandra -> nixfmt
* nix: start using treefmt-nix
* nix: simplify flake
* nix: refactor derivation & docker image
* nix: remove overlay
* ci: update & cleanup workflows
* commands: assign all commands automatically
* commands/copypasta: remove
* http/teawie: update response struct for upstream rust rewrite
* handlers: rename modules to events; flatten
* crates: rename self to teawie-bot
* nix: fenix -> rust-overlay
i want a specific rust version grrrrrrr
* ci: pin rust to 1.79
this is what our nix dev shell uses and what we can compile on. it seems
the time crate doesn't like v1.80 of the compiler :(
* ci: always run release gates
* nix: fix static toolchain
* nix: rust-overlay -> nixpkgs
* ci: adopt actions-rust-lang actions
* nix: use docker arch names for containers
* crates/time: 0.3.30 -> 0.3.36
fixes building on rust 1.80.0
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); } } |
