diff --git a/src/Discord.Net.Core/Entities/Channels/IAudioChannel.cs b/src/Discord.Net.Core/Entities/Channels/IAudioChannel.cs index 6295a6829..e6642d8b0 100644 --- a/src/Discord.Net.Core/Entities/Channels/IAudioChannel.cs +++ b/src/Discord.Net.Core/Entities/Channels/IAudioChannel.cs @@ -12,6 +12,9 @@ namespace Discord /// /// Connects to this audio channel. /// - Task ConnectAsync(Action configAction = null); + Task ConnectAsync(bool selfDeaf = false, bool selfMute = false, bool external = false); + + /// Disconnects from this audio channel. + Task DisconnectAsync(); } } diff --git a/src/Discord.Net.Rest/Entities/Channels/RestGroupChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestGroupChannel.cs index 2f14dc94f..1288a8ee8 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestGroupChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestGroupChannel.cs @@ -187,8 +187,8 @@ namespace Discord.Rest //IAudioChannel /// /// Connecting to a group channel is not supported. - Task IAudioChannel.ConnectAsync(Action configAction) => - throw new NotSupportedException(); + Task IAudioChannel.ConnectAsync(bool selfDeaf, bool selfMute, bool external) { throw new NotSupportedException(); } + Task IAudioChannel.DisconnectAsync() { throw new NotSupportedException(); } //IChannel Task IChannel.GetUserAsync(ulong id, CacheMode mode, RequestOptions options) diff --git a/src/Discord.Net.Rest/Entities/Channels/RestVoiceChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestVoiceChannel.cs index 07da22235..f54013950 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestVoiceChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestVoiceChannel.cs @@ -54,7 +54,8 @@ namespace Discord.Rest //IAudioChannel /// /// Connecting to a REST-based channel is not supported. - Task IAudioChannel.ConnectAsync(Action configAction) => throw new NotSupportedException(); + Task IAudioChannel.ConnectAsync(bool selfDeaf, bool selfMute, bool external) { throw new NotSupportedException(); } + Task IAudioChannel.DisconnectAsync() { throw new NotSupportedException(); } //IGuildChannel /// diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketGroupChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketGroupChannel.cs index 5eb2a6e12..df1dda55d 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketGroupChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketGroupChannel.cs @@ -256,8 +256,8 @@ namespace Discord.WebSocket //IAudioChannel /// /// Connecting to a group channel is not supported. - Task IAudioChannel.ConnectAsync(Action configAction) => - throw new NotSupportedException(); + Task IAudioChannel.ConnectAsync(bool selfDeaf, bool selfMute, bool external) { throw new NotSupportedException(); } + Task IAudioChannel.DisconnectAsync() { throw new NotSupportedException(); } //IChannel /// diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketVoiceChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketVoiceChannel.cs index ee932e0cd..10bdfdb56 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketVoiceChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketVoiceChannel.cs @@ -51,11 +51,14 @@ namespace Discord.WebSocket => ChannelHelper.ModifyAsync(this, Discord, func, options); /// - public async Task ConnectAsync(Action configAction = null) + public async Task ConnectAsync(bool selfDeaf, bool selfMute, bool external) { - return await Guild.ConnectAudioAsync(Id, false, false, configAction).ConfigureAwait(false); + return await Guild.ConnectAudioAsync(Id, selfDeaf, selfMute, external).ConfigureAwait(false); } + public async Task DisconnectAsync() + => await Guild.DisconnectAudioAsync(); + /// public override SocketGuildUser GetUser(ulong id) { diff --git a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs index 81106ec48..689ce145b 100644 --- a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs +++ b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs @@ -734,11 +734,8 @@ namespace Discord.WebSocket { return _audioClient?.GetInputStream(userId); } - internal async Task ConnectAudioAsync(ulong channelId, bool selfDeaf, bool selfMute, Action configAction) + internal async Task ConnectAudioAsync(ulong channelId, bool selfDeaf, bool selfMute, bool external) { - selfDeaf = false; - selfMute = false; - TaskCompletionSource promise; await _audioLock.WaitAsync().ConfigureAwait(false); @@ -748,6 +745,13 @@ namespace Discord.WebSocket promise = new TaskCompletionSource(); _audioConnectPromise = promise; + if (external) + { + var _ = promise.TrySetResultAsync(null); + await Discord.ApiClient.SendVoiceStateUpdateAsync(Id, channelId, selfDeaf, selfMute).ConfigureAwait(false); + return null; + } + if (_audioClient == null) { var audioClient = new AudioClient(this, Discord.GetAudioId(), channelId); @@ -755,7 +759,9 @@ namespace Discord.WebSocket { if (!promise.Task.IsCompleted) { - try { audioClient.Dispose(); } catch { } + try + { audioClient.Dispose(); } + catch { } _audioClient = null; if (ex != null) await promise.TrySetExceptionAsync(ex); @@ -769,7 +775,6 @@ namespace Discord.WebSocket var _ = promise.TrySetResultAsync(_audioClient); return Task.Delay(0); }; - configAction?.Invoke(audioClient); _audioClient = audioClient; } @@ -828,8 +833,11 @@ namespace Discord.WebSocket await _audioLock.WaitAsync().ConfigureAwait(false); try { - await RepopulateAudioStreamsAsync().ConfigureAwait(false); - await _audioClient.StartAsync(url, Discord.CurrentUser.Id, voiceState.VoiceSessionId, token).ConfigureAwait(false); + if (_audioClient != null) + { + await RepopulateAudioStreamsAsync().ConfigureAwait(false); + await _audioClient.StartAsync(url, Discord.CurrentUser.Id, voiceState.VoiceSessionId, token).ConfigureAwait(false); + } } catch (OperationCanceledException) {