Skip to content

Commit

Permalink
Merge pull request #27180 from bdach/better-submission-failure-messaging
Browse files Browse the repository at this point in the history
Add better submission failure messaging
  • Loading branch information
peppy committed Feb 19, 2024
2 parents d7b1e3b + ec26ab5 commit c87bc8b
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 17 deletions.
2 changes: 1 addition & 1 deletion osu.Game/Screens/Play/SoloPlayer.cs
Expand Up @@ -52,7 +52,7 @@ protected override APIRequest<APIScoreToken> CreateTokenRequest()
Scores = { BindTarget = LeaderboardScores }
};

protected override bool HandleTokenRetrievalFailure(Exception exception) => false;
protected override bool ShouldExitOnTokenRetrievalFailure(Exception exception) => false;

protected override Task ImportScore(Score score)
{
Expand Down
39 changes: 24 additions & 15 deletions osu.Game/Screens/Play/SubmittingPlayer.cs
Expand Up @@ -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);

Expand All @@ -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})");
}
}
}

Expand All @@ -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)
{
Expand Down Expand Up @@ -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();
Expand Down
2 changes: 1 addition & 1 deletion osu.Game/Tests/Visual/TestPlayer.cs
Expand Up @@ -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()
{
Expand Down

0 comments on commit c87bc8b

Please sign in to comment.