using Gameboard.Shogi.Api.ServiceModels.Messages; using Gameboard.ShogiUI.Sockets.Extensions; using Gameboard.ShogiUI.Sockets.Managers.Utility; using Gameboard.ShogiUI.Sockets.Repositories; using Gameboard.ShogiUI.Sockets.ServiceModels.Socket.Messages; using Gameboard.ShogiUI.Sockets.ServiceModels.Socket.Types; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using System.Net.WebSockets; using System.Threading.Tasks; namespace Gameboard.ShogiUI.Sockets.Managers.ClientActionHandlers { public class MoveHandler : IActionHandler { private readonly ILogger logger; private readonly IGameboardRepository gameboardRepository; private readonly ISocketCommunicationManager communicationManager; public MoveHandler( ILogger logger, ISocketCommunicationManager communicationManager, IGameboardRepository gameboardRepository) { this.logger = logger; this.gameboardRepository = gameboardRepository; this.communicationManager = communicationManager; } public async Task Handle(WebSocket socket, string json, string userName) { logger.LogInformation("Socket Request \n{0}\n", new[] { json }); var request = JsonConvert.DeserializeObject(json); // Basic move validation var move = request.Move; if (move.To.Equals(move.From)) { var serialized = JsonConvert.SerializeObject( new ErrorResponse(ClientAction.Move) { Error = "Error: moving piece from tile to the same tile." }); await socket.SendTextAsync(serialized); return; } var getSessionResponse = await gameboardRepository.GetGame(request.GameName); var isPlayer1 = userName == getSessionResponse.Session.Player1; if (!isPlayer1) { // Convert the move coords to player1 perspective. move = Move.ConvertPerspective(move); } await gameboardRepository.PostMove(request.GameName, new PostMove(Mapper.Map(move))); var response = new MoveResponse(ClientAction.Move) { GameName = request.GameName, PlayerName = userName }; await communicationManager.BroadcastToGame( request.GameName, (playerName, sslStream) => { response.Move = playerName.Equals(userName) ? request.Move : Move.ConvertPerspective(request.Move); var serialized = JsonConvert.SerializeObject(response); logger.LogInformation("Socket Response \n{0}\n", new[] { serialized }); return serialized; } ); } } }