// Copyright (c) 2007-2017 ppy Pty Ltd . // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE using System; using System.Collections.Generic; using System.Linq; using Newtonsoft.Json; using osu.Game.Beatmaps; using osu.Game.Rulesets; using osu.Game.Users; using osu.Game.Rulesets.Replays; using osu.Game.Rulesets.Scoring; using osu.Game.Screens.Select.Leaderboards; using System.Collections.Specialized; using osu.Framework.IO.Network; namespace osu.Game.Online.API.Requests { public class GetScoresRequest : APIRequest { private readonly BeatmapInfo beatmap; private readonly LeaderboardScope scope; private readonly RulesetInfo ruleset; public GetScoresRequest(BeatmapInfo beatmap) { if (!beatmap.OnlineBeatmapID.HasValue) throw new InvalidOperationException($"Cannot lookup a beatmap's scores without having a populated {nameof(BeatmapInfo.OnlineBeatmapID)}."); this.beatmap = beatmap; Success += onSuccess; } public GetScoresRequest(BeatmapInfo beatmap, RulesetInfo ruleset, LeaderboardScope scope = LeaderboardScope.Global) { if (!beatmap.OnlineBeatmapID.HasValue) throw new InvalidOperationException($"Cannot lookup a beatmap's scores without having a populated {nameof(BeatmapInfo.OnlineBeatmapID)}."); this.beatmap = beatmap; this.scope = scope; this.ruleset = ruleset; Success += onSuccess; } private void onSuccess(GetScoresResponse r) { foreach (OnlineScore score in r.Scores) score.ApplyBeatmap(beatmap); } protected override WebRequest CreateWebRequest() { var req = base.CreateWebRequest(); switch(scope) { default: case LeaderboardScope.Global: req.AddParameter(@"type", @"global"); break; case LeaderboardScope.Friends: req.AddParameter(@"type", @"friend"); break; case LeaderboardScope.Country: req.AddParameter(@"type", @"country"); break; } if (ruleset != null) { switch (ruleset.Name) { default: case @"osu!": req.AddParameter(@"mode", @"osu"); break; case @"osu!taiko": req.AddParameter(@"mode", @"taiko"); break; case @"osu!catch": req.AddParameter(@"mode", @"catch"); break; case @"osu!mania": req.AddParameter(@"mode", @"mania"); break; } } return req; } protected override string Target => $@"beatmaps/{beatmap.OnlineBeatmapID}/scores"; } public class GetScoresResponse { [JsonProperty(@"scores")] public IEnumerable Scores; } public class OnlineScore : Score { [JsonProperty(@"score")] private double totalScore { set { TotalScore = value; } } [JsonProperty(@"max_combo")] private int maxCombo { set { MaxCombo = value; } } [JsonProperty(@"user")] private User user { set { User = value; } } [JsonProperty(@"replay_data")] private Replay replay { set { Replay = value; } } [JsonProperty(@"mode_int")] public int OnlineRulesetID { get; set; } [JsonProperty(@"score_id")] private long onlineScoreID { set { OnlineScoreID = value; } } [JsonProperty(@"created_at")] private DateTimeOffset date { set { Date = value; } } [JsonProperty(@"beatmap")] private BeatmapInfo beatmap { set { Beatmap = value; } } [JsonProperty(@"beatmapset")] private BeatmapMetadata metadata { set { Beatmap.Metadata = value; } } [JsonProperty(@"statistics")] private Dictionary jsonStats { set { foreach (var kvp in value) { string key = kvp.Key; switch (key) { case @"count_300": key = @"300"; break; case @"count_100": key = @"100"; break; case @"count_50": key = @"50"; break; case @"count_miss": key = @"x"; break; default: continue; } Statistics.Add(key, kvp.Value); } } } [JsonProperty(@"mods")] private string[] modStrings { get; set; } public void ApplyBeatmap(BeatmapInfo beatmap) { Beatmap = beatmap; ApplyRuleset(beatmap.Ruleset); } public void ApplyRuleset(RulesetInfo ruleset) { Ruleset = ruleset; // Evaluate the mod string Mods = Ruleset.CreateInstance().GetAllMods().Where(mod => modStrings.Contains(mod.ShortenedName)).ToArray(); } } }