using AspShogiSockets.Extensions; using Gameboard.Shogi.Api.ServiceModels.Messages; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using System.Net.WebSockets; using System.Threading.Tasks; using Websockets.Managers.Utility; using Websockets.Repositories; using Websockets.ServiceModels.Messages; using Websockets.ServiceModels.Types; namespace Websockets.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 getGameResponse = await gameboardRepository.GetGame(request.GameName); var isPlayer1 = userName.Equals(getGameResponse.Players[0]); if (!isPlayer1) { // Convert the move coords to player1 perspective. move = Move.ConvertPerspective(move); } await gameboardRepository.PostMove( request.GameName, new PostMove { Move = 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; } ); } } }