|
@@ -17,6 +17,16 @@ namespace Discord.Net.WebSockets |
|
|
{ |
|
|
{ |
|
|
internal partial class VoiceWebSocket : WebSocket |
|
|
internal partial class VoiceWebSocket : WebSocket |
|
|
{ |
|
|
{ |
|
|
|
|
|
public enum OpCodes : byte |
|
|
|
|
|
{ |
|
|
|
|
|
Identify = 0, |
|
|
|
|
|
SelectProtocol = 1, |
|
|
|
|
|
Ready = 2, |
|
|
|
|
|
Heartbeat = 3, |
|
|
|
|
|
SessionDescription = 4, |
|
|
|
|
|
Speaking = 5 |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
private const int MaxOpusSize = 4000; |
|
|
private const int MaxOpusSize = 4000; |
|
|
private const string EncryptedMode = "xsalsa20_poly1305"; |
|
|
private const string EncryptedMode = "xsalsa20_poly1305"; |
|
|
private const string UnencryptedMode = "plain"; |
|
|
private const string UnencryptedMode = "plain"; |
|
@@ -437,9 +447,10 @@ namespace Discord.Net.WebSockets |
|
|
{ |
|
|
{ |
|
|
await base.ProcessMessage(json).ConfigureAwait(false); |
|
|
await base.ProcessMessage(json).ConfigureAwait(false); |
|
|
var msg = JsonConvert.DeserializeObject<WebSocketMessage>(json); |
|
|
var msg = JsonConvert.DeserializeObject<WebSocketMessage>(json); |
|
|
switch (msg.Operation) |
|
|
|
|
|
|
|
|
var opCode = (OpCodes)msg.Operation; |
|
|
|
|
|
switch (opCode) |
|
|
{ |
|
|
{ |
|
|
case 2: //READY |
|
|
|
|
|
|
|
|
case OpCodes.Ready: |
|
|
{ |
|
|
{ |
|
|
if (_state != (int)WebSocketState.Connected) |
|
|
if (_state != (int)WebSocketState.Connected) |
|
|
{ |
|
|
{ |
|
@@ -476,7 +487,7 @@ namespace Discord.Net.WebSockets |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
break; |
|
|
break; |
|
|
case 3: //PONG |
|
|
|
|
|
|
|
|
case OpCodes.Heartbeat: |
|
|
{ |
|
|
{ |
|
|
long time = EpochTime.GetMilliseconds(); |
|
|
long time = EpochTime.GetMilliseconds(); |
|
|
var payload = (long)msg.Payload; |
|
|
var payload = (long)msg.Payload; |
|
@@ -484,7 +495,7 @@ namespace Discord.Net.WebSockets |
|
|
//TODO: Use this to estimate latency |
|
|
//TODO: Use this to estimate latency |
|
|
} |
|
|
} |
|
|
break; |
|
|
break; |
|
|
case 4: //SESSION_DESCRIPTION |
|
|
|
|
|
|
|
|
case OpCodes.SessionDescription: |
|
|
{ |
|
|
{ |
|
|
var payload = (msg.Payload as JToken).ToObject<JoinServerEvent>(_client.VoiceSocketSerializer); |
|
|
var payload = (msg.Payload as JToken).ToObject<JoinServerEvent>(_client.VoiceSocketSerializer); |
|
|
_secretKey = payload.SecretKey; |
|
|
_secretKey = payload.SecretKey; |
|
@@ -492,7 +503,7 @@ namespace Discord.Net.WebSockets |
|
|
EndConnect(); |
|
|
EndConnect(); |
|
|
} |
|
|
} |
|
|
break; |
|
|
break; |
|
|
case 5: |
|
|
|
|
|
|
|
|
case OpCodes.Speaking: |
|
|
{ |
|
|
{ |
|
|
var payload = (msg.Payload as JToken).ToObject<IsTalkingEvent>(_client.VoiceSocketSerializer); |
|
|
var payload = (msg.Payload as JToken).ToObject<IsTalkingEvent>(_client.VoiceSocketSerializer); |
|
|
RaiseIsSpeaking(payload.UserId, payload.IsSpeaking); |
|
|
RaiseIsSpeaking(payload.UserId, payload.IsSpeaking); |
|
@@ -500,7 +511,7 @@ namespace Discord.Net.WebSockets |
|
|
break; |
|
|
break; |
|
|
default: |
|
|
default: |
|
|
if (_logLevel >= LogMessageSeverity.Warning) |
|
|
if (_logLevel >= LogMessageSeverity.Warning) |
|
|
RaiseOnLog(LogMessageSeverity.Warning, $"Unknown Opcode: {msg.Operation}"); |
|
|
|
|
|
|
|
|
RaiseOnLog(LogMessageSeverity.Warning, $"Unknown Opcode: {opCode}"); |
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|