public AudioClient(AudioService service, int clientId, Server server, GatewaySocket gatewaySocket, Logger logger) { Service = service; Id = clientId; GatewaySocket = gatewaySocket; Logger = logger; _connectionLock = new AsyncLock(); _serializer = new JsonSerializer(); _serializer.DateTimeZoneHandling = DateTimeZoneHandling.Utc; _serializer.Error += (s, e) => { e.ErrorContext.Handled = true; Logger.Error("Serialization Failed", e.ErrorContext.Error); }; GatewaySocket.ReceivedDispatch += OnReceivedDispatch; VoiceSocket = new VoiceWebSocket(service.Client, this, _serializer, logger); VoiceSocket.Server = server; /*_voiceSocket.Connected += (s, e) => RaiseVoiceConnected(); _voiceSocket.Disconnected += async (s, e) => { _voiceSocket.CurrentServerId; if (voiceServerId != null) _gatewaySocket.SendLeaveVoice(voiceServerId.Value); await _voiceSocket.Disconnect().ConfigureAwait(false); RaiseVoiceDisconnected(socket.CurrentServerId.Value, e); if (e.WasUnexpected) await socket.Reconnect().ConfigureAwait(false); };*/ /*_voiceSocket.IsSpeaking += (s, e) => { if (_voiceSocket.State == WebSocketState.Connected) { var user = _users[e.UserId, socket.CurrentServerId]; bool value = e.IsSpeaking; if (user.IsSpeaking != value) { user.IsSpeaking = value; var channel = _channels[_voiceSocket.CurrentChannelId]; RaiseUserIsSpeaking(user, channel, value); if (Config.TrackActivity) user.UpdateActivity(); } } };*/ /*this.Connected += (s, e) => { _voiceSocket.ParentCancelToken = _cancelToken; };*/ }
public AudioClient(DiscordClient client, Server server, int id) { Id = id; _config = client.Config; Service = client.Services.Get<AudioService>(); Config = Service.Config; Serializer = client.Serializer; _gatewayState = (int)ConnectionState.Disconnected; //Logging Logger = client.Log.CreateLogger($"AudioClient #{id}"); //Async _taskManager = new TaskManager(Cleanup, false); _connectionLock = new AsyncLock(); CancelToken = new CancellationToken(true); //Networking if (Config.EnableMultiserver) { ClientAPI = new JsonRestClient(_config, DiscordConfig.ClientAPIUrl, client.Log.CreateLogger($"ClientAPI #{id}")); GatewaySocket = new GatewaySocket(_config, client.Serializer, client.Log.CreateLogger($"Gateway #{id}")); GatewaySocket.Connected += (s, e) => { if (_gatewayState == ConnectionState.Connecting) EndGatewayConnect(); }; } else GatewaySocket = client.GatewaySocket; GatewaySocket.ReceivedDispatch += (s, e) => OnReceivedEvent(e); VoiceSocket = new VoiceSocket(_config, Config, client.Serializer, client.Log.CreateLogger($"Voice #{id}")); VoiceSocket.Server = server; OutputStream = new OutStream(this); }
/// <summary> Initializes a new instance of the DiscordClient class. </summary> public DiscordClient(DiscordConfig config = null) { Config = config ?? new DiscordConfig(); Config.Lock(); State = (int)ConnectionState.Disconnected; Status = UserStatus.Online; //Logging Log = new LogManager(this); Logger = Log.CreateLogger("Discord"); //Async _taskManager = new TaskManager(Cleanup); _connectionLock = new AsyncLock(); _disconnectedEvent = new ManualResetEvent(true); _connectedEvent = new ManualResetEventSlim(false); CancelToken = new CancellationToken(true); //Cache _servers = new ConcurrentDictionary<ulong, Server>(); _channels = new ConcurrentDictionary<ulong, Channel>(); _privateChannels = new ConcurrentDictionary<ulong, Channel>(); //Serialization _serializer = new JsonSerializer(); _serializer.DateTimeZoneHandling = DateTimeZoneHandling.Utc; #if TEST_RESPONSES _serializer.CheckAdditionalContent = true; _serializer.MissingMemberHandling = MissingMemberHandling.Error; #else _serializer.Error += (s, e) => { e.ErrorContext.Handled = true; Logger.Error("Serialization Failed", e.ErrorContext.Error); }; #endif //Networking ClientAPI = new RestClient(Config, DiscordConfig.ClientAPIUrl, Log.CreateLogger("ClientAPI")); StatusAPI = new RestClient(Config, DiscordConfig.StatusAPIUrl, Log.CreateLogger("StatusAPI")); GatewaySocket = new GatewaySocket(this, _serializer, Log.CreateLogger("Gateway")); GatewaySocket.Connected += (s, e) => { if (State == ConnectionState.Connecting) EndConnect(); }; GatewaySocket.Disconnected += (s, e) => OnDisconnected(e.WasUnexpected, e.Exception); GatewaySocket.ReceivedDispatch += (s, e) => OnReceivedEvent(e); if (Config.UseMessageQueue) MessageQueue = new MessageQueue(this, Log.CreateLogger("MessageQueue")); //Extensibility Services = new ServiceManager(this); //Import/Export //_messageImporter = new JsonSerializer(); //_messageImporter.ContractResolver = new Message.ImportResolver(); }
private async Task<IAudioClient> CreateClient(Server server) { var client = _voiceClients.GetOrAdd(server.Id, _ => null); //Placeholder, so we can't have two clients connecting at once if (client == null) { int id = unchecked(++_nextClientId); var gatewayLogger = Client.Log.CreateLogger($"Gateway #{id}"); var voiceLogger = Client.Log.CreateLogger($"Voice #{id}"); var gatewaySocket = new GatewaySocket(Client, gatewayLogger); var voiceClient = new AudioClient(this, id, server, Client.GatewaySocket, voiceLogger); await voiceClient.Connect(true).ConfigureAwait(false); /*voiceClient.VoiceSocket.FrameReceived += (s, e) => { OnFrameReceieved(e); }; voiceClient.VoiceSocket.UserIsSpeaking += (s, e) => { var user = server.GetUser(e.UserId); OnUserIsSpeakingUpdated(user, e.IsSpeaking); };*/ //Update the placeholder only it still exists (RemoveClient wasnt called) if (!_voiceClients.TryUpdate(server.Id, voiceClient, null)) { //If it was, cleanup await voiceClient.Disconnect().ConfigureAwait(false); ; await gatewaySocket.Disconnect().ConfigureAwait(false); ; } } return client; }