示例#1
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());
        }
示例#2
0
        public virtual void Deserialize(DWMessage packet)
        {
            Address = packet.ByteBuffer.ReadBlob();
            //UnknownBlob = packet.ByteBuffer.ReadBlob();
            Unknown1 = packet.ByteBuffer.ReadUInt32();
            Unknown2 = packet.ByteBuffer.ReadUInt32();
            //Unknown3 = packet.ByteBuffer.ReadUInt32();

            byte[] addrbytes = new byte[4];
            byte[] portbytes = new byte[2];
            Array.ConstrainedCopy(Address, 0, addrbytes, 0, 4);
            Array.ConstrainedCopy(Address, 4, portbytes, 0, 2);
            InternalIPAddress = BitConverter.ToUInt32(addrbytes, 0);
            InternalPort      = BitConverter.ToUInt16(portbytes, 0);

            addrbytes = new byte[4];
            portbytes = new byte[2];
            Array.ConstrainedCopy(Address, 18, addrbytes, 0, 4);
            Array.ConstrainedCopy(Address, 22, portbytes, 0, 2);
            IPAddress = BitConverter.ToUInt32(addrbytes, 0);
            Port      = BitConverter.ToUInt16(portbytes, 0);

            if (addrbytes[0] == 0)
            {
                IPAddress = InternalIPAddress;
                Port      = InternalPort;
            }
        }
示例#3
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());
        }
示例#4
0
        public override void Serialize(DWMessage packet)
        {
            base.Serialize(packet);

            packet.ByteBuffer.Write(NetcodeVersion);
            packet.ByteBuffer.WriteBlob(UnknownBlob2);
            packet.ByteBuffer.Write(HostName);
            packet.ByteBuffer.Write(UnknownLong1);
            packet.ByteBuffer.Write(MapName);
            packet.ByteBuffer.Write(GameType);
            packet.ByteBuffer.Write(Playlist);
            packet.ByteBuffer.Write(Unknown6);
            packet.ByteBuffer.Write(Unknown7);
            packet.ByteBuffer.Write(Unknown8);
            packet.ByteBuffer.Write(LicenseType);
            packet.ByteBuffer.Write(UnknownA);
            packet.ByteBuffer.Write(UnknownB);
            packet.ByteBuffer.Write(MaxPlayers);
            packet.ByteBuffer.Write(UnknownD);
            packet.ByteBuffer.Write(OnlineID);
            packet.ByteBuffer.Write(Wager);
            packet.ByteBuffer.Write(UnknownF);
            packet.ByteBuffer.Write(UnknownString3);
            packet.ByteBuffer.Write(UnknownLong3);
            packet.ByteBuffer.Write(StatDDL);
        }
示例#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
        public override void Deserialize(DWMessage packet)
        {
            base.Deserialize(packet);

            NetcodeVersion = packet.ByteBuffer.ReadInt32();
            UnknownBlob2   = packet.ByteBuffer.ReadBlob();
            HostName       = packet.ByteBuffer.ReadString();
            UnknownLong1   = packet.ByteBuffer.ReadUInt64();
            MapName        = DetermineMapName(packet.ByteBuffer.ReadString());
            GameType       = packet.ByteBuffer.ReadInt32();
            Playlist       = packet.ByteBuffer.ReadInt32();
            Unknown6       = packet.ByteBuffer.ReadInt32();
            Unknown7       = packet.ByteBuffer.ReadInt32();
            Unknown8       = packet.ByteBuffer.ReadInt32();
            LicenseType    = packet.ByteBuffer.ReadUInt32();
            UnknownA       = packet.ByteBuffer.ReadInt32();
            UnknownB       = packet.ByteBuffer.ReadInt32();
            MaxPlayers     = packet.ByteBuffer.ReadInt32();
            UnknownD       = packet.ByteBuffer.ReadInt32();
            OnlineID       = packet.ByteBuffer.ReadUInt64();
            Wager          = packet.ByteBuffer.ReadInt32();
            UnknownF       = packet.ByteBuffer.ReadInt32();
            UnknownString3 = packet.ByteBuffer.ReadString();
            UnknownLong3   = packet.ByteBuffer.ReadUInt64();
            StatDDL        = packet.ByteBuffer.ReadUInt32();
        }
示例#7
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 { }
        }
示例#8
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);
        }
示例#9
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());
        }
示例#10
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.");
            }
        }
示例#11
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);
        }
示例#12
0
 public virtual void Serialize(DWMessage packet)
 {
     packet.ByteBuffer.WriteBlob(Address);
     packet.ByteBuffer.WriteBlob(SessionID);
     packet.ByteBuffer.Write(Unknown1);
     packet.ByteBuffer.Write(Unknown2);
     packet.ByteBuffer.Write(Players);
 }
示例#13
0
            public void Deserialize(DWMessage packet)
            {
                if (Program.Game == TitleID.T5)
                {
                    UnknownInt = packet.ByteBuffer.ReadInt32();
                }

                ProfileData = packet.ByteBuffer.ReadBlob();
            }
示例#14
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 { }
        }
示例#15
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);
        }
示例#16
0
            public void Serialize(DWMessage packet)
            {
                packet.ByteBuffer.Write(UserID);

                if (Program.Game == TitleID.T5)
                {
                    packet.ByteBuffer.Write(UnknownInt);
                }

                packet.ByteBuffer.WriteBlob(ProfileData);
            }
示例#17
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);
        }
示例#18
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());
            }
        }
示例#19
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);
        }
示例#20
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);
        }
示例#21
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);
        }
示例#22
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);
        }
示例#23
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);
        }
示例#24
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);
        }
示例#25
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);
        }
示例#26
0
        public override void Serialize(DWMessage packet)
        {
            base.Serialize(packet);

            packet.ByteBuffer.Write(Unknown1);
            packet.ByteBuffer.Write(Playlist);
            packet.ByteBuffer.Write(PlaylistVersion);
            packet.ByteBuffer.Write(Unknown4);
            packet.ByteBuffer.Write(Unknown5);
            packet.ByteBuffer.Write(Unknown6);
            packet.ByteBuffer.Write(Unknown7);
            packet.ByteBuffer.Write(Unknown8);
            packet.ByteBuffer.Write(Unknown9);
            packet.ByteBuffer.Write(UnknownA);
            packet.ByteBuffer.Write(UnknownB);
            packet.ByteBuffer.WriteBlob(UnknownBlob);
            packet.ByteBuffer.Write(UnknownC);
            packet.ByteBuffer.Write(UnknownUInt1);
            packet.ByteBuffer.Write(UnknownUInt2);
            packet.ByteBuffer.Write(UnknownFloat1);
            packet.ByteBuffer.Write(UnknownFloat2);
            packet.ByteBuffer.Write(UnknownD);
            packet.ByteBuffer.Write(UnknownE);
            packet.ByteBuffer.Write(UnknownF);
            packet.ByteBuffer.Write(UnknownG);
            packet.ByteBuffer.Write(UnknownH);
            packet.ByteBuffer.Write(UnknownI);
            packet.ByteBuffer.Write(UnknownJ);
            packet.ByteBuffer.Write(UnknownK);
            packet.ByteBuffer.Write(UnknownL);
            packet.ByteBuffer.Write(UnknownM);
            packet.ByteBuffer.Write(UnknownN);
            packet.ByteBuffer.Write(UnknownO);
            packet.ByteBuffer.Write(UnknownP);
            packet.ByteBuffer.Write(UnknownQ);
            packet.ByteBuffer.Write(UnknownR);
            packet.ByteBuffer.Write(UnknownS);
            packet.ByteBuffer.Write(UnknownUInt64);
        }
示例#27
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);
        }
示例#28
0
        public override void Deserialize(DWMessage packet)
        {
            base.Deserialize(packet);

            Unknown1        = packet.ByteBuffer.ReadInt32();
            Playlist        = packet.ByteBuffer.ReadInt32();
            PlaylistVersion = packet.ByteBuffer.ReadInt32();
            Unknown4        = packet.ByteBuffer.ReadInt32();
            Unknown5        = packet.ByteBuffer.ReadInt32();
            Unknown6        = packet.ByteBuffer.ReadInt32();
            Unknown7        = packet.ByteBuffer.ReadInt32();
            Unknown8        = packet.ByteBuffer.ReadInt32();
            Unknown9        = packet.ByteBuffer.ReadInt32();
            UnknownA        = packet.ByteBuffer.ReadInt32();
            UnknownB        = packet.ByteBuffer.ReadInt32();
            UnknownBlob     = packet.ByteBuffer.ReadBlob();
            UnknownC        = packet.ByteBuffer.ReadInt32();
            UnknownUInt1    = packet.ByteBuffer.ReadUInt32();
            UnknownUInt2    = packet.ByteBuffer.ReadUInt32();
            UnknownFloat1   = packet.ByteBuffer.ReadFloat();
            UnknownFloat2   = packet.ByteBuffer.ReadFloat();
            UnknownD        = packet.ByteBuffer.ReadInt32();
            UnknownE        = packet.ByteBuffer.ReadInt32();
            UnknownF        = packet.ByteBuffer.ReadInt32();
            UnknownG        = packet.ByteBuffer.ReadInt32();
            UnknownH        = packet.ByteBuffer.ReadInt32();
            UnknownI        = packet.ByteBuffer.ReadInt32();
            UnknownJ        = packet.ByteBuffer.ReadInt32();
            UnknownK        = packet.ByteBuffer.ReadInt32();
            UnknownL        = packet.ByteBuffer.ReadInt32();
            UnknownM        = packet.ByteBuffer.ReadInt32();
            UnknownN        = packet.ByteBuffer.ReadInt32();
            UnknownO        = packet.ByteBuffer.ReadInt32();
            UnknownP        = packet.ByteBuffer.ReadInt32();
            UnknownQ        = packet.ByteBuffer.ReadInt32();
            UnknownR        = packet.ByteBuffer.ReadInt32();
            UnknownS        = packet.ByteBuffer.ReadInt32();
            UnknownUInt64   = packet.ByteBuffer.ReadUInt64();
        }
示例#29
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);
            }
        }
示例#30
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());
        }