diff --git a/src/Discord.Net.Rpc/API/DiscordRpcApiClient.cs b/src/Discord.Net.Rpc/API/DiscordRpcApiClient.cs index 540f9eb28..10fd054f5 100644 --- a/src/Discord.Net.Rpc/API/DiscordRpcApiClient.cs +++ b/src/Discord.Net.Rpc/API/DiscordRpcApiClient.cs @@ -319,14 +319,12 @@ namespace Discord.API public async Task SendGlobalSubscribeAsync(string evt, RequestOptions options = null) { options = RequestOptions.CreateOrClone(options); - var msg = new object(); - return await SendRpcAsync("SUBSCRIBE", msg, evt: evt, options: options).ConfigureAwait(false); + return await SendRpcAsync("SUBSCRIBE", null, evt: evt, options: options).ConfigureAwait(false); } public async Task SendGlobalUnsubscribeAsync(string evt, RequestOptions options = null) { options = RequestOptions.CreateOrClone(options); - var msg = new object(); - return await SendRpcAsync("UNSUBSCRIBE", msg, evt: evt, options: options).ConfigureAwait(false); + return await SendRpcAsync("UNSUBSCRIBE", null, evt: evt, options: options).ConfigureAwait(false); } public async Task SendGuildSubscribeAsync(string evt, ulong guildId, RequestOptions options = null) @@ -367,6 +365,17 @@ namespace Discord.API return await SendRpcAsync("UNSUBSCRIBE", msg, evt: evt, options: options).ConfigureAwait(false); } + public async Task GetVoiceSettingsAsync(RequestOptions options = null) + { + options = RequestOptions.CreateOrClone(options); + return await SendRpcAsync("GET_VOICE_SETTINGS", null, options: options).ConfigureAwait(false); + } + public async Task SetVoiceSettingsAsync(API.Rpc.VoiceSettings settings, RequestOptions options = null) + { + options = RequestOptions.CreateOrClone(options); + return await SendRpcAsync("SET_VOICE_SETTINGS", settings, options: options).ConfigureAwait(false); + } + private bool ProcessMessage(API.Rpc.RpcFrame msg) { RpcRequest requestTracker; diff --git a/src/Discord.Net.Rpc/API/Rpc/VoiceDeviceSettings.cs b/src/Discord.Net.Rpc/API/Rpc/VoiceDeviceSettings.cs index 9bad1dd6d..38473c803 100644 --- a/src/Discord.Net.Rpc/API/Rpc/VoiceDeviceSettings.cs +++ b/src/Discord.Net.Rpc/API/Rpc/VoiceDeviceSettings.cs @@ -5,10 +5,10 @@ namespace Discord.API.Rpc public class VoiceDeviceSettings { [JsonProperty("device_id")] - public string DeviceId { get; set; } + public Optional DeviceId { get; set; } [JsonProperty("volume")] - public float Volume { get; set; } + public Optional Volume { get; set; } [JsonProperty("available_devices")] - public VoiceDevice[] AvailableDevices { get; set; } + public Optional AvailableDevices { get; set; } } } diff --git a/src/Discord.Net.Rpc/API/Rpc/VoiceMode.cs b/src/Discord.Net.Rpc/API/Rpc/VoiceMode.cs index f9b650fb5..a502cc960 100644 --- a/src/Discord.Net.Rpc/API/Rpc/VoiceMode.cs +++ b/src/Discord.Net.Rpc/API/Rpc/VoiceMode.cs @@ -5,14 +5,14 @@ namespace Discord.API.Rpc public class VoiceMode { [JsonProperty("type")] - public string Type { get; set; } + public Optional Type { get; set; } [JsonProperty("auto_threshold")] - public bool AutoThreshold { get; set; } + public Optional AutoThreshold { get; set; } [JsonProperty("threshold")] - public float Threshold { get; set; } + public Optional Threshold { get; set; } [JsonProperty("shortcut")] - public VoiceShortcut[] Shortcut { get; set; } + public Optional Shortcut { get; set; } [JsonProperty("delay")] - public float Delay { get; set; } + public Optional Delay { get; set; } } } diff --git a/src/Discord.Net.Rpc/API/Rpc/VoiceSettings.cs b/src/Discord.Net.Rpc/API/Rpc/VoiceSettings.cs index 817c75cfe..c3268a719 100644 --- a/src/Discord.Net.Rpc/API/Rpc/VoiceSettings.cs +++ b/src/Discord.Net.Rpc/API/Rpc/VoiceSettings.cs @@ -13,14 +13,14 @@ namespace Discord.API.Rpc [JsonProperty("mode")] public VoiceMode Mode { get; set; } [JsonProperty("automatic_gain_control")] - public bool AutomaticGainControl { get; set; } + public Optional AutomaticGainControl { get; set; } [JsonProperty("echo_cancellation")] - public bool EchoCancellation { get; set; } + public Optional EchoCancellation { get; set; } [JsonProperty("noise_suppression")] - public bool NoiseSuppression { get; set; } + public Optional NoiseSuppression { get; set; } [JsonProperty("qos")] - public bool QualityOfService { get; set; } + public Optional QualityOfService { get; set; } [JsonProperty("silence_warning")] - public bool SilenceWarning { get; set; } + public Optional SilenceWarning { get; set; } } } diff --git a/src/Discord.Net.Rpc/API/Rpc/VoiceShortcut.cs b/src/Discord.Net.Rpc/API/Rpc/VoiceShortcut.cs index e090071ee..5b0939d79 100644 --- a/src/Discord.Net.Rpc/API/Rpc/VoiceShortcut.cs +++ b/src/Discord.Net.Rpc/API/Rpc/VoiceShortcut.cs @@ -6,10 +6,10 @@ namespace Discord.API.Rpc public class VoiceShortcut { [JsonProperty("type")] - public VoiceShortcutType Type { get; set; } + public Optional Type { get; set; } [JsonProperty("code")] - public int Code { get; set; } + public Optional Code { get; set; } [JsonProperty("name")] - public string Name { get; set; } + public Optional Name { get; set; } } } diff --git a/src/Discord.Net.Rpc/DiscordRpcClient.cs b/src/Discord.Net.Rpc/DiscordRpcClient.cs index 1d67cc8d0..708e18878 100644 --- a/src/Discord.Net.Rpc/DiscordRpcClient.cs +++ b/src/Discord.Net.Rpc/DiscordRpcClient.cs @@ -265,6 +265,21 @@ namespace Discord.Rpc await ApiClient.SendChannelUnsubscribeAsync(GetEventName(events[i]), channelId); } + public async Task GetVoiceSettingsAsync() + { + var model = await ApiClient.GetVoiceSettingsAsync().ConfigureAwait(false); + return VoiceSettings.Create(model); + } + public async Task SetVoiceSettingsAsync(Action func) + { + var settings = new API.Rpc.VoiceSettings(); + settings.Input = new VoiceDeviceSettings(); + settings.Output = new VoiceDeviceSettings(); + settings.Mode = new VoiceMode(); + func(settings); + await ApiClient.SetVoiceSettingsAsync(settings).ConfigureAwait(false); + } + private static string GetEventName(RpcGlobalEvent rpcEvent) { switch (rpcEvent) diff --git a/src/Discord.Net.Rpc/Entities/VoiceSettings.cs b/src/Discord.Net.Rpc/Entities/VoiceSettings.cs index 48e5538fd..2e8d6e74c 100644 --- a/src/Discord.Net.Rpc/Entities/VoiceSettings.cs +++ b/src/Discord.Net.Rpc/Entities/VoiceSettings.cs @@ -36,25 +36,41 @@ namespace Discord.Rpc } internal void Update(Model model) { - AutomaticGainControl = model.AutomaticGainControl; - EchoCancellation = model.EchoCancellation; - NoiseSuppression = model.NoiseSuppression; - QualityOfService = model.QualityOfService; - SilenceWarning = model.SilenceWarning; - - InputDeviceId = model.Input.DeviceId; - InputVolume = model.Input.Volume; - AvailableInputDevices = model.Input.AvailableDevices.Select(x => VoiceDevice.Create(x)).ToImmutableArray(); - - OutputDeviceId = model.Output.DeviceId; - OutputVolume = model.Output.Volume; - AvailableInputDevices = model.Output.AvailableDevices.Select(x => VoiceDevice.Create(x)).ToImmutableArray(); - - ActivationMode = model.Mode.Type; - AutoThreshold = model.Mode.AutoThreshold; - Threshold = model.Mode.Threshold; - Shortcuts = model.Mode.Shortcut.Select(x => VoiceShortcut.Create(x)).ToImmutableArray(); - Delay = model.Mode.Delay; + if (model.AutomaticGainControl.IsSpecified) + AutomaticGainControl = model.AutomaticGainControl.Value; + if (model.EchoCancellation.IsSpecified) + EchoCancellation = model.EchoCancellation.Value; + if (model.NoiseSuppression.IsSpecified) + NoiseSuppression = model.NoiseSuppression.Value; + if (model.QualityOfService.IsSpecified) + QualityOfService = model.QualityOfService.Value; + if (model.SilenceWarning.IsSpecified) + SilenceWarning = model.SilenceWarning.Value; + + if (model.Input.DeviceId.IsSpecified) + InputDeviceId = model.Input.DeviceId.Value; + if (model.Input.Volume.IsSpecified) + InputVolume = model.Input.Volume.Value; + if (model.Input.AvailableDevices.IsSpecified) + AvailableInputDevices = model.Input.AvailableDevices.Value.Select(x => VoiceDevice.Create(x)).ToImmutableArray(); + + if (model.Output.DeviceId.IsSpecified) + OutputDeviceId = model.Output.DeviceId.Value; + if (model.Output.Volume.IsSpecified) + OutputVolume = model.Output.Volume.Value; + if (model.Output.AvailableDevices.IsSpecified) + AvailableInputDevices = model.Output.AvailableDevices.Value.Select(x => VoiceDevice.Create(x)).ToImmutableArray(); + + if (model.Mode.Type.IsSpecified) + ActivationMode = model.Mode.Type.Value; + if (model.Mode.AutoThreshold.IsSpecified) + AutoThreshold = model.Mode.AutoThreshold.Value; + if (model.Mode.Threshold.IsSpecified) + Threshold = model.Mode.Threshold.Value; + if (model.Mode.Shortcut.IsSpecified) + Shortcuts = model.Mode.Shortcut.Value.Select(x => VoiceShortcut.Create(x)).ToImmutableArray(); + if (model.Mode.Delay.IsSpecified) + Delay = model.Mode.Delay.Value; } } } diff --git a/src/Discord.Net.Rpc/Entities/VoiceShortcut.cs b/src/Discord.Net.Rpc/Entities/VoiceShortcut.cs index d71e30ee8..93ef21804 100644 --- a/src/Discord.Net.Rpc/Entities/VoiceShortcut.cs +++ b/src/Discord.Net.Rpc/Entities/VoiceShortcut.cs @@ -18,7 +18,7 @@ namespace Discord.Rpc } internal static VoiceShortcut Create(Model model) { - return new VoiceShortcut(model.Type, model.Code, model.Name); + return new VoiceShortcut(model.Type.Value, model.Code.Value, model.Name.Value); } public override string ToString() => $"{Name}";