use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct PresenceUpdateApiType {
pub user: Value,
pub guild_id: String,
pub status: String,
pub activities: Vec<ActivityApiType>,
pub client_status: ClientStatusApiType,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct ActivityApiType {
pub name: String,
#[serde(rename = "type")]
pub type_: ActivityTypeApiType,
#[serde(skip_serializing_if = "Option::is_none")]
pub url: Option<String>,
pub created_at: u64,
#[serde(skip_serializing_if = "Option::is_none")]
pub timestamps: Option<ActivityTimestampsApiType>,
#[serde(skip_serializing_if = "Option::is_none")]
pub application_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status_display_type: Option<u8>,
#[serde(skip_serializing_if = "Option::is_none")]
pub details: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub details_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub state: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub state_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub emoji: Option<ActivityEmojiApiType>,
#[serde(skip_serializing_if = "Option::is_none")]
pub party: Option<ActivityPartyApiType>,
#[serde(skip_serializing_if = "Option::is_none")]
pub assets: Option<ActivityAssetsApiType>,
#[serde(skip_serializing_if = "Option::is_none")]
pub secrets: Option<ActivitySecretsApiType>,
#[serde(skip_serializing_if = "Option::is_none")]
pub instance: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub flags: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub buttons: Option<Vec<ActivityButtonApiType>>,
}
#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, Eq)]
#[repr(u8)]
#[serde(from = "u8", into = "u8")]
pub enum ActivityTypeApiType {
Playing = 0,
Streaming = 1,
Listening = 2,
Watching = 3,
Custom = 4,
Competing = 5,
}
impl From<u8> for ActivityTypeApiType {
fn from(value: u8) -> Self {
match value {
0 => ActivityTypeApiType::Playing,
1 => ActivityTypeApiType::Streaming,
2 => ActivityTypeApiType::Listening,
3 => ActivityTypeApiType::Watching,
4 => ActivityTypeApiType::Custom,
5 => ActivityTypeApiType::Competing,
_ => ActivityTypeApiType::Playing, }
}
}
impl From<ActivityTypeApiType> for u8 {
fn from(value: ActivityTypeApiType) -> Self {
value as u8
}
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct ActivityTimestampsApiType {
#[serde(skip_serializing_if = "Option::is_none")]
pub start: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub end: Option<u64>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct ActivityEmojiApiType {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub animated: Option<bool>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct ActivityPartyApiType {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub size: Option<[u32; 2]>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct ActivityAssetsApiType {
#[serde(skip_serializing_if = "Option::is_none")]
pub large_image: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub large_text: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub large_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub small_image: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub small_text: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub small_url: Option<String>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct ActivitySecretsApiType {
#[serde(skip_serializing_if = "Option::is_none")]
pub join: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub spectate: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", rename = "match")]
pub match_: Option<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[repr(u32)]
pub enum ActivityFlagsApiType {
Instance = 1 << 0,
Join = 1 << 1,
Spectate = 1 << 2,
JoinRequest = 1 << 3,
Sync = 1 << 4,
Play = 1 << 5,
PartyPrivacyFriends = 1 << 6,
PartyPrivacyVoiceChannel = 1 << 7,
Embedded = 1 << 8,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct ActivityButtonApiType {
pub label: String,
pub url: String,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct ClientStatusApiType {
#[serde(skip_serializing_if = "Option::is_none")]
pub desktop: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub mobile: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub web: Option<String>,
}