Merge pull request #19189 from peppy/peform-actions-after-reconnect

Fix creating multiplayer game during server migration not joining new room correctly
This commit is contained in:
Dan Balasescu
2022-07-19 14:46:29 +09:00
committed by GitHub
6 changed files with 27 additions and 18 deletions

View File

@ -64,26 +64,26 @@ namespace osu.Game.Online
this.preferMessagePack = preferMessagePack; this.preferMessagePack = preferMessagePack;
apiState.BindTo(api.State); apiState.BindTo(api.State);
apiState.BindValueChanged(_ => connectIfPossible(), true); apiState.BindValueChanged(_ => Task.Run(connectIfPossible), true);
} }
public void Reconnect() public Task Reconnect()
{ {
Logger.Log($"{clientName} reconnecting...", LoggingTarget.Network); Logger.Log($"{clientName} reconnecting...", LoggingTarget.Network);
Task.Run(connectIfPossible); return Task.Run(connectIfPossible);
} }
private void connectIfPossible() private async Task connectIfPossible()
{ {
switch (apiState.Value) switch (apiState.Value)
{ {
case APIState.Failing: case APIState.Failing:
case APIState.Offline: case APIState.Offline:
Task.Run(() => disconnect(true)); await disconnect(true);
break; break;
case APIState.Online: case APIState.Online:
Task.Run(connect); await connect();
break; break;
} }
} }

View File

@ -2,6 +2,7 @@
// See the LICENCE file in the repository root for full licence text. // See the LICENCE file in the repository root for full licence text.
using System; using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.SignalR.Client; using Microsoft.AspNetCore.SignalR.Client;
using osu.Framework.Bindables; using osu.Framework.Bindables;
using osu.Game.Online.API; using osu.Game.Online.API;
@ -32,6 +33,6 @@ namespace osu.Game.Online
/// <summary> /// <summary>
/// Reconnect if already connected. /// Reconnect if already connected.
/// </summary> /// </summary>
void Reconnect(); Task Reconnect();
} }
} }

View File

@ -21,7 +21,6 @@ using osu.Game.Online.Rooms.RoomStatuses;
using osu.Game.Rulesets; using osu.Game.Rulesets;
using osu.Game.Rulesets.Mods; using osu.Game.Rulesets.Mods;
using osu.Game.Utils; using osu.Game.Utils;
using APIUser = osu.Game.Online.API.Requests.Responses.APIUser;
namespace osu.Game.Online.Multiplayer namespace osu.Game.Online.Multiplayer
{ {
@ -91,7 +90,7 @@ namespace osu.Game.Online.Multiplayer
/// <summary> /// <summary>
/// The joined <see cref="MultiplayerRoom"/>. /// The joined <see cref="MultiplayerRoom"/>.
/// </summary> /// </summary>
public virtual MultiplayerRoom? Room public virtual MultiplayerRoom? Room // virtual for moq
{ {
get get
{ {
@ -150,7 +149,7 @@ namespace osu.Game.Online.Multiplayer
// clean up local room state on server disconnect. // clean up local room state on server disconnect.
if (!connected.NewValue && Room != null) if (!connected.NewValue && Room != null)
{ {
Logger.Log("Connection to multiplayer server was lost.", LoggingTarget.Runtime, LogLevel.Important); Logger.Log("Clearing room due to multiplayer server connection loss.", LoggingTarget.Runtime, LogLevel.Important);
LeaveRoom(); LeaveRoom();
} }
})); }));

View File

@ -85,7 +85,13 @@ namespace osu.Game.Online.Multiplayer
catch (HubException exception) catch (HubException exception)
{ {
if (exception.GetHubExceptionMessage() == HubClientConnector.SERVER_SHUTDOWN_MESSAGE) if (exception.GetHubExceptionMessage() == HubClientConnector.SERVER_SHUTDOWN_MESSAGE)
connector?.Reconnect(); {
Debug.Assert(connector != null);
await connector.Reconnect();
return await JoinRoom(roomId, password);
}
throw; throw;
} }
} }

View File

@ -61,7 +61,14 @@ namespace osu.Game.Online.Spectator
catch (HubException exception) catch (HubException exception)
{ {
if (exception.GetHubExceptionMessage() == HubClientConnector.SERVER_SHUTDOWN_MESSAGE) if (exception.GetHubExceptionMessage() == HubClientConnector.SERVER_SHUTDOWN_MESSAGE)
connector?.Reconnect(); {
Debug.Assert(connector != null);
await connector.Reconnect();
await BeginPlayingInternal(state);
return;
}
throw; throw;
} }
} }

View File

@ -70,12 +70,8 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer
client.LoadRequested += onLoadRequested; client.LoadRequested += onLoadRequested;
client.RoomUpdated += onRoomUpdated; client.RoomUpdated += onRoomUpdated;
isConnected.BindTo(client.IsConnected); if (!client.IsConnected.Value)
isConnected.BindValueChanged(connected => handleRoomLost();
{
if (!connected.NewValue)
handleRoomLost();
}, true);
} }
protected override Drawable CreateMainContent() => new Container protected override Drawable CreateMainContent() => new Container