diff --git a/src/Discord.Net.Net45/Discord.Net.csproj b/src/Discord.Net.Net45/Discord.Net.csproj index adf26293a..68ed60e20 100644 --- a/src/Discord.Net.Net45/Discord.Net.csproj +++ b/src/Discord.Net.Net45/Discord.Net.csproj @@ -205,6 +205,9 @@ DiscordClient.Users.cs + + DiscordClient.Voice.cs + DiscordClientConfig.cs diff --git a/src/Discord.Net/DiscordClient.Voice.cs b/src/Discord.Net/DiscordClient.Voice.cs new file mode 100644 index 000000000..247977e59 --- /dev/null +++ b/src/Discord.Net/DiscordClient.Voice.cs @@ -0,0 +1,84 @@ +using Discord.Audio; +using System; + +namespace Discord +{ + public partial class DiscordClient + { + public IDiscordVoiceClient GetVoiceClient(Server server) + => GetVoiceClient(server.Id); + public IDiscordVoiceClient GetVoiceClient(string serverId) + { + if (serverId == null) throw new ArgumentNullException(nameof(serverId)); + + if (!Config.EnableVoiceMultiserver) + { + if (serverId == _voiceServerId) + return this; + else + return null; + } + + DiscordWSClient client; + if (_voiceClients.TryGetValue(serverId, out client)) + return client; + else + return null; + } + private async Task CreateVoiceClient(string serverId) + { + if (!Config.EnableVoiceMultiserver) + { + _voiceServerId = serverId; + return this; + } + + var client = _voiceClients.GetOrAdd(serverId, _ => + { + var config = _config.Clone(); + config.LogLevel = _config.LogLevel;// (LogMessageSeverity)Math.Min((int)_config.LogLevel, (int)LogMessageSeverity.Warning); + config.VoiceOnly = true; + config.VoiceClientId = unchecked(++_nextVoiceClientId); + return new DiscordWSClient(config, serverId); + }); + client.LogMessage += (s, e) => RaiseOnLog(e.Severity, e.Source, $"(#{client.Config.VoiceClientId}) {e.Message}"); + await client.Connect(_gateway, _token).ConfigureAwait(false); + return client; + } + + public Task JoinVoiceServer(Channel channel) + => JoinVoiceServer(channel?.ServerId, channel?.Id); + public Task JoinVoiceServer(Server server, string channelId) + => JoinVoiceServer(server?.Id, channelId); + public async Task JoinVoiceServer(string serverId, string channelId) + { + CheckReady(); //checkVoice is done inside the voice client + if (serverId == null) throw new ArgumentNullException(nameof(serverId)); + if (channelId == null) throw new ArgumentNullException(nameof(channelId)); + + var client = await CreateVoiceClient(serverId).ConfigureAwait(false); + await client.JoinChannel(channelId).ConfigureAwait(false); + return client; + } + + public Task LeaveVoiceServer(Server server) + => LeaveVoiceServer(server?.Id); + public async Task LeaveVoiceServer(string serverId) + { + CheckReady(checkVoice: true); + if (serverId == null) throw new ArgumentNullException(nameof(serverId)); + + if (Config.EnableVoiceMultiserver) + { + DiscordWSClient client; + if (_voiceClients.TryRemove(serverId, out client)) + await client.Disconnect().ConfigureAwait(false); + } + else + { + await _voiceSocket.Disconnect().ConfigureAwait(false); + _dataSocket.SendLeaveVoice(serverId); + } + } + } +} diff --git a/src/Discord.Net/DiscordClient.cs b/src/Discord.Net/DiscordClient.cs index ff73571a5..c8c5b7e60 100644 --- a/src/Discord.Net/DiscordClient.cs +++ b/src/Discord.Net/DiscordClient.cs @@ -1,14 +1,11 @@ using Discord.API; -using Discord.Audio; using Discord.Collections; -using Discord.Net; using Discord.Net.WebSockets; using Newtonsoft.Json; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; -using System.Net; using System.Threading.Tasks; namespace Discord @@ -714,82 +711,6 @@ namespace Discord } } - public IDiscordVoiceClient GetVoiceClient(Server server) - => GetVoiceClient(server.Id); - public IDiscordVoiceClient GetVoiceClient(string serverId) - { - if (serverId == null) throw new ArgumentNullException(nameof(serverId)); - - if (!Config.EnableVoiceMultiserver) - { - if (serverId == _voiceServerId) - return this; - else - return null; - } - - DiscordWSClient client; - if (_voiceClients.TryGetValue(serverId, out client)) - return client; - else - return null; - } - private async Task CreateVoiceClient(string serverId) - { - if (!Config.EnableVoiceMultiserver) - { - _voiceServerId = serverId; - return this; - } - - var client = _voiceClients.GetOrAdd(serverId, _ => - { - var config = _config.Clone(); - config.LogLevel = _config.LogLevel;// (LogMessageSeverity)Math.Min((int)_config.LogLevel, (int)LogMessageSeverity.Warning); - config.VoiceOnly = true; - config.VoiceClientId = unchecked(++_nextVoiceClientId); - return new DiscordWSClient(config, serverId); - }); - client.LogMessage += (s, e) => RaiseOnLog(e.Severity, e.Source, $"(#{client.Config.VoiceClientId}) {e.Message}"); - await client.Connect(_gateway, _token).ConfigureAwait(false); - return client; - } - - public Task JoinVoiceServer(Channel channel) - => JoinVoiceServer(channel?.ServerId, channel?.Id); - public Task JoinVoiceServer(Server server, string channelId) - => JoinVoiceServer(server?.Id, channelId); - public async Task JoinVoiceServer(string serverId, string channelId) - { - CheckReady(); //checkVoice is done inside the voice client - if (serverId == null) throw new ArgumentNullException(nameof(serverId)); - if (channelId == null) throw new ArgumentNullException(nameof(channelId)); - - var client = await CreateVoiceClient(serverId).ConfigureAwait(false); - await client.JoinChannel(channelId).ConfigureAwait(false); - return client; - } - - public Task LeaveVoiceServer(Server server) - => LeaveVoiceServer(server?.Id); - public async Task LeaveVoiceServer(string serverId) - { - CheckReady(checkVoice: true); - if (serverId == null) throw new ArgumentNullException(nameof(serverId)); - - if (Config.EnableVoiceMultiserver) - { - DiscordWSClient client; - if (_voiceClients.TryRemove(serverId, out client)) - await client.Disconnect().ConfigureAwait(false); - } - else - { - await _voiceSocket.Disconnect().ConfigureAwait(false); - _dataSocket.SendLeaveVoice(serverId); - } - } - private void SendInitialLog() { if (_config.LogLevel >= LogMessageSeverity.Verbose)