]> git.deb.at Git - rhonda/impostor.git/commitdiff
Deprecate JoinGame errors
authorminiduikboot <mini@duikbo.at>
Wed, 16 Feb 2022 21:31:23 +0000 (22:31 +0100)
committerminiduikboot <mini@duikbo.at>
Sat, 26 Feb 2022 18:08:57 +0000 (19:08 +0100)
Starting from version 2021.11.9, join errors no longer exist, instead a
client will show the message "An unknown error disconnected you from the
server". As a workaround, the connection is disconnected entirely when
an error occurs, which allows us to show a custom message.

src/Impostor.Api/Net/Messages/S2C/Message01JoinGameS2C.cs
src/Impostor.Server/Net/Manager/ClientManager.cs
src/Impostor.Server/Net/Redirector/ClientRedirector.cs

index 6bd38c9482dcc31129424b6570e23751a2038fdc..bbfb9bbbb18a41894f5464c7a1631e41964341de 100644 (file)
@@ -22,6 +22,7 @@ namespace Impostor.Api.Net.Messages.S2C
             writer.EndMessage();
         }
 
+        [Obsolete("JoinGame errors are no longer serialized by 2021.11.9 and up, disconnect clients instead.")]
         public static void SerializeError(IMessageWriter writer, bool clear, DisconnectReason reason, string? message = null)
         {
             if (clear)
index a4ab5cc04f334db0d08eaca228e0590c76d6b2c3..58405b114f610764423ba2c3b8091b973f558434 100644 (file)
@@ -85,25 +85,19 @@ namespace Impostor.Server.Net.Manager
                     _ => throw new ArgumentOutOfRangeException(),
                 };
 
-                Message01JoinGameS2C.SerializeError(packet, false, DisconnectReason.Custom, message);
-
-                await connection.SendAsync(packet);
+                await DisconnectConnection(connection, 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 DisconnectConnection(connection, 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 DisconnectConnection(connection, DisconnectMessages.UsernameIllegalCharacters);
                 return;
             }
 
@@ -153,5 +147,14 @@ namespace Impostor.Server.Net.Manager
             // This may happen in the very rare case that version X is supported, X+2 is as well, but X+1 is not.
             return VersionCompareResult.Unknown;
         }
+
+        private async ValueTask DisconnectConnection(IHazelConnection connection, string message)
+        {
+            using var writer = MessageWriter.Get();
+            MessageDisconnect.Serialize(writer, true, DisconnectReason.Custom, message);
+
+            await connection.DisconnectAsync(DisconnectReason.Custom.ToString(), writer);
+            return;
+        }
     }
 }
index a96ca733e3ee00cd625d8048df05ecdac8c5d7db..f463abb6b364eff11889af36ec287d7ead15d6bf 100644 (file)
@@ -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;
                 }