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)
{