using Gameboard.ShogiUI.Sockets.Extensions; using Gameboard.ShogiUI.Sockets.Managers.Utility; using Gameboard.ShogiUI.Sockets.Models; 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.Linq; using System.Net.WebSockets; using System.Threading.Tasks; namespace Gameboard.ShogiUI.Sockets.Managers.ClientActionHandlers { public class LoadGameHandler : IActionHandler { private readonly ILogger logger; private readonly IGameboardRepository gameboardRepository; private readonly ISocketCommunicationManager communicationManager; public LoadGameHandler( 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) { var request = JsonConvert.DeserializeObject(json); var getGameResponse = await gameboardRepository.GetGame(request.GameName); var getMovesResponse = await gameboardRepository.GetMoves(request.GameName); var response = new LoadGameResponse(ClientAction.LoadGame); if (getGameResponse == null || getMovesResponse == null) { response.Error = $"Could not find game."; } else { var session = new Session(getGameResponse.Session); communicationManager.SubscribeToGame(socket, session, userName); response.Game = session.ToServiceModel(); response.Moves = userName.Equals(session.Player1) ? getMovesResponse.Moves.Select(_ => Mapper.Map(_)) : getMovesResponse.Moves.Select(_ => Move.ConvertPerspective(Mapper.Map(_))); } var serialized = JsonConvert.SerializeObject(response); logger.LogInformation("Response to {0} \n{1}\n", userName, serialized); await socket.SendTextAsync(serialized); } } }