Pure websocket game.

This commit is contained in:
Anduin Xue
2024-01-02 06:37:00 +00:00
parent 91b01b6341
commit e67b4907ac
4 changed files with 146 additions and 121 deletions
@@ -35,10 +35,31 @@ public class GamesController : Controller
public async Task GetWebSocket([FromRoute] int id)
{
var pusher = await HttpContext.AcceptWebSocketClient();
var subscription = _database
.GetOrAddGame(id)
var game = _database.GetOrAddGame(id);
var outSub = game
.FenChangedChannel
.Subscribe(t => pusher.Send(t, HttpContext.RequestAborted));
var inSub = pusher.Subscribe(async message =>
{
if (message.Length < 2)
{
return;
}
var player = message[..1];
var move = message[1..];
lock (game.MovePieceLock)
{
if (game.Board.IsValidMove(move) && !game.Board.IsEndGame &&
game.Board.Turn.AsChar.ToString() == player)
{
game.Board.Move(move);
}
}
await game.FenChangedChannel.BroadcastAsync(game.Board.ToFen());
});
try
{
await pusher.Listen(HttpContext.RequestAborted);
@@ -50,7 +71,8 @@ public class GamesController : Controller
finally
{
await pusher.Close(HttpContext.RequestAborted);
subscription.UnRegister();
outSub.UnRegister();
inSub.UnRegister();
}
}
@@ -80,22 +102,4 @@ public class GamesController : Controller
var game = _database.GetOrAddGame(id);
return Ok(game.Board.ToPgn());
}
[HttpPost]
[Route("{id:int}/move/{player}/{move}")]
public async Task<IActionResult> Move([FromRoute] int id, [FromRoute] string player, [FromRoute] string move)
{
var game = _database.GetOrAddGame(id);
lock (game.MovePieceLock)
{
if (!game.Board.IsValidMove(move) || game.Board.IsEndGame || game.Board.Turn.AsChar.ToString() != player)
{
return BadRequest();
}
game.Board.Move(move);
}
var fen = game.Board.ToFen();
await game.FenChangedChannel.BroadcastAsync(fen);
return Ok(fen);
}
}