Esempio n. 1
0
        public async Task Ranks(int count, int position)
        {
            const int elementsPerList = 20;

            using (var uow = _db.UnitOfWork)
            {
                var levelModels = uow.LevelModel.GetAll().Where(p => p.TotalXP != 0 && p.GuildId == Context.Guild.Id)
                                  .OrderByDescending(p => p.TotalXP).Skip(position - 1 <= 0 ? 0 : position - 1).Take(count).ToList();

                if (!levelModels.Any())
                {
                    return;
                }

                var groupedLevelModels =
                    levelModels.GroupBy(lm => (int)Math.Floor(levelModels.IndexOf(lm) * 1d / elementsPerList));
                var rankStrings = new List <string>();
                var sb          = new StringBuilder();
                sb.AppendLine(GetText("ranks_header"));
                foreach (var glm in groupedLevelModels)
                {
                    var listNumber = glm.Key + 1;
                    if (!glm.Any())
                    {
                        continue;
                    }
                    sb.Append($"```{GetText("ranks_list_header", listNumber)}");
                    foreach (var lm in glm)
                    {
                        var user = await Context.Guild.GetUserAsync(lm.UserId).ConfigureAwait(false);

                        var level     = uow.LevelModel.GetLevel(lm.GuildId, lm.UserId);
                        var currentXp = uow.LevelModel.GetCurrentXp(lm.GuildId, lm.UserId);
                        sb.Append("\n" + GetText("ranks_list_row", $"{position + levelModels.IndexOf(lm),3}",
                                                 $"{user?.ToString() ?? lm.UserId.ToString(),-37}", $"{level,3}", $"{currentXp,6}",
                                                 $"{LevelModelRepository.GetXpToNextLevel(level),6}", $"{lm.TotalXP,8}"));
                    }

                    sb.Append("```");
                    rankStrings.Add(sb.ToString());
                    sb.Clear();
                }

                var channel = count <= 20
                    ? Context.Channel
                    : await Context.User.GetOrCreateDMChannelAsync().ConfigureAwait(false);

                foreach (var s in rankStrings)
                {
                    await channel.SendMessageAsync(s).ConfigureAwait(false);

                    Thread.Sleep(250);
                }
            }
        }
Esempio n. 2
0
            //levelxp(lvl): xp needed to reach the given level beginning at level 0
            //levelxp(lvl1, lvl2): xp needed to get to lvl2 from lvl1
            public static object LevelXp(ICommandContext context, DbService db, FunctionArgs args)
            {
                if (args.Parameters.Length < 1 || args.Parameters.Length > 2)
                {
                    return(null);
                }
                var arg1 = args.Parameters[0];

                if (arg1.ParsedExpression == null)
                {
                    arg1.Evaluate();
                }
                var expr = arg1.ParsedExpression.ToString();

                if (!int.TryParse(expr, out var lvl1))
                {
                    return(null);
                }
                if (args.Parameters.Length < 2)
                {
                    return(LevelModelRepository.GetXpForLevel(lvl1));
                }

                var arg2 = args.Parameters[1];

                if (arg2.ParsedExpression == null)
                {
                    arg2.Evaluate();
                }
                expr = arg2.ParsedExpression.ToString();
                if (!int.TryParse(expr, out var lvl2))
                {
                    return(null);
                }
                return(LevelModelRepository.GetXpForLevel(lvl2) - LevelModelRepository.GetXpForLevel(lvl1));
            }
Esempio n. 3
0
        public async Task Rank(ulong userId = 0)
        {
            userId = userId != 0 ? userId : Context.User.Id;

            int totalRanks, rank, totalXp, level, currentXp;

            using (var uow = _db.UnitOfWork)
            {
                var lm = uow.LevelModel.Get(Context.Guild.Id, userId);
                totalXp    = uow.LevelModel.GetTotalXp(Context.Guild.Id, userId);
                level      = uow.LevelModel.GetLevel(Context.Guild.Id, userId);
                currentXp  = uow.LevelModel.GetCurrentXp(Context.Guild.Id, userId);
                totalRanks = uow.LevelModel.GetAll().Count(m => m.TotalXP > 0 && m.GuildId == Context.Guild.Id);
                rank       = lm == null
                    ? -1
                    : uow.LevelModel.GetAll().Where(p => p.GuildId == Context.Guild.Id)
                             .OrderByDescending(p => p.TotalXP).ToList().IndexOf(lm) + 1;
                await uow.CompleteAsync().ConfigureAwait(false);
            }

            if (userId == Context.User.Id)
            {
                await Context.Channel.SendMessageAsync(GetText("rank_self", Context.User.Mention, level, currentXp,
                                                               LevelModelRepository.GetXpToNextLevel(level), totalXp, totalXp > 0 ? rank.ToString() : "-",
                                                               totalRanks)).ConfigureAwait(false);
            }
            else
            {
                var user = await Context.Guild.GetUserAsync(userId).ConfigureAwait(false);

                var namestring = user?.Nickname ?? (user?.Username ?? userId.ToString());
                await Context.Channel.SendMessageAsync(GetText("rank_other", Context.User.Mention, namestring, level,
                                                               currentXp, LevelModelRepository.GetXpToNextLevel(level), totalXp,
                                                               totalXp > 0 ? rank.ToString() : "-", totalRanks)).ConfigureAwait(false);
            }
        }