public void HandleCommand(MatchServer server, Client client, UdpPacket packet, MatchBaseRequestPacket baseRequest) { if (!packet.Secure) { return; } var random = new Random(); var reader = packet.GetReader(); var request = new MatchRequestListRequestPacket(reader); var playlist = server.Playlist; var country = ""; try { country = geo.GetCountryCode(client.ExternalIP.Address); } catch { } client.CurrentState = playlist; // set player as being in this playlist var unclean = CIServer.IsUnclean(client.XUID, packet.GetSource().Address) || CIServer.IsUnclean(client.XUIDAlias, packet.GetSource().Address); // match hosts // TODO: possibly skew 'preferred' players like XBL... 'random' isn't really a matchmaking algorithm lock (server.Sessions) { IEnumerable <MatchSession> sessions = null; if (client.GameBuild < 47) { sessions = (from session in server.Sessions where /*session.HostXUID != client.XUID && */ (DateTime.Now - session.LastTouched).TotalSeconds < 60 && session.Unclean == unclean orderby random.Next() select session).Take(19); } else { var localsessions = (from session in server.Sessions where (DateTime.Now - session.LastTouched).TotalSeconds < 60 && session.Unclean == unclean && session.Country == country orderby random.Next() select session).Take(20); var remaining = (50 - localsessions.Count()); var othersessions = (from session in server.Sessions where /*session.HostXUID != client.XUID && */ (DateTime.Now - session.LastTouched).TotalSeconds < 60 && session.Unclean == unclean orderby random.Next() select session).Take(remaining); sessions = localsessions.Concat(othersessions); } if (unclean) { var list = sessions.ToList(); var i = 0; while (list.Count < 19) { list.Add(new MatchSession() { Clients = new List <MatchSessionClient>(), ExternalIP = new IPEndPoint(0x7F000001, 28960 + i), GameID = i, HostXUID = i + 123, InternalIP = new IPEndPoint(0x7F000001, 28960 + i) }); i++; } sessions = list.Take(19); } var responsePacket = new MatchRequestListResponsePacket(request.ReplyType, request.Sequence, sessions); var response = packet.MakeResponse(); responsePacket.Write(response.GetWriter(), Client.IsVersionAllowed(client.GameVersion, client.GameBuild)); response.Send(); Log.Debug(string.Format("Sent {0} sessions to {1}", sessions.Count(), client.XUID.ToString("X16"))); } }
void server_PacketReceived(object sender, UdpPacketReceivedEventArgs e) { var packet = e.Packet; var reader = packet.GetReader(); var type = reader.ReadByte(); if (type == 0xE) { var request = new LogRequestPacket1(reader); if (request.GameVersion == 0 || (request.InternalIP.Port < 28960 || request.InternalIP.Port > 28970)) { // update 'last touched', possibly re-set state var client = Client.Get(request.XUID); client.SetLastTouched(); if (!client.IsMatched) { client.CurrentState = 0x417D; } // only send 0E 02 00 here var response = packet.MakeResponse(); var writer = response.GetWriter(); writer.Write(new byte[] { 0x0E, 0x02, 0x00 }); response.Send(); } else { bool allowedVersion = true; Log.Data(string.Format("Player connecting {0} from {1} version {2}.{3} XUID {4}", request.GamerTag, request.ExternalIP, request.GameVersion, request.GameBuild, request.XUID.ToString("X16"))); if (!Client.IsVersionAllowed(request.GameVersion, request.GameBuild)) { // no return, we need to keep the version logged for later packets Log.Warn(string.Format("Client {0} attempted to connect with disallowed version {1}.{2}.", request.GamerTag, request.GameVersion, request.GameBuild)); // to send 'fake' data allowedVersion = false; } var client = Client.Get(request.XUID); client.SetFromLog(request); var tempStats = new List <LogStatistics>(); /* * tempStats.Add(new LogStatistics(0x2ee0, 1)); * tempStats.Add(new LogStatistics(1, 2)); * tempStats.Add(new LogStatistics(0x417f, 3)); * tempStats.Add(new LogStatistics(0x417e, 4)); * tempStats.Add(new LogStatistics(5, 5)); * tempStats.Add(new LogStatistics(13, 6)); * tempStats.Add(new LogStatistics(0x3a98, 7)); * tempStats.Add(new LogStatistics(4, 8)); * tempStats.Add(new LogStatistics(3, 9)); * tempStats.Add(new LogStatistics(2, 10)); * tempStats.Add(new LogStatistics(17, 11)); * tempStats.Add(new LogStatistics(17, 12)); * tempStats.Add(new LogStatistics(6, 13)); * tempStats.Add(new LogStatistics(9, 14)); * tempStats.Add(new LogStatistics(15, 16)); * tempStats.Add(new LogStatistics(0x416e, 17)); * tempStats.Add(new LogStatistics(7, 18)); * tempStats.Add(new LogStatistics(0x417d, 19)); * tempStats.Add(new LogStatistics(8, 20)); * tempStats.Add(new LogStatistics(12, 21)); * tempStats.Add(new LogStatistics(16, 22)); * tempStats.Add(new LogStatistics(14, 23)); * tempStats.Add(new LogStatistics(0x2ee0, 24)); * tempStats.Add(new LogStatistics(11, 25)); * tempStats.Add(new LogStatistics(10, 26)); */ var responsePacket = new LogResponsePacket1(client.XUID); if (allowedVersion) { responsePacket.SetStatistics(Client.GetStatistics()); } else { var fakeStats = new List <LogStatistics>(); fakeStats.Add(new LogStatistics(1, 28789)); //up fakeStats.Add(new LogStatistics(2, 24932)); //da fakeStats.Add(new LogStatistics(3, 25972)); //te for (short i = 4; i <= 19; i++) { fakeStats.Add(new LogStatistics(i, 1337)); } responsePacket.SetStatistics(fakeStats); /*if (request.GameBuild < 40) * { * responsePacket.SetBetaClosed(); * } * else * {*/ responsePacket.SetOldBuild(); //} } if ((request.XUID & 0xFFFFFFFF) == 2) { Log.Info(string.Format("Non-allowed client (IDGEN) (XUID {0}) tried to connect", request.XUID)); responsePacket.SetBetaClosed(); } if (!Client.IsAllowed(request.XUID)) { Log.Info(string.Format("Non-allowed client (XUID {0}) tried to connect", request.XUID)); responsePacket.SetBanned(); } if (!Client.IsAllowed(client.XUIDAlias)) { Log.Info(string.Format("Non-allowed client (XUID {0}) tried to connect", request.XUID)); responsePacket.SetBanned(); } var ipAddress = packet.GetSource().Address; if (!Client.IsAllowed(ipAddress)) { Log.Info(string.Format("Non-allowed client (IP {0}) tried to connect", ipAddress)); responsePacket.SetBanned(); } if (!packet.Secure) { if (allowedVersion) { Log.Info(string.Format("Client (IP {0}) tried to connect with insecure packet.", ipAddress)); } responsePacket.SetOldBuild(); } var response = packet.MakeResponse(); responsePacket.Write(response.GetWriter()); response.Send(); } } else if (type == 0xFD) { if (!packet.Secure) { return; } long realID = (0x0110000100000000 | reader.ReadInt32()); long fakeID = (0x0110000100000000 | reader.ReadInt32()); if (realID == fakeID) { return; } var client = Client.Get(realID); client.XUIDAlias = fakeID; } }
void server_PacketReceived(object sender, UdpPacketReceivedEventArgs e) { var packet = e.Packet; var reader = packet.GetReader(); var basePacket = new MatchBaseRequestPacket(reader); var client = Client.Get(basePacket.XUID); /*if (!Client.IsAllowed(basePacket.XUID)) * { * Log.Info(string.Format("Non-allowed client (XUID {0}) tried to get matches", basePacket.XUID.ToString("X16"))); * return; * } * * if (!Client.IsAllowed(client.XUIDAlias)) * { * Log.Info(string.Format("Non-allowed client (XUID {0}) tried to get matches", basePacket.XUID.ToString("X16"))); * return; * }*/ var ipAddress = packet.GetSource().Address; if (!Client.IsAllowed(ipAddress)) { Log.Info(string.Format("Non-allowed client (IP {0}) tried to get matches", ipAddress)); return; } client.SetLastTouched(); client.CurrentState = _playlist; client.SetLastMatched(); if (!Client.IsVersionAllowed(client.GameVersion, client.GameBuild)) { return; } var sessions = from session in Sessions where session.HostXUID == client.XUID && (DateTime.Now - session.LastTouched).TotalSeconds < 120 select session; if (sessions.Count() > 0) { var session = sessions.First(); if (CIServer.IsUnclean(session.HostXUID, packet.GetSource().Address)) { session.Unclean = true; } foreach (var updateClient in session.Clients) { var updClient = Client.Get(updateClient.XUID); updClient.CurrentState = _playlist; updClient.SetLastTouched(); updClient.SetLastMatched(); } } if (_handlers.ContainsKey(basePacket.CommandType)) { _handlers[basePacket.CommandType].HandleCommand(this, client, packet, basePacket); } else { Log.Info(string.Format("Client {0} sent unknown match packet {1}", basePacket.XUID.ToString("X16"), basePacket.CommandType)); } }