diff --git a/lsp/src/configuration.rs b/lsp/src/configuration.rs index 5e4b4e8..a97101b 100644 --- a/lsp/src/configuration.rs +++ b/lsp/src/configuration.rs @@ -52,9 +52,16 @@ impl Rules { } } +#[derive(Debug, PartialEq)] +pub enum IdleAction { + ClearActivity, // Clear the activity + ChangeActivity, // Change the activity +} + #[derive(Debug)] pub struct Idle { - pub timeout: u64, // in seconds + pub timeout: u64, // in seconds + pub action: IdleAction, // what to do when idle pub state: Option, pub details: Option, @@ -69,6 +76,7 @@ impl Default for Idle { fn default() -> Self { Idle { timeout: 300, + action: IdleAction::ChangeActivity, state: Some("Idling".to_string()), details: Some("In Zed".to_string()), @@ -175,6 +183,15 @@ impl Configuration { if let Some(idle) = options.get("idle") { self.idle.timeout = idle.get("timeout").and_then(|t| t.as_u64()).unwrap_or(300); + self.idle.action = idle.get("action").and_then(|a| a.as_str()).map_or( + IdleAction::ChangeActivity, + |action| match action { + "clear_activity" => IdleAction::ClearActivity, + "change_activity" => IdleAction::ChangeActivity, + _ => IdleAction::ChangeActivity, + }, + ); + set_option!(self, idle, state, "state"); set_option!(self, idle, details, "details"); set_option!(self, idle, large_image, "large_image"); diff --git a/lsp/src/discord.rs b/lsp/src/discord.rs index 24263cf..0ca5cf2 100644 --- a/lsp/src/discord.rs +++ b/lsp/src/discord.rs @@ -73,6 +73,13 @@ impl Discord { .await } + pub async fn clear_activity(&self) { + let mut client = self.get_client().await; + client + .clear_activity() + .unwrap_or_else(|_| println!("Failed to clear activity")); + } + #[allow(clippy::too_many_arguments)] pub async fn change_activity( &self, diff --git a/lsp/src/main.rs b/lsp/src/main.rs index ebf5c99..25de29a 100644 --- a/lsp/src/main.rs +++ b/lsp/src/main.rs @@ -141,6 +141,13 @@ impl Backend { let config_guard = config_clone.lock().await; let placeholders = Placeholders::new(None, &config_guard, ""); + let discord_guard = discord_clone.lock().await; + + if config_guard.idle.action == configuration::IdleAction::ClearActivity { + discord_guard.clear_activity().await; + return; + } + let (state, details, large_image, large_text, small_image, small_text) = Backend::process_fields( &placeholders, @@ -152,7 +159,6 @@ impl Backend { &config_guard.idle.small_text, ); - let discord_guard = discord_clone.lock().await; discord_guard .change_activity( state,