Feature/automautic room closing (#5)

* Room now closes when nobody is in the room

* cleanup
This commit is contained in:
DTieman
2023-03-24 14:33:37 +01:00
committed by GitHub
parent 0bddf64797
commit 78af43ad44
4 changed files with 39 additions and 48 deletions

View File

@@ -1,21 +0,0 @@
using MauMau_Server.Mau;
using Microsoft.AspNetCore.Mvc;
namespace MauMau_Server.Controllers;
[ApiController]
[Route("[controller]")]
public class MauController : ControllerBase
{
[HttpGet("deck")]
public IActionResult GetDeck()
{
return Ok(new Deck().GetUnusedDeck().Select(card => card.ToString()).ToList());
}
[HttpGet("hand")]
public IActionResult GetHand()
{
return Ok(new Deck().DrawCards(8).Select(card => card.ToString()).ToList());
}
}

View File

@@ -52,11 +52,4 @@ public class RoomController : ControllerBase
var id = _roomManager.CreateRoom(); var id = _roomManager.CreateRoom();
return Ok(JsonSerializer.Serialize(id)); return Ok(JsonSerializer.Serialize(id));
} }
[HttpDelete]
public IActionResult Delete()
{
_roomManager.RemoveAllRooms();
return NoContent();
}
} }

View File

@@ -7,9 +7,18 @@ namespace MauMau_Server.Websockets;
public class Room public class Room
{ {
private readonly IRoomManager _roomManager;
private readonly string _roomId;
private readonly Dictionary<string, WebSocket> _connections = new(); private readonly Dictionary<string, WebSocket> _connections = new();
private string _host;
private readonly Game _game = new(); private readonly Game _game = new();
public Room(IRoomManager roomManager, string roomId)
{
_roomManager = roomManager;
_roomId = roomId;
}
public async Task InstantiateConnection(WebSocket socket) public async Task InstantiateConnection(WebSocket socket)
{ {
var socketId = AddConnection(socket); var socketId = AddConnection(socket);
@@ -30,41 +39,46 @@ public class Room
buffer = EmptyBuffer(); buffer = EmptyBuffer();
result = await ReceiveAsync(socket, buffer); result = await ReceiveAsync(socket, buffer);
} }
await socket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None); await socket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);
RemoveConnection(socketId); HandleDisconnect(socketId);
_game.RemovePlayer(socketId);
} }
private string AddConnection(WebSocket socket) private string AddConnection(WebSocket socket)
{ {
var socketId = Guid.NewGuid().ToString(); var socketId = Guid.NewGuid().ToString();
if (_connections.Count == 0)
{
_host = socketId;
}
_connections.Add(socketId, socket); _connections.Add(socketId, socket);
_game.AddPlayerToGame(socketId, socket); _game.AddPlayerToGame(socketId, socket);
return socketId; return socketId;
} }
public WebSocket GetConnection(string socketId) public WebSocket GetConnection(string socketId)
{ {
return _connections[socketId]; return _connections[socketId];
} }
public Dictionary<string, WebSocket> GetAllConnections() public Dictionary<string, WebSocket> GetAllConnections()
{ {
return _connections; return _connections;
} }
public void RemoveConnection(string socketId) public void RemoveConnection(string socketId)
{ {
_connections.Remove(socketId); _connections.Remove(socketId);
} }
private static async Task<WebSocketReceiveResult?> ReceiveAsync(WebSocket webSocket, byte[] buffer) private static async Task<WebSocketReceiveResult?> ReceiveAsync(WebSocket webSocket, byte[] buffer)
{ {
var arraySegment = new ArraySegment<byte>(buffer); var arraySegment = new ArraySegment<byte>(buffer);
var result = await webSocket.ReceiveAsync(arraySegment, CancellationToken.None); var result = await webSocket.ReceiveAsync(arraySegment, CancellationToken.None);
return result; return result;
} }
private void BroadcastGameState() private void BroadcastGameState()
{ {
foreach (var (id, socket) in GetAllConnections()) foreach (var (id, socket) in GetAllConnections())
@@ -74,7 +88,7 @@ public class Room
SendAsync(socket, message); SendAsync(socket, message);
} }
} }
private void BroadcastAsync(string message) private void BroadcastAsync(string message)
{ {
foreach (var (id, socket) in GetAllConnections()) foreach (var (id, socket) in GetAllConnections())
@@ -82,7 +96,7 @@ public class Room
SendAsync(socket, message); SendAsync(socket, message);
} }
} }
private static void SendAsync(WebSocket socket, string message) private static void SendAsync(WebSocket socket, string message)
{ {
var bytes = Encoding.Default.GetBytes(message); var bytes = Encoding.Default.GetBytes(message);
@@ -90,11 +104,25 @@ public class Room
socket.SendAsync(arraySegment, WebSocketMessageType.Text, true, CancellationToken.None); socket.SendAsync(arraySegment, WebSocketMessageType.Text, true, CancellationToken.None);
} }
private void HandleDisconnect(string socketId)
{
RemoveConnection(socketId);
_game.RemovePlayer(socketId);
if (IsEmpty())
{
_roomManager.RemoveRoom(_roomId);
}
else if (socketId == _host)
{
_host = _connections.First().Key;
}
}
private static byte[] EmptyBuffer() private static byte[] EmptyBuffer()
{ {
return new byte[4096]; return new byte[4096];
} }
public bool IsEmpty() public bool IsEmpty()
{ {
return _connections.Count == 0; return _connections.Count == 0;

View File

@@ -7,7 +7,7 @@ public class RoomManager : IRoomManager
public string CreateRoom() public string CreateRoom()
{ {
var roomId = Guid.NewGuid().ToString(); var roomId = Guid.NewGuid().ToString();
var room = new Room(); var room = new Room(this, roomId);
Rooms.Add(roomId, room); Rooms.Add(roomId, room);
return roomId; return roomId;
} }
@@ -31,14 +31,6 @@ public class RoomManager : IRoomManager
{ {
return Rooms.ContainsKey(roomId); return Rooms.ContainsKey(roomId);
} }
public void RemoveAllRooms()
{
foreach (var room in Rooms.Where(room => room.Value.IsEmpty()))
{
Rooms.Remove(room.Key);
}
}
} }
public interface IRoomManager public interface IRoomManager
@@ -48,5 +40,4 @@ public interface IRoomManager
public List<string> GetAllRooms(); public List<string> GetAllRooms();
public void RemoveRoom(string roomId); public void RemoveRoom(string roomId);
public bool RoomExists(string roomId); public bool RoomExists(string roomId);
public void RemoveAllRooms();
} }