using Gameboard.ShogiUI.Sockets.Models; 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 IGameboardManager manager; private readonly ISocketConnectionManager connectionManager; public CreateGameHandler( ISocketConnectionManager communicationManager, IGameboardManager manager) { this.manager = manager; this.connectionManager = communicationManager; } public async Task Handle(CreateGameRequest request, string userName) { var model = new SessionMetadata(request.GameName, request.IsPrivate, userName, null); var success = await manager.CreateSession(model); if (!success) { var error = new CreateGameResponse(request.Action) { Error = "Unable to create game with this name." }; await connectionManager.BroadcastToPlayers(error, userName); } var response = new CreateGameResponse(request.Action) { PlayerName = userName, Game = model.ToServiceModel() }; var task = request.IsPrivate ? connectionManager.BroadcastToPlayers(response, userName) : connectionManager.BroadcastToAll(response); await task; } } }