using Gameboard.Shogi.Api.ServiceModels.Messages; using Gameboard.ShogiUI.Sockets.Repositories; using Gameboard.ShogiUI.Sockets.ServiceModels.Socket.Messages; using Gameboard.ShogiUI.Sockets.ServiceModels.Socket.Types; using Newtonsoft.Json; using System.Threading.Tasks; namespace Gameboard.ShogiUI.Sockets.Managers.ClientActionHandlers { public class JoinByCodeHandler : IActionHandler { private readonly IGameboardRepository repository; private readonly ISocketCommunicationManager communicationManager; public JoinByCodeHandler( ISocketCommunicationManager communicationManager, IGameboardRepository repository) { this.repository = repository; this.communicationManager = communicationManager; } public async Task Handle(string json, string userName) { var request = JsonConvert.DeserializeObject(json); var sessionName = await repository.PostJoinPrivateSession(new PostJoinPrivateSession { PlayerName = userName, JoinCode = request.JoinCode }); if (sessionName == null) { var response = new JoinGameResponse(ClientAction.JoinByCode) { PlayerName = userName, GameName = sessionName, Error = "Error joining game." }; await communicationManager.BroadcastToPlayers(response, userName); } else { // Other members of the game see a regular JoinGame occur. var response = new JoinGameResponse(ClientAction.JoinGame) { PlayerName = userName, GameName = sessionName }; // At this time, userName hasn't subscribed and won't receive this message. await communicationManager.BroadcastToGame(sessionName, response); // The player joining sees the JoinByCode occur. response = new JoinGameResponse(ClientAction.JoinByCode) { PlayerName = userName, GameName = sessionName }; await communicationManager.BroadcastToPlayers(response, userName); } } } }