use crate::intents::Intents;
use crate::models::Snowflake;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Hello {
pub heartbeat_interval: u64,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Identify {
pub token: String,
pub intents: u32,
pub shard: Option<[u32; 2]>,
pub properties: IdentifyProperties,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct IdentifyProperties {
#[serde(rename = "$os", default, skip_serializing_if = "String::is_empty")]
pub os: String,
#[serde(rename = "$browser", default, skip_serializing_if = "String::is_empty")]
pub browser: String,
#[serde(rename = "$device", default, skip_serializing_if = "String::is_empty")]
pub device: String,
}
impl Default for IdentifyProperties {
fn default() -> Self {
Self {
os: std::env::consts::OS.to_string(),
browser: "botrs".to_string(),
device: "botrs".to_string(),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct WSIdentityData {
pub token: String,
pub intents: u32,
pub shard: Vec<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub properties: Option<IdentifyProperties>,
}
impl From<Identify> for WSIdentityData {
fn from(identify: Identify) -> Self {
Self {
token: identify.token,
intents: identify.intents,
shard: identify.shard.map(Vec::from).unwrap_or_default(),
properties: Some(identify.properties),
}
}
}
impl From<WSIdentityData> for Identify {
fn from(data: WSIdentityData) -> Self {
Self {
token: data.token,
intents: data.intents,
shard: (data.shard.len() == 2).then(|| [data.shard[0], data.shard[1]]),
properties: data.properties.unwrap_or_default(),
}
}
}
impl WSIdentityData {
pub fn new(token: impl Into<String>, intents: Intents, shard: Option<[u32; 2]>) -> Self {
Self {
token: token.into(),
intents: intents.bits,
shard: shard.map(Vec::from).unwrap_or_default(),
properties: Some(IdentifyProperties::default()),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Resume {
pub token: String,
pub session_id: String,
pub seq: u64,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct WSResumeData {
pub token: String,
pub session_id: String,
pub seq: u32,
}
impl From<Resume> for WSResumeData {
fn from(resume: Resume) -> Self {
Self {
token: resume.token,
session_id: resume.session_id,
seq: resume.seq as u32,
}
}
}
impl From<WSResumeData> for Resume {
fn from(data: WSResumeData) -> Self {
Self {
token: data.token,
session_id: data.session_id,
seq: u64::from(data.seq),
}
}
}
pub type WSHelloData = Hello;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct WSUser {
pub id: Snowflake,
pub username: String,
#[serde(default)]
pub bot: bool,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Ready {
pub version: u32,
pub session_id: String,
pub user: crate::models::robot::Robot,
pub shard: Option<[u32; 2]>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct WSReadyData {
pub version: u32,
pub session_id: String,
pub user: WSUser,
pub shard: Vec<u32>,
}
impl From<Ready> for WSReadyData {
fn from(ready: Ready) -> Self {
Self {
version: ready.version,
session_id: ready.session_id,
user: WSUser {
id: ready.user.id,
username: ready.user.username,
bot: ready.user.bot,
},
shard: ready.shard.map(Vec::from).unwrap_or_default(),
}
}
}