1use tokio::sync::{mpsc::Sender, oneshot};
2
3use crate::{
4 errors::PresenceClientError,
5 str,
6 types::{ActivitySpec, IPCCommand},
7};
8
9pub type RPCClient = PresenceClient;
11
12#[derive(Debug, Clone)]
14pub struct PresenceClient {
15 pub(crate) tx: Sender<IPCCommand>,
16 pub(crate) client_id: String,
17}
18
19impl PresenceClient {
20 str!(client_id, "Returns the client ID.");
21
22 pub async fn set_activity(&self, activity: ActivitySpec) -> Result<(), PresenceClientError> {
27 let activity = Box::new(activity);
28
29 self.tx
30 .send(IPCCommand::SetActivity { activity })
31 .await
32 .map_err(|_| PresenceClientError::ActivitySendError)?;
33
34 Ok(())
35 }
36
37 pub async fn clear_activity(&self) -> Result<(), PresenceClientError> {
41 self.tx
42 .send(IPCCommand::ClearActivity)
43 .await
44 .map_err(|_| PresenceClientError::ActivitySendError)?;
45
46 Ok(())
47 }
48
49 pub async fn close(&self) -> Result<(), PresenceClientError> {
53 let (done_tx, done_rx) = oneshot::channel::<()>();
54
55 match self.tx.send(IPCCommand::Close { done_tx }).await {
56 Ok(_) => done_rx.await?,
57 Err(_) => return Ok(()),
58 }
59
60 Ok(())
61 }
62}