using System.Net.WebSockets; using System.Text; using System.Text.Json; using MauMau_Server.Mau; namespace MauMau_Server.Websockets; public class Room { private readonly Dictionary _connections = new(); private Game _game = new(); public async Task InstantiateConnection(WebSocket socket) { var socketId = AddConnection(socket); await HandleConnection(socket, socketId); } private async Task HandleConnection(WebSocket socket, string socketId) { BroadcastAsync(JsonSerializer.Serialize(new GameState(_game))); var buffer = EmptyBuffer(); var result = await ReceiveAsync(socket, buffer); while (!result.CloseStatus.HasValue) { var slicedBuffer = buffer[0..result.Count]; var playedCard = JsonSerializer.Deserialize(slicedBuffer).ToCard(); _game.PlayCard(playedCard); BroadcastAsync(JsonSerializer.Serialize(new GameState(_game))); buffer = EmptyBuffer(); result = await ReceiveAsync(socket, buffer); } await socket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None); RemoveConnection(socketId); } private string AddConnection(WebSocket socket) { var socketId = Guid.NewGuid().ToString(); _connections.Add(socketId, socket); return socketId; } public WebSocket GetConnection(string socketId) { return _connections[socketId]; } public Dictionary GetAllConnections() { return _connections; } public void RemoveConnection(string socketId) { _connections.Remove(socketId); } private async Task ReceiveAsync(WebSocket webSocket, byte[] buffer) { var arraySegment = new ArraySegment(buffer); var result = await webSocket.ReceiveAsync(arraySegment, CancellationToken.None); return result; } private void BroadcastAsync(string message) { foreach (var (id, socket) in GetAllConnections()) { SendAsync(socket, message); } } private void SendAsync(WebSocket socket, string message) { var bytes = Encoding.Default.GetBytes(message); var arraySegment = new ArraySegment(bytes); socket.SendAsync(arraySegment, WebSocketMessageType.Text, true, CancellationToken.None); } private static byte[] EmptyBuffer() { return new byte[4096]; } }