using Gameboard.ShogiUI.Sockets.Models; using Gameboard.ShogiUI.Sockets.Repositories; using System; using System.Threading.Tasks; namespace Gameboard.ShogiUI.Sockets.Managers { public interface IGameboardManager { Task CreateGuestUser(); Task IsPlayer1(string sessionName, string playerName); bool IsGuest(string playerName); Task CreateSession(SessionMetadata session); Task ReadSession(string gameName); Task UpdateSession(Session session); Task AssignPlayer2ToSession(string sessionName, string userName); } public class GameboardManager : IGameboardManager { private const int MaxTries = 3; private const string GuestPrefix = "Guest-"; private readonly IGameboardRepository repository; public GameboardManager(IGameboardRepository repository) { this.repository = repository; } public async Task CreateGuestUser() { var count = 0; while (count < MaxTries) { count++; var clientId = $"Guest-{Guid.NewGuid()}"; var isCreated = await repository.CreateGuestUser(clientId); if (isCreated) { return clientId; } } throw new OperationCanceledException($"Failed to create guest user after {MaxTries} tries."); } public async Task IsPlayer1(string sessionName, string playerName) { //var session = await repository.GetGame(sessionName); //return session?.Player1 == playerName; return true; } public async Task CreateJoinCode(string sessionName, string playerName) { //var session = await repository.GetGame(sessionName); //if (playerName == session?.Player1) //{ // return await repository.PostJoinCode(sessionName, playerName); //} return string.Empty; } public Task CreateSession(SessionMetadata session) { return repository.CreateSession(session); } public bool IsGuest(string playerName) => playerName.StartsWith(GuestPrefix); public Task ReadSession(string sessionName) { return repository.ReadSession(sessionName); } /// /// Saves the session to storage. /// /// The session to save. /// True if the session was saved successfully. public Task UpdateSession(Session session) { return repository.UpdateSession(session); } public async Task AssignPlayer2ToSession(string sessionName, string userName) { var isSuccess = false; var session = await repository.ReadSession(sessionName); if (session != null && !session.IsPrivate && string.IsNullOrEmpty(session.Player2)) { session.SetPlayer2(userName); if (await repository.UpdateSession(session)) { isSuccess = true; } } return isSuccess; } } }