diff --git a/.gitignore b/.gitignore index 86e2e89..abded7c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ /target /.env /settings.json -/Cross.toml \ No newline at end of file +/Cross.toml +/.vscode \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 11135d7..dc56fad 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1514,7 +1514,7 @@ dependencies = [ [[package]] name = "shibe-bot" -version = "0.3.2" +version = "0.3.3" dependencies = [ "build-time", "dotenvy", diff --git a/Cargo.toml b/Cargo.toml index 1227dde..d8f6e19 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,7 +3,7 @@ name = "shibe-bot" description = "A Discord bot written in Rust, using Poise." license = "MIT" readme = "README.md" -version = "0.3.2" +version = "0.3.3" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/README.md b/README.md index 6b3e549..1e2d0fa 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Shibe Bot 0.3.2 +# Shibe Bot 0.3.3 [![Rust](https://github.com/shibedrill/shibe-bot/actions/workflows/rust.yml/badge.svg)](https://github.com/shibedrill/shibe-bot/actions/workflows/rust.yml) [![GitHub License](https://img.shields.io/github/license/shibedrill/shibe-bot)](LICENSE.txt) diff --git a/src/command/devel.rs b/src/command/devel.rs index ec6205f..1fc5027 100644 --- a/src/command/devel.rs +++ b/src/command/devel.rs @@ -1,6 +1,41 @@ +use build_time::build_time_local; + use crate::Context; use crate::Error; +/// Update the bot from anywhere, using systemd service +#[poise::command(slash_command, owners_only, hide_in_help)] +pub async fn update(ctx: Context<'_>) -> Result<(), Error> { + let command_result = std::process::Command::new("systemd") + .arg("--user") + .arg("restart") + .arg("shibe-bot-update.service") + .spawn(); + match command_result { + Ok(_child) => { + ctx.say(format!( + "Initialized restart service successfully.\n\ + Expect brief outage soon.\n\ + Current version: {}\n\ + Timestamp of last build: {}", + env!("CARGO_PKG_VERSION"), + build_time_local!() + )) + .await?; + info!("Initialized restart service successfully"); + } + Err(what) => { + ctx.say(format!( + "Failed to initialize restart service. Reason: {}", + what + )) + .await?; + error!("Failed to initialize restart service: {}", what); + } + } + Ok(()) +} + /// Shut down the bot remotely #[poise::command(slash_command, owners_only, hide_in_help)] pub async fn shutdown(ctx: Context<'_>) -> Result<(), Error> { diff --git a/src/main.rs b/src/main.rs index 36b45cd..2b7235e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -76,23 +76,33 @@ async fn event_handler( // Main function for setup #[tokio::main] async fn main() { - // Get secure env vars from .env file - dotenv().ok(); - // Get token from environment - let token = std::env::var("TOKEN").expect("Getting TOKEN from environment failed"); - // Set up some non privileged intents - let intents = serenity::GatewayIntents::non_privileged(); - // Initialize logging pretty_env_logger::init(); + info!("Initialized logger successfully"); + // Get secure env vars from .env file + match dotenv() { + Ok(_) => info!("Loaded env vars from .env successfully"), + Err(e) => error!("Failed to get vars from .env: {}", e), + } + + // Get token from environment + let token = std::env::var("TOKEN") + .inspect_err(|e| { + error!("Failed to get TOKEN from environment: {}", e); + }) + .expect("Failed to get TOKEN from environment"); + info!("Got TOKEN successfully"); + // Set up some non privileged intents + let intents = serenity::GatewayIntents::non_privileged(); // Configure persistent options let config_manager: Arc>> = Arc::new(Mutex::new( Manager::load(SETTINGS_PATH).unwrap_or(Manager::manage(SETTINGS_PATH, Settings::default())), )); - let _ = config_manager.lock().await.store().inspect_err(|e| { - error!("Failed to store config: {}", e); - }); + match config_manager.lock().await.store() { + Ok(_) => info!("Stored config successfully"), + Err(e) => error!("Failed to store config: {}", e), + }; // Set up framework let framework = poise::Framework::builder() diff --git a/src/settings.rs b/src/settings.rs index 56da883..a4dfb60 100644 --- a/src/settings.rs +++ b/src/settings.rs @@ -39,7 +39,7 @@ impl Deserialize<'a>> Manager { pub fn store(&self) -> Result<(), std::io::Error> { let data = serde_json::to_string_pretty(&self.internal)?; let mut file = std::fs::File::create(&self.path)?; - let _ = file.write(data.as_bytes()); + file.write_all(data.as_bytes())?; Ok(()) } /// Create a new manager, passing in the path, and a structure to manage.