use std::fmt::{Display, Formatter, Result as FmtResult};
use serde_json::Error as JsonError;
use serde_repr::{Deserialize_repr, Serialize_repr};
use crate::gateway::{Opcodes, SendablePacket, SendPacket};
#[derive(Deserialize, Serialize, Debug, Clone, Default)]
pub struct Activity {
pub name: String,
#[serde(rename = "type")]
pub kind: ActivityType,
#[serde(default)]
pub url: String,
#[serde(default)]
pub timestamps: ActivityTimestamps,
pub application_id: String,
pub details: Option<String>,
pub state: Option<String>,
#[serde(default)]
pub party: ActivityParty,
#[serde(default)]
pub assets: ActivityAssets,
#[serde(default)]
pub secrets: ActivitySecrets,
#[serde(default)]
pub instance: bool,
#[serde(default)]
pub flags: i32
}
impl Activity {
pub fn new(kind: ActivityType, name: &str, url: &str) -> Self {
Activity {
name: name.to_string(),
kind,
url: url.to_string(),
timestamps: ActivityTimestamps::default(),
application_id: String::new(),
details: None,
state: None,
party: ActivityParty::default(),
assets: ActivityAssets::default(),
secrets: ActivitySecrets::default(),
instance: false,
flags: i32::default()
}
}
}
#[derive(Deserialize, Serialize, Debug, Clone, Default)]
pub struct ClientActivity {
pub name: String,
#[serde(rename = "type")]
pub kind: ActivityType,
pub url: Option<String>,
}
impl ClientActivity {
pub fn game(name: &str) -> Self {
Self {
name: name.to_string(),
kind: ActivityType::Game,
url: None
}
}
pub fn streaming(name: &str, url: &str) -> Self {
Self {
name: name.to_string(),
kind: ActivityType::Streaming,
url: Some(url.to_string())
}
}
pub fn listening(name: &str) -> Self {
Self {
name: name.to_string(),
kind: ActivityType::Listening,
url: None
}
}
}
#[derive(Deserialize, Serialize, Debug, Clone, Default)]
pub struct ClientPresence {
pub since: Option<i32>,
pub game: Option<ClientActivity>,
pub status: String,
pub afk: bool
}
#[derive(Deserialize, Serialize, Debug, Clone, Default)]
pub struct ActivityTimestamps {
pub start: i32,
pub end: i32
}
#[derive(Deserialize, Serialize, Debug, Clone, Default)]
pub struct ActivityParty {
#[serde(default)]
pub id: String,
#[serde(default)]
pub size: [i32; 2]
}
#[derive(Deserialize, Serialize, Debug, Clone, Default)]
pub struct ActivityAssets {
#[serde(default)]
pub large_image: String,
#[serde(default)]
pub large_text: String,
#[serde(default)]
pub small_image: String,
#[serde(default)]
pub small_text: String
}
#[derive(Deserialize, Serialize, Debug, Clone, Default)]
pub struct ActivitySecrets {
#[serde(default)]
pub join: String,
#[serde(default)]
pub spectate: String,
#[serde(rename = "match", default)]
pub match_type: String
}
#[derive(Deserialize, Serialize, Debug, Clone, Default)]
pub struct Presence {
pub since: Option<i32>,
pub game: Option<Activity>,
pub status: String,
pub afk: bool
}
impl SendablePacket for ClientPresence {
fn to_json(self) -> Result<String, JsonError> {
serde_json::to_string(&SendPacket {
op: Opcodes::StatusUpdate,
d: self
})
}
}
#[derive(Deserialize_repr, Serialize_repr, Debug, Clone)]
#[repr(u8)]
pub enum ActivityType {
Game,
Streaming,
Listening
}
impl Default for ActivityType {
fn default() -> Self {
ActivityType::Game
}
}
#[derive(Deserialize, Serialize, Debug, Clone)]
pub enum Status {
Online,
DnD,
Idle,
Invisible,
Offline
}
impl Display for Status {
fn fmt(&self, f: &mut Formatter) -> FmtResult {
match self {
Status::Online => write!(f, "online"),
Status::DnD => write!(f, "dnd"),
Status::Idle => write!(f, "idle"),
Status::Invisible => write!(f, "invisible"),
Status::Offline => write!(f, "offline")
}
}
}