cord-nvim 2.0.0-beta.34

🚀 The most extensible Discord Rich Presence plugin for Neovim, powered by Rust.
use crate::messages::events::event::{EventContext, OnEvent};
use crate::presence::packet::Packet;
use crate::protocol::msgpack::Deserialize;

#[derive(Debug, Default)]
pub struct ClearActivityEvent {
    force: bool,
}

impl OnEvent for ClearActivityEvent {
    fn on_event(self, ctx: &mut EventContext) -> crate::Result<()> {
        if self.force {
            ctx.cord.rich_client.read().unwrap().clear()?;
        } else {
            let sessions = ctx.cord.session_manager.sessions.read().unwrap();
            let latest = sessions
                .iter()
                .filter(|s| {
                    s.0 != &ctx.client_id && s.1.last_activity.is_some()
                })
                .max_by_key(|s| {
                    (
                        s.1.last_activity.as_ref().is_some_and(|a| !a.is_idle),
                        s.1.last_updated,
                    )
                });

            if let Some((_, session)) = latest {
                let rich_client = ctx.cord.rich_client.read().unwrap();
                rich_client.update(&Packet::new(
                    rich_client.pid,
                    session.last_activity.as_ref(),
                ))?;
            } else {
                ctx.cord.rich_client.read().unwrap().clear()?;
            }
        }

        Ok(())
    }
}

impl Deserialize for ClearActivityEvent {
    fn deserialize(
        input: crate::protocol::msgpack::Value,
    ) -> crate::Result<Self> {
        let force = input.as_bool().unwrap_or_default();

        Ok(ClearActivityEvent { force })
    }
}