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 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 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); } }
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."); } }