diff --git a/Controllers/MauController.cs b/Controllers/MauController.cs deleted file mode 100644 index 7f713e0..0000000 --- a/Controllers/MauController.cs +++ /dev/null @@ -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()); - } -} \ No newline at end of file diff --git a/Controllers/RoomController.cs b/Controllers/RoomController.cs index ea63f33..85fe489 100644 --- a/Controllers/RoomController.cs +++ b/Controllers/RoomController.cs @@ -52,11 +52,4 @@ public class RoomController : ControllerBase var id = _roomManager.CreateRoom(); return Ok(JsonSerializer.Serialize(id)); } - - [HttpDelete] - public IActionResult Delete() - { - _roomManager.RemoveAllRooms(); - return NoContent(); - } } \ No newline at end of file diff --git a/Mau/Game.cs b/Mau/Game.cs index 35e2231..e9c8084 100644 --- a/Mau/Game.cs +++ b/Mau/Game.cs @@ -83,8 +83,11 @@ public class Game CurrentPlayer = GetNextPlayer(2); break; case CardValue.ACE: - TurnDirection *= -1; - CurrentPlayer = GetNextPlayer(); + if (Players.Count > 2) + { + TurnDirection *= -1; + CurrentPlayer = GetNextPlayer(); + } break; case CardValue.THREE: case CardValue.FOUR: diff --git a/Websockets/Room.cs b/Websockets/Room.cs index 6705cd2..6673bb9 100644 --- a/Websockets/Room.cs +++ b/Websockets/Room.cs @@ -7,9 +7,18 @@ namespace MauMau_Server.Websockets; public class Room { + private readonly IRoomManager _roomManager; + private readonly string _roomId; private readonly Dictionary _connections = new(); + private string _host; private readonly Game _game = new(); + public Room(IRoomManager roomManager, string roomId) + { + _roomManager = roomManager; + _roomId = roomId; + } + public async Task InstantiateConnection(WebSocket socket) { var socketId = AddConnection(socket); @@ -30,41 +39,46 @@ public class Room buffer = EmptyBuffer(); result = await ReceiveAsync(socket, buffer); } + await socket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None); - RemoveConnection(socketId); - _game.RemovePlayer(socketId); + HandleDisconnect(socketId); } private string AddConnection(WebSocket socket) { var socketId = Guid.NewGuid().ToString(); + if (_connections.Count == 0) + { + _host = socketId; + } + _connections.Add(socketId, socket); _game.AddPlayerToGame(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 static async Task ReceiveAsync(WebSocket webSocket, byte[] buffer) { var arraySegment = new ArraySegment(buffer); var result = await webSocket.ReceiveAsync(arraySegment, CancellationToken.None); return result; } - + private void BroadcastGameState() { foreach (var (id, socket) in GetAllConnections()) @@ -74,7 +88,7 @@ public class Room SendAsync(socket, message); } } - + private void BroadcastAsync(string message) { foreach (var (id, socket) in GetAllConnections()) @@ -82,7 +96,7 @@ public class Room SendAsync(socket, message); } } - + private static void SendAsync(WebSocket socket, string message) { var bytes = Encoding.Default.GetBytes(message); @@ -90,11 +104,25 @@ public class Room 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() { return new byte[4096]; } - + public bool IsEmpty() { return _connections.Count == 0; diff --git a/Websockets/RoomManager.cs b/Websockets/RoomManager.cs index fd14d28..2280be2 100644 --- a/Websockets/RoomManager.cs +++ b/Websockets/RoomManager.cs @@ -7,7 +7,7 @@ public class RoomManager : IRoomManager public string CreateRoom() { var roomId = Guid.NewGuid().ToString(); - var room = new Room(); + var room = new Room(this, roomId); Rooms.Add(roomId, room); return roomId; } @@ -31,14 +31,6 @@ public class RoomManager : IRoomManager { return Rooms.ContainsKey(roomId); } - - public void RemoveAllRooms() - { - foreach (var room in Rooms.Where(room => room.Value.IsEmpty())) - { - Rooms.Remove(room.Key); - } - } } public interface IRoomManager @@ -48,5 +40,4 @@ public interface IRoomManager public List GetAllRooms(); public void RemoveRoom(string roomId); public bool RoomExists(string roomId); - public void RemoveAllRooms(); } \ No newline at end of file