From 6ccd9405c4fe7c8d705691598ddf356b20a09e32 Mon Sep 17 00:00:00 2001 From: Thomas May Date: Sun, 22 Sep 2019 15:52:52 +0100 Subject: [PATCH] Bug fixes and channel moving --- .../DSharpPlus/DSharpPlus/DiscordClient.cs | 2 ++ .../ServiceBackgroundTask.cpp | 11 +++++++ .../VoiceServiceRequest.idl | 1 + Unicord.Universal/Pages/DiscordPage.xaml.cs | 24 ++++++++++++-- .../Voice/VoiceConnectionModel.cs | 31 ++++++++++++++++++- 5 files changed, 65 insertions(+), 4 deletions(-) diff --git a/Libraries/DSharpPlus/DSharpPlus/DiscordClient.cs b/Libraries/DSharpPlus/DSharpPlus/DiscordClient.cs index c770cb88..1804a350 100644 --- a/Libraries/DSharpPlus/DSharpPlus/DiscordClient.cs +++ b/Libraries/DSharpPlus/DSharpPlus/DiscordClient.cs @@ -2182,6 +2182,8 @@ internal async Task OnVoiceStateUpdateEventAsync(JObject raw) mbr.IsDeafened = vstateNew.IsServerDeafened; } + vstateOld?.Channel?.InvokePropertyChanged(nameof(vstateNew.Channel.ConnectedUsers)); + vstateNew?.Channel?.InvokePropertyChanged(nameof(vstateNew.Channel.ConnectedUsers)); var ea = new VoiceStateUpdateEventArgs(this) { diff --git a/Unicord.Universal.Voice/ServiceBackgroundTask.cpp b/Unicord.Universal.Voice/ServiceBackgroundTask.cpp index 9b91c836..ef5a21ec 100644 --- a/Unicord.Universal.Voice/ServiceBackgroundTask.cpp +++ b/Unicord.Universal.Voice/ServiceBackgroundTask.cpp @@ -149,6 +149,17 @@ namespace winrt::Unicord::Universal::Voice::Background::implementation } } break; + case VoiceServiceRequest::GuildMoveRequest: + { + if (voiceClient != nullptr && activeCall != nullptr) { + activeCall.ContactName(unbox_value(data.Lookup(L"contact_name"))); + voiceClientOptions.ChannelId(unbox_value(data.Lookup(L"channel_id"))); + + // already connected, so raise the event again + RaiseEvent(VoiceServiceEvent::Connected, event_values); + } + } + break; case VoiceServiceRequest::StateRequest: if (voiceClient != nullptr) { values.Insert(L"state", box_value((uint32_t)VoiceServiceState::Connected)); diff --git a/Unicord.Universal.Voice/VoiceServiceRequest.idl b/Unicord.Universal.Voice/VoiceServiceRequest.idl index 684a5503..926020ec 100644 --- a/Unicord.Universal.Voice/VoiceServiceRequest.idl +++ b/Unicord.Universal.Voice/VoiceServiceRequest.idl @@ -7,6 +7,7 @@ namespace Unicord.Universal.Voice.Background StateRequest, GuildConnectRequest, + GuildMoveRequest, DisconnectRequest, MuteRequest, DeafenRequest, diff --git a/Unicord.Universal/Pages/DiscordPage.xaml.cs b/Unicord.Universal/Pages/DiscordPage.xaml.cs index 88cd9b6a..65e6b30d 100644 --- a/Unicord.Universal/Pages/DiscordPage.xaml.cs +++ b/Unicord.Universal/Pages/DiscordPage.xaml.cs @@ -410,11 +410,29 @@ internal async void Navigate(DiscordChannel channel, NavigationTransitionInfo in if (channel.Type == ChannelType.Voice) { + var model = DataContext as DiscordPageModel; + var voiceModel = model.VoiceModel; + try { - var voice = new VoiceConnectionModel(channel); - (DataContext as DiscordPageModel).VoiceModel = voice; - await voice.ConnectAsync(); + if (voiceModel == null) + { + voiceModel = new VoiceConnectionModel(channel); + model.VoiceModel = voiceModel; + await voiceModel.ConnectAsync(); + } + else if (voiceModel.Channel.Guild == channel.Guild) + { + await voiceModel.MoveAsync(channel); + } + else + { + await voiceModel.DisconnectAsync(); + + voiceModel = new VoiceConnectionModel(channel); + model.VoiceModel = voiceModel; + await voiceModel.ConnectAsync(); + } } catch (Exception ex) { diff --git a/Unicord.Universal/Voice/VoiceConnectionModel.cs b/Unicord.Universal/Voice/VoiceConnectionModel.cs index c68c4190..bd94ee85 100644 --- a/Unicord.Universal/Voice/VoiceConnectionModel.cs +++ b/Unicord.Universal/Voice/VoiceConnectionModel.cs @@ -30,6 +30,7 @@ public class VoiceConnectionModel : PropertyChangedBase, IDisposable private AppServiceConnection _appServiceConnection; private VoipCallCoordinator _voipCallCoordinator; private ResourceLoader _strings; + private TaskCompletionSource _voiceStateUpdateCompletion; private TaskCompletionSource _voiceServerUpdateCompletion; @@ -41,7 +42,7 @@ public class VoiceConnectionModel : PropertyChangedBase, IDisposable private string _connectionStatus; public string ConnectionStatus { get => _connectionStatus; set => OnPropertySet(ref _connectionStatus, value); } - public DiscordChannel Channel { get; } + public DiscordChannel Channel { get; private set; } public bool Muted { @@ -148,6 +149,32 @@ public async Task UpdatePreferredAudioDevicesAsync(string audioRender, string au await SendRequestAsync(set); } + public async Task MoveAsync(DiscordChannel newChannel) + { + if (Channel.Guild != newChannel.Guild) + { + throw new InvalidOperationException("Can only move inside a guild"); + } + + Channel = newChannel; + ConnectionStatus = _strings.GetString("ConnectionState3"); + + App.Discord.VoiceStateUpdated += OnVoiceStateUpdated; + SendVoiceStateUpdate(Channel.Id); + + var vstu = await _voiceStateUpdateCompletion.Task.ConfigureAwait(false); + ConnectionStatus = string.Format(_strings.GetString("ConnectionState4Format"), Channel.Name); + + var connectionRequest = new ValueSet() + { + ["req"] = (uint)VoiceServiceRequest.GuildMoveRequest, + ["channel_id"] = Channel.Id, + ["contact_name"] = Channel.Guild != null ? $"{Channel.Name} - {Channel.Guild.Name}" : DMNameConverter.Instance.Convert(Channel, null, null, null), + }; + + await SendRequestAsync(connectionRequest); + } + public async Task ConnectAsync() { if (ApiInformation.IsTypePresent("Windows.ApplicationModel.Calls.VoipPhoneCallResourceReservationStatus")) @@ -311,6 +338,7 @@ private async void OnRequestReceived(AppServiceConnection sender, AppServiceRequ ConnectionStatus = _strings.GetString("DisconnectedState"); Disconnected?.Invoke(this, null); SendVoiceStateUpdate(null); + Dispose(); break; case VoiceServiceEvent.Muted: await PlayCueAsync(_muted ? "mute" : "unmute"); @@ -395,6 +423,7 @@ public void Dispose() { _appServiceConnection?.Dispose(); _mediaPlayer.MediaPlayer?.Dispose(); + App.Discord.VoiceStateUpdated -= OnVoiceStateUpdated; } }