using Fleck; using Microsoft.Extensions.Logging; using SharpChat.Connections; using SharpChat.SockChat; using System.Net; namespace SharpChat; public class SockChatConnection(IWebSocketConnection sock, IPEndPoint remoteEndPoint, ILogger logger) : Connection { public IWebSocketConnection Socket { get; } = sock; public IPEndPoint RemoteEndPoint { get; } = remoteEndPoint; public ILogger Logger { get; } = logger; public async Task Send(S2CPacket packet) { if(!Socket.IsAvailable) return; string data = packet.Pack(); if(!string.IsNullOrWhiteSpace(data)) await Socket.Send(data); } public void Close(ConnectionCloseReason reason = ConnectionCloseReason.Unexpected) { Socket.Close(reason switch { ConnectionCloseReason.ShuttingDown => WebSocketCloseCode.GoingAway, ConnectionCloseReason.Error => WebSocketCloseCode.InternalError, ConnectionCloseReason.Restarting => WebSocketCloseCode.ServiceRestart, ConnectionCloseReason.Unavailable => WebSocketCloseCode.ServiceRestart, ConnectionCloseReason.Unauthorized => WebSocketCloseCode.Unauthorized, ConnectionCloseReason.TimeOut => WebSocketCloseCode.Timeout, ConnectionCloseReason.AccessDenied => WebSocketCloseCode.Forbidden, ConnectionCloseReason.TooManyConnections => WebSocketCloseCode.TryAgainLater, _ => WebSocketCloseCode.NormalClosure, }); } }