Skip to content

Commit

Permalink
Exit daily challenge screen when going offline
Browse files Browse the repository at this point in the history
This sort of thing is bound to happen when rewriting screens from
scratch without invoking abstract eldritch entities sometimes. Damned if
you do, damned if you don't...
  • Loading branch information
bdach committed Jul 24, 2024
1 parent aded31b commit 788b704
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 0 deletions.
28 changes: 28 additions & 0 deletions osu.Game/Screens/OnlinePlay/DailyChallenge/DailyChallenge.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
using osu.Game.Graphics.Containers;
using osu.Game.Graphics.UserInterface;
using osu.Game.Localisation;
using osu.Game.Online.API;
using osu.Game.Online.API.Requests.Responses;
using osu.Game.Online.Metadata;
using osu.Game.Online.Multiplayer;
Expand Down Expand Up @@ -48,6 +49,8 @@ public partial class DailyChallenge : OsuScreen
/// </summary>
private readonly Bindable<IReadOnlyList<Mod>> userMods = new Bindable<IReadOnlyList<Mod>>(Array.Empty<Mod>());

private readonly IBindable<APIState> apiState = new Bindable<APIState>();

private OnlinePlayScreenWaveContainer waves = null!;
private DailyChallengeLeaderboard leaderboard = null!;
private RoomModSelectOverlay userModsSelectOverlay = null!;
Expand Down Expand Up @@ -84,6 +87,9 @@ public partial class DailyChallenge : OsuScreen
[Resolved]
private UserLookupCache userLookupCache { get; set; } = null!;

[Resolved]
protected IAPIProvider API { get; private set; } = null!;

public override bool DisallowExternalBeatmapRulesetChanges => true;

public DailyChallenge(Room room)
Expand Down Expand Up @@ -358,6 +364,9 @@ protected override void LoadComplete()
userModsSelectOverlayRegistration = overlayManager?.RegisterBlockingOverlay(userModsSelectOverlay);
userModsSelectOverlay.SelectedItem.Value = playlistItem;
userMods.BindValueChanged(_ => Scheduler.AddOnce(updateMods), true);

apiState.BindTo(API.State);
apiState.BindValueChanged(onlineStateChanged, true);
}

private void trySetDailyChallengeBeatmap()
Expand All @@ -368,6 +377,25 @@ private void trySetDailyChallengeBeatmap()
applyLoopingToTrack();
}

private void onlineStateChanged(ValueChangedEvent<APIState> state) => Schedule(() =>
{
if (state.NewValue != APIState.Online)
Schedule(forcefullyExit);
});

private void forcefullyExit()
{
Logger.Log($"{this} forcefully exiting due to loss of API connection");

// This is temporary since we don't currently have a way to force screens to be exited
// See also: `OnlinePlayScreen.forcefullyExit()`
if (this.IsCurrentScreen())
{
while (this.IsCurrentScreen())
this.Exit();
}
}

public override void OnEntering(ScreenTransitionEvent e)
{
base.OnEntering(e);
Expand Down
1 change: 1 addition & 0 deletions osu.Game/Screens/OnlinePlay/OnlinePlayScreen.cs
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@ private void forcefullyExit()
Logger.Log($"{this} forcefully exiting due to loss of API connection");

// This is temporary since we don't currently have a way to force screens to be exited
// See also: `DailyChallenge.forcefullyExit()`
if (this.IsCurrentScreen())
{
while (this.IsCurrentScreen())
Expand Down

0 comments on commit 788b704

Please sign in to comment.