using System.Net.WebSockets; using System.Text; namespace MauMau_Server.Websockets; public class Room { private readonly Dictionary _connections = new(); public async Task InstantiateConnection(WebSocket socket) { var socketId = AddConnection(socket); await HandleConnection(socket, socketId); } private async Task HandleConnection(WebSocket socket, string socketId) { var buffer = EmptyBuffer(); var result = await ReceiveAsync(socket, buffer); while (!result.CloseStatus.HasValue) { var message = $"{socketId}: {Encoding.Default.GetString(buffer)}"; BroadcastAsync(message); 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) { var bytes = Encoding.Default.GetBytes(message); var arraySegment = new ArraySegment(bytes); foreach (var (id, socket) in GetAllConnections()) { socket.SendAsync(arraySegment, WebSocketMessageType.Text, true, CancellationToken.None); } } private static byte[] EmptyBuffer() { return new byte[4096]; } }