using Gameboard.ShogiUI.Sockets.ServiceModels.Socket; using System.Threading.Tasks; namespace Gameboard.ShogiUI.Sockets.Managers.ClientActionHandlers { public interface IMoveHandler { Task Handle(MoveRequest request, string userName); } public class MoveHandler : IMoveHandler { private readonly IGameboardManager gameboardManager; private readonly ISocketConnectionManager connectionManager; public MoveHandler( ISocketConnectionManager connectionManager, IGameboardManager gameboardManager) { this.gameboardManager = gameboardManager; this.connectionManager = connectionManager; } public async Task Handle(MoveRequest request, string userName) { Models.Move moveModel; if (request.Move.PieceFromCaptured.HasValue) { moveModel = new Models.Move(request.Move.PieceFromCaptured.Value, request.Move.To); } else { moveModel = new Models.Move(request.Move.From!, request.Move.To, request.Move.IsPromotion); } var session = await gameboardManager.ReadSession(request.GameName); if (session != null) { var shogi = session.Shogi; var moveSuccess = shogi.Move(moveModel); if (moveSuccess) { await gameboardManager.CreateBoardState(session.Name, shogi); var response = new MoveResponse() { GameName = request.GameName, PlayerName = userName, Move = moveModel.ToServiceModel() }; await connectionManager.BroadcastToPlayers(response, session.Player1, session.Player2); } else { var response = new MoveResponse() { Error = "Invalid move." }; await connectionManager.BroadcastToPlayers(response, userName); } } } } }