using Gameboard.Shogi.Api.ServiceModels.Messages; using System; using System.Threading.Tasks; namespace Gameboard.ShogiUI.Sockets.Repositories.RepositoryManagers { public interface IGameboardRepositoryManager { Task CreateGuestUser(); Task IsPlayer1(string sessionName, string playerName); bool IsGuest(string playerName); Task PlayerExists(string playerName); } public class GameboardRepositoryManager : IGameboardRepositoryManager { private const int MaxTries = 3; private const string GuestPrefix = "Guest-"; private readonly IGameboardRepository repository; public GameboardRepositoryManager(IGameboardRepository repository) { this.repository = repository; } public async Task CreateGuestUser() { var count = 0; while (count < MaxTries) { count++; var clientId = $"Guest-{Guid.NewGuid()}"; var request = new PostPlayer { PlayerName = clientId }; var isCreated = await repository.PostPlayer(request); 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; } 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 null; } public bool IsGuest(string playerName) => playerName.StartsWith(GuestPrefix); public async Task PlayerExists(string playerName) => await repository.GetPlayer(playerName) != null; } }