use std::path::PathBuf; use dotenv::dotenv; use envconfig::Envconfig; use grate::tracing; use lazy_static::lazy_static; use serenity::model::id::UserId; lazy_static! { pub static ref CONFIG: Config = { dotenv().ok(); ::init_from_env().unwrap() }; pub static ref FFMPEG_COMMAND: String = { let result = CONFIG.ffmpeg.clone().unwrap_or("ffmpeg".to_owned()); tracing::debug!(ffmpeg = %result, "got ffmpeg"); result }; pub static ref YTDL_COMMAND: String = { let result = CONFIG.ytdl.clone().unwrap_or("yt-dlp".to_owned()); tracing::debug!(ytdl = %result, "got ytdl"); result }; } #[derive(Envconfig)] pub struct Config { #[envconfig(from = "DATABASE_URL")] pub db_string: String, #[envconfig(from = "MAX_HIST")] pub max_hist: usize, #[envconfig(from = "DEFAULT_HIST")] pub default_hist: usize, #[envconfig(from = "STEAM_API_KEY")] pub steam_api_key: String, #[envconfig(from = "FFMPEG")] pub ffmpeg: Option, #[envconfig(from = "YTDL")] pub ytdl: Option, #[envconfig(from = "USER_ID_MAPPING")] pub user_id_mapping: Option, #[envconfig(from = "RESTRICT")] pub restrict: Option, #[envconfig(nested = true)] pub discord: DiscordConfig, #[envconfig(nested = true)] pub sheets: SheetsConfig, } #[derive(Envconfig)] pub struct DiscordConfig { #[envconfig(nested = true)] pub auth: DiscordAuth, #[envconfig(from = "OWNER_ID")] owner: u64, } impl DiscordConfig { #[inline] pub fn owner(&self) -> UserId { self.owner.into() } } #[derive(Envconfig)] pub struct DiscordAuth { #[envconfig(from = "THULANI_CLIENT_ID")] pub client_id: u64, #[envconfig(from = "THULANI_TOKEN")] pub token: String, } #[derive(Envconfig)] pub struct SheetsConfig { #[envconfig(from = "SHEETS_API_KEY")] pub api_key: String, #[envconfig(from = "SPREADSHEET_ID")] pub spreadsheet: String, #[envconfig(from = "MAX_SHEET_COLUMN")] pub max_column: String, }