mirror of https://github.com/ppy/osu
Merge pull request #27180 from bdach/better-submission-failure-messaging
Add better submission failure messaging
This commit is contained in:
commit
c87bc8b597
|
@ -52,7 +52,7 @@ protected override GameplayLeaderboard CreateGameplayLeaderboard() =>
|
|||
Scores = { BindTarget = LeaderboardScores }
|
||||
};
|
||||
|
||||
protected override bool HandleTokenRetrievalFailure(Exception exception) => false;
|
||||
protected override bool ShouldExitOnTokenRetrievalFailure(Exception exception) => false;
|
||||
|
||||
protected override Task ImportScore(Score score)
|
||||
{
|
||||
|
|
|
@ -118,7 +118,7 @@ private bool handleTokenRetrieval()
|
|||
token = r.ID;
|
||||
tcs.SetResult(true);
|
||||
};
|
||||
req.Failure += handleTokenFailure;
|
||||
req.Failure += ex => handleTokenFailure(ex, displayNotification: true);
|
||||
|
||||
api.Queue(req);
|
||||
|
||||
|
@ -128,40 +128,49 @@ private bool handleTokenRetrieval()
|
|||
|
||||
return true;
|
||||
|
||||
void handleTokenFailure(Exception exception)
|
||||
void handleTokenFailure(Exception exception, bool displayNotification = false)
|
||||
{
|
||||
tcs.SetResult(false);
|
||||
|
||||
if (HandleTokenRetrievalFailure(exception))
|
||||
bool shouldExit = ShouldExitOnTokenRetrievalFailure(exception);
|
||||
|
||||
if (displayNotification || shouldExit)
|
||||
{
|
||||
string whatWillHappen = shouldExit
|
||||
? "Play in this state is not permitted."
|
||||
: "Your score will not be submitted.";
|
||||
|
||||
if (string.IsNullOrEmpty(exception.Message))
|
||||
Logger.Error(exception, "Failed to retrieve a score submission token.");
|
||||
Logger.Error(exception, $"Failed to retrieve a score submission token.\n\n{whatWillHappen}");
|
||||
else
|
||||
{
|
||||
switch (exception.Message)
|
||||
{
|
||||
case "expired token":
|
||||
Logger.Log("Score submission failed because your system clock is set incorrectly. Please check your system time, date and timezone.", level: LogLevel.Important);
|
||||
case @"missing token header":
|
||||
case @"invalid client hash":
|
||||
case @"invalid verification hash":
|
||||
Logger.Log($"Please ensure that you are using the latest version of the official game releases.\n\n{whatWillHappen}", level: LogLevel.Important);
|
||||
break;
|
||||
|
||||
case @"expired token":
|
||||
Logger.Log($"Your system clock is set incorrectly. Please check your system time, date and timezone.\n\n{whatWillHappen}", level: LogLevel.Important);
|
||||
break;
|
||||
|
||||
default:
|
||||
Logger.Log($"You are not able to submit a score: {exception.Message}", level: LogLevel.Important);
|
||||
Logger.Log($"{whatWillHappen} {exception.Message}", level: LogLevel.Important);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (shouldExit)
|
||||
{
|
||||
Schedule(() =>
|
||||
{
|
||||
ValidForResume = false;
|
||||
this.Exit();
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
// Gameplay is allowed to continue, but we still should keep track of the error.
|
||||
// In the future, this should be visible to the user in some way.
|
||||
Logger.Log($"Score submission token retrieval failed ({exception.Message})");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -170,7 +179,7 @@ void handleTokenFailure(Exception exception)
|
|||
/// </summary>
|
||||
/// <param name="exception">The error causing the failure.</param>
|
||||
/// <returns>Whether gameplay should be immediately exited as a result. Returning false allows the gameplay session to continue. Defaults to true.</returns>
|
||||
protected virtual bool HandleTokenRetrievalFailure(Exception exception) => true;
|
||||
protected virtual bool ShouldExitOnTokenRetrievalFailure(Exception exception) => true;
|
||||
|
||||
protected override async Task PrepareScoreForResultsAsync(Score score)
|
||||
{
|
||||
|
@ -231,7 +240,7 @@ private void submitFromFailOrQuit()
|
|||
|
||||
/// <summary>
|
||||
/// Construct a request to be used for retrieval of the score token.
|
||||
/// Can return null, at which point <see cref="HandleTokenRetrievalFailure"/> will be fired.
|
||||
/// Can return null, at which point <see cref="ShouldExitOnTokenRetrievalFailure"/> will be fired.
|
||||
/// </summary>
|
||||
[CanBeNull]
|
||||
protected abstract APIRequest<APIScoreToken> CreateTokenRequest();
|
||||
|
|
|
@ -61,7 +61,7 @@ public TestPlayer(bool allowPause = true, bool showResults = true, bool pauseOnF
|
|||
PauseOnFocusLost = pauseOnFocusLost;
|
||||
}
|
||||
|
||||
protected override bool HandleTokenRetrievalFailure(Exception exception) => false;
|
||||
protected override bool ShouldExitOnTokenRetrievalFailure(Exception exception) => false;
|
||||
|
||||
protected override APIRequest<APIScoreToken> CreateTokenRequest()
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue