vionya / discord-rich-presence

A cross-platform Discord Rich Presence library written in Rust
MIT License
89 stars 16 forks source link

Rich presence automatically disappears after a minute #30

Closed Atsukoro1 closed 3 months ago

Atsukoro1 commented 5 months ago

So I ran into a problem with discord-rich-presence on a Windows machine, it connects successfully and displays the rich presence as it should but after a minute, it eventually disappears.

use std::sync::Mutex;

use crate::commands::configuration::schema::Configuration;
use crate::schema::user_location::UserLocationContent;
use crate::utils::replacer::replace_magic_string;
use discord_presence::{Client, Event};
use lazy_static::lazy_static;

pub static DISCORD_CLIENT_ID: u64 = 1202945591739420702;

lazy_static! {
    pub static ref DISCORD_CLIENT: Mutex<DiscordIpcClient> = Mutex::new(DiscordIpcClient::new());
}

pub struct DiscordIpcClient {
    pub client: Client,
    pub configuration: Option<Configuration>,
    pub data: Option<UserLocationContent>,
}

impl DiscordIpcClient {
    pub fn new() -> Self {
        let mut drpc_client = Client::new(DISCORD_CLIENT_ID);

        drpc_client.start();
        match drpc_client.block_until_event(Event::Ready) {
            Ok(_) => println!("Discord RPC client ready"),
            Err(e) => println!("Error starting discord RPC client: {}", e),
        }

        Self {
            client: drpc_client,
            configuration: Some(Configuration {
                title: "VRCHAT".to_string(),
                description: "{{user.display_name}} is playing rest & sleep".to_string(),
                show_timestamp: true,
                show_player_status: true,
                small_image_key: "This is a small image key".to_string(),
                large_image_key: "This is a large image key".to_string(),
            }),
            data: None,
        }
    }

    pub fn set_activity(&mut self) {
        let config = self.configuration.clone().unwrap();
        let data = self.data.clone().unwrap();

        match self.client.set_activity(|a| {
            a.state(replace_magic_string(config.title, &data))
                .details(replace_magic_string(config.description, &data))
                .assets(|assets| {
                    assets
                        .large_image(data.world.unwrap().image_url.unwrap_or("vrchat".to_string()))
                        .large_text("VRChat")
                        .small_image("vrchat")
                        .small_text("VRChat")
                })
        }) {
            Ok(_) => println!("Discord presence updated"),
            Err(e) => println!("Error updating discord presence: {}", e),
        }
    }

    pub fn set_configuration(&mut self, configuration: Configuration) {
        self.configuration = Some(configuration);
    }

    pub fn set_data(&mut self, data: UserLocationContent) {
        self.data = Some(data);
    }
}
Bowarc commented 5 months ago

Does your program exits ?

Atsukoro1 commented 5 months ago

No, it is a tauri app so the Discord IPC client it starts on the main thread and is blocked waiting for tauri app to exit

vionya commented 3 months ago

hi, the provided code is not using this library