1
0
mirror of https://github.com/ppy/osu.git synced 2024-12-14 09:32:55 +08:00

Remove local score copying in GetScoresRequest to allow APIScoreInfo.Beatmap to be APIBeatmap

This commit is contained in:
Dean Herbert 2021-10-29 14:14:25 +09:00
parent 54073d8a1e
commit 3f030cebf4
6 changed files with 16 additions and 46 deletions

View File

@ -9,7 +9,6 @@ using osu.Game.Online.API.Requests.Responses;
using osu.Game.Rulesets.Mods;
using System.Text;
using System.Collections.Generic;
using System.Diagnostics;
namespace osu.Game.Online.API.Requests
{
@ -32,27 +31,6 @@ namespace osu.Game.Online.API.Requests
this.scope = scope;
this.ruleset = ruleset ?? throw new ArgumentNullException(nameof(ruleset));
this.mods = mods ?? Array.Empty<IMod>();
Success += onSuccess;
}
private void onSuccess(APIScoresCollection r)
{
Debug.Assert(ruleset.OnlineID >= 0);
foreach (APIScoreInfo score in r.Scores)
{
score.Beatmap = beatmapInfo;
score.OnlineRulesetID = ruleset.OnlineID;
}
var userScore = r.UserScore;
if (userScore != null)
{
userScore.Score.Beatmap = beatmapInfo;
userScore.Score.OnlineRulesetID = ruleset.OnlineID;
}
}
protected override string Target => $@"beatmaps/{beatmapInfo.OnlineBeatmapID}/scores{createQueryParameters()}";

View File

@ -39,7 +39,7 @@ namespace osu.Game.Online.API.Requests.Responses
public DateTimeOffset Date { get; set; }
[JsonProperty(@"beatmap")]
public IBeatmapInfo Beatmap { get; set; }
public APIBeatmap Beatmap { get; set; }
[JsonProperty("accuracy")]
public double Accuracy { get; set; }
@ -71,10 +71,8 @@ namespace osu.Game.Online.API.Requests.Responses
[JsonConverter(typeof(StringEnumConverter))]
public ScoreRank Rank { get; set; }
IBeatmapInfo IScoreInfo.Beatmap => Beatmap;
// TODO: nuke
public ScoreInfo CreateScoreInfo(RulesetStore rulesets)
// TODO: This function will eventually be going away.
public ScoreInfo CreateScoreInfo(RulesetStore rulesets, BeatmapInfo beatmap = null)
{
var ruleset = rulesets.GetRuleset(OnlineRulesetID);
@ -94,7 +92,6 @@ namespace osu.Game.Online.API.Requests.Responses
OnlineScoreID = OnlineID,
Date = Date,
PP = PP,
BeatmapInfo = Beatmap.ToBeatmapInfo(rulesets),
RulesetID = OnlineRulesetID,
Hash = Replay ? "online" : string.Empty, // todo: temporary?
Rank = Rank,
@ -102,6 +99,9 @@ namespace osu.Game.Online.API.Requests.Responses
Mods = mods,
};
if (beatmap != null)
scoreInfo.BeatmapInfo = beatmap;
if (Statistics != null)
{
foreach (var kvp in Statistics)
@ -138,19 +138,10 @@ namespace osu.Game.Online.API.Requests.Responses
return scoreInfo;
}
[JsonProperty(@"beatmapset")]
public APIBeatmapSet Metadata
{
set
{
// in the deserialisation case we need to ferry this data across.
if (Beatmap is APIBeatmap apiBeatmap)
apiBeatmap.BeatmapSet = value;
}
}
public IRulesetInfo Ruleset => new RulesetInfo { ID = OnlineRulesetID };
IBeatmapInfo IScoreInfo.Beatmap => Beatmap;
Dictionary<HitResult, int> IScoreInfo.Statistics => new Dictionary<HitResult, int>(); // TODO: implement... maybe. hitresults have weird mappings per ruleset it would seem.
}
}

View File

@ -2,6 +2,7 @@
// See the LICENCE file in the repository root for full licence text.
using Newtonsoft.Json;
using osu.Game.Beatmaps;
using osu.Game.Rulesets;
using osu.Game.Scoring;
@ -15,10 +16,10 @@ namespace osu.Game.Online.API.Requests.Responses
[JsonProperty(@"score")]
public APIScoreInfo Score;
public ScoreInfo CreateScoreInfo(RulesetStore rulesets)
public ScoreInfo CreateScoreInfo(RulesetStore rulesets, BeatmapInfo beatmap = null)
{
var score = Score.CreateScoreInfo(rulesets);
var score = Score.CreateScoreInfo(rulesets, beatmap);
score.Position = Position;
return score;
}

View File

@ -66,7 +66,7 @@ namespace osu.Game.Overlays.BeatmapSet.Scores
if (value?.Scores.Any() != true)
return;
scoreManager.OrderByTotalScoreAsync(value.Scores.Select(s => s.CreateScoreInfo(rulesets)).ToArray(), loadCancellationSource.Token)
scoreManager.OrderByTotalScoreAsync(value.Scores.Select(s => s.CreateScoreInfo(rulesets, Beatmap.Value)).ToArray(), loadCancellationSource.Token)
.ContinueWith(ordered => Schedule(() =>
{
if (loadCancellationSource.IsCancellationRequested)
@ -78,7 +78,7 @@ namespace osu.Game.Overlays.BeatmapSet.Scores
scoreTable.Show();
var userScore = value.UserScore;
var userScoreInfo = userScore?.Score.CreateScoreInfo(rulesets);
var userScoreInfo = userScore?.Score.CreateScoreInfo(rulesets, Beatmap.Value);
topScoresContainer.Add(new DrawableTopScore(topScore));

View File

@ -31,7 +31,7 @@ namespace osu.Game.Screens.Ranking
return null;
getScoreRequest = new GetScoresRequest(Score.BeatmapInfo, Score.Ruleset);
getScoreRequest.Success += r => scoresCallback?.Invoke(r.Scores.Where(s => s.OnlineID != Score.OnlineScoreID).Select(s => s.CreateScoreInfo(rulesets)));
getScoreRequest.Success += r => scoresCallback?.Invoke(r.Scores.Where(s => s.OnlineID != Score.OnlineScoreID).Select(s => s.CreateScoreInfo(rulesets, Beatmap.Value.BeatmapInfo)));
return getScoreRequest;
}

View File

@ -192,14 +192,14 @@ namespace osu.Game.Screens.Select.Leaderboards
req.Success += r =>
{
scoreManager.OrderByTotalScoreAsync(r.Scores.Select(s => s.CreateScoreInfo(rulesets)).ToArray(), loadCancellationSource.Token)
scoreManager.OrderByTotalScoreAsync(r.Scores.Select(s => s.CreateScoreInfo(rulesets, BeatmapInfo)).ToArray(), loadCancellationSource.Token)
.ContinueWith(ordered => Schedule(() =>
{
if (loadCancellationSource.IsCancellationRequested)
return;
scoresCallback?.Invoke(ordered.Result);
TopScore = r.UserScore?.CreateScoreInfo(rulesets);
TopScore = r.UserScore?.CreateScoreInfo(rulesets, BeatmapInfo);
}), TaskContinuationOptions.OnlyOnRanToCompletion);
};