diff options
Diffstat (limited to 'Impostor-dev/src/Impostor.Server/Net/ClientBase.cs')
-rw-r--r-- | Impostor-dev/src/Impostor.Server/Net/ClientBase.cs | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/Impostor-dev/src/Impostor.Server/Net/ClientBase.cs b/Impostor-dev/src/Impostor.Server/Net/ClientBase.cs new file mode 100644 index 0000000..5279192 --- /dev/null +++ b/Impostor-dev/src/Impostor.Server/Net/ClientBase.cs @@ -0,0 +1,58 @@ +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 +{ + internal abstract class ClientBase : IClient + { + protected ClientBase(string name, IHazelConnection connection) + { + Name = name; + Connection = connection; + Items = new ConcurrentDictionary<object, object>(); + } + + public int Id { get; set; } + + public string Name { get; } + + public IHazelConnection Connection { get; } + + public IDictionary<object, object> Items { get; } + + public ClientPlayer? Player { get; set; } + + 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()); + } + } +} |