use serde::{Deserialize, Serialize};
use serde_json::Value;
pub const VOICE_GATEWAY_VERSION: &str = "8";
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[repr(u8)]
pub enum VoiceOpcodes {
Identify = 0,
SelectProtocol = 1,
Ready = 2,
Heartbeat = 3,
SessionDescription = 4,
Speaking = 5,
HeartbeatAck = 6,
Resume = 7,
Hello = 8,
Resumed = 9,
ClientsConnect = 11,
ClientDisconnect = 13,
DavePrepareTransition = 21,
DaveExecuteTransition = 22,
DaveTransitionReady = 23,
DavePrepareEpoch = 24,
DaveMlsExternalSender = 25,
DaveMlsKeyPackage = 26,
DaveMlsProposals = 27,
DaveMlsCommitWelcome = 28,
DaveMlsAnnounceCommitTransition = 29,
DaveMlsWelcome = 30,
DaveMlsInvalidCommitWelcome = 31,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[repr(u16)]
pub enum VoiceCloseCodes {
UnknownOpcode = 4_001,
FailedToDecode = 4_002,
NotAuthenticated = 4_003,
AuthenticationFailed = 4_004,
AlreadyAuthenticated = 4_005,
SessionNoLongerValid = 4_006,
SessionTimeout = 4_009,
ServerNotFound = 4_011,
UnknownProtocol = 4_012,
Disconnected = 4_014,
VoiceServerCrashed = 4_015,
UnknownEncryptionMode = 4_016,
BadRequest = 4_020,
RateLimited = 4_021,
CallTerminated = 4_022,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum VoiceEncryptionMode {
#[serde(rename = "aead_aes256_gcm_rtpsize")]
AeadAes256GcmRtpSize,
#[serde(rename = "aead_xchacha20_poly1305_rtpsize")]
AeadXChaCha20Poly1305RtpSize,
#[serde(rename = "xsalsa20_poly1305_lite_rtpsize")]
XSalsa20Poly1305LiteRtpSize,
#[serde(rename = "aead_aes256_gcm")]
AeadAes256Gcm,
#[serde(rename = "xsalsa20_poly1305")]
XSalsa20Poly1305,
#[serde(rename = "xsalsa20_poly1305_suffix")]
XSalsa20Poly1305Suffix,
#[serde(rename = "xsalsa20_poly1305_lite")]
XSalsa20Poly1305Lite,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[repr(u8)]
pub enum VoiceSpeakingFlags {
Microphone = 1 << 0,
Soundshare = 1 << 1,
Priority = 1 << 2,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(untagged)]
pub enum VoiceSendPayload {
VoiceDaveMlsInvalidCommitWelcome(VoiceDaveMlsInvalidCommitWelcome),
VoiceDaveTransitionReady(VoiceDaveTransitionReady),
VoiceHeartbeat(VoiceHeartbeat),
VoiceIdentify(VoiceIdentify),
VoiceResume(VoiceResume),
VoiceSelectProtocol(VoiceSelectProtocol),
VoiceSpeakingSend(VoiceSpeakingSend),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(untagged)]
pub enum VoiceReceivePayload {
VoiceClientDisconnect(VoiceClientDisconnect),
VoiceClientsConnect(VoiceClientsConnect),
VoiceDaveExecuteTransition(VoiceDaveExecuteTransition),
VoiceDavePrepareEpochRecv(VoiceDavePrepareEpoch),
VoiceDavePrepareTransition(VoiceDavePrepareTransition),
VoiceHeartbeatAck(VoiceHeartbeatAck),
VoiceHello(VoiceHello),
VoiceReady(VoiceReady),
VoiceResumed(VoiceResumed),
VoiceSessionDescription(VoiceSessionDescription),
VoiceSpeaking(VoiceSpeaking),
}
pub type VoiceHello = _DataPayload<VoiceOpcodes, VoiceHelloData>;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct VoiceHelloData {
pub v: i64,
pub heartbeat_interval: i64,
}
pub type VoiceReady = _DataPayload<VoiceOpcodes, VoiceReadyData>;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct VoiceReadyData {
pub ssrc: i64,
pub ip: String,
pub port: i64,
pub modes: Vec<VoiceEncryptionMode>,
}
pub type VoiceHeartbeatAck = _DataPayload<VoiceOpcodes, VoiceHeartbeatAckData>;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct VoiceHeartbeatAckData {
pub t: i64,
}
pub type VoiceSessionDescription = _DataPayload<VoiceOpcodes, VoiceSessionDescriptionData>;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct VoiceSessionDescriptionData {
pub mode: VoiceEncryptionMode,
pub secret_key: Vec<i64>,
pub dave_protocol_version: i64,
}
pub type VoiceResumed = _DataPayload<VoiceOpcodes, ()>;
pub type VoiceSpeaking = _DataPayload<VoiceOpcodes, VoiceSpeakingData>;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct VoiceSpeakingData {
pub speaking: VoiceSpeakingFlags,
pub ssrc: i64,
pub user_id: String,
}
pub type VoiceClientsConnect = _DataPayload<VoiceOpcodes, VoiceClientsConnectData>;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct VoiceClientsConnectData {
pub user_ids: Vec<String>,
}
pub type VoiceClientDisconnect = _DataPayload<VoiceOpcodes, VoiceClientDisconnectData>;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct VoiceClientDisconnectData {
pub user_id: String,
}
pub type VoiceDavePrepareTransition = _DataPayload<VoiceOpcodes, VoiceDavePrepareTransitionData>;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct VoiceDavePrepareTransitionData {
pub protocol_version: i64,
pub transition_id: i64,
}
pub type VoiceDaveExecuteTransition = _DataPayload<VoiceOpcodes, VoiceDaveExecuteTransitionData>;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct VoiceDaveExecuteTransitionData {
pub transition_id: i64,
}
pub type VoiceDaveMlsExternalSender = VoiceBinaryPayload;
pub type VoiceDaveMlsProposals = VoiceBinaryPayload;
pub type VoiceDaveMlsAnnounceCommitTransition = VoiceBinaryPayload;
pub type VoiceDaveMlsWelcome = VoiceBinaryPayload;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct VoiceIdentify {
pub op: VoiceOpcodes,
pub d: VoiceIdentifyData,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct VoiceIdentifyData {
pub server_id: String,
pub user_id: String,
pub session_id: String,
pub token: String,
pub max_dave_protocol_version: Option<i64>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct VoiceHeartbeat {
pub op: VoiceOpcodes,
pub d: VoiceHeartbeatData,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct VoiceHeartbeatData {
pub t: i64,
pub seq_ack: i64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct VoiceSelectProtocol {
pub op: VoiceOpcodes,
pub d: VoiceSelectProtocolData,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct VoiceSelectProtocolData {
pub protocol: String,
pub data: VoiceUDPProtocolData,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct VoiceUDPProtocolData {
pub address: String,
pub port: i64,
pub mode: VoiceEncryptionMode,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct VoiceResume {
pub op: VoiceOpcodes,
pub d: VoiceResumeData,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct VoiceResumeData {
pub server_id: String,
pub session_id: String,
pub token: String,
pub seq_ack: i64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct VoiceSpeakingSend {
pub op: VoiceOpcodes,
pub d: VoiceSpeakingSendData,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct VoiceSpeakingSendData {
pub speaking: VoiceSpeakingFlags,
pub delay: i64,
pub ssrc: i64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct VoiceDaveTransitionReady {
pub op: VoiceOpcodes,
pub d: VoiceDaveTransitionReadyData,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct VoiceDaveTransitionReadyData {
pub transition_id: i64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct VoiceDavePrepareEpoch {
pub op: VoiceOpcodes,
pub d: VoiceDavePrepareEpochData,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct VoiceDavePrepareEpochData {
pub protocol_version: i64,
pub epoch: i64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct VoiceDaveMlsInvalidCommitWelcome {
pub op: VoiceOpcodes,
pub d: VoiceDaveMlsInvalidCommitWelcomeData,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct VoiceDaveMlsInvalidCommitWelcomeData {
pub transition_id: i64,
}
pub type VoiceDaveMlsKeyPackage = VoiceBinaryPayload;
pub type VoiceDaveMlsCommitWelcome = VoiceBinaryPayload;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct _BasePayload {
pub op: VoiceOpcodes,
pub d: Option<Value>,
pub seq: Option<i64>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct _DataPayload<Op, D> {
pub op: Op,
pub d: D,
#[serde(skip_serializing_if = "Option::is_none")]
pub seq: Option<i64>,
}
pub type VoiceBinaryPayload = Vec<u8>;