예제 #1
0
        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());
        }
예제 #2
0
        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());
        }
예제 #3
0
        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 { }
        }
예제 #4
0
        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.");
            }
        }
예제 #5
0
        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);
        }
예제 #6
0
        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);
        }
예제 #7
0
        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());
        }
예제 #8
0
        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);
        }
예제 #9
0
        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);
        }
예제 #10
0
        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);
        }
예제 #11
0
        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 { }
        }
예제 #12
0
        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);
        }
예제 #13
0
        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);
        }
예제 #14
0
        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);
            }
        }
예제 #15
0
        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());
            }
        }
예제 #16
0
        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);
        }
예제 #17
0
        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);
        }
예제 #18
0
        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);
        }
예제 #19
0
        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);
        }
예제 #20
0
        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);
        }
예제 #21
0
        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);
        }
예제 #22
0
        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());
        }
예제 #23
0
        // 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);
        }
예제 #24
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);
        }
예제 #25
0
        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);
        }
예제 #26
0
        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.");
            }
        }
예제 #27
0
        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());
            }
        }
예제 #28
0
        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);
            }
        }