using Gameboard.ShogiUI.Sockets.Models; using Gameboard.ShogiUI.Sockets.Repositories.RepositoryManagers; using Gameboard.ShogiUI.Sockets.ServiceModels.Socket.Messages; using System.Threading.Tasks; namespace Gameboard.ShogiUI.Sockets.Managers.ClientActionHandlers { public interface ICreateGameHandler { Task Handle(CreateGameRequest request, string userName); } // TODO: This doesn't need to be a socket action. // It can be an API route and still tell socket connections about the new session. public class CreateGameHandler : ICreateGameHandler { private readonly IGameboardRepositoryManager manager; private readonly ISocketCommunicationManager communicationManager; public CreateGameHandler( ISocketCommunicationManager communicationManager, IGameboardRepositoryManager manager) { this.manager = manager; this.communicationManager = communicationManager; } public async Task Handle(CreateGameRequest request, string userName) { var model = new Session(request.GameName, request.IsPrivate, userName); var success = await manager.CreateSession(model); if (!success) { var error = new CreateGameResponse(request.Action) { Error = "Unable to create game with this name." }; await communicationManager.BroadcastToPlayers(error, userName); } var response = new CreateGameResponse(request.Action) { PlayerName = userName, Game = model.ToServiceModel() }; var task = request.IsPrivate ? communicationManager.BroadcastToPlayers(response, userName) : communicationManager.BroadcastToAll(response); await task; } } }