diff --git a/src/Discord.Net.Core/Audio/IAudioClient.cs b/src/Discord.Net.Core/Audio/IAudioClient.cs index 2fc52a529..1fc34b446 100644 --- a/src/Discord.Net.Core/Audio/IAudioClient.cs +++ b/src/Discord.Net.Core/Audio/IAudioClient.cs @@ -13,6 +13,7 @@ namespace Discord.Audio event Func StreamCreated; event Func StreamDestroyed; event Func SpeakingUpdated; + event Func ClientDisconnected; /// Gets the current connection state of this client. ConnectionState ConnectionState { get; } diff --git a/src/Discord.Net.WebSocket/API/Voice/ClientDisconnectEvent.cs b/src/Discord.Net.WebSocket/API/Voice/ClientDisconnectEvent.cs new file mode 100644 index 000000000..d7c1bb2d2 --- /dev/null +++ b/src/Discord.Net.WebSocket/API/Voice/ClientDisconnectEvent.cs @@ -0,0 +1,14 @@ +using Newtonsoft.Json; + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord.API.Voice; +internal class ClientDisconnectEvent +{ + [JsonProperty("user_id")] + public ulong UserId { get; set; } +} diff --git a/src/Discord.Net.WebSocket/Audio/AudioClient.Events.cs b/src/Discord.Net.WebSocket/Audio/AudioClient.Events.cs index b3e438a01..ea8d2d2a5 100644 --- a/src/Discord.Net.WebSocket/Audio/AudioClient.Events.cs +++ b/src/Discord.Net.WebSocket/Audio/AudioClient.Events.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Threading.Tasks; namespace Discord.Audio @@ -47,5 +47,11 @@ namespace Discord.Audio remove { _speakingUpdatedEvent.Remove(value); } } private readonly AsyncEvent> _speakingUpdatedEvent = new AsyncEvent>(); + public event Func ClientDisconnected + { + add { _clientDisconnectedEvent.Add(value); } + remove { _clientDisconnectedEvent.Remove(value); } + } + private readonly AsyncEvent> _clientDisconnectedEvent = new AsyncEvent>(); } } diff --git a/src/Discord.Net.WebSocket/Audio/AudioClient.cs b/src/Discord.Net.WebSocket/Audio/AudioClient.cs index 3549fb106..78780577c 100644 --- a/src/Discord.Net.WebSocket/Audio/AudioClient.cs +++ b/src/Discord.Net.WebSocket/Audio/AudioClient.cs @@ -11,7 +11,7 @@ using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; -using System.Collections.Generic; +using System.Collections.Generic; namespace Discord.Audio { @@ -279,6 +279,15 @@ namespace Discord.Audio await _speakingUpdatedEvent.InvokeAsync(data.UserId, data.Speaking); } break; + case VoiceOpCode.ClientDisconnect: + { + await _audioLogger.DebugAsync("Received ClientDisconnect").ConfigureAwait(false); + + var data = (payload as JToken).ToObject(_serializer); + + await _clientDisconnectedEvent.InvokeAsync(data.UserId); + } + break; default: await _audioLogger.WarningAsync($"Unknown OpCode ({opCode})").ConfigureAwait(false); return;