예제 #1
0
        /// <summary>
        /// Parses presence.db file.
        /// </summary>
        /// <param name="stream">Stream containing presence.db data.</param>
        /// <returns>A usable <see cref="PresenceDatabase"/>.</returns>
        public static PresenceDatabase DecodePresence(Stream stream)
        {
            PresenceDatabase db = new PresenceDatabase();

            using (var r = new SerializationReader(stream))
            {
                db.OsuVersion = r.ReadInt32();
                int playersCount = r.ReadInt32();

                for (int i = 0; i < playersCount; i++)
                {
                    Player player = new Player();
                    player.UserId      = r.ReadInt32();
                    player.Username    = r.ReadString();
                    player.Timezone    = r.ReadByte() - 24;
                    player.CountryCode = r.ReadByte();
                    byte b = r.ReadByte();
                    player.Permissions    = (Permissions)(b & ~0xe0);
                    player.Ruleset        = (Ruleset)Math.Max(0, Math.Min(3, ((b & 0xe0) >> 5)));
                    player.Longitude      = r.ReadSingle();
                    player.Latitude       = r.ReadSingle();
                    player.Rank           = r.ReadInt32();
                    player.LastUpdateTime = r.ReadDateTime();
                    db.Players.Add(player);
                }
            }

            return(db);
        }
예제 #2
0
        public static void EncodePresenceDatabase(string path, PresenceDatabase db)
        {
            using (SerializationWriter writer = new SerializationWriter(new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.Read)))
            {
                writer.Write(db.OsuVersion);
                writer.Write(db.Players.Count);

                foreach (var player in db.Players)
                {
                    writer.Write(player.UserId);
                    writer.Write(player.Username);
                    writer.Write((byte)(player.Timezone + 24));
                    writer.Write(player.CountryCode);
                    writer.Write((byte)(((byte)player.Permissions & 0x1f) | (((byte)player.Ruleset & 0x7) << 5)));
                    writer.Write(player.Longitude);
                    writer.Write(player.Latitude);
                    writer.Write(player.Rank);
                    writer.Write(player.LastUpdateTime);
                }
            }
        }