public void HandleCommand(MatchServer server, Client client, UdpPacket packet, MatchBaseRequestPacket baseRequest) { var reader = packet.GetReader(); var request = new MatchRegisterHostingRequestPacket(reader); var playlist = server.Playlist; var challengePassed = false; if (MatchRequestHostingHandler.Challenges.ContainsKey(client.XUID)) { var oldChallenge = MatchRequestHostingHandler.Challenges[client.XUID]; if (request.Challenge == oldChallenge) { challengePassed = true; } } if (!challengePassed) { Log.Warn(string.Format("Client {0} replied with a wrong host registration challenge.", client.XUID.ToString("X16"))); } var existingMatches = from session in server.Sessions where session.HostXUID == client.XUID select session; if (existingMatches.Count() > 0) { var match = existingMatches.First(); match.GameID = request.Session.GameID; match.SetLastTouched(); Log.Debug(string.Format("Updated match as registered by {0}", client.XUID.ToString("X16"))); } else { if (!Client.IsHostAllowed(client.XUID)) { Log.Info(string.Format("Non-allowed client (XUID {0}) tried to register lobby", client.XUID.ToString("X16"))); return; } else if (!Client.IsHostAllowed(request.Session.ExternalIP.Address)) { Log.Info(string.Format("Non-allowed client (IP {0}) tried to register lobby", request.Session.ExternalIP)); return; } else { request.Session.Unclean = (CIServer.IsUnclean(client.XUID, packet.GetSource().Address) || CIServer.IsUnclean(client.XUIDAlias, packet.GetSource().Address)); request.Session.HostXUID = client.XUID; request.Session.Country = ""; try { var countrycode = geo.GetCountryCode(request.Session.ExternalIP.Address); Console.WriteLine("Country code of IP address " + request.Session.ExternalIP.ToString() + ": " + countrycode.ToString()); request.Session.Country = countrycode; } catch { } server.Sessions.Add(request.Session); Log.Info(string.Format("Registered session by {0}; lobby at {1}", client.XUID.ToString("X16"), request.Session.ExternalIP)); } } // this response appears wrong for now var responsePacket = new MatchRegisterHostingResponsePacket(request.ReplyType, request.Sequence); var response = packet.MakeResponse(); responsePacket.Write(response.GetWriter()); response.Send(); }