diff --git a/src/Impostor.Api/Net/Messages/S2C/Message01JoinGameS2C.cs b/src/Impostor.Api/Net/Messages/S2C/Message01JoinGameS2C.cs index 6bd38c94..902bd666 100644 --- a/src/Impostor.Api/Net/Messages/S2C/Message01JoinGameS2C.cs +++ b/src/Impostor.Api/Net/Messages/S2C/Message01JoinGameS2C.cs @@ -22,6 +22,7 @@ namespace Impostor.Api.Net.Messages.S2C writer.EndMessage(); } + [Obsolete("JoinGame errors are no longer used by 2021.11.9 and up, disconnect clients instead.")] public static void SerializeError(IMessageWriter writer, bool clear, DisconnectReason reason, string? message = null) { if (clear) diff --git a/src/Impostor.Server/Extensions/IHazelConnectionExtensions.cs b/src/Impostor.Server/Extensions/IHazelConnectionExtensions.cs new file mode 100644 index 00000000..d46e3704 --- /dev/null +++ b/src/Impostor.Server/Extensions/IHazelConnectionExtensions.cs @@ -0,0 +1,30 @@ +using System.Threading.Tasks; +using Impostor.Api.Innersloth; +using Impostor.Api.Net; +using Impostor.Api.Net.Messages.S2C; +using Impostor.Hazel; + +namespace Impostor.Server +{ + public static class IHazelConnectionExtensions + { + /// + /// Disconnect a connection using a custom message. + /// + /// The connection to disconnect. + /// The message to disconnect with. + /// Task that should be awaited to ensure disconnection. + public static async ValueTask CustomDisconnectAsync(this IHazelConnection connection, string message) + { + if (!connection.IsConnected) + { + return; + } + + using var writer = MessageWriter.Get(); + MessageDisconnect.Serialize(writer, true, DisconnectReason.Custom, message); + + await connection.DisconnectAsync(DisconnectReason.Custom.ToString(), writer); + } + } +} diff --git a/src/Impostor.Server/Net/ClientBase.cs b/src/Impostor.Server/Net/ClientBase.cs index 74224fcc..15dfe919 100644 --- a/src/Impostor.Server/Net/ClientBase.cs +++ b/src/Impostor.Server/Net/ClientBase.cs @@ -5,8 +5,6 @@ using Impostor.Api; using Impostor.Api.Innersloth; using Impostor.Api.Net; using Impostor.Api.Net.Messages; -using Impostor.Api.Net.Messages.S2C; -using Impostor.Hazel; using Impostor.Server.Net.State; namespace Impostor.Server.Net @@ -55,15 +53,7 @@ namespace Impostor.Server.Net public async ValueTask DisconnectAsync(DisconnectReason reason, string? message = null) { - if (!Connection.IsConnected) - { - return; - } - - using var writer = MessageWriter.Get(); - MessageDisconnect.Serialize(writer, true, reason, message); - - await Connection.DisconnectAsync(message ?? reason.ToString(), writer); + await Connection.CustomDisconnectAsync(message ?? reason.ToString()); } } } diff --git a/src/Impostor.Server/Net/Manager/ClientManager.cs b/src/Impostor.Server/Net/Manager/ClientManager.cs index a4ab5cc0..94426bf2 100644 --- a/src/Impostor.Server/Net/Manager/ClientManager.cs +++ b/src/Impostor.Server/Net/Manager/ClientManager.cs @@ -8,7 +8,6 @@ using Impostor.Api.Events.Managers; using Impostor.Api.Innersloth; using Impostor.Api.Net; using Impostor.Api.Net.Messages; -using Impostor.Api.Net.Messages.S2C; using Impostor.Hazel; using Impostor.Server.Config; using Impostor.Server.Events.Client; @@ -85,25 +84,19 @@ namespace Impostor.Server.Net.Manager _ => throw new ArgumentOutOfRangeException(), }; - Message01JoinGameS2C.SerializeError(packet, false, DisconnectReason.Custom, message); - - await connection.SendAsync(packet); + await connection.CustomDisconnectAsync(message); return; } if (name.Length > 10) { - using var packet = MessageWriter.Get(MessageType.Reliable); - Message01JoinGameS2C.SerializeError(packet, false, DisconnectReason.Custom, DisconnectMessages.UsernameLength); - await connection.SendAsync(packet); + await connection.CustomDisconnectAsync(DisconnectMessages.UsernameLength); return; } if (string.IsNullOrWhiteSpace(name)) { - using var packet = MessageWriter.Get(MessageType.Reliable); - Message01JoinGameS2C.SerializeError(packet, false, DisconnectReason.Custom, DisconnectMessages.UsernameIllegalCharacters); - await connection.SendAsync(packet); + await connection.CustomDisconnectAsync(DisconnectMessages.UsernameIllegalCharacters); return; } diff --git a/src/Impostor.Server/Net/Redirector/ClientRedirector.cs b/src/Impostor.Server/Net/Redirector/ClientRedirector.cs index a96ca733..f463abb6 100644 --- a/src/Impostor.Server/Net/Redirector/ClientRedirector.cs +++ b/src/Impostor.Server/Net/Redirector/ClientRedirector.cs @@ -56,27 +56,25 @@ namespace Impostor.Server.Net.Redirector { Message01JoinGameC2S.Deserialize(reader, out var gameCode); - using var packet = MessageWriter.Get(MessageType.Reliable); var endpoint = await _nodeLocator.FindAsync(gameCode); if (endpoint == null) { - Message01JoinGameS2C.SerializeError(packet, false, DisconnectReason.GameMissing); + await DisconnectAsync(DisconnectReason.GameMissing); } else { + using var packet = MessageWriter.Get(MessageType.Reliable); Message13RedirectS2C.Serialize(packet, false, endpoint); + await Connection.SendAsync(packet); } - await Connection.SendAsync(packet); break; } case MessageFlags.GetGameListV2: { // TODO: Implement. - using var packet = MessageWriter.Get(MessageType.Reliable); - Message01JoinGameS2C.SerializeError(packet, false, DisconnectReason.Custom, DisconnectMessages.NotImplemented); - await Connection.SendAsync(packet); + await DisconnectAsync(DisconnectReason.Custom, DisconnectMessages.NotImplemented); break; } diff --git a/src/Impostor.Server/Net/State/Game.Data.cs b/src/Impostor.Server/Net/State/Game.Data.cs index d6d87bf2..26f2e5b9 100644 --- a/src/Impostor.Server/Net/State/Game.Data.cs +++ b/src/Impostor.Server/Net/State/Game.Data.cs @@ -382,7 +382,6 @@ namespace Impostor.Server.Net.State case InnerPlayerControl control: { - if (GameState != GameStates.Started) if (GameState != GameStates.Started && GameState != GameStates.Starting) { GameNet.GameData?.RemovePlayer(control);