use derive_more::From; use poise::serenity_prelude::Http; use serde::{Deserialize, Serialize}; use std::fs; #[derive(Serialize, Deserialize)] pub struct Settings { pub guilds: Vec, } impl Settings { pub async fn new(http: &Http) -> Result { let file = fs::read_to_string("settings.yaml").unwrap(); let mut settings: Self = serde_yaml::from_str(&file)?; settings.load(http).await?; Ok(settings) } pub async fn load(&mut self, http: &Http) -> poise::serenity_prelude::Result<()> { for guild in self.guilds.iter_mut() { guild.load(http).await?; } Ok(()) } } #[derive(From, Debug)] pub enum GetSettingsError { Io(std::io::Error), Deserialize(serde_yaml::Error), Serenity(poise::serenity_prelude::Error), } #[derive(Serialize, Deserialize)] pub struct Guild { pub id: u64, #[serde(default)] pub hidden: bool, #[serde(default)] pub recommended: bool, pub channel: u64, pub invite: Option, // None case means guild is not yet loaded #[serde(default)] pub icon: Option>, #[serde(default)] pub name: Option, } impl Guild { pub async fn load(&mut self, http: &Http) -> poise::serenity_prelude::Result<()> { let server = http.get_guild(self.id).await?; self.icon = Some(server.icon); self.name = Some(server.name); Ok(()) } }