Compare commits

..

3 commits

7 changed files with 49 additions and 14 deletions

2
Cargo.lock generated
View file

@ -125,7 +125,7 @@ dependencies = [
[[package]] [[package]]
name = "discord-presence-lsp" name = "discord-presence-lsp"
version = "0.5.1" version = "0.6.0"
dependencies = [ dependencies = [
"discord-rich-presence", "discord-rich-presence",
"git2", "git2",

View file

@ -31,6 +31,8 @@ You can configure state, details and git integration by changing Discord Presenc
"lsp": { "lsp": {
"discord_presence": { "discord_presence": {
"initialization_options": { "initialization_options": {
// application id for the rich presence (required, keep it if you don't know what you're doing)
"application_id": "1263505205522337886"
// Base url for all language icons // Base url for all language icons
"base_icons_url": "https://raw.githubusercontent.com/xhyrom/zed-discord-presence/main/assets/icons/", "base_icons_url": "https://raw.githubusercontent.com/xhyrom/zed-discord-presence/main/assets/icons/",

View file

@ -1,6 +1,6 @@
[package] [package]
name = "discord-presence-lsp" name = "discord-presence-lsp"
version = "0.5.1" version = "0.6.0"
edition = "2021" edition = "2021"
[dependencies] [dependencies]
@ -10,5 +10,5 @@ tower-lsp = "0.20.0"
git2 = { version = "0.19.0", default-features = false } git2 = { version = "0.19.0", default-features = false }
serde_json = { version = "1.0.122", features = ["std"] } serde_json = { version = "1.0.122", features = ["std"] }
lazy_static = "1.5.0" lazy_static = "1.5.0"
regex = { version = "1.10.6", default-features = false, features = ["std", "perf", "unicode-case"] } regex = { version = "1.10.6", default-features = false, features = ["std", "perf", "unicode-case", "unicode-perl"] }
urlencoding = "2.1.3" urlencoding = "2.1.3"

View file

@ -54,6 +54,7 @@ impl Rules {
#[derive(Debug)] #[derive(Debug)]
pub struct Configuration { pub struct Configuration {
pub application_id: String,
pub base_icons_url: String, pub base_icons_url: String,
pub state: Option<String>, pub state: Option<String>,
@ -92,6 +93,7 @@ macro_rules! set_string {
impl Configuration { impl Configuration {
pub fn new() -> Self { pub fn new() -> Self {
Self { Self {
application_id: String::from("1263505205522337886"),
base_icons_url: String::from( base_icons_url: String::from(
"https://raw.githubusercontent.com/xhyrom/zed-discord-presence/main/assets/icons/", "https://raw.githubusercontent.com/xhyrom/zed-discord-presence/main/assets/icons/",
), ),
@ -108,6 +110,7 @@ impl Configuration {
pub fn set(&mut self, initialization_options: Option<Value>) { pub fn set(&mut self, initialization_options: Option<Value>) {
if let Some(options) = initialization_options { if let Some(options) = initialization_options {
set_string!(self, options, application_id, "application_id");
set_string!(self, options, base_icons_url, "base_icons_url"); set_string!(self, options, base_icons_url, "base_icons_url");
set_option!(self, options, state, "state"); set_option!(self, options, state, "state");
set_option!(self, options, details, "details"); set_option!(self, options, details, "details");

View file

@ -31,25 +31,30 @@ use crate::util;
#[derive(Debug)] #[derive(Debug)]
pub struct Discord { pub struct Discord {
client: Mutex<DiscordIpcClient>, client: Option<Mutex<DiscordIpcClient>>,
start_timestamp: Duration, start_timestamp: Duration,
} }
impl Discord { impl Discord {
pub fn new() -> Self { pub fn new() -> Self {
let discord_client = DiscordIpcClient::new("1263505205522337886")
.expect("Failed to initialize Discord Ipc Client");
let start_timestamp = SystemTime::now(); let start_timestamp = SystemTime::now();
let since_epoch = start_timestamp let since_epoch = start_timestamp
.duration_since(UNIX_EPOCH) .duration_since(UNIX_EPOCH)
.expect("Failed to get duration since UNIX_EPOCH"); .expect("Failed to get duration since UNIX_EPOCH");
Self { Self {
client: Mutex::new(discord_client), client: None,
start_timestamp: since_epoch, start_timestamp: since_epoch,
} }
} }
pub fn create_client(&mut self, application_id: String) {
let discord_client = DiscordIpcClient::new(application_id.as_str())
.expect("Failed to initialize Discord Ipc Client");
self.client = Some(Mutex::new(discord_client));
}
pub fn connect(&self) { pub fn connect(&self) {
let mut client = self.get_client(); let mut client = self.get_client();
let result = client.connect(); let result = client.connect();
@ -62,8 +67,12 @@ impl Discord {
result.unwrap(); result.unwrap();
} }
pub fn get_client(&self) -> MutexGuard<DiscordIpcClient> { pub fn get_client(&self) -> MutexGuard<'_, DiscordIpcClient> {
return self.client.lock().expect("Failed to lock discord client"); self.client
.as_ref()
.expect("Discord client not initialized")
.lock()
.expect("Failed to lock discord client")
} }
#[allow(clippy::too_many_arguments)] #[allow(clippy::too_many_arguments)]

View file

@ -45,3 +45,17 @@ pub fn get_language(document: &Document) -> String {
String::from("text") String::from("text")
} }
#[cfg(test)]
mod tests {
use tower_lsp::lsp_types::Url;
use super::*;
#[test]
fn test_unicode_perl() {
let document = Document::new(Url::parse("file:///home/user/file.php").unwrap());
let lang = get_language(&document);
assert_eq!(lang, "php");
}
}

View file

@ -45,8 +45,8 @@ struct Document {
#[derive(Debug)] #[derive(Debug)]
struct Backend { struct Backend {
discord: discord::Discord,
client: Client, client: Client,
discord: Mutex<Discord>,
workspace_file_name: Mutex<String>, workspace_file_name: Mutex<String>,
git_remote_url: Mutex<Option<String>>, git_remote_url: Mutex<Option<String>>,
config: Mutex<Configuration>, config: Mutex<Configuration>,
@ -82,7 +82,7 @@ impl Backend {
fn new(client: Client) -> Self { fn new(client: Client) -> Self {
Self { Self {
client, client,
discord: Discord::new(), discord: Mutex::new(Discord::new()),
workspace_file_name: Mutex::new(String::new()), workspace_file_name: Mutex::new(String::new()),
git_remote_url: Mutex::new(None), git_remote_url: Mutex::new(None),
config: Mutex::new(Configuration::new()), config: Mutex::new(Configuration::new()),
@ -120,7 +120,7 @@ impl Backend {
.as_ref() .as_ref()
.map(|text| placeholders.replace(text)); .map(|text| placeholders.replace(text));
self.discord.change_activity( self.get_discord().change_activity(
state, state,
details, details,
large_image, large_image,
@ -154,6 +154,10 @@ impl Backend {
fn get_config(&self) -> MutexGuard<Configuration> { fn get_config(&self) -> MutexGuard<Configuration> {
return self.config.lock().expect("Failed to lock config"); return self.config.lock().expect("Failed to lock config");
} }
fn get_discord(&self) -> MutexGuard<Discord> {
return self.discord.lock().expect("Failed to lock discord");
}
} }
#[tower_lsp::async_trait] #[tower_lsp::async_trait]
@ -179,13 +183,16 @@ impl LanguageServer for Backend {
let mut config = self.config.lock().unwrap(); let mut config = self.config.lock().unwrap();
config.set(params.initialization_options); config.set(params.initialization_options);
let mut discord = self.get_discord();
discord.create_client(config.application_id.to_string());
if config.rules.suitable( if config.rules.suitable(
workspace_path workspace_path
.to_str() .to_str()
.expect("Failed to transform workspace path to str"), .expect("Failed to transform workspace path to str"),
) { ) {
// Connect discord client // Connect discord client
self.discord.connect(); discord.connect();
} else { } else {
// Exit LSP // Exit LSP
exit(0); exit(0);
@ -215,7 +222,7 @@ impl LanguageServer for Backend {
} }
async fn shutdown(&self) -> Result<()> { async fn shutdown(&self) -> Result<()> {
self.discord.kill(); self.get_discord().kill();
Ok(()) Ok(())
} }