Skip to main content

filthy_rich/types/
activity.rs

1use std::time::Duration;
2
3use serde_repr::{Deserialize_repr, Serialize_repr};
4
5use crate::types::payloads::{AssetsPayload, ButtonPayload};
6
7/// A complete Rich Presence activity which can be sent to [`crate::PresenceClient::set_activity`].
8#[derive(Default, Clone)]
9pub struct ActivitySpec {
10    pub(crate) name: Option<String>,
11    pub(crate) r#type: Option<ActivityType>,
12    pub(crate) instance: Option<bool>,
13    pub(crate) status_display_type: Option<StatusDisplayType>,
14    pub(crate) details: Option<String>,
15    pub(crate) details_url: Option<String>,
16    pub(crate) state: Option<String>,
17    pub(crate) state_url: Option<String>,
18    pub(crate) assets: Option<AssetsPayload>,
19    pub(crate) buttons: Option<Vec<ButtonPayload>>,
20    pub(crate) duration: Option<Duration>,
21}
22
23/// Enum indicating the activity type.
24///
25/// NOTE: Not all six types are implemented by the Discord client itself, so only the four active
26/// ones have been implemented in this enum.
27#[repr(u8)]
28#[derive(Clone, Debug, Eq, PartialEq, Serialize_repr, Deserialize_repr, Copy)]
29#[serde(into = "u8", try_from = "u8")]
30pub enum ActivityType {
31    Playing = 0,
32    Listening = 2,
33    Watching = 3,
34    Competing = 5,
35}
36
37impl From<ActivityType> for u8 {
38    fn from(value: ActivityType) -> Self {
39        value as u8
40    }
41}
42
43/// Enum indicating which mode to use for indicating the status of an activity.
44#[repr(u8)]
45#[derive(Clone, Debug, Eq, PartialEq, Copy, Serialize_repr, Deserialize_repr)]
46pub enum StatusDisplayType {
47    Name = 0,
48    State = 1,
49    Details = 2,
50}
51
52impl From<StatusDisplayType> for u8 {
53    fn from(value: StatusDisplayType) -> Self {
54        value as u8
55    }
56}