private void reloadReplays() { loadReplay.Enabled = false; replaySelect.Items.Clear(); scoreDb = DatabaseDecoder.DecodeScores(Path.Combine(osuRoot, "scores.db")); scoreDb.Scores.Sort((a, b) => { var aS = a.Item2; var bS = b.Item2; if (aS.Count == 0) { return(1); } if (bS.Count == 0) { return(-1); } aS.Sort((x, y) => DateTime.Compare(y.ScoreTimestamp, x.ScoreTimestamp)); bS.Sort((x, y) => DateTime.Compare(y.ScoreTimestamp, x.ScoreTimestamp)); return(DateTime.Compare(bS[0].ScoreTimestamp, aS[0].ScoreTimestamp)); }); mapSelect.Items.Clear(); foreach (var tp in scoreDb.Scores) { var map = mapsByHash[tp.Item1]; mapSelect.Items.Add(map.FileName); } }
public async Task <IActionResult> AddNewOrUpdateScores([FromBody] GroupScoresRequest request) { BaseResponse response = new BaseResponse(); if (!ModelState.IsValid) { response.Success = false; response.ExceptionObject = new Exception(NotValidRequest, new Exception(ModelState.Values.First().Errors.First().ErrorMessage)); return(BadRequest(response)); } try { ScoresDatabase scoresDatabase = new ScoresDatabase(_context); var validateResult = ValidateRequest(request.Data); if (validateResult != null) { return(validateResult); } ScoreBuilder scoreBuilder = new ScoreBuilder(); scoresDatabase.AddNewOrUpdateScores(scoreBuilder.BuildScores(request.Data)); await _context.SaveChangesAsync(); var scores = scoresDatabase.GetAllFromTheTableScore().ToList(); if (scores.Any()) { GroupScoreCounter groupScoreCounter = new GroupScoreCounter(scores); IDictionary <string, IDictionary <string, int> > groupResults = groupScoreCounter.SortListAccordingGroup(request.RetrieveGroups); response.Result = groupResults; } response.Success = true; return(Ok(response)); } catch (Exception e) { response.Success = false; response.ExceptionObject = e; return(BadRequest(response)); } }
/// <summary> /// Parses scores.db file. /// </summary> /// <param name="stream">Stream containing scores.db data.</param> /// <returns>A usable <see cref="ScoresDatabase"/>.</returns> public static ScoresDatabase DecodeScores(Stream stream) { ScoresDatabase db = new ScoresDatabase(); using (var r = new SerializationReader(stream)) { db.OsuVersion = r.ReadInt32(); int beatmapCount = r.ReadInt32(); for (int i = 0; i < beatmapCount; i++) { string md5Hash = r.ReadString(); int scoresCount = r.ReadInt32(); List <Score> scores = new List <Score>(); for (int j = 0; j < scoresCount; j++) { Score score = new Score(); score.Ruleset = (Ruleset)r.ReadByte(); score.OsuVersion = r.ReadInt32(); score.BeatmapMD5Hash = r.ReadString(); score.PlayerName = r.ReadString(); score.ReplayMD5Hash = r.ReadString(); score.Count300 = r.ReadUInt16(); score.Count100 = r.ReadUInt16(); score.Count50 = r.ReadUInt16(); score.CountGeki = r.ReadUInt16(); score.CountKatu = r.ReadUInt16(); score.CountMiss = r.ReadUInt16(); score.ReplayScore = r.ReadInt32(); score.Combo = r.ReadUInt16(); score.PerfectCombo = r.ReadBoolean(); score.Mods = (Mods)r.ReadInt32(); string lifeBarGraphData = r.ReadString(); score.ScoreTimestamp = r.ReadDateTime(); r.BaseStream.Seek(sizeof(int), SeekOrigin.Current); score.ScoreId = r.ReadInt64(); scores.Add(score); } db.Scores.Add(new Tuple <string, List <Score> >(md5Hash, scores)); } } return(db); }
public static void EncodeScoresDatabase(string path, ScoresDatabase db) { using (SerializationWriter writer = new SerializationWriter(new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.Read))) { writer.Write(db.OsuVersion); writer.Write(db.Scores.Count); foreach (var beatmap in db.Scores) { writer.Write(beatmap.Item1); //md5 writer.Write(beatmap.Item2.Count); foreach (var score in beatmap.Item2) //scores { writer.Write((byte)score.Ruleset); writer.Write(score.OsuVersion); writer.Write(score.BeatmapMD5Hash); writer.Write(score.PlayerName); writer.Write(score.ReplayMD5Hash); writer.Write(score.Count300); writer.Write(score.Count100); writer.Write(score.Count50); writer.Write(score.CountGeki); writer.Write(score.CountKatu); writer.Write(score.CountMiss); writer.Write(score.ReplayScore); writer.Write(score.Combo); writer.Write(score.PerfectCombo); writer.Write((int)score.Mods); writer.Write(string.Empty); //TODO: figure out what this is, probably life bar graph data writer.Write(score.ScoreTimestamp); writer.Write(-1); //Should always be -1 writer.Write(score.ScoreId); } } } }