public static void DW_PacketReceived(MessageData data) { var type = data.Get <int>("type"); var crypt = data.Get <bool>("crypt"); if (type == 6) { var packet = DWRouter.GetMessage(data); var call = packet.ByteBuffer.ReadByte(); try { switch (call) { case 1: break; case 14: SendGlobalInstantMessage(data, packet); break; default: Log.Debug("unknown packet " + call + " in bdMessaging"); //DWRouter.Unknown(data, packet); break; } } catch (Exception e) { Log.Error(e.ToString()); } } }
private static void HandleIW5ServerAuth(MessageData data, int type) { var packet = DWRouter.GetMessage(data); bool unknownBool; uint randomNumber; uint gameID; byte[] rsaKeyBuf = new byte[1120 / 8]; packet.BitBuffer.UseDataTypes = false; packet.BitBuffer.ReadBoolean(out unknownBool); packet.BitBuffer.UseDataTypes = true; packet.BitBuffer.ReadUInt32(out randomNumber); packet.BitBuffer.ReadUInt32(out gameID); // create state var state = new IW5ServerAuthstate() { GameID = gameID, Packet = packet, Random = randomNumber, OddBool = unknownBool }; if (type == 26) { packet.BitBuffer.Read(1120, rsaKeyBuf); // start thread var thread = new Thread(CreateIW5ServerKey); thread.Start(state); } }
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."); } }
public static void DW_PacketReceived(MessageData data) { var type = data.Get <int>("type"); var crypt = data.Get <bool>("crypt"); var packet = DWRouter.GetMessage(data); var call = packet.ByteBuffer.ReadByte(); switch (call) { case 2: GetUserData(data, packet); break; } }
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); }
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 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 HandleClientAuth(MessageData data) { var packet = DWRouter.GetMessage(data); bool unknownBool; uint randomNumber; uint gameID; uint ticketLength; byte[] ticket; packet.BitBuffer.UseDataTypes = false; packet.BitBuffer.ReadBoolean(out unknownBool); packet.BitBuffer.UseDataTypes = true; packet.BitBuffer.ReadUInt32(out randomNumber); packet.BitBuffer.ReadUInt32(out gameID); packet.BitBuffer.ReadUInt32(out ticketLength); ticket = new byte[ticketLength]; packet.BitBuffer.ReadBytes((int)ticketLength, out ticket); var cid = data.Get <string>("cid"); // and the connection //var ci = TCPHandler.Connections.Find(c => c.ConnectionID == cid); var SourceSocket = cid.Split(':'); // create state var state = new ClientAuthstate() { GameID = gameID, Ticket = ticket, Packet = packet, Random = randomNumber, OddBool = unknownBool, Source = SourceSocket[0] }; // start thread var thread = new Thread(DoClientAuth); thread.Start(state); }
public static void Net_TcpDisconnected(MessageData data) { /*ulong userID = 0; * * lock (DWRouter.Connections) * { * userID = (from conn in DWRouter.Connections * where conn.Value == data.Get<string>("cid") * select conn.Key).FirstOrDefault(); * }*/ ulong userID = DWRouter.GetIDForData(data);; if (userID == 0) { return; } RemoveUserGroups(userID); }
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); }
public void Send(bool encrypted) { var buffer = (BitBuffer != null) ? BitBuffer.Bytes : ByteBuffer.Bytes; byte[] array = null; if (!encrypted) { array = new byte[buffer.Length + 6]; Array.Copy(BitConverter.GetBytes(buffer.Length + 2), 0, array, 0, 4); array[4] = 0; array[5] = (byte)Data.Get <int>("type"); Array.Copy(buffer, 0, array, 6, buffer.Length); } else { array = new byte[buffer.Length + 4 + 4 + 1]; Array.Copy(BitConverter.GetBytes(buffer.Length + 5), 0, array, 0, 4); array[4] = 1; Array.Copy(BitConverter.GetBytes(0x13371337), 0, array, 5, 4); var iv = DWCrypto.CalculateInitialVector(0x13371337); var key = DWRouter.GetGlobalKey(Data); var crypted = DWCrypto.Encrypt(iv, key, buffer); Array.Resize(ref array, crypted.Length + 4 + 4 + 1); Array.Copy(BitConverter.GetBytes(array.Length - 4), 0, array, 0, 4); Array.Copy(crypted, 0, array, 9, crypted.Length); } //Log.Debug("sending a reply"); Data.Arguments["handled"] = true; MessageData message = new MessageData("none"); message["data"] = array; message["cid"] = Data["cid"]; TCPHandler.Net_TcpSend(message); }
private static void HandleServerAuth(MessageData data) { var packet = DWRouter.GetMessage(data); bool unknownBool; uint randomNumber; uint gameID; byte[] keyDataBuf = new byte[8]; packet.BitBuffer.UseDataTypes = false; packet.BitBuffer.ReadBoolean(out unknownBool); packet.BitBuffer.UseDataTypes = true; packet.BitBuffer.ReadUInt32(out randomNumber); packet.BitBuffer.ReadUInt32(out gameID); packet.BitBuffer.Read(64, keyDataBuf); // create state var state = new ServerAuthstate() { GameID = gameID, KeyData = BitConverter.ToUInt64(keyDataBuf, 0), Packet = packet, Random = randomNumber, OddBool = unknownBool }; // start thread if (Program.Game == TitleID.T5) { var thread = new Thread(DoServerAuth); thread.Start(state); } else if (Program.Game == TitleID.IW5) { var thread = new Thread(DoIW5ServerAuth); thread.Start(state); } }
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 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); } }
void CloseSocket(SocketAsyncEventArgs e) { try { var client = (TCPClient)e.UserToken; lock (_clients) { _clients.Remove(client.ConnectionID); } MessageData message = new MessageData("none"); message["source"] = client.socket.RemoteEndPoint; message["cid"] = client.ConnectionID; try { DWMatch.Net_TcpDisconnected(message); DWGroups.Net_TcpDisconnected(message); DWRouter.Net_TcpDisconnected(message); } catch (Exception ex) { Log.Error(ex.ToString()); } try { client.socket.Shutdown(SocketShutdown.Both); } catch { } client.socket.Close(); } catch (Exception ex) { Log.Error(ex.ToString()); } }
public static void DW_PacketReceived(MessageData data) { var type = data.Get <int>("type"); var crypt = data.Get <bool>("crypt"); if (type == 12 && crypt) { var packet = DWRouter.GetMessage(data); var call = packet.ByteBuffer.ReadByte(); switch (call) { case 6: GetServerTime(data, packet); break; default: //DWRouter.Unknown(data, packet); Log.Info("unknown packet " + call + " in bdTitleUtilities"); break; } } }
public static void DW_PacketReceived(MessageData data) { var type = data.Get <int>("type"); var crypt = data.Get <bool>("crypt"); if (type == 21) { var packet = DWRouter.GetMessage(data); var call = packet.ByteBuffer.ReadByte(); try { switch (call) { case 1: CreateSession(data, packet); break; case 2: UpdateSession(data, packet); break; case 3: DeleteSession(data, packet); break; case 4: FindSessionFromID(data, packet); break; case 5: FindSessions(data, packet); break; case 8: InviteToSession(data, packet); break; case 9: SubmitPerformance(data, packet); break; case 10: GetPerformanceValues(data, packet); break; case 12: UpdateSessionPlayers(data, packet); break; case 13: FindSessionsPaged(data, packet); break; case 14: FindSessionsByEntityIDs(data, packet); break; default: Log.Debug("unknown packet " + call + " in bdMatchMaking"); //DWRouter.Unknown(data, packet); break; } } catch (Exception e) { Log.Error(e.ToString()); } } }
public static void DW_PacketReceived(MessageData data) { var type = data.Get <int>("type"); var crypt = data.Get <bool>("crypt"); var weHandle = ((type == 10) || (type == 18) || (type == 8 || (crypt && type == 28) || type == 50 || type == 4 || type == 58) || (type == 23)); try { if (type == 10) { var packet = DWRouter.GetMessage(data); var call = packet.ByteBuffer.ReadByte(); var initTime = DateTime.Now; switch (call) { case 1: UploadFile(data, packet); break; case 3: GetFile(data, packet); break; case 7: GetPublisherFile(data, packet); break; default: Log.Debug("unknown packet " + call + " in bdStorage"); DWRouter.Unknown(data, packet); break; } } else if (type == 18) { try { var packet = DWRouter.GetMessage(data); var reply = packet.MakeReply(5, false); reply.ByteBuffer.Write(new byte[] { 0x2d, 0xb3, 0xa2, 0x4f, 0x1a, 0x36, 0xd0, 0xd2, 0x00, 0x00, 0x04, 0x00, 0x00, 0xee, 0x02, 0x00, 0x00, 0xf4, 0x01, 0x00, 0x00, 0xd0, 0x07, 0x00, 0x00, 0x10, 0x27, 0x00, 0x00, 0x88, 0x13, 0x00, 0x00, 0xf4, 0x01, 0x00, 0x00, 0x02, 0x0c, 0xd1, 0xaa, 0x7a, 0xb1, 0x31, 0xb1, 0xaa, 0x6b, 0x83, 0x51, 0x00, 0x00 }); reply.Send(true); } catch { } } else if (type == 8 || (crypt && type == 28) || type == 50 || type == 4 || type == 58) { try { var packet = DWRouter.GetMessage(data); try { var call = packet.ByteBuffer.ReadByte(); //Log.Debug("Service call identifier is " + call + "."); } catch { } //DWRouter.Unknown(data, packet); } catch { } } else if (type == 23) { try { var packet = DWRouter.GetMessage(data); var call = packet.ByteBuffer.ReadByte(); switch (call) { case 2: GetCounterTotals(data, packet); break; default: Log.Debug("unknown packet " + call + " in bdCounter"); //DWRouter.Unknown(data, packet); break; } } catch { } } /*else if (type != 12 && crypt) * { * var packet = DWRouter.GetMessage(data); * DWRouter.Unknown(data, packet); * }*/ } catch (Exception e) { Log.Error(e.ToString()); } if (weHandle) { var upacket = DWRouter.GetMessage(data); } }
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 void redirectPacket(MessageData data) { data.Arguments["handled"] = false; var type = data.Get <int>("type"); var crypt = data.Get <bool>("crypt"); bool routed = false; try { if (!crypt && (type == 28 || type == 12 || type == 26)) { DWAuther.DW_PacketReceived(data); routed = true; //Log.Debug("got auth packet"); } if (crypt && type == 28) { DWGroups.DW_PacketReceived(data); routed = true; } if (type == 7) { DWLobby.DW_PacketReceived(data); routed = true; //Log.Debug("got lobby packet"); } if (type == 6) { DWMessaging.DW_PacketReceived(data); routed = true; //Log.Debug("got service packet"); } if (type == 21) { DWMatch.DW_PacketReceived(data); routed = true; //Log.Debug("got match packet"); } if ((type == 10) || (type == 18) || (type == 23) || (type == 8 || type == 50 || type == 4 || type == 58)) { DWStorage.DW_PacketReceived(data); routed = true; //Log.Debug("got storage packet"); } if (type == 12 && crypt) { DWTitles.DW_PacketReceived(data); routed = true; //Log.Debug("got Title packet"); } if (type == 8) { DWProfiles.DW_PacketReceived(data); routed = true; } if (type == 27) { DWDML.DW_PacketReceived(data); } if (type == 67) { DWEventLog.DW_PacketReceived(data); } } catch (Exception e) { Log.Error("Exception: " + e.ToString()); } /*if(routed == false) * { * Log.Debug("UNHANDLED PACKET: " + type); * }*/ try { if (crypt && !data.Get <bool>("handled")) { DWRouter.Unknown(data, DWRouter.GetMessage(data)); } } catch { Log.Error("UNKNOWN FAILED, THIS CONNECTION CAN BE CONSIDERED DEAD."); // disconnect to prevent pollution of system TCPHandler.ForceDisconnect(data); } }
static void Main(string[] args) { Log.Initialize("DWServer.log", LogLevel.Data | LogLevel.Info | LogLevel.Error | LogLevel.Debug | LogLevel.Verbose, true); Log.Info("Starting DW server"); var game = (args.Length == 1) ? args[0] : "t5"; if (game == "t5") { Game = TitleID.T5; } else if (game == "iw5") { Game = TitleID.IW5; } /* * TCPHandler ipServer = new TCPHandler(3074); * ipServer.Start(); * TCPHandler ipServer3 = new TCPHandler(3077); * ipServer3.Start(); */ Database.Initialize(); DWRouter.OnStart(); //TCPHandler.OnStart(); var handler = new TCPHandler(); //default: 3074, deviain handler.Start((game == "t5") ? 3074 : 3078); Heatmap.StartThread(); HttpHandler.Start(); /*MessageData server2 = new MessageData("none"); * server2.Arguments["name"] = "demonware2"; * server2.Arguments["port"] = (int)3077; * TCPHandler.Net_TcpListen("none", server2);*/ new Thread(() => { while (true) { Thread.Sleep(30000); try { DWMatch.CleanSessions(); } catch (Exception e) { Log.Error(e.ToString()); } } }).Start(); new Thread(() => { while (true) { Thread.Sleep(30000);//30000 try { DWGroups.updateCache(); } catch (Exception e) { Log.Error(e.ToString()); } } }).Start(); while (true) { try { Log.WriteAway(); } catch (Exception e) { Log.Error(e.ToString()); } Thread.Sleep(1000); } }
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."); } }
public static void DW_PacketReceived(MessageData data) { var type = data.Get <int>("type"); if (type == 7) { var packet = DWRouter.GetMessage(data); bool initialBool; uint gameID, randomNumber; byte[] ticket; packet.BitBuffer.UseDataTypes = false; packet.BitBuffer.ReadBoolean(out initialBool); packet.BitBuffer.UseDataTypes = true; packet.BitBuffer.ReadUInt32(out gameID); packet.BitBuffer.ReadUInt32(out randomNumber); packet.BitBuffer.ReadBytes(128, out ticket); // parse LSG ticket var key = DWTickets.GetKeyFromLSGTicket(ticket); DWRouter.SetGlobalKey(packet.Data, key); lock (DWRouter.Connections) { var id = DWTickets.GetIDFromLSGTicket(ticket); DWRouter.Connections[id] = packet.Data.Get <string>("cid"); } lock (DWRouter.CIDToUser) { var id = DWTickets.GetUserFromLSGTicket(ticket); DWRouter.CIDToUser[packet.Data.Get <string>("cid")] = id; } lock (DWRouter.ConnectionsReverse) { var id = DWTickets.GetIDFromLSGTicket(ticket); DWRouter.ConnectionsReverse[packet.Data.Get <string>("cid")] = id; } lock (DWRouter.CIDToName) { var name = DWTickets.GetNameFromLSGTicket(ticket); DWRouter.CIDToName[packet.Data.Get <string>("cid")] = name; } lock (DWRouter.CIDToTitle) { var title = (TitleID)gameID; DWRouter.CIDToTitle[packet.Data.Get <string>("cid")] = title; } // now make a reply. /* * var reply = packet.MakeReply(1, false); * reply.ByteBuffer.Write(0x8000000000000000); * reply.ByteBuffer.Write(0); * reply.ByteBuffer.Write((byte)6); * reply.ByteBuffer.Write(1); * reply.ByteBuffer.Write(1); * reply.ByteBuffer.Write(0x12345678); * reply.Send(true);*/ } }