private static void FindSessionFromID(MessageData mdata, DWMessage packet) { var sidBlob = packet.ByteBuffer.ReadBlob(); var sid = BitConverter.ToUInt64(sidBlob, 0); IEnumerable <KeyValuePair <ulong, bdMatchMakingInfo> > matchingSessions = null; var reply = packet.MakeReply(1, false); reply.ByteBuffer.Write(0x8000000000000001); reply.ByteBuffer.Write((uint)0); reply.ByteBuffer.Write((byte)13); lock (_sessions) { matchingSessions = (from session in _sessions where session.Key == sid select session).Take(1); reply.ByteBuffer.Write((uint)matchingSessions.Count()); reply.ByteBuffer.Write((uint)matchingSessions.Count()); foreach (var session in matchingSessions) { session.Value.Serialize(reply); } } reply.Send(true); Console.WriteLine("get id returned {0} sessions", matchingSessions.Count()); }
private static void FindZombieSessions(MessageData mdata, DWMessage packet) { var a = packet.ByteBuffer.ReadInt32(); // gametype var b = packet.ByteBuffer.ReadInt32(); // netcode version packet.ByteBuffer.ReadDataType(0x14); packet.ByteBuffer.ReadDataType(0x14); packet.ByteBuffer.ReadDataType(0x14); packet.ByteBuffer.ReadDataType(0x14); var g = packet.ByteBuffer.ReadInt32(); // playlist IEnumerable <KeyValuePair <ulong, bdMatchMakingInfo> > matchingSessions = new Dictionary <ulong, bdMatchMakingInfo>(); var reply = packet.MakeReply(1, false); reply.ByteBuffer.Write(0x8000000000000001); reply.ByteBuffer.Write((uint)0); reply.ByteBuffer.Write((byte)13); lock (_sessions) { matchingSessions = (from session in _sessions where session.Value.TitleID == TitleID.T5 && ((MatchMakingInfoT5)session.Value).NetcodeVersion == b && ((MatchMakingInfoT5)session.Value).GameType == a && ((MatchMakingInfoT5)session.Value).Playlist == g select session); reply.ByteBuffer.Write((uint)matchingSessions.Count()); reply.ByteBuffer.Write((uint)matchingSessions.Count()); foreach (var session in matchingSessions) { session.Value.Serialize(reply); } } reply.Send(true); Console.WriteLine("get zm g {0} a {1} returned {2} sessions", g, a, matchingSessions.Count()); }
private static void GetCounterTotals(MessageData mdata, DWMessage packet) { try { var reply = packet.MakeReply(1, false); reply.ByteBuffer.Write(0x8000000000000002); reply.ByteBuffer.Write((uint)0); reply.ByteBuffer.Write((byte)2); reply.ByteBuffer.Write((uint)100); reply.ByteBuffer.Write((uint)100); for (int i = 0; i < 100; i++) { var id = packet.ByteBuffer.ReadUInt32(); reply.ByteBuffer.Write(id); byte[] buffer = new byte[sizeof(Int64)]; // from internLabs DWServer, random number generator Random random = new Random(); random.NextBytes(buffer); long signed = BitConverter.ToInt64(buffer, 0); reply.ByteBuffer.Write((long)signed); // random number, mmk? //reply.ByteBuffer.Write((long)9223372036854775807); pffft /* from NN DWServer * //reply.ByteBuffer.Write((long)1337); * reply.ByteBuffer.Write((long)9223372036854775807); */ } reply.Send(true); } catch { } }
private static void CreateSession(MessageData mdata, DWMessage packet) { Net_TcpDisconnected(mdata); var seed = 0; string IP = mdata.Get <string>("cid"); string[] IPParts = IP.Split(':'); seed = BitConverter.ToInt32(IPAddress.Parse(IPParts[0]).GetAddressBytes(), 0); TimeSpan ts = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0)); seed += (int)ts.TotalSeconds; var rnd = new Random(seed); var sid = new byte[8]; rnd.NextBytes(sid); var titleID = DWRouter.GetTitleIDForData(mdata); bdMatchMakingInfo info = null; if (titleID == TitleID.T5) { info = new MatchMakingInfoT5(); } else if (titleID == TitleID.IW5) { info = new MatchMakingInfoIW5(); } info.Deserialize(packet); info.SessionID = sid; info.CID = mdata.Get <string>("cid"); info.User = (DWRouter.CIDToUser.ContainsKey(info.CID)) ? DWRouter.CIDToUser[info.CID] : 0; info.Reachable = true; lock (_sessions) { _sessions.Add(BitConverter.ToUInt64(sid, 0), info); } var reply = packet.MakeReply(1, false); reply.ByteBuffer.Write(0x8000000000000001); reply.ByteBuffer.Write((uint)0); reply.ByteBuffer.Write((byte)1); reply.ByteBuffer.Write((uint)1); reply.ByteBuffer.Write((uint)1); reply.ByteBuffer.WriteBlob(info.SessionID); reply.Send(true); if (titleID == TitleID.T5) { var tInfo = (MatchMakingInfoT5)info; Log.Debug(tInfo.OnlineID.ToString("X16") + " registered session (map " + tInfo.MapName + ", gametype " + tInfo.GameTypeName + ")"); } else if (titleID == TitleID.IW5) { Log.Debug("Registered session."); } }
private static void DeleteSession(MessageData mdata, DWMessage packet) { var sidBlob = packet.ByteBuffer.ReadBlob(); var sid = BitConverter.ToUInt64(sidBlob, 0); lock (_sessions) { var matchingSessions = (from session in _sessions where session.Value.CID == mdata.Get <string>("cid") select session); var toRemove = new List <ulong>(); foreach (var session in matchingSessions) { toRemove.Add(session.Key); } foreach (var key in toRemove) { _sessions.Remove(key); } } var reply = packet.MakeReply(1, false); reply.ByteBuffer.Write(0x8000000000000001); reply.ByteBuffer.Write((uint)0); reply.ByteBuffer.Write((byte)1); reply.ByteBuffer.Write((uint)0); reply.ByteBuffer.Write((uint)0); reply.Send(true); }
private static void GetGroupCounts(MessageData data, DWMessage packet) { packet.ByteBuffer.DataTypePackingEnabled = true; var a = packet.ByteBuffer.ReadByte(); // 108 var b = packet.ByteBuffer.ReadUInt32(); // count * 4 var count = packet.ByteBuffer.ReadUInt32(); var groups = new List <BsonValue>(); for (int i = 0; i < count; i++) { groups.Add((int)packet.ByteBuffer.ReadUInt32()); } var results = Database.AGroupUserCache.Find(Query.In("groupID", groups)); var reply = packet.MakeReply(1, false); reply.ByteBuffer.Write(0x8000000000000001); reply.ByteBuffer.Write((uint)0); reply.ByteBuffer.Write((byte)28); reply.ByteBuffer.Write((uint)results.Count()); reply.ByteBuffer.Write((uint)results.Count()); foreach (var result in results) { reply.ByteBuffer.Write((uint)result.groupID); reply.ByteBuffer.Write((uint)result.totalCount); } reply.Send(true); }
private static void FindSessionByIP(MessageData mdata, DWMessage packet, uint address, ushort port) { IEnumerable <KeyValuePair <ulong, bdMatchMakingInfo> > matchingSessions = null; var reply = packet.MakeReply(1, false); reply.ByteBuffer.Write(0x8000000000000001); reply.ByteBuffer.Write((uint)0); reply.ByteBuffer.Write((byte)13); lock (_sessions) { matchingSessions = (from session in _sessions where (session.Value.TitleID == TitleID.T5 && session.Value.IPAddress == address && session.Value.Port == port) || (mdata.Get <IPEndPoint>("source").Address.Address == session.Value.IPAddress && session.Value.InternalIPAddress == address && session.Value.InternalPort == port) select session).Take(1); reply.ByteBuffer.Write((uint)matchingSessions.Count()); reply.ByteBuffer.Write((uint)matchingSessions.Count()); foreach (var session in matchingSessions) { session.Value.Serialize(reply); } } reply.Send(true); Console.WriteLine("get ip {0} returned {1} sessions", address, matchingSessions.Count()); }
private static void SendGlobalInstantMessage(MessageData mdata, DWMessage packet) { var bdOnlineID = packet.ByteBuffer.ReadUInt64(); var data = packet.ByteBuffer.ReadBlob(); // route the message to the target user if (DWRouter.Connections.ContainsKey(bdOnlineID)) { try { //var ourID = (from conn in DWRouter.Connections // where conn.Value == mdata.Get<string>("cid") // select conn.Key).FirstOrDefault(); var ourID = DWRouter.GetIDForData(mdata); var cid = DWRouter.Connections[bdOnlineID]; var treply = packet.MakeReply(2, false, cid); // 2 is 'push message' treply.ByteBuffer.Write((uint)21); treply.ByteBuffer.Write(ourID); treply.ByteBuffer.Write("someone"); treply.ByteBuffer.WriteBlob(data); treply.Send(true); Log.Verbose("sent an instant message to " + bdOnlineID.ToString("X16") + " from " + ourID.ToString("X16")); } catch { var reply2 = packet.MakeReply(1, false); reply2.ByteBuffer.Write(0x8000000000000001); reply2.ByteBuffer.Write((uint)0); reply2.ByteBuffer.Write((byte)14); reply2.ByteBuffer.Write((uint)0); reply2.ByteBuffer.Write((uint)0); reply2.Send(true); return; } } // note: we shouldn't force success, but there's no clear error list yet var reply = packet.MakeReply(1, false); reply.ByteBuffer.Write(0x8000000000000001); reply.ByteBuffer.Write((uint)0); reply.ByteBuffer.Write((byte)14); reply.ByteBuffer.Write((uint)0); reply.ByteBuffer.Write((uint)0); reply.Send(true); }
public static void Unknown(MessageData data, DWMessage packet) { var reply = packet.MakeReply(1, false); reply.ByteBuffer.Write(0x8000000000000001); reply.ByteBuffer.Write((uint)2); reply.Send(true); }
private static void InviteToSession(MessageData mdata, DWMessage packet) { var sidBlob = packet.ByteBuffer.ReadBlob(); var sid = BitConverter.ToUInt64(sidBlob, 0); var attachment = packet.ByteBuffer.ReadBlob(); var onlineIDs = new List <ulong>(); while (packet.ByteBuffer.PeekByte() == 10) { onlineIDs.Add(packet.ByteBuffer.ReadUInt64()); } foreach (var onlineID in onlineIDs) { try { var ourID = DWRouter.GetIDForData(mdata); var ourName = DWRouter.CIDToName[mdata.Get <string>("cid")]; var theirID = DWRouter.Connections[onlineID]; var treply = packet.MakeReply(2, false, theirID); // 2 is 'push message' treply.ByteBuffer.Write((uint)6); treply.ByteBuffer.Write(ourID); treply.ByteBuffer.Write(ourName); treply.ByteBuffer.WriteBlob(sidBlob); treply.ByteBuffer.WriteBlob(attachment); treply.Send(true); Log.Debug("sent an invite to " + onlineID.ToString("X16") + " from " + ourID.ToString("X16")); } catch (Exception) { } } var reply = packet.MakeReply(1, false); reply.ByteBuffer.Write(0x8000000000000001); reply.ByteBuffer.Write((uint)0); reply.ByteBuffer.Write((byte)21); reply.ByteBuffer.Write((uint)0); reply.ByteBuffer.Write((uint)0); reply.Send(true); }
private static void UpdateSessionPlayers(MessageData mdata, DWMessage packet) { try { var sidBlob = packet.ByteBuffer.ReadBlob(); var players = packet.ByteBuffer.ReadUInt32(); var sid = BitConverter.ToUInt64(sidBlob, 0); var success = false; if (_sessions.ContainsKey(sid)) { MatchMakingInfoT5 info; lock (_sessions) { info = _sessions[sid]; info.Deserialize(packet); info.Players = players; info.LastTouched = DateTime.Now; _sessions[sid] = info; } success = true; if (info.TitleID == TitleID.T5) { var tInfo = (MatchMakingInfoT5)info; Log.Debug("Updated session (map " + tInfo.MapName + ", gametype " + tInfo.GameTypeName + ")"); } else if (info.TitleID == TitleID.IW5) { Log.Debug("Updated session"); } } var reply = packet.MakeReply(1, false); reply.ByteBuffer.Write(0x8000000000000001); if (success) { reply.ByteBuffer.Write((uint)0); reply.ByteBuffer.Write((byte)12); reply.ByteBuffer.Write((uint)1); reply.ByteBuffer.Write((uint)1); reply.ByteBuffer.WriteBlob(sidBlob); } else { reply.ByteBuffer.Write((uint)2); } reply.Send(true); } catch { } }
private static void GetPerformanceValues(MessageData mdata, DWMessage packet) { var reply = packet.MakeReply(1, false); reply.ByteBuffer.Write(0x8000000000000001); reply.ByteBuffer.Write((uint)0); reply.ByteBuffer.Write((byte)21); reply.ByteBuffer.Write((uint)0); reply.ByteBuffer.Write((uint)0); reply.Send(true); }
private static void GetServerTime(MessageData data, DWMessage packet) { var reply = packet.MakeReply(1, false); reply.ByteBuffer.Write(0x8000000000000000); reply.ByteBuffer.Write((uint)0); reply.ByteBuffer.Write((byte)6); reply.ByteBuffer.Write((uint)1); reply.ByteBuffer.Write((uint)1); reply.ByteBuffer.Write(DateTime.UtcNow.ToUnixTime()); reply.Send(true); }
private static void GetFile(MessageData mdata, DWMessage packet) { var filename = packet.ByteBuffer.ReadString(); var user = packet.ByteBuffer.ReadUInt64(); if (user == 0) { user = DWRouter.GetIDForData(mdata); } var path = filename + "_" + user.ToString("x16"); var e = r.Next(1, 164); Log.Debug("Trying to send " + path + "... (originID " + e + ")"); var query = Query.EQ("filename", path); var files = Database.AFiles.Find(query); if (files.Count() > 0) { var file = files.First(); var reply = packet.MakeReply(1, false); reply.ByteBuffer.Write(0x8000000000000001); reply.ByteBuffer.Write((uint)0); reply.ByteBuffer.Write((byte)7); reply.ByteBuffer.Write((uint)1); reply.ByteBuffer.Write((uint)1); reply.ByteBuffer.WriteBlob(file.data); reply.Send(true); } else { var reply = packet.MakeReply(1, false); reply.ByteBuffer.Write(0x8000000000000001); reply.ByteBuffer.Write((uint)0x3E8); reply.Send(true); } }
private static void GetPublisherFile(MessageData mdata, DWMessage packet) { try { var filename = packet.ByteBuffer.ReadString(); filename = "data/" + filename.Replace("\\", "/").Replace("/", ""); Log.Debug("Trying to send " + filename); //var data = File.ReadAllBytes(@"data/pub/" + filename); if (!_defaultFiles.ContainsKey(filename)) { FileStream fileStream = new FileStream(filename, FileMode.Open, FileAccess.Read); int offset = 0; byte[] data = new byte[fileStream.Length]; int remaining = (int)fileStream.Length; while (remaining > 0) { int read = fileStream.Read(data, offset, remaining); if (read <= 0) { throw new EndOfStreamException (String.Format("End of stream reached with {0} bytes left to read", remaining)); } remaining -= read; offset += read; } fileStream.Close(); fileStream.Dispose(); _defaultFiles.Add(filename, data); } var reply = packet.MakeReply(1, false); reply.ByteBuffer.Write(0x8000000000000001); reply.ByteBuffer.Write((uint)0); reply.ByteBuffer.Write((byte)7); reply.ByteBuffer.Write((uint)1); reply.ByteBuffer.Write((uint)1); reply.ByteBuffer.WriteBlob(_defaultFiles[filename]); reply.Send(true); } catch (Exception e) { Log.Debug(e.ToString()); } }
private static void UpdateSession(MessageData mdata, DWMessage packet) { var sidBlob = packet.ByteBuffer.ReadBlob(); var sid = BitConverter.ToUInt64(sidBlob, 0); var titleID = DWRouter.GetTitleIDForData(mdata); MatchMakingInfoT5 info = null; if (titleID == TitleID.T5) { info = new MatchMakingInfoT5(); } else if (titleID == TitleID.IW5) { //info = new MatchMakingInfoIW5(); } info.Deserialize(packet); info.SessionID = sidBlob; info.CID = mdata.Get <string>("cid"); info.User = (DWRouter.CIDToUser.ContainsKey(info.CID)) ? DWRouter.CIDToUser[info.CID] : 0; info.Reachable = true; info.LastTouched = DateTime.Now; _sessions[sid] = info; if (titleID == TitleID.T5) { var tInfo = (MatchMakingInfoT5)info; Log.Debug(tInfo.OnlineID.ToString("X16") + " updated session (map " + tInfo.MapName + ", gametype " + tInfo.GameTypeName + ")"); } else if (titleID == TitleID.IW5) { Log.Debug("Updated session."); } var reply = packet.MakeReply(1, false); reply.ByteBuffer.Write(0x8000000000000001); reply.ByteBuffer.Write((uint)0); reply.ByteBuffer.Write((byte)1); reply.ByteBuffer.Write((uint)0); reply.ByteBuffer.Write((uint)0); reply.Send(true); }
private static void GetPublicInfos(MessageData data, DWMessage packet) { var entityIDs = new List <BsonInt32>(); while (packet.ByteBuffer.PeekByte() == 10) { entityIDs.Add((int)(packet.ByteBuffer.ReadUInt64() & 0xFFFFFFFF)); } var profileInfos = new List <PublicProfileInfo>(); var query = Query.In("user_id", entityIDs); var profiles = Database.APublicProfile.Find(query); if (profiles.Count() > 0) { foreach (var profile in profiles) { profileInfos.Add(new PublicProfileInfo() { UserID = (ulong)(0x110000100000000 | (uint)profile.user_id), UnknownInt = profile.profile_int, ProfileData = profile.profile_blob }); } } var reply = packet.MakeReply(1, false); reply.ByteBuffer.Write(0x8000000000000001); reply.ByteBuffer.Write((uint)0); reply.ByteBuffer.Write((byte)8); reply.ByteBuffer.Write((uint)profileInfos.Count()); reply.ByteBuffer.Write((uint)profileInfos.Count()); foreach (var info in profileInfos) { info.Serialize(reply); } reply.Send(true); }
private static void UnknownHandler(MessageData mdata, DWMessage packet) { string ukblob2 = ""; { for (int i = 0; i < packet.Buffer.Length; i++) { ukblob2 = ukblob2 + packet.Buffer[i].ToString("X2"); } } Log.Debug(ukblob2); var reply = packet.MakeReply(1, false); reply.ByteBuffer.Write(0x8000000000000001); reply.ByteBuffer.Write((uint)0); reply.ByteBuffer.Write((byte)1); reply.ByteBuffer.Write((uint)0); reply.ByteBuffer.Write((uint)0); reply.Send(true); }
private static void SetPublicInfo(MessageData data, DWMessage packet) { var profileInfo = new PublicProfileInfo(); profileInfo.Deserialize(packet); /*ulong user = 0; * lock (DWRouter.Connections) * { * user = (from conn in DWRouter.Connections * where conn.Value == data.Get<string>("cid") * select conn.Key).FirstOrDefault(); * }*/ ulong user = DWRouter.GetIDForData(data); var existing = Database.APublicProfile.Find(Query.EQ("user_id", (int)(user & 0xFFFFFFFF))); var item = new PublicProfile(); if (existing.Count() > 0) { item = existing.First(); } item.user_id = (int)(user & 0xFFFFFFFF); item.profile_int = profileInfo.UnknownInt; item.profile_blob = profileInfo.ProfileData; item.blobsize = profileInfo.ProfileData.Length; Database.APublicProfile.Save(item); var reply = packet.MakeReply(1, false); reply.ByteBuffer.Write(0x8000000000000001); reply.ByteBuffer.Write((uint)0); reply.ByteBuffer.Write((byte)8); reply.ByteBuffer.Write((uint)0); reply.ByteBuffer.Write((uint)0); reply.Send(true); }
private static void GetUserData(MessageData mdata, DWMessage packet) { var ip = mdata.Get <string>("cid").Split(':')[0]; var location = _geoIP.getLocation(ip); var reply = packet.MakeReply(1, false); reply.ByteBuffer.Write(0x8000000000000001); reply.ByteBuffer.Write((uint)0); reply.ByteBuffer.Write((byte)8); reply.ByteBuffer.Write(1); reply.ByteBuffer.Write(1); reply.ByteBuffer.Write(location.countryCode ?? ""); reply.ByteBuffer.Write(location.countryName ?? ""); reply.ByteBuffer.Write(location.regionName ?? ""); reply.ByteBuffer.Write(location.city ?? ""); reply.ByteBuffer.Write((float)location.latitude); reply.ByteBuffer.Write((float)location.longitude); reply.Send(true); }
private static void SetGroups(MessageData data, DWMessage packet) { ulong userID = DWRouter.GetIDForData(data); /*lock (DWRouter.Connections) * { * userID = (from conn in DWRouter.Connections * where conn.Value == data.Get<string>("cid") * select conn.Key).FirstOrDefault(); * }*/ RemoveUserGroups(userID); packet.ByteBuffer.DataTypePackingEnabled = true; var a = packet.ByteBuffer.ReadByte(); // 108 var b = packet.ByteBuffer.ReadUInt32(); // count * 4 var count = packet.ByteBuffer.ReadUInt32(); var groups = new List <GroupUser>(); for (int i = 0; i < count; i++) { groups.Add(new GroupUser() { groupID = (int)packet.ByteBuffer.ReadUInt32(), userID = (long)userID }); } Database.AGroupUser.InsertBatch(groups); var reply = packet.MakeReply(1, false); reply.ByteBuffer.Write(0x8000000000000001); reply.ByteBuffer.Write((uint)0); reply.ByteBuffer.Write((byte)28); reply.ByteBuffer.Write((uint)0); reply.ByteBuffer.Write((uint)0); reply.Send(true); }
private static void FindSessionsByEntityIDs(MessageData mdata, DWMessage packet) { var entityIDs = new List <ulong>(); while (packet.ByteBuffer.PeekByte() == 10) { entityIDs.Add(packet.ByteBuffer.ReadUInt64()); } DWMessage reply; IEnumerable <KeyValuePair <ulong, MatchMakingInfoT5> > matchingSessions = new Dictionary <ulong, MatchMakingInfoT5>(); reply = packet.MakeReply(1, false); reply.ByteBuffer.Write(0x8000000000000001); reply.ByteBuffer.Write((uint)0); reply.ByteBuffer.Write((byte)14); lock (_sessions) { matchingSessions = (from session in _sessions where ( session.Value.TitleID == TitleID.T5 && entityIDs.Contains(((MatchMakingInfoT5)session.Value).OnlineID) && (DateTime.Now - ((MatchMakingInfoT5)session.Value).LastTouched).TotalSeconds < 120 ) select session); reply.ByteBuffer.Write((uint)matchingSessions.Count()); reply.ByteBuffer.Write((uint)matchingSessions.Count()); foreach (var session in matchingSessions) { session.Value.Serialize(reply); } } reply.Send(true); Console.WriteLine("returned {0} sessions", matchingSessions.Count()); }
// not native name private static void LogBinaryEvent(MessageData mdata, DWMessage packet) { var data = packet.ByteBuffer.ReadBlob(); var type = packet.ByteBuffer.ReadUInt32(); var e = new BinaryEvent() { data = data, type = (int)type }; Database.ABlobEvents.Insert(e); Log.Debug("Inserted a binary event of type " + type); var reply = packet.MakeReply(1, false); reply.ByteBuffer.Write(0x8000000000000001); reply.ByteBuffer.Write((uint)0); reply.ByteBuffer.Write((byte)8); reply.ByteBuffer.Write(0); reply.ByteBuffer.Write(0); }
private static void FindZombieSessions(int count, MessageData mdata, DWMessage packet) { var a = packet.ByteBuffer.ReadInt32(); // gametype var b = packet.ByteBuffer.ReadInt32(); // netcode version packet.ByteBuffer.ReadDataType(0x14); packet.ByteBuffer.ReadDataType(0x14); packet.ByteBuffer.ReadDataType(0x14); packet.ByteBuffer.ReadDataType(0x14); var g = packet.ByteBuffer.ReadInt32(); // playlist IEnumerable <KeyValuePair <ulong, MatchMakingInfoT5> > matchingSessions = null; var reply = packet.MakeReply(1, false); reply.ByteBuffer.Write(0x8000000000000001); reply.ByteBuffer.Write((uint)0); reply.ByteBuffer.Write((byte)13); lock (_sessions) { /* * matchingSessions = (from session in _sessions * where session.Value.TitleID == TitleID.T5 && ((MatchMakingInfoT5)session.Value).NetcodeVersion == b && ((MatchMakingInfoT5)session.Value).GameType == a && ((MatchMakingInfoT5)session.Value).Playlist == g * select session); */ var rand = new Random(); matchingSessions = (from session in _sessions where session.Value.TitleID == TitleID.T5 && //((MatchMakingInfoT5)session.Value).NetcodeVersion == b && ((MatchMakingInfoT5)session.Value).GameType == a && //((MatchMakingInfoT5)session.Value).Playlist == g && ((MatchMakingInfoT5)session.Value).Reachable == true && //((MatchMakingInfoT5)session.Value).SessionID != _sessions[sid].SessionID && (DateTime.Now - ((MatchMakingInfoT5)session.Value).LastTouched).TotalSeconds < 120 orderby rand.Next() select session).Take(count); /* * if ((uint)matchingSessions.Count() == 0 && _sessions[sid].MatchRetry > 2) * { * matchingSessions = (from session in _sessions * where session.Value.TitleID == TitleID.T5 && * ((MatchMakingInfoT5)session.Value).GameType == a && * ((MatchMakingInfoT5)session.Value).SessionID != _sessions[sid].SessionID && * (DateTime.Now - _sessions[sid].LastTouched).TotalSeconds < 120 * orderby rand.Next() * select session).Take(count); * } */ //If the users has tried more than 3 times to find matches but kept asking for more. We'll assume something is going wrong. Lets return 0 so he can host his own /* * if (_sessions[sid].MatchRetry > 3) * { * _sessions[sid].MatchRetry = 0; * reply.ByteBuffer.Write((uint)0); * reply.ByteBuffer.Write((uint)0); * } * else * {*/ reply.ByteBuffer.Write((uint)matchingSessions.Count()); reply.ByteBuffer.Write((uint)matchingSessions.Count()); foreach (var session in matchingSessions) { if ((DateTime.Now - session.Value.TimeFound).TotalSeconds > 5) { _sessions[session.Key].TimeFound = DateTime.Now; session.Value.Serialize(reply); } } //} } Console.WriteLine("get zm g {0} a {1} returned {2} sessions", g, a, matchingSessions.Count()); reply.Send(true); }
private static void UploadFile(MessageData mdata, DWMessage packet) { var filename = packet.ByteBuffer.ReadString(); var test = packet.ByteBuffer.ReadBool(); var data = packet.ByteBuffer.ReadBlob(); // NOTE: AN UINT64 MIGHT FOLLOW HERE. THIS COULD BE USED BY DEDICATED SERVER-STYLE LICENSES FOR WRITING USER STATS. var user = (ulong)0; try { user = packet.ByteBuffer.ReadUInt64(); } catch { } if (user == 0) { /*lock (DWRouter.Connections) * { * user = (from conn in DWRouter.Connections * where conn.Value == mdata.Get<string>("cid") * select conn.Key).FirstOrDefault(); * }*/ user = DWRouter.GetIDForData(mdata); } //var user = 0x1100001ded1ca7e;//packet.ByteBuffer.ReadUInt64(); var path = filename + "_" + user.ToString("x16"); /*MySqlDataReader query = Database.Query("SELECT * FROM files WHERE filename='" + path + "'"); * if (query.HasRows) * { * query.Close(); * Log.Debug("Trying to update " + path + "... for user "); * Database.UploadQuery("UPDATE files SET data = ?filedata, filesize = '" + data.Length + "', userid='" + Convert.ToString((int)user) + "' WHERE filename='" + path + "'", data); * } * else * { * query.Close(); * Log.Debug("Trying to write " + path + "... for user "); * Database.UploadQuery("INSERT INTO files(userid, filename, data, filesize) VALUES('" + Convert.ToString((int)user) + "', '" + path + "', ?filedata, '" + data.Length + "')", data); * }*/ Log.Debug("Trying to write " + path + "..."); var file = new File() { filename = path, userid = (int)user, filesize = data.Length, data = data }; var query = Query.EQ("filename", path); var files = Database.AFiles.Find(query); if (files.Count() > 0) { file.id = files.First().id; } Database.AFiles.Save(file); var reply = packet.MakeReply(1, false); reply.ByteBuffer.Write(0x8000000000000001); reply.ByteBuffer.Write((uint)0); reply.ByteBuffer.Write((byte)1); reply.ByteBuffer.Write((uint)0); reply.ByteBuffer.Write((uint)0); reply.Send(true); }
private static void CreateSession(MessageData mdata, DWMessage packet) { Net_TcpDisconnected(mdata); var seed = 0; string IP = mdata.Get <string>("cid"); string[] IPParts = IP.Split(':'); seed = BitConverter.ToInt32(IPAddress.Parse(IPParts[0]).GetAddressBytes(), 0); TimeSpan ts = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0)); seed += (int)ts.TotalSeconds; var rnd = new Random(seed); var sid = new byte[8]; rnd.NextBytes(sid); var titleID = DWRouter.GetTitleIDForData(mdata); MatchMakingInfoT5 info = null; if (titleID == TitleID.T5) { info = new MatchMakingInfoT5(); } else if (titleID == TitleID.IW5) { //info = new MatchMakingInfoIW5(); } info.Deserialize(packet); info.SessionID = sid; info.CID = mdata.Get <string>("cid"); info.User = (DWRouter.CIDToUser.ContainsKey(info.CID)) ? DWRouter.CIDToUser[info.CID] : 0; info.Reachable = true; lock (_sessions) { //Delete old sessions int deleted = 0; foreach (var session in _sessions) { if (session.Value.User == info.User) { _sessions.Remove(session.Key); deleted++; } } /* * var duplicateValues = _sessions.GroupBy(x => x.Value).Where(x => x.Count() > 1); * * foreach (var dupSession in _sessions) * { * _sessions.Remove(dupSession.Key); * deleted++; * } */ Console.WriteLine("Deleted {0} old sessions whilst making a new one...", deleted); _sessions.Add(BitConverter.ToUInt64(sid, 0), info); } var reply = packet.MakeReply(1, false); reply.ByteBuffer.Write(0x8000000000000001); reply.ByteBuffer.Write((uint)0); reply.ByteBuffer.Write((byte)1); reply.ByteBuffer.Write((uint)1); reply.ByteBuffer.Write((uint)1); reply.ByteBuffer.WriteBlob(info.SessionID); reply.Send(true); if (titleID == TitleID.T5) { var tInfo = (MatchMakingInfoT5)info; Log.Debug(tInfo.OnlineID.ToString("X16") + " registered session (map " + tInfo.MapName + ", gametype " + tInfo.GameTypeName + ")"); } else if (titleID == TitleID.IW5) { Log.Debug("Registered session."); } }
private static void FindSessionsPaged(MessageData mdata, DWMessage packet) { try { // TODO: paging; do this by connection // return perPage results first, then on next requests either return more starting from the last result // or return 0 results. the game should always query until equal/0 is returned? var a = packet.ByteBuffer.ReadUInt32(); // always 6 var b = packet.ByteBuffer.ReadBool(); // new paging token? var c = packet.ByteBuffer.ReadBlob(); // paging token ID, or something useless like typename var d = packet.ByteBuffer.ReadUInt32(); // results per page var ca = packet.ByteBuffer.ReadUInt32(); // netcode version var cb = packet.ByteBuffer.ReadUInt32(); // -1 var cc = packet.ByteBuffer.ReadUInt32(); // server type var cd = packet.ByteBuffer.ReadUInt32(); // stat DDL version var ce = packet.ByteBuffer.ReadUInt32(); // unknown, should be -1 actually var cf = packet.ByteBuffer.ReadUInt32(); // -1 var cg = packet.ByteBuffer.ReadUInt32(); // country ID IEnumerable <KeyValuePair <ulong, bdMatchMakingInfo> > matchingSessions = null; var wager = 0; if (cc == 2) { wager = 2; } else if (cc == 1) { wager = 1; } else { wager = 1; } var reply = packet.MakeReply(1, false); reply.ByteBuffer.Write(0x8000000000000001); reply.ByteBuffer.Write((uint)0); reply.ByteBuffer.Write((byte)13); lock (_sessions) { matchingSessions = (from session in _sessions where (session.Value.TitleID == TitleID.T5 && ((MatchMakingInfoT5)session.Value).LicenseType != 5) && ((MatchMakingInfoT5)session.Value).StatDDL == cd && ((MatchMakingInfoT5)session.Value).NetcodeVersion == ca && ((MatchMakingInfoT5)session.Value).Wager == wager && ((MatchMakingInfoT5)session.Value).Reachable == true select session).Take((int)d); reply.ByteBuffer.Write((uint)matchingSessions.Count()); reply.ByteBuffer.Write((uint)matchingSessions.Count()); foreach (var session in matchingSessions) { session.Value.Serialize(reply); } Console.WriteLine("rp {0} ptb {1} t {2} returned {3} sessions", d, b, cc, matchingSessions.Count()); } reply.Send(true); } catch (Exception e) { Log.Error(e.ToString()); } }
private static void FindSessions(MessageData mdata, DWMessage packet) { var queryType = packet.ByteBuffer.ReadUInt32(); // query type var vb = packet.ByteBuffer.ReadUInt32(); // seems to be 0 var count = packet.ByteBuffer.ReadUInt32(); var titleID = DWRouter.GetTitleIDForData(mdata); if (titleID == TitleID.T5) { if (queryType == 2) { FindZombieSessions(mdata, packet); } else if (queryType == 4) { // technically a UInt64, but we don't seem to like bit shifting :) packet.ByteBuffer.ReadDataType(10); var portbytes = packet.ByteBuffer.Read(2); var ipbytes = packet.ByteBuffer.Read(4); var port = BitConverter.ToUInt16(portbytes, 0); var address = BitConverter.ToUInt32(ipbytes, 0); packet.ByteBuffer.Read(2); FindSessionByIP(mdata, packet, address, port); } } else if (titleID == TitleID.IW5) { IEnumerable <KeyValuePair <ulong, bdMatchMakingInfo> > matchingSessions = null; var reply = packet.MakeReply(1, false); reply.ByteBuffer.Write(0x8000000000000001); reply.ByteBuffer.Write((uint)0); reply.ByteBuffer.Write((byte)13); Func <MatchMakingInfoIW5, bool> condition = null; /*switch (queryType) * { * case 1: * * break; * }*/ var a = packet.ByteBuffer.ReadInt32(); var e = packet.ByteBuffer.ReadInt32(); condition = info => { return(info.Playlist == e); }; var rand = new Random(); lock (_sessions) { matchingSessions = (from session in _sessions where (session.Value.TitleID == TitleID.IW5 && condition((MatchMakingInfoIW5)session.Value)) orderby rand.Next() select session).Take((int)count); reply.ByteBuffer.Write((uint)matchingSessions.Count()); reply.ByteBuffer.Write((uint)matchingSessions.Count()); foreach (var session in matchingSessions) { session.Value.Serialize(reply); } } reply.Send(true); } }