示例#1
0
        public async Task UpdateXp(SocketMessage messageParam)
        {
            if (messageParam.Author.IsBot)
            {
                return;
            }

            if (_noXpChannels.Contains(messageParam.Channel.Id))
            {
                return;
            }

            ulong userId   = messageParam.Author.Id;
            int   waitTime = rand.Next(_xpMinCooldown, _xpMaxCooldown);
            float baseXp   = rand.Next(_xpMinPerMessage, _xpMaxPerMessage);
            float bonusXp  = 0;

            if (_xpCooldown.HasUser(userId))
            {
                return;
            }

            int karma = _databaseService.GetUserKarma(userId);

            if (messageParam.Author.Activity != null)
            {
                if (Regex.Match(messageParam.Author.Activity.Name, "(Unity.+)").Length > 0)
                {
                    bonusXp += baseXp / 4;
                }
            }

            bonusXp += baseXp * (1f + (karma / 100f));

            //Reduce XP for members with no role
            if (((IGuildUser)messageParam.Author).RoleIds.Count < 2)
            {
                baseXp *= .9f;
            }

            //Lower xp for difference between level and karma
            uint  level    = _databaseService.GetUserLevel(userId);
            float reduceXp = 1f;

            if (karma < level)
            {
                reduceXp = 1 - Math.Min(.9f, (level - karma) * .05f);
            }

            int xpGain = (int)Math.Round((baseXp + bonusXp) * reduceXp);

            //Console.WriteLine($"basexp {baseXp} karma {karma}  bonus {bonusXp}");
            _xpCooldown.AddCooldown(userId, waitTime);
            //Console.WriteLine($"{_xpCooldown[id].Minute}  {_xpCooldown[id].Second}");

            if (!await _databaseService.UserExists(userId))
            {
                _databaseService.AddNewUser((SocketGuildUser)messageParam.Author);
            }

            _databaseService.AddUserXp(userId, xpGain);
            _databaseService.AddUserUdc(userId, (int)Math.Round(xpGain * .15f));

            _loggingService.LogXp(messageParam.Channel.Name, messageParam.Author.Username, baseXp, bonusXp, reduceXp, xpGain);

            await LevelUp(messageParam, userId);

            //TODO: add xp gain on website
        }
示例#2
0
        public async Task UpdateXp(SocketMessage messageParam)
        {
            if (messageParam.Author.IsBot)
            {
                return;
            }

            if (_noXpChannels.Contains(messageParam.Channel.Id))
            {
                return;
            }

            var   userId   = messageParam.Author.Id;
            var   waitTime = _rand.Next(_xpMinCooldown, _xpMaxCooldown);
            float baseXp   = _rand.Next(_xpMinPerMessage, _xpMaxPerMessage);
            float bonusXp  = 0;

            if (_xpCooldown.HasUser(userId))
            {
                return;
            }

            var user = await _databaseService.Query().GetUser(userId.ToString());

            if (user == null)
            {
                await _databaseService.AddNewUser((SocketGuildUser)messageParam.Author);

                user = await _databaseService.Query().GetUser(userId.ToString());
            }

            if (messageParam.Author.Activity != null)
            {
                if (Regex.Match(messageParam.Author.Activity.Name, "(Unity.+)").Length > 0)
                {
                    bonusXp += baseXp / 4;
                }
            }

            bonusXp += baseXp * (1f + user.Karma / 100f);

            //Reduce XP for members with no role
            if (((IGuildUser)messageParam.Author).RoleIds.Count < 2)
            {
                baseXp *= .9f;
            }

            //Lower xp for difference between level and karma
            var reduceXp = 1f;

            if (user.Karma < user.Level)
            {
                reduceXp = 1 - Math.Min(.9f, (user.Level - user.Karma) * .05f);
            }

            var xpGain = (int)Math.Round((baseXp + bonusXp) * reduceXp);

            //Console.WriteLine($"basexp {baseXp} karma {karma}  bonus {bonusXp}");
            _xpCooldown.AddCooldown(userId, waitTime);
            //Console.WriteLine($"{_xpCooldown[id].Minute}  {_xpCooldown[id].Second}");

            await _databaseService.Query().UpdateXp(userId.ToString(), user.Exp + (uint)xpGain);

            _loggingService.LogXp(messageParam.Channel.Name, messageParam.Author.Username, baseXp, bonusXp, reduceXp, xpGain);

            await LevelUp(messageParam, userId);
        }