use std::{
fmt::Display,
net::{IpAddr, Ipv4Addr, SocketAddr},
path::PathBuf,
};
use serde::{Deserialize, Serialize};
use url::Url;
use crate::Error;
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct Config {
pub data_directory: PathBuf,
pub database_url: String,
pub discord_token: String,
pub channel_id: u64,
pub log_channel_id: Option<u64>,
pub guild_id: u64,
pub rate_adjuster: f64,
pub whisper: Whisper,
pub http_api: HttpApi,
pub random_clip_interval: u64,
pub mimic_endpoint: Option<Url>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct Whisper {
pub model: PathBuf,
}
impl Default for Whisper {
fn default() -> Self {
Whisper {
model: PathBuf::from("/var/lib/btfm/whisper/base.en.pt"),
}
}
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct HttpApi {
pub url: SocketAddr,
pub user: String,
pub password: String,
pub tls_certificate: Option<PathBuf>,
pub tls_key: Option<PathBuf>,
}
impl Default for HttpApi {
fn default() -> Self {
HttpApi {
url: SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 8080),
user: "admin".to_string(),
password: "admin".to_string(),
tls_certificate: None,
tls_key: None,
}
}
}
impl Default for Config {
fn default() -> Self {
Config {
data_directory: PathBuf::from(r"/var/lib/btfm/"),
database_url: "postgres:///btfm".to_string(),
discord_token: "Go get a Discord API token".to_string(),
channel_id: 0,
log_channel_id: None,
guild_id: 0,
rate_adjuster: 120.0,
whisper: Default::default(),
http_api: Default::default(),
random_clip_interval: 60 * 15,
mimic_endpoint: None,
}
}
}
impl Display for Config {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"{}",
toml::ser::to_string_pretty(&self).unwrap_or_default()
)
}
}
pub fn load_config(path: &str) -> Result<Config, Error> {
let path = PathBuf::from(path);
let config_string = std::fs::read_to_string(path)?;
let config: Config = toml::from_str(&config_string).map_err(|err| {
println!("Example config format:\n\n{}", Config::default());
err
})?;
Ok(config)
}