From b670800c540ff43699a18f90c043ba89133e204e Mon Sep 17 00:00:00 2001 From: AeonLucid Date: Mon, 26 Oct 2020 22:20:14 +0100 Subject: [PATCH] Expose DisconnectAsync in the api --- src/Impostor.Api/Net/IClient.cs | 17 +++++++++- src/Impostor.Hazel/Udp/UdpConnection.cs | 13 ++++++-- src/Impostor.Hazel/Udp/UdpServerConnection.cs | 8 ++--- src/Impostor.Server/Net/Client.cs | 18 ++--------- src/Impostor.Server/Net/ClientBase.cs | 31 ++++++++++++++++--- src/Impostor.Server/Net/State/Game.Data.cs | 8 ++++- 6 files changed, 66 insertions(+), 29 deletions(-) diff --git a/src/Impostor.Api/Net/IClient.cs b/src/Impostor.Api/Net/IClient.cs index 0b9b77d..48efeda 100644 --- a/src/Impostor.Api/Net/IClient.cs +++ b/src/Impostor.Api/Net/IClient.cs @@ -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); + + /// + /// Disconnect the client with a . + /// + /// + /// The message to show to the player. + /// + /// + /// Only used when is set to . + /// + /// + /// A representing the asynchronous operation. + /// + ValueTask DisconnectAsync(DisconnectReason reason, string? message = null); } -} \ No newline at end of file +} diff --git a/src/Impostor.Hazel/Udp/UdpConnection.cs b/src/Impostor.Hazel/Udp/UdpConnection.cs index fbd74b7..4990469 100644 --- a/src/Impostor.Hazel/Udp/UdpConnection.cs +++ b/src/Impostor.Hazel/Udp/UdpConnection.cs @@ -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) diff --git a/src/Impostor.Hazel/Udp/UdpServerConnection.cs b/src/Impostor.Hazel/Udp/UdpServerConnection.cs index ddd22ae..0803496 100644 --- a/src/Impostor.Hazel/Udp/UdpServerConnection.cs +++ b/src/Impostor.Hazel/Udp/UdpServerConnection.cs @@ -55,11 +55,11 @@ namespace Impostor.Hazel.Udp /// /// Sends a disconnect message to the end point. /// - protected override ValueTask SendDisconnect(MessageWriter data = null) + protected override async ValueTask 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) diff --git a/src/Impostor.Server/Net/Client.cs b/src/Impostor.Server/Net/Client.cs index b6fb097..bfe29a6 100644 --- a/src/Impostor.Server/Net/Client.cs +++ b/src/Impostor.Server/Net/Client.cs @@ -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 +} diff --git a/src/Impostor.Server/Net/ClientBase.cs b/src/Impostor.Server/Net/ClientBase.cs index b56d08f..5279192 100644 --- a/src/Impostor.Server/Net/ClientBase.cs +++ b/src/Impostor.Server/Net/ClientBase.cs @@ -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 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 +} diff --git a/src/Impostor.Server/Net/State/Game.Data.cs b/src/Impostor.Server/Net/State/Game.Data.cs index d3eaff5..eff155c 100644 --- a/src/Impostor.Server/Net/State/Game.Data.cs +++ b/src/Impostor.Server/Net/State/Game.Data.cs @@ -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 +} -- 2.39.5