mirror of
https://github.com/ppy/osu.git
synced 2025-01-26 12:45:09 +08:00
Merge pull request #26356 from stanriders/global-user-statistics
Add `Statistics` bindable to `IAPIProvider` and update it from `SoloStatisticsWatcher`
This commit is contained in:
commit
a3b63391fa
@ -268,6 +268,26 @@ namespace osu.Game.Tests.Visual.Online
|
|||||||
AddAssert("update not received", () => update == null);
|
AddAssert("update not received", () => update == null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestGlobalStatisticsUpdatedAfterRegistrationAddedAndScoreProcessed()
|
||||||
|
{
|
||||||
|
int userId = getUserId();
|
||||||
|
long scoreId = getScoreId();
|
||||||
|
setUpUser(userId);
|
||||||
|
|
||||||
|
var ruleset = new OsuRuleset().RulesetInfo;
|
||||||
|
|
||||||
|
SoloStatisticsUpdate? update = null;
|
||||||
|
registerForUpdates(scoreId, ruleset, receivedUpdate => update = receivedUpdate);
|
||||||
|
|
||||||
|
feignScoreProcessing(userId, ruleset, 5_000_000);
|
||||||
|
|
||||||
|
AddStep("signal score processed", () => ((ISpectatorClient)spectatorClient).UserScoreProcessed(userId, scoreId));
|
||||||
|
AddUntilStep("update received", () => update != null);
|
||||||
|
AddAssert("local user values are correct", () => dummyAPI.LocalUser.Value.Statistics.TotalScore, () => Is.EqualTo(5_000_000));
|
||||||
|
AddAssert("statistics values are correct", () => dummyAPI.Statistics.Value!.TotalScore, () => Is.EqualTo(5_000_000));
|
||||||
|
}
|
||||||
|
|
||||||
private int nextUserId = 2000;
|
private int nextUserId = 2000;
|
||||||
private long nextScoreId = 50000;
|
private long nextScoreId = 50000;
|
||||||
|
|
||||||
|
@ -53,6 +53,7 @@ namespace osu.Game.Online.API
|
|||||||
public IBindable<APIUser> LocalUser => localUser;
|
public IBindable<APIUser> LocalUser => localUser;
|
||||||
public IBindableList<APIUser> Friends => friends;
|
public IBindableList<APIUser> Friends => friends;
|
||||||
public IBindable<UserActivity> Activity => activity;
|
public IBindable<UserActivity> Activity => activity;
|
||||||
|
public IBindable<UserStatistics> Statistics => statistics;
|
||||||
|
|
||||||
public Language Language => game.CurrentLanguage.Value;
|
public Language Language => game.CurrentLanguage.Value;
|
||||||
|
|
||||||
@ -65,6 +66,8 @@ namespace osu.Game.Online.API
|
|||||||
private Bindable<UserStatus?> configStatus { get; } = new Bindable<UserStatus?>();
|
private Bindable<UserStatus?> configStatus { get; } = new Bindable<UserStatus?>();
|
||||||
private Bindable<UserStatus?> localUserStatus { get; } = new Bindable<UserStatus?>();
|
private Bindable<UserStatus?> localUserStatus { get; } = new Bindable<UserStatus?>();
|
||||||
|
|
||||||
|
private Bindable<UserStatistics> statistics { get; } = new Bindable<UserStatistics>();
|
||||||
|
|
||||||
protected bool HasLogin => authentication.Token.Value != null || (!string.IsNullOrEmpty(ProvidedUsername) && !string.IsNullOrEmpty(password));
|
protected bool HasLogin => authentication.Token.Value != null || (!string.IsNullOrEmpty(ProvidedUsername) && !string.IsNullOrEmpty(password));
|
||||||
|
|
||||||
private readonly CancellationTokenSource cancellationToken = new CancellationTokenSource();
|
private readonly CancellationTokenSource cancellationToken = new CancellationTokenSource();
|
||||||
@ -517,9 +520,21 @@ namespace osu.Game.Online.API
|
|||||||
flushQueue();
|
flushQueue();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void UpdateStatistics(UserStatistics newStatistics)
|
||||||
|
{
|
||||||
|
statistics.Value = newStatistics;
|
||||||
|
|
||||||
|
if (IsLoggedIn)
|
||||||
|
localUser.Value.Statistics = newStatistics;
|
||||||
|
}
|
||||||
|
|
||||||
private static APIUser createGuestUser() => new GuestUser();
|
private static APIUser createGuestUser() => new GuestUser();
|
||||||
|
|
||||||
private void setLocalUser(APIUser user) => Scheduler.Add(() => localUser.Value = user, false);
|
private void setLocalUser(APIUser user) => Scheduler.Add(() =>
|
||||||
|
{
|
||||||
|
localUser.Value = user;
|
||||||
|
statistics.Value = user.Statistics;
|
||||||
|
}, false);
|
||||||
|
|
||||||
protected override void Dispose(bool isDisposing)
|
protected override void Dispose(bool isDisposing)
|
||||||
{
|
{
|
||||||
|
@ -28,6 +28,8 @@ namespace osu.Game.Online.API
|
|||||||
|
|
||||||
public Bindable<UserActivity> Activity { get; } = new Bindable<UserActivity>();
|
public Bindable<UserActivity> Activity { get; } = new Bindable<UserActivity>();
|
||||||
|
|
||||||
|
public Bindable<UserStatistics?> Statistics { get; } = new Bindable<UserStatistics?>();
|
||||||
|
|
||||||
public Language Language => Language.en;
|
public Language Language => Language.en;
|
||||||
|
|
||||||
public string AccessToken => "token";
|
public string AccessToken => "token";
|
||||||
@ -115,6 +117,12 @@ namespace osu.Game.Online.API
|
|||||||
Id = DUMMY_USER_ID,
|
Id = DUMMY_USER_ID,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Statistics.Value = new UserStatistics
|
||||||
|
{
|
||||||
|
GlobalRank = 1,
|
||||||
|
CountryRank = 1
|
||||||
|
};
|
||||||
|
|
||||||
state.Value = APIState.Online;
|
state.Value = APIState.Online;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -126,6 +134,14 @@ namespace osu.Game.Online.API
|
|||||||
LocalUser.Value = new GuestUser();
|
LocalUser.Value = new GuestUser();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void UpdateStatistics(UserStatistics newStatistics)
|
||||||
|
{
|
||||||
|
Statistics.Value = newStatistics;
|
||||||
|
|
||||||
|
if (IsLoggedIn)
|
||||||
|
LocalUser.Value.Statistics = newStatistics;
|
||||||
|
}
|
||||||
|
|
||||||
public IHubClientConnector? GetHubConnector(string clientName, string endpoint, bool preferMessagePack) => null;
|
public IHubClientConnector? GetHubConnector(string clientName, string endpoint, bool preferMessagePack) => null;
|
||||||
|
|
||||||
public NotificationsClientConnector GetNotificationsConnector() => new PollingNotificationsClientConnector(this);
|
public NotificationsClientConnector GetNotificationsConnector() => new PollingNotificationsClientConnector(this);
|
||||||
@ -141,6 +157,7 @@ namespace osu.Game.Online.API
|
|||||||
IBindable<APIUser> IAPIProvider.LocalUser => LocalUser;
|
IBindable<APIUser> IAPIProvider.LocalUser => LocalUser;
|
||||||
IBindableList<APIUser> IAPIProvider.Friends => Friends;
|
IBindableList<APIUser> IAPIProvider.Friends => Friends;
|
||||||
IBindable<UserActivity> IAPIProvider.Activity => Activity;
|
IBindable<UserActivity> IAPIProvider.Activity => Activity;
|
||||||
|
IBindable<UserStatistics?> IAPIProvider.Statistics => Statistics;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// During the next simulated login, the process will fail immediately.
|
/// During the next simulated login, the process will fail immediately.
|
||||||
|
@ -28,6 +28,11 @@ namespace osu.Game.Online.API
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
IBindable<UserActivity> Activity { get; }
|
IBindable<UserActivity> Activity { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The current user's online statistics.
|
||||||
|
/// </summary>
|
||||||
|
IBindable<UserStatistics?> Statistics { get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The language supplied by this provider to API requests.
|
/// The language supplied by this provider to API requests.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -111,6 +116,11 @@ namespace osu.Game.Online.API
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
void Logout();
|
void Logout();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Sets Statistics bindable.
|
||||||
|
/// </summary>
|
||||||
|
void UpdateStatistics(UserStatistics newStatistics);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Constructs a new <see cref="IHubClientConnector"/>. May be null if not supported.
|
/// Constructs a new <see cref="IHubClientConnector"/>. May be null if not supported.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -127,6 +127,8 @@ namespace osu.Game.Online.Solo
|
|||||||
{
|
{
|
||||||
string rulesetName = callback.Score.Ruleset.ShortName;
|
string rulesetName = callback.Score.Ruleset.ShortName;
|
||||||
|
|
||||||
|
api.UpdateStatistics(updatedStatistics);
|
||||||
|
|
||||||
if (latestStatistics == null)
|
if (latestStatistics == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user