/// <summary> /// Get a player from cache or database /// </summary> /// <param name="userId"></param> /// <param name="onlineOnly"></param> /// <returns></returns> public async Task <Player> GetPlayerAsync(long userId, bool onlineOnly = false) { lock (SyncObject) { if (ContainsKey(userId)) { return(this[userId]); } } if (onlineOnly) { return(null); } var player = Resources.ObjectCache.GetCachedPlayer(userId); if (player != null) { return(player); } player = await PlayerDb.GetAsync(userId); Resources.ObjectCache.CachePlayer(player); return(player); }
/// <summary> /// Get a player from cache or database /// </summary> /// <param name="userId"></param> /// <param name="onlineOnly"></param> /// <returns></returns> public async Task <Player> GetPlayerAsync(long userId, bool onlineOnly = false) { lock (SyncObject) { if (ContainsKey(userId)) { return(this[userId]); } } if (onlineOnly) { return(null); } if (!Redis.IsConnected) { return(await PlayerDb.GetAsync(userId)); } var player = await Redis.GetPlayerAsync(userId); if (player != null) { return(player); } player = await PlayerDb.GetAsync(userId); await Redis.CacheAsync(player); return(player); }
/// <summary> /// Login a player /// </summary> /// <param name="userId"></param> /// <param name="token"></param> public async Task <Player> Login(long userId, string token) { Player player; if (userId <= 0 && string.IsNullOrEmpty(token)) { player = await PlayerDb.CreateAsync(); } else { //var p = await Redis.GetPlayerAsync(userId); var p = Resources.ObjectCache.GetCachedPlayer(userId); if (p != null) { player = p; } else { player = await PlayerDb.GetAsync(userId); } if (player == null) { return(null); } if (player.Home.UserToken != token) { return(null); } } lock (SyncObject) { if (player == null) { return(null); } Logout(ref player); var result = TryAdd(player.Home.Id, player); if (!result) { return(null); } //Logger.Log($"User {player.Home.Id} logged in.", GetType(), ErrorLevel.Debug); return(player); } }