]> git.deb.at Git - rhonda/impostor.git/commitdiff
Expose DisconnectAsync in the api
authorAeonLucid <aeonlucid@outlook.com>
Mon, 26 Oct 2020 21:20:14 +0000 (22:20 +0100)
committerAeonLucid <aeonlucid@outlook.com>
Mon, 26 Oct 2020 21:20:14 +0000 (22:20 +0100)
src/Impostor.Api/Net/IClient.cs
src/Impostor.Hazel/Udp/UdpConnection.cs
src/Impostor.Hazel/Udp/UdpServerConnection.cs
src/Impostor.Server/Net/Client.cs
src/Impostor.Server/Net/ClientBase.cs
src/Impostor.Server/Net/State/Game.Data.cs

index 0b9b77d3eac13548ee4ac726a35185399ad317e8..48efeda42ca97ec19fa168bea8066e6793242591 100644 (file)
@@ -1,5 +1,6 @@
 using System.Collections.Generic;
 using System.Threading.Tasks;
+using Impostor.Api.Innersloth;
 using Impostor.Api.Net.Messages;
 
 namespace Impostor.Api.Net
@@ -57,5 +58,19 @@ namespace Impostor.Api.Net
         ValueTask HandleMessageAsync(IMessageReader message, MessageType messageType);
 
         ValueTask HandleDisconnectAsync(string reason);
+
+        /// <summary>
+        ///     Disconnect the client with a <see cref="DisconnectReason"/>.
+        /// </summary>
+        /// <param name="reason">
+        ///     The message to show to the player.
+        /// </param>
+        /// <param name="message">
+        ///     Only used when <see cref="reason"/> is set to <see cref="DisconnectReason.Custom"/>.
+        /// </param>
+        /// <returns>
+        ///     A <see cref="ValueTask"/> representing the asynchronous operation.
+        /// </returns>
+        ValueTask DisconnectAsync(DisconnectReason reason, string? message = null);
     }
-}
\ No newline at end of file
+}
index fbd74b7bf8deac06e0f7d195a2d3e63a29a83874..4990469df5eaa3e96a1944b462166cd999053902 100644 (file)
@@ -1,4 +1,4 @@
-using System;
+using System;
 using System.Threading;
 using System.Threading.Channels;
 using System.Threading.Tasks;
@@ -63,8 +63,15 @@ namespace Impostor.Hazel.Udp
             // Signal cancellation to methods.
             _stoppingCts.Cancel();
 
-            // Cancel reader.
-            Pipeline.Writer.Complete();
+            try
+            {
+                // Cancel reader.
+                Pipeline.Writer.Complete();
+            }
+            catch (ChannelClosedException)
+            {
+                // Already done.
+            }
 
             // Remove references.
             if (!_isDisposing)
index ddd22ae9f70aeb349fbadcc5b0d1c98fec4f36bb..08034968b9b90aa03b8f15fe8f17aa8f489b4934 100644 (file)
@@ -55,11 +55,11 @@ namespace Impostor.Hazel.Udp
         /// <summary>
         ///     Sends a disconnect message to the end point.
         /// </summary>
-        protected override ValueTask<bool> SendDisconnect(MessageWriter data = null)
+        protected override async ValueTask<bool> SendDisconnect(MessageWriter data = null)
         {
             lock (this)
             {
-                if (this._state != ConnectionState.Connected) return ValueTask.FromResult(false);
+                if (this._state != ConnectionState.Connected) return false;
                 this._state = ConnectionState.NotConnected;
             }
             
@@ -74,11 +74,11 @@ namespace Impostor.Hazel.Udp
 
             try
             {
-                Listener.SendDataSync(bytes, bytes.Length, RemoteEndPoint);
+                await Listener.SendData(bytes, bytes.Length, RemoteEndPoint);
             }
             catch { }
 
-            return ValueTask.FromResult(true);
+            return true;
         }
 
         protected override void Dispose(bool disposing)
index b6fb09741052c83d6d8bcc7a03a647c4de811974..bfe29a6c35d98e8a3aee7ef434af77eca6377bb2 100644 (file)
@@ -275,7 +275,7 @@ namespace Impostor.Server.Net
                 _logger.LogError(ex, "Exception caught in client disconnection.");
             }
 
-            _logger.LogInformation("Client {0} disconnecting, reason: {1}.", Id, reason);
+            _logger.LogInformation("Client {0} disconnecting, reason: {1}", Id, reason);
             _clientManager.Remove(this);
         }
 
@@ -330,19 +330,5 @@ namespace Impostor.Server.Net
 
             return Connection.SendAsync(message);
         }
-
-        private async ValueTask DisconnectAsync(DisconnectReason reason, string message = null)
-        {
-            if (Connection == null)
-            {
-                return;
-            }
-
-            using var packet = MessageWriter.Get(MessageType.Reliable);
-            Message01JoinGameS2C.SerializeError(packet, false, reason, message);
-
-            await Connection.SendAsync(packet);
-            await Connection.DisconnectAsync(message ?? reason.ToString());
-        }
     }
-}
\ No newline at end of file
+}
index b56d08f9611cc445a6704db2c736b382dd27d38f..527919256e16aebf027deec65f725abd10a011d9 100644 (file)
@@ -1,8 +1,12 @@
-using System.Collections.Concurrent;
+using System;
+using System.Collections.Concurrent;
 using System.Collections.Generic;
 using System.Threading.Tasks;
+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
@@ -24,12 +28,31 @@ namespace Impostor.Server.Net
 
         public IDictionary<object, object> Items { get; }
 
-        public ClientPlayer Player { get; set; }
+        public ClientPlayer? Player { get; set; }
 
-        IClientPlayer IClient.Player => Player;
+        IClientPlayer? IClient.Player => Player;
 
         public abstract ValueTask HandleMessageAsync(IMessageReader message, MessageType messageType);
 
         public abstract ValueTask HandleDisconnectAsync(string reason);
+
+
+        public async ValueTask DisconnectAsync(DisconnectReason reason, string? message = null)
+        {
+            if (!Connection.IsConnected)
+            {
+                return;
+            }
+
+            using var packet = MessageWriter.Get(MessageType.Reliable);
+            Message01JoinGameS2C.SerializeError(packet, false, reason, message);
+
+            await Connection.SendAsync(packet);
+
+            // Need this to show the correct message, otherwise it shows a generic disconnect message.
+            await Task.Delay(TimeSpan.FromMilliseconds(250));
+
+            await Connection.DisconnectAsync(message ?? reason.ToString());
+        }
     }
-}
\ No newline at end of file
+}
index d3eaff58c69d231a6091989011e966f0fa227975..eff155c0afcf4fbbf645271cf81c460e7fc8db53 100644 (file)
@@ -392,6 +392,12 @@ namespace Impostor.Server.Net.State
                         break;
                     }
                 }
+
+                if (sender.Client.Player == null)
+                {
+                    // Disconnect handler was probably invoked, cancel the rest.
+                    return false;
+                }
             }
 
             return true;
@@ -433,4 +439,4 @@ namespace Impostor.Server.Net.State
             return null;
         }
     }
-}
\ No newline at end of file
+}