Beispiel #1
0
        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);
            }
        }
Beispiel #2
0
        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));
            }
        }
Beispiel #3
0
        /// <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);
        }
Beispiel #4
0
        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);
                    }
                }
            }
        }