1
0
mirror of https://github.com/ppy/osu.git synced 2025-02-13 15:03:13 +08:00

Standardise request/response handling

This commit is contained in:
Dean Herbert 2019-12-05 14:26:36 +09:00
parent cd473f207a
commit 6e9157d59c
2 changed files with 55 additions and 49 deletions

View File

@ -8,13 +8,14 @@ namespace osu.Game.Online.API.Requests
{
public class GetUserRankingsRequest : GetRankingsRequest<GetUsersResponse>
{
public readonly UserRankingsType Type;
private readonly string country;
private readonly UserRankingsType type;
public GetUserRankingsRequest(RulesetInfo ruleset, UserRankingsType type = UserRankingsType.Performance, int page = 1, string country = null)
: base(ruleset, page)
{
this.type = type;
this.Type = type;
this.country = country;
}
@ -28,7 +29,7 @@ namespace osu.Game.Online.API.Requests
return req;
}
protected override string TargetPostfix() => type.ToString().ToLowerInvariant();
protected override string TargetPostfix() => Type.ToString().ToLowerInvariant();
}
public enum UserRankingsType

View File

@ -26,10 +26,10 @@ namespace osu.Game.Overlays
private readonly BasicScrollContainer scrollFlow;
private readonly Box background;
private readonly Container contentPlaceholder;
private readonly Container tableContainer;
private readonly DimmedLoadingLayer loading;
private APIRequest request;
private APIRequest lastRequest;
private CancellationTokenSource cancellationToken;
[Resolved]
@ -68,7 +68,7 @@ namespace osu.Game.Overlays
AutoSizeAxes = Axes.Y,
Children = new Drawable[]
{
contentPlaceholder = new Container
tableContainer = new Container
{
Anchor = Anchor.TopCentre,
Origin = Anchor.TopCentre,
@ -132,76 +132,81 @@ namespace osu.Game.Overlays
private void loadNewContent()
{
scrollFlow.ScrollToStart();
loading.Show();
cancellationToken?.Cancel();
request?.Cancel();
lastRequest?.Cancel();
var request = createScopedRequest();
lastRequest = request;
if (request == null)
{
loadTable(null);
return;
}
request.Success += () => loadTable(createTableFromResponse(request));
request.Failure += _ => loadTable(null);
api.Queue(request);
}
private APIRequest createScopedRequest()
{
switch (scope.Value)
{
default:
contentPlaceholder.Clear();
loading.Hide();
return;
case RankingsScope.Performance:
createPerformanceTable();
return;
return new GetUserRankingsRequest(ruleset.Value, country: country.Value?.FlagName);
case RankingsScope.Country:
createCountryTable();
return;
return new GetCountryRankingsRequest(ruleset.Value);
case RankingsScope.Score:
createScoreTable();
return;
}
return new GetUserRankingsRequest(ruleset.Value, UserRankingsType.Score);
}
private void createCountryTable()
{
request = new GetCountryRankingsRequest(ruleset.Value);
((GetCountryRankingsRequest)request).Success += rankings => Schedule(() =>
{
var table = new CountriesTable(1, rankings.Countries);
loadTable(table);
});
api.Queue(request);
return null;
}
private void createPerformanceTable()
private Drawable createTableFromResponse(APIRequest request)
{
request = new GetUserRankingsRequest(ruleset.Value, country: country.Value?.FlagName);
((GetUserRankingsRequest)request).Success += rankings => Schedule(() =>
switch (request)
{
var table = new PerformanceTable(1, rankings.Users);
loadTable(table);
});
case GetUserRankingsRequest userRequest:
switch (userRequest.Type)
{
case UserRankingsType.Performance:
return new PerformanceTable(1, userRequest.Result.Users);
api.Queue(request);
case UserRankingsType.Score:
return new ScoresTable(1, userRequest.Result.Users);
}
private void createScoreTable()
{
request = new GetUserRankingsRequest(ruleset.Value, UserRankingsType.Score);
((GetUserRankingsRequest)request).Success += rankings => Schedule(() =>
{
var table = new ScoresTable(1, rankings.Users);
loadTable(table);
});
return null;
api.Queue(request);
case GetCountryRankingsRequest countryRequest:
return new CountriesTable(1, countryRequest.Result.Countries);
}
return null;
}
private void loadTable(Drawable table)
{
scrollFlow.ScrollToStart();
if (table == null)
{
tableContainer.Clear();
loading.Hide();
return;
}
LoadComponentAsync(table, t =>
{
contentPlaceholder.Child = t;
loading.Hide();
tableContainer.Child = table;
}, (cancellationToken = new CancellationTokenSource()).Token);
}
}