static IEnumerable <IOutboundPacket> OnPacketReady(IConnection connection, IIncomingPacket packet) { var handler = handlerSelector.SelectForPacket(packet); if (handler != null && clientMap.TryGetValue(connection, out IClient client)) { return(handler.HandleRequest(packet, client)); } return(null); }
/// <summary> /// Binds the TCP listener events with handler picking. /// </summary> /// <param name="loggerFactory">The loggers factory to create loggers with.</param> /// <param name="handlerSelector">The selector of handlers to bind listeners' events to.</param> /// <param name="listeners">The listeners to bind.</param> private void BindListeners(ILoggerFactory loggerFactory, IHandlerSelector handlerSelector, IEnumerable <IListener> listeners) { IEnumerable <IOutboundPacket> OnPacketReady(IConnection connection, IInboundPacket packet) { var handler = handlerSelector.SelectForPacket(packet); if (handler != null && this.connectionToClientMap.TryGetValue(connection, out IClient client)) { return(handler.HandleRequestPacket(this, packet, client)); } return(null); } void OnConnectionClosed(IConnection connection) { // Clean up the event listeners we set up here. connection.PacketReady -= OnPacketReady; connection.Closed -= OnConnectionClosed; if (!this.connectionToClientMap.ContainsKey(connection)) { return; } var playerId = this.connectionToClientMap[connection].PlayerId; this.clientsManager.Unregister(playerId); this.connectionToClientMap.Remove(connection); } void OnNewConnection(IConnection connection) { if (this.connectionToClientMap.ContainsKey(connection)) { return; } this.connectionToClientMap.Add(connection, new ConnectedClient(loggerFactory.CreateLogger <ConnectedClient>(), connection)); connection.PacketReady += OnPacketReady; connection.Closed += OnConnectionClosed; } foreach (var tcpListener in listeners) { tcpListener.NewConnection += OnNewConnection; } }