From 7159600d7d5872e3acb9f629a50726f2f5c87aea Mon Sep 17 00:00:00 2001 From: Finite Reality Date: Sun, 31 Jul 2016 15:09:17 +0100 Subject: [PATCH 1/3] Finish SocketVoiceChannel.ConnectAsync --- .../WebSocket/Entities/Channels/SocketVoiceChannel.cs | 5 +++-- src/Discord.Net/WebSocket/Entities/Guilds/SocketGuild.cs | 4 +++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/Discord.Net/WebSocket/Entities/Channels/SocketVoiceChannel.cs b/src/Discord.Net/WebSocket/Entities/Channels/SocketVoiceChannel.cs index b13cc04cc..b448980b0 100644 --- a/src/Discord.Net/WebSocket/Entities/Channels/SocketVoiceChannel.cs +++ b/src/Discord.Net/WebSocket/Entities/Channels/SocketVoiceChannel.cs @@ -45,8 +45,9 @@ namespace Discord await Discord.ApiClient.SendVoiceStateUpdateAsync(Guild.Id, Id, (audioMode & AudioMode.Incoming) == 0, (audioMode & AudioMode.Outgoing) == 0).ConfigureAwait(false); - return null; - //TODO: Block and return + + await Guild.AudioPromise.ConfigureAwait(false); + return Guild.AudioClient; } public SocketVoiceChannel Clone() => MemberwiseClone() as SocketVoiceChannel; diff --git a/src/Discord.Net/WebSocket/Entities/Guilds/SocketGuild.cs b/src/Discord.Net/WebSocket/Entities/Guilds/SocketGuild.cs index 03fff4d98..378707108 100644 --- a/src/Discord.Net/WebSocket/Entities/Guilds/SocketGuild.cs +++ b/src/Discord.Net/WebSocket/Entities/Guilds/SocketGuild.cs @@ -24,7 +24,7 @@ namespace Discord internal override bool IsAttached => true; private readonly SemaphoreSlim _audioLock; - private TaskCompletionSource _syncPromise, _downloaderPromise; + private TaskCompletionSource _syncPromise, _downloaderPromise, _audioPromise; private ConcurrentHashSet _channels; private ConcurrentDictionary _members; private ConcurrentDictionary _voiceStates; @@ -39,6 +39,7 @@ namespace Discord public bool IsSynced => _syncPromise.Task.IsCompleted; public Task SyncPromise => _syncPromise.Task; public Task DownloaderPromise => _downloaderPromise.Task; + public Task AudioPromise => _audioPromise.Task; public new DiscordSocketClient Discord => base.Discord as DiscordSocketClient; public SocketGuildUser CurrentUser => GetUser(Discord.CurrentUser.Id); @@ -307,6 +308,7 @@ namespace Discord _audioLock.Release(); } await audioClient.ConnectAsync(url, CurrentUser.Id, voiceState.VoiceSessionId, token).ConfigureAwait(false); + _audioPromise.TrySetResult(true); } public SocketGuild Clone() => MemberwiseClone() as SocketGuild; From 1d5ae33e0e191c4c54e791d33d5fdbf9a7e94fce Mon Sep 17 00:00:00 2001 From: Finite Reality Date: Sun, 31 Jul 2016 15:16:35 +0100 Subject: [PATCH 2/3] Rename promise to make more sense --- .../WebSocket/Entities/Channels/SocketVoiceChannel.cs | 2 +- src/Discord.Net/WebSocket/Entities/Guilds/SocketGuild.cs | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Discord.Net/WebSocket/Entities/Channels/SocketVoiceChannel.cs b/src/Discord.Net/WebSocket/Entities/Channels/SocketVoiceChannel.cs index b448980b0..d5be011e9 100644 --- a/src/Discord.Net/WebSocket/Entities/Channels/SocketVoiceChannel.cs +++ b/src/Discord.Net/WebSocket/Entities/Channels/SocketVoiceChannel.cs @@ -46,7 +46,7 @@ namespace Discord (audioMode & AudioMode.Incoming) == 0, (audioMode & AudioMode.Outgoing) == 0).ConfigureAwait(false); - await Guild.AudioPromise.ConfigureAwait(false); + await Guild.AudioConnectPromise.ConfigureAwait(false); return Guild.AudioClient; } diff --git a/src/Discord.Net/WebSocket/Entities/Guilds/SocketGuild.cs b/src/Discord.Net/WebSocket/Entities/Guilds/SocketGuild.cs index 378707108..3ead0d6a5 100644 --- a/src/Discord.Net/WebSocket/Entities/Guilds/SocketGuild.cs +++ b/src/Discord.Net/WebSocket/Entities/Guilds/SocketGuild.cs @@ -24,7 +24,7 @@ namespace Discord internal override bool IsAttached => true; private readonly SemaphoreSlim _audioLock; - private TaskCompletionSource _syncPromise, _downloaderPromise, _audioPromise; + private TaskCompletionSource _syncPromise, _downloaderPromise, _audioConnectPromise; private ConcurrentHashSet _channels; private ConcurrentDictionary _members; private ConcurrentDictionary _voiceStates; @@ -39,7 +39,7 @@ namespace Discord public bool IsSynced => _syncPromise.Task.IsCompleted; public Task SyncPromise => _syncPromise.Task; public Task DownloaderPromise => _downloaderPromise.Task; - public Task AudioPromise => _audioPromise.Task; + public Task AudioConnectPromise => _audioConnectPromise.Task; public new DiscordSocketClient Discord => base.Discord as DiscordSocketClient; public SocketGuildUser CurrentUser => GetUser(Discord.CurrentUser.Id); @@ -308,7 +308,7 @@ namespace Discord _audioLock.Release(); } await audioClient.ConnectAsync(url, CurrentUser.Id, voiceState.VoiceSessionId, token).ConfigureAwait(false); - _audioPromise.TrySetResult(true); + _audioConnectPromise.TrySetResult(true); } public SocketGuild Clone() => MemberwiseClone() as SocketGuild; From c3dc8cd15a311ab52546599ed439701560916b6c Mon Sep 17 00:00:00 2001 From: Finite Reality Date: Sun, 31 Jul 2016 18:53:04 +0100 Subject: [PATCH 3/3] Use async methods and feed exceptions to promise --- .../WebSocket/Entities/Guilds/SocketGuild.cs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/Discord.Net/WebSocket/Entities/Guilds/SocketGuild.cs b/src/Discord.Net/WebSocket/Entities/Guilds/SocketGuild.cs index 3ead0d6a5..e1ed18261 100644 --- a/src/Discord.Net/WebSocket/Entities/Guilds/SocketGuild.cs +++ b/src/Discord.Net/WebSocket/Entities/Guilds/SocketGuild.cs @@ -307,8 +307,16 @@ namespace Discord { _audioLock.Release(); } - await audioClient.ConnectAsync(url, CurrentUser.Id, voiceState.VoiceSessionId, token).ConfigureAwait(false); - _audioConnectPromise.TrySetResult(true); + + try + { + await audioClient.ConnectAsync(url, CurrentUser.Id, voiceState.VoiceSessionId, token).ConfigureAwait(false); + await _audioConnectPromise.TrySetResultAsync(true).ConfigureAwait(false); + } + catch(Exception e) + { + await _audioConnectPromise.SetExceptionAsync(e).ConfigureAwait(false); + } } public SocketGuild Clone() => MemberwiseClone() as SocketGuild;