From c69eea2f4823da476628742fbbec600ee95ac049 Mon Sep 17 00:00:00 2001 From: seth Date: Mon, 27 May 2024 04:55:45 -0400 Subject: initial commit --- src/client.rs | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 src/client.rs (limited to 'src/client.rs') diff --git a/src/client.rs b/src/client.rs new file mode 100644 index 0000000..a779a3b --- /dev/null +++ b/src/client.rs @@ -0,0 +1,58 @@ +use std::sync::Arc; + +use crate::{ + handler::Handler, + http::{self, HttpClientExt}, +}; + +use eyre::Result; +use serenity::prelude::{Client, GatewayIntents, TypeMapKey}; +use tracing::trace; + +/// Container for [http::Client] +pub struct SharedClient; + +impl TypeMapKey for SharedClient { + type Value = Arc; +} + +/// Fetch our bot token +fn token() -> Result { + let token = std::env::var("DISCORD_BOT_TOKEN")?; + Ok(token) +} + +/// Create our client +#[tracing::instrument] +pub async fn get() -> Client { + let token = token().expect("Couldn't find token in environment! Is DISCORD_BOT_TOKEN set?"); + + let intents = GatewayIntents::default(); + trace!("Creating client"); + let client = Client::builder(token, intents) + .event_handler(Handler) + .await + .expect("Couldn't create a client!"); + + // add state stuff + { + let mut data = client.data.write().await; + trace!("Creating HTTP client"); + let http_client = ::default(); + trace!("Inserting HTTP client into Discord client"); + data.insert::(Arc::new(http_client)) + } + + let shard_manager = client.shard_manager.clone(); + + // gracefully shutdown on ctrl+c + tokio::spawn(async move { + #[cfg(target_family = "unix")] + tokio::signal::ctrl_c() + .await + .expect("Couldn't registrl ctrl+c handler!"); + shard_manager.shutdown_all().await; + }); + + client +} -- cgit v1.2.3