using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace Gameboard.ShogiUI.Sockets.Managers { public interface ISocketTokenManager { Guid GenerateToken(string s); string GetUsername(Guid g); } public class SocketTokenManager : ISocketTokenManager { /// /// Key is userName /// private readonly Dictionary Tokens; public SocketTokenManager() { Tokens = new Dictionary(); } public Guid GenerateToken(string userName) { var guid = Guid.NewGuid(); if (Tokens.ContainsKey(userName)) { Tokens.Remove(userName); } Tokens.Add(userName, guid); _ = Task.Run(async () => { await Task.Delay(TimeSpan.FromMinutes(1)); Tokens.Remove(userName); }); return guid; } /// User name associated to the guid or null. public string GetUsername(Guid guid) { if (Tokens.ContainsValue(guid)) { var username = Tokens.First(kvp => kvp.Value == guid).Key; Tokens.Remove(username); return username; } return null; } } }