use config::parse_local_config; use poise::serenity_prelude as serenity; use tracing::{error, info}; pub mod config; pub mod dotenv; pub mod model; struct Data {} // User data, which is stored and accessible in all command invocations type Error = Box; type Context<'a> = poise::Context<'a, Data, Error>; /// Displays your or another user's account creation date #[poise::command(slash_command, prefix_command)] async fn age( ctx: Context<'_>, #[description = "Selected user"] user: Option, ) -> Result<(), Error> { let u = user.as_ref().unwrap_or_else(|| ctx.author()); let response = format!("{}'s account was created at {}", u.name, u.created_at()); ctx.say(response).await?; Ok(()) } #[tokio::main] async fn main() { let config = parse_local_config(); tool_tracing::init::init_tracing(config.tracing.clone(), config.bot_name.clone()); info!("Init Database"); let datalake_config = model::create_pool_manager(config.persistence.clone()).unwrap(); let _manager = match model::create_manager_and_init(datalake_config).await { Ok(manager) => { info!("Database manager created successfully"); manager } Err(e) => { error!("Failed to create database manager: {}", e); return; } }; info!("Database manager initialized successfully"); info!("Starting bot {}", config.bot_name); let intents = serenity::GatewayIntents::non_privileged(); let framework = poise::Framework::builder() .options(poise::FrameworkOptions { commands: vec![age()], ..Default::default() }) .setup(|ctx, _ready, framework| { Box::pin(async move { poise::builtins::register_globally(ctx, &framework.options().commands).await?; Ok(Data {}) }) }) .build(); let client = serenity::ClientBuilder::new(config.token.clone(), intents) .framework(framework) .await; client.unwrap().start().await.unwrap(); }