summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorseth <[email protected]>2023-12-05 06:33:54 -0500
committerseth <[email protected]>2023-12-15 16:41:13 -0500
commit00b933a90de1799d9f0a8074e427491339e7134a (patch)
tree3102be353c727596cf57ab8e7488bb5bfe1e9909
parenteacf266d22ddf03541524755a43c8c46ed4cd4cb (diff)
feat: cleanly shutdown on ctrl+c & sigterm
-rw-r--r--src/main.rs31
1 files changed, 26 insertions, 5 deletions
diff --git a/src/main.rs b/src/main.rs
index b16a13d..06e6724 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,11 +1,16 @@
+use std::sync::Arc;
use std::time::Duration;
use color_eyre::eyre::{eyre, Context as _, Report, Result};
+use color_eyre::owo_colors::OwoColorize;
use log::*;
-use poise::serenity_prelude as serenity;
+use poise::serenity_prelude::{self as serenity, ShardManager};
use poise::{EditTracker, Framework, FrameworkOptions, PrefixFrameworkOptions};
use redis::ConnectionLike;
use storage::Storage;
+use tokio::signal::ctrl_c;
+use tokio::signal::unix::{signal, SignalKind};
+use tokio::sync::Mutex;
mod api;
mod colors;
@@ -63,6 +68,12 @@ async fn setup(
Ok(data)
}
+async fn handle_shutdown(shard_manager: Arc<Mutex<ShardManager>>, reason: &str) {
+ warn!("{reason}! Shutting down bot...");
+ shard_manager.lock().await.shutdown_all().await;
+ println!("{}", "Everything is shutdown. Goodbye!".green());
+}
+
#[tokio::main]
async fn main() -> Result<()> {
dotenvy::dotenv().ok();
@@ -100,12 +111,22 @@ async fn main() -> Result<()> {
.token(token)
.intents(intents)
.options(options)
- .setup(|ctx, ready, framework| Box::pin(setup(ctx, ready, framework)));
+ .setup(|ctx, ready, framework| Box::pin(setup(ctx, ready, framework)))
+ .build()
+ .await
+ .wrap_err_with(|| "Failed to build framework!")?;
+
+ let shard_manager = framework.shard_manager().clone();
+ let mut sigterm = signal(SignalKind::terminate())?;
tokio::select! {
- result = framework.run() => result.map_err(Report::from),
- _ = tokio::signal::ctrl_c() => {
- info!("Interrupted! Exiting...");
+ result = framework.start() => result.map_err(Report::from),
+ _ = sigterm.recv() => {
+ handle_shutdown(shard_manager, "Recieved SIGTERM").await;
+ std::process::exit(0);
+ },
+ _ = ctrl_c() => {
+ handle_shutdown(shard_manager, "Interrupted").await;
std::process::exit(130);
}
}