/// <summary> /// A callback for when a client attempts a connection /// </summary> /// <param name="ar"></param> private static async void OnConnect(IAsyncResult ar) { TcpClient client = null; try { client = mitm.EndAcceptTcpClient(ar); if (Helper.Settings.Instance.PrivateSlots > 0 && PremiumPlayers.Count < Helper.Settings.Instance.PrivateSlots && premiumPlayers != null && await premiumPlayers.CheckPremiumPlayerAsync(((IPEndPoint)client.Client.RemoteEndPoint).Address.ToString())) { MITMMessageHandler handler = prepareClient(client); PremiumPlayers.Add(handler.IP, handler); establishedConnections.Add(handler); Helper.Settings.Instance.Logger.AddMessage(MessageType.INFO, String.Format("Premium player joined from {0}", handler.IP)); } else if (Helper.Settings.Instance.PlayerLimit < 0 || ConnectedPlayers.Count <= Helper.Settings.Instance.PlayerLimit) { MITMMessageHandler handler = prepareClient(client); ConnectedPlayers.Add(handler.IP, handler); establishedConnections.Add(handler); } else { client.Close(); } } catch (Exception ex) { if (ex is SocketException) { Helper.Settings.Instance.Logger.AddMessage(Utilities.Logging.MessageType.ERROR, String.Format("An error occured while connecting to your server. Is the CubeWorld server running?")); } else { Helper.Settings.Instance.Logger.AddMessage(ex); } if (client != null && client.Connected) { client.Close(); } } }
private static MITMMessageHandler prepareClient(TcpClient client) { wait.Set(); TcpClient toServer = new TcpClient(); toServer.Connect(cubeWorldIP, (int)serverPort); NetworkStream clientStream = client.GetStream(); NetworkStream serverStream = toServer.GetStream(); IPAddress clientIP = ((IPEndPoint)client.Client.RemoteEndPoint).Address; Helper.Settings.Instance.Logger.AddMessage(Utilities.Logging.MessageType.INFO, String.Format("{1} connected to {0}", client.Client.LocalEndPoint.ToString(), clientIP.ToString())); MITMMessageHandler handler = new MITMMessageHandler(clientStream, serverStream, clientIP.ToString()); handler.OnClientDisconnected = new Action <MITMMessageHandler>(h => { if (ConnectedPlayers.ContainsKey(h.IP)) { ConnectedPlayers.Remove(h.IP); } if (PremiumPlayers.ContainsKey(h.IP)) { PremiumPlayers.Remove(h.IP); } if (knownPlayers != null) { knownPlayers.RemoveConnectedPlayer(h.IP); } }); handler.OnClientIdentified = new Action <MITMMessageHandler>(h => { if (KnownNames.ContainsKey(h.IP) && !KnownNames[h.IP].Contains(h.Name)) { KnownNames[h.IP].Add(h.Name); } else if (!KnownNames.ContainsKey(h.IP)) { List <string> tmp = new List <string>(); tmp.Add(h.Name); KnownNames.Add(h.IP, tmp); } if (knownPlayers != null) { if (ConnectedPlayers.ContainsKey(h.IP)) { knownPlayers.AddConnectedPlayer(h.IP, h.Name); } knownPlayers.AddKnownPlayer(h.IP, h.Name); } if (!playerAllowed(h.Level, h.HP, h.IP)) { h.Disconnect(); Helper.Settings.Instance.Logger.AddMessage(Utilities.Logging.MessageType.INFO, String.Format("{0} was kicked, because his character is not allowed (HP:{2}, Level:{1}).", h.Name, h.Level, h.HP)); } }); if (ConnectedPlayers.ContainsKey(handler.IP)) { ConnectedPlayers[handler.IP].Disconnect(); ConnectedPlayers.Remove(handler.IP); } return(handler); }