/// <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); }
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); } } }