using Gameboard.ShogiUI.Sockets.Models; using Gameboard.ShogiUI.Sockets.Repositories; using Gameboard.ShogiUI.Sockets.ServiceModels.Socket; using Gameboard.ShogiUI.Sockets.ServiceModels.Types; using Microsoft.Extensions.Logging; using System.Linq; using System.Threading.Tasks; namespace Gameboard.ShogiUI.Sockets.Managers.ClientActionHandlers { public interface ILoadGameHandler { Task Handle(LoadGameRequest request, string userName); } /// /// Subscribes a user to messages for a session and loads that session into the BoardManager for playing. /// public class LoadGameHandler : ILoadGameHandler { private readonly ILogger logger; private readonly IGameboardRepository gameboardRepository; private readonly ISocketConnectionManager communicationManager; public LoadGameHandler( ILogger logger, ISocketConnectionManager communicationManager, IGameboardRepository gameboardRepository) { this.logger = logger; this.gameboardRepository = gameboardRepository; this.communicationManager = communicationManager; } public async Task Handle(LoadGameRequest request, string userName) { var sessionModel = await gameboardRepository.ReadSession(request.GameName); if (sessionModel == null) { logger.LogWarning("{action} - {user} was unable to load session named {session}.", ClientAction.LoadGame, userName, request.GameName); var error = new LoadGameResponse() { Error = "Game not found." }; await communicationManager.BroadcastToPlayers(error, userName); return; } communicationManager.SubscribeToGame(sessionModel, userName); var response = new LoadGameResponse() { Game = new SessionMetadata(sessionModel).ToServiceModel(), BoardState = sessionModel.Shogi.ToServiceModel(), MoveHistory = sessionModel.Shogi.MoveHistory.Select(_ => _.ToServiceModel()).ToList() }; await communicationManager.BroadcastToPlayers(response, userName); } } }