summaryrefslogtreecommitdiff
path: root/src/main.rs
diff options
context:
space:
mode:
authorseth <[email protected]>2023-12-05 06:04:52 -0500
committerseth <[email protected]>2023-12-15 16:41:13 -0500
commiteacf266d22ddf03541524755a43c8c46ed4cd4cb (patch)
treeca3d7d4a127ef53b6a4f15776d00e0243e54a3be /src/main.rs
parent815cb0df3b3e3f9dd2078b00f85754da87b1d55e (diff)
feat: handle errors during setup
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs68
1 files changed, 39 insertions, 29 deletions
diff --git a/src/main.rs b/src/main.rs
index d355307..b16a13d 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -2,9 +2,9 @@ use std::time::Duration;
use color_eyre::eyre::{eyre, Context as _, Report, Result};
use log::*;
-use poise::{
- serenity_prelude as serenity, EditTracker, Framework, FrameworkOptions, PrefixFrameworkOptions,
-};
+use poise::serenity_prelude as serenity;
+use poise::{EditTracker, Framework, FrameworkOptions, PrefixFrameworkOptions};
+use redis::ConnectionLike;
use storage::Storage;
mod api;
@@ -33,6 +33,36 @@ impl Data {
}
}
+async fn setup(
+ ctx: &serenity::Context,
+ _ready: &serenity::Ready,
+ framework: &Framework<Data, Report>,
+) -> Result<Data> {
+ let data = Data::new()?;
+ let mut client = data.storage.client.clone();
+
+ if !client.check_connection() {
+ return Err(eyre!(
+ "Couldn't connect to storage! Is your daemon running?"
+ ));
+ }
+
+ poise::builtins::register_globally(ctx, &framework.options().commands).await?;
+ info!("Registered global commands!");
+
+ // register "extra" commands in guilds that allow it
+ info!("Fetching opted guilds");
+ let guilds = data.storage.get_opted_guilds().await?;
+
+ for guild in guilds {
+ poise::builtins::register_in_guild(ctx, &commands::to_optional_commands(), guild).await?;
+
+ info!("Registered guild commands to {}", guild);
+ }
+
+ Ok(data)
+}
+
#[tokio::main]
async fn main() -> Result<()> {
dotenvy::dotenv().ok();
@@ -48,17 +78,21 @@ async fn main() -> Result<()> {
let options = FrameworkOptions {
commands: commands::to_global_commands(),
on_error: |error| Box::pin(handlers::handle_error(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::handle_event(ctx, event, framework, data))
},
+
prefix_options: PrefixFrameworkOptions {
prefix: Some("!".into()),
edit_tracker: Some(EditTracker::for_timespan(Duration::from_secs(3600))),
..Default::default()
},
+
..Default::default()
};
@@ -66,34 +100,10 @@ async fn main() -> Result<()> {
.token(token)
.intents(intents)
.options(options)
- .setup(|ctx, _ready, framework| {
- Box::pin(async move {
- let data = Data::new()?;
-
- poise::builtins::register_globally(ctx, &framework.options().commands).await?;
- info!("Registered global commands!");
-
- // register "extra" commands in guilds that allow it
- info!("Fetching opted guilds");
- let guilds = data.storage.get_opted_guilds().await?;
-
- for guild in guilds {
- poise::builtins::register_in_guild(
- ctx,
- &commands::to_optional_commands(),
- guild,
- )
- .await?;
-
- info!("Registered guild commands to {}", guild);
- }
-
- Ok(data)
- })
- });
+ .setup(|ctx, ready, framework| Box::pin(setup(ctx, ready, framework)));
tokio::select! {
- result = framework.run() => { result.map_err(Report::from) },
+ result = framework.run() => result.map_err(Report::from),
_ = tokio::signal::ctrl_c() => {
info!("Interrupted! Exiting...");
std::process::exit(130);