use crate::serde_for_bitflags;
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
#[cfg(feature = "utoipa")]
use utoipa::ToSchema;
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq, Hash, Deserialize, Serialize)]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
#[cfg_attr(feature = "bincode", derive(bincode::Encode, bincode::Decode))]
#[serde(rename_all = "snake_case")]
pub enum PresenceStatus {
#[default]
Online,
Idle,
Dnd,
Offline,
}
#[derive(Clone, Debug, Eq, PartialEq, Hash, Deserialize, Serialize)]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
#[cfg_attr(feature = "bincode", derive(bincode::Encode, bincode::Decode))]
pub struct Presence {
pub user_id: u64,
pub status: PresenceStatus,
pub custom_status: Option<String>,
#[cfg_attr(feature = "bincode", bincode(with_serde))]
pub devices: Devices,
#[cfg_attr(feature = "bincode", bincode(with_serde))]
pub online_since: Option<DateTime<Utc>>,
}
#[derive(Clone, Copy, Debug, Deserialize, Serialize)]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
#[cfg_attr(feature = "bincode", derive(bincode::Encode, bincode::Decode))]
#[serde(rename_all = "snake_case")]
pub enum Device {
Desktop,
Mobile,
Web,
}
bitflags::bitflags! {
#[derive(Default)]
pub struct Devices: u32 {
const DESKTOP = 1 << 0;
const MOBILE = 1 << 1;
const WEB = 1 << 2;
}
}
serde_for_bitflags!(u32: Devices);