| @@ -319,14 +319,12 @@ namespace Discord.API | |||||
| public async Task<SubscriptionResponse> SendGlobalSubscribeAsync(string evt, RequestOptions options = null) | public async Task<SubscriptionResponse> SendGlobalSubscribeAsync(string evt, RequestOptions options = null) | ||||
| { | { | ||||
| options = RequestOptions.CreateOrClone(options); | options = RequestOptions.CreateOrClone(options); | ||||
| var msg = new object(); | |||||
| return await SendRpcAsync<SubscriptionResponse>("SUBSCRIBE", msg, evt: evt, options: options).ConfigureAwait(false); | |||||
| return await SendRpcAsync<SubscriptionResponse>("SUBSCRIBE", null, evt: evt, options: options).ConfigureAwait(false); | |||||
| } | } | ||||
| public async Task<SubscriptionResponse> SendGlobalUnsubscribeAsync(string evt, RequestOptions options = null) | public async Task<SubscriptionResponse> SendGlobalUnsubscribeAsync(string evt, RequestOptions options = null) | ||||
| { | { | ||||
| options = RequestOptions.CreateOrClone(options); | options = RequestOptions.CreateOrClone(options); | ||||
| var msg = new object(); | |||||
| return await SendRpcAsync<SubscriptionResponse>("UNSUBSCRIBE", msg, evt: evt, options: options).ConfigureAwait(false); | |||||
| return await SendRpcAsync<SubscriptionResponse>("UNSUBSCRIBE", null, evt: evt, options: options).ConfigureAwait(false); | |||||
| } | } | ||||
| public async Task<SubscriptionResponse> SendGuildSubscribeAsync(string evt, ulong guildId, RequestOptions options = null) | public async Task<SubscriptionResponse> SendGuildSubscribeAsync(string evt, ulong guildId, RequestOptions options = null) | ||||
| @@ -367,6 +365,17 @@ namespace Discord.API | |||||
| return await SendRpcAsync<SubscriptionResponse>("UNSUBSCRIBE", msg, evt: evt, options: options).ConfigureAwait(false); | return await SendRpcAsync<SubscriptionResponse>("UNSUBSCRIBE", msg, evt: evt, options: options).ConfigureAwait(false); | ||||
| } | } | ||||
| public async Task<API.Rpc.VoiceSettings> GetVoiceSettingsAsync(RequestOptions options = null) | |||||
| { | |||||
| options = RequestOptions.CreateOrClone(options); | |||||
| return await SendRpcAsync<API.Rpc.VoiceSettings>("GET_VOICE_SETTINGS", null, options: options).ConfigureAwait(false); | |||||
| } | |||||
| public async Task<API.Rpc.VoiceSettings> SetVoiceSettingsAsync(API.Rpc.VoiceSettings settings, RequestOptions options = null) | |||||
| { | |||||
| options = RequestOptions.CreateOrClone(options); | |||||
| return await SendRpcAsync<API.Rpc.VoiceSettings>("SET_VOICE_SETTINGS", settings, options: options).ConfigureAwait(false); | |||||
| } | |||||
| private bool ProcessMessage(API.Rpc.RpcFrame msg) | private bool ProcessMessage(API.Rpc.RpcFrame msg) | ||||
| { | { | ||||
| RpcRequest requestTracker; | RpcRequest requestTracker; | ||||
| @@ -5,10 +5,10 @@ namespace Discord.API.Rpc | |||||
| public class VoiceDeviceSettings | public class VoiceDeviceSettings | ||||
| { | { | ||||
| [JsonProperty("device_id")] | [JsonProperty("device_id")] | ||||
| public string DeviceId { get; set; } | |||||
| public Optional<string> DeviceId { get; set; } | |||||
| [JsonProperty("volume")] | [JsonProperty("volume")] | ||||
| public float Volume { get; set; } | |||||
| public Optional<float> Volume { get; set; } | |||||
| [JsonProperty("available_devices")] | [JsonProperty("available_devices")] | ||||
| public VoiceDevice[] AvailableDevices { get; set; } | |||||
| public Optional<VoiceDevice[]> AvailableDevices { get; set; } | |||||
| } | } | ||||
| } | } | ||||
| @@ -5,14 +5,14 @@ namespace Discord.API.Rpc | |||||
| public class VoiceMode | public class VoiceMode | ||||
| { | { | ||||
| [JsonProperty("type")] | [JsonProperty("type")] | ||||
| public string Type { get; set; } | |||||
| public Optional<string> Type { get; set; } | |||||
| [JsonProperty("auto_threshold")] | [JsonProperty("auto_threshold")] | ||||
| public bool AutoThreshold { get; set; } | |||||
| public Optional<bool> AutoThreshold { get; set; } | |||||
| [JsonProperty("threshold")] | [JsonProperty("threshold")] | ||||
| public float Threshold { get; set; } | |||||
| public Optional<float> Threshold { get; set; } | |||||
| [JsonProperty("shortcut")] | [JsonProperty("shortcut")] | ||||
| public VoiceShortcut[] Shortcut { get; set; } | |||||
| public Optional<VoiceShortcut[]> Shortcut { get; set; } | |||||
| [JsonProperty("delay")] | [JsonProperty("delay")] | ||||
| public float Delay { get; set; } | |||||
| public Optional<float> Delay { get; set; } | |||||
| } | } | ||||
| } | } | ||||
| @@ -13,14 +13,14 @@ namespace Discord.API.Rpc | |||||
| [JsonProperty("mode")] | [JsonProperty("mode")] | ||||
| public VoiceMode Mode { get; set; } | public VoiceMode Mode { get; set; } | ||||
| [JsonProperty("automatic_gain_control")] | [JsonProperty("automatic_gain_control")] | ||||
| public bool AutomaticGainControl { get; set; } | |||||
| public Optional<bool> AutomaticGainControl { get; set; } | |||||
| [JsonProperty("echo_cancellation")] | [JsonProperty("echo_cancellation")] | ||||
| public bool EchoCancellation { get; set; } | |||||
| public Optional<bool> EchoCancellation { get; set; } | |||||
| [JsonProperty("noise_suppression")] | [JsonProperty("noise_suppression")] | ||||
| public bool NoiseSuppression { get; set; } | |||||
| public Optional<bool> NoiseSuppression { get; set; } | |||||
| [JsonProperty("qos")] | [JsonProperty("qos")] | ||||
| public bool QualityOfService { get; set; } | |||||
| public Optional<bool> QualityOfService { get; set; } | |||||
| [JsonProperty("silence_warning")] | [JsonProperty("silence_warning")] | ||||
| public bool SilenceWarning { get; set; } | |||||
| public Optional<bool> SilenceWarning { get; set; } | |||||
| } | } | ||||
| } | } | ||||
| @@ -6,10 +6,10 @@ namespace Discord.API.Rpc | |||||
| public class VoiceShortcut | public class VoiceShortcut | ||||
| { | { | ||||
| [JsonProperty("type")] | [JsonProperty("type")] | ||||
| public VoiceShortcutType Type { get; set; } | |||||
| public Optional<VoiceShortcutType> Type { get; set; } | |||||
| [JsonProperty("code")] | [JsonProperty("code")] | ||||
| public int Code { get; set; } | |||||
| public Optional<int> Code { get; set; } | |||||
| [JsonProperty("name")] | [JsonProperty("name")] | ||||
| public string Name { get; set; } | |||||
| public Optional<string> Name { get; set; } | |||||
| } | } | ||||
| } | } | ||||
| @@ -265,6 +265,21 @@ namespace Discord.Rpc | |||||
| await ApiClient.SendChannelUnsubscribeAsync(GetEventName(events[i]), channelId); | await ApiClient.SendChannelUnsubscribeAsync(GetEventName(events[i]), channelId); | ||||
| } | } | ||||
| public async Task<VoiceSettings> GetVoiceSettingsAsync() | |||||
| { | |||||
| var model = await ApiClient.GetVoiceSettingsAsync().ConfigureAwait(false); | |||||
| return VoiceSettings.Create(model); | |||||
| } | |||||
| public async Task SetVoiceSettingsAsync(Action<API.Rpc.VoiceSettings> 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) | private static string GetEventName(RpcGlobalEvent rpcEvent) | ||||
| { | { | ||||
| switch (rpcEvent) | switch (rpcEvent) | ||||
| @@ -36,25 +36,41 @@ namespace Discord.Rpc | |||||
| } | } | ||||
| internal void Update(Model model) | 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; | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| @@ -18,7 +18,7 @@ namespace Discord.Rpc | |||||
| } | } | ||||
| internal static VoiceShortcut Create(Model model) | 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}"; | public override string ToString() => $"{Name}"; | ||||