Пример #1
0
        /// <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);
        }
Пример #2
0
        /// <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);
        }
Пример #3
0
        /// <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);
            }
        }