use serde::Deserialize;
#[derive(Debug, Clone, Deserialize)]
pub struct VoiceStateUpdate {
pub user_id: String,
pub session_id: String,
}
#[derive(Debug, Clone, Deserialize)]
pub struct VoiceServerUpdate {
pub guild_id: Option<String>,
pub channel_id: Option<String>,
pub endpoint: String,
pub token: String,
}
#[derive(Debug, Clone, Deserialize)]
pub struct StreamCreate {
pub stream_key: String,
pub rtc_server_id: String,
}
#[derive(Debug, Clone, Deserialize)]
pub struct StreamServerUpdate {
pub stream_key: String,
pub endpoint: String,
pub token: String,
}
#[derive(Debug, Clone)]
pub enum GatewayEvent {
VoiceStateUpdate(VoiceStateUpdate),
VoiceServerUpdate(VoiceServerUpdate),
StreamCreate(StreamCreate),
StreamServerUpdate(StreamServerUpdate),
Unknown(String),
}
impl GatewayEvent {
pub fn from_dispatch(
event_name: &str,
data: serde_json::Value,
) -> Self {
match event_name {
"VOICE_STATE_UPDATE" => {
if let Ok(v) = serde_json::from_value(data) {
return Self::VoiceStateUpdate(v);
}
}
"VOICE_SERVER_UPDATE" => {
if let Ok(v) = serde_json::from_value(data) {
return Self::VoiceServerUpdate(v);
}
}
"STREAM_CREATE" => {
if let Ok(v) = serde_json::from_value(data) {
return Self::StreamCreate(v);
}
}
"STREAM_SERVER_UPDATE" => {
if let Ok(v) = serde_json::from_value(data) {
return Self::StreamServerUpdate(v);
}
}
_ => {}
}
Self::Unknown(event_name.to_owned())
}
}