Exemple #1
0
        private string BuildLeaderboardsRoute(LeaderboardsOptions options)
        {
            StringBuilder sb = new StringBuilder()
                               .Append("/leaderboards")
                               .Append((options.guildId == 0) ? "" : $"/{options.guildId}")
                               .Append($"/{options.type.ToString().ToLower()}");

            if (options.type == LeaderboardsType.COMMANDS && !string.IsNullOrEmpty(options.commandSpecified))
            {
                sb.Append($"/{options.commandSpecified.ToLower()}");
            }

            sb.Append($"/{options.pageNumber}");
            return(sb.ToString());
        }
Exemple #2
0
        private string BuildLeaderboardsRoute(LeaderboardsOptions options)
        {
            StringBuilder sb = new StringBuilder()
                               .Append("/leaderboards")
                               .Append($"/{options.Type.ToString().ToLower()}");

            if (options.GuildId.HasValue)
            {
                sb.Append($"/{options.GuildId}");
            }

            QueryString qs = new QueryString();

            qs.Add("amount", options.Amount);
            qs.Add("offset", options.Offset);

            return(sb.ToString() + qs.Query);
        }
Exemple #3
0
        public async Task <LeaderboardsObject> GetPagedLeaderboardsAsync(LeaderboardsOptions options)
        {
            StringBuilder sb = new StringBuilder()
                               .Append("/leaderboards")
                               .Append((options.guildId == 0) ? "" : $"/{options.guildId}")
                               .Append($"/{options.type.ToString().ToLower()}");

            if (options.type == LeaderboardsType.COMMANDS && !string.IsNullOrEmpty(options.commandSpecified))
            {
                sb.Append($"/{options.commandSpecified.ToLower()}");
            }

            sb.Append($"/{options.pageNumber}");

            var response = await client.GetAsync <LeaderboardsObject>(sb.ToString());

            return(response.Data);
        }
Exemple #4
0
        public async Task <LeaderboardsObject> GetPagedLeaderboardsAsync(LeaderboardsOptions options)
        {
            StringBuilder sb = Utils.CreateBaseRoute()
                               .Append("/leaderboards")
                               .Append((options.guildId != 0) ? "/local" : "/global")
                               .Append("/")
                               .Append(options.type.ToString().ToLower());

            if (options.type == LeaderboardsType.COMMANDS && !string.IsNullOrEmpty(options.commandSpecified))
            {
                sb.Append("/")
                .Append(options.commandSpecified.ToLower());
            }

            sb.Append("/")
            .Append(options.pageNumber);

            RestClient client   = new RestClient(baseUrl + sb.ToString() + Utils.AddToken(token));
            var        response = await client.GetAsync <LeaderboardsObject>();

            return(response.Data);
        }
Exemple #5
0
        public async Task LeaderboardsAsync(EventContext e)
        {
            LeaderboardsOptions options = new LeaderboardsOptions();

            ArgObject argument = e.Arguments.FirstOrDefault();

            switch (argument?.Argument.ToLower() ?? "")
            {
            case "commands":
            case "cmds":
            {
                options.type = LeaderboardsType.COMMANDS;
                argument     = argument?.Next();
            }
            break;

            case "currency":
            case "mekos":
            case "money":
            case "bal":
            {
                options.type = LeaderboardsType.CURRENCY;
                argument     = argument?.Next();
            }
            break;

            case "rep":
            case "reputation":
            {
                options.type = LeaderboardsType.REPUTATION;
                argument     = argument?.Next();
            }
            break;

            case "pasta":
            case "pastas":
            {
                options.type = LeaderboardsType.PASTA;
                argument     = argument?.Next();
            }
            break;

            case "experience":
            case "exp":
            {
                options.type = LeaderboardsType.EXPERIENCE;
                argument     = argument?.Next();
            }
            break;

            case "guild":
            case "guilds":
            {
                options.type = LeaderboardsType.GUILDS;
                argument     = argument?.Next();
            }
            break;


            default:
            {
                options.type = LeaderboardsType.EXPERIENCE;
            }
            break;
            }

            if (argument?.Argument.ToLower() == "local")
            {
                if (options.type != LeaderboardsType.PASTA)
                {
                    options.guildId = e.Guild.Id;
                }
                argument = argument.Next();
            }

            if (argument != null)
            {
                IDiscordUser user = await argument.GetUserAsync(e.Guild);

                if (user != null)
                {
                    options.mentionedUserId = user.Id;
                    argument = argument.Next();
                }
            }

            if ((argument?.AsInt() ?? 0) != 0)
            {
                options.pageNumber = argument.AsInt().Value - 1;
                argument           = argument?.Next();
            }

            using (var context = new MikiContext())
            {
                int p = Math.Max(options.pageNumber - 1, 0);

                LeaderboardsObject obj = await Global.MikiApi.GetPagedLeaderboardsAsync(options);

                Utils.RenderLeaderboards(Utils.Embed, obj.items, obj.currentPage * 10)
                .SetFooter(Locale.GetString(e.Channel.Id, "page_index",
                                            obj.currentPage + 1, Math.Ceiling((double)obj.totalItems / 10)), "")
                .SetAuthor(
                    "Leaderboards: " + options.type + " (click me!)",
                    null,
                    Global.MikiApi.BuildLeaderboardsUrl(options)
                    )
                .ToEmbed().QueueToChannel(e.Channel);
            }
        }
Exemple #6
0
 /// <summary>
 /// Pulls the leaderboards data from the API
 /// </summary>
 /// <param name="options">Leaderboards Options Object</param>
 public async Task <LeaderboardsObject> GetPagedLeaderboardsAsync(LeaderboardsOptions options)
 => (await _client.GetAsync <LeaderboardsObject>(BuildLeaderboardsRoute(options))).Data;
Exemple #7
0
 /// <summary>
 /// Builds the url to the leaderboards page on the miki website
 /// </summary>
 /// <param name="options">Leaderboards Options Object</param>
 /// <returns>https://miki.ai/leaderboards/{type}/{guild_id?}</returns>
 public string BuildLeaderboardsUrl(LeaderboardsOptions options)
 => "https://miki.ai" + BuildLeaderboardsRoute(options);
Exemple #8
0
 /// <summary>
 /// Pulls the leaderboards data from the API
 /// </summary>
 /// <param name="options">Leaderboards Options Object</param>
 public async Task <LeaderboardsObject> GetPagedLeaderboardsAsync(LeaderboardsOptions options)
 => JsonConvert.DeserializeObject <LeaderboardsObject>(
     (await client.GetAsync(BuildLeaderboardsRoute(options))).Body);
Exemple #9
0
        public async Task LeaderboardsAsync(EventContext e)
        {
            LeaderboardsOptions options = new LeaderboardsOptions();

            ArgObject argument = e.Arguments.FirstOrDefault();

            switch (argument?.Argument.ToLower() ?? "")
            {
            case "commands":
            case "cmds":
            {
                options.Type = LeaderboardsType.COMMANDS;
                argument     = argument?.Next();
            }
            break;

            case "currency":
            case "mekos":
            case "money":
            case "bal":
            {
                options.Type = LeaderboardsType.CURRENCY;
                argument     = argument?.Next();
            }
            break;

            case "rep":
            case "reputation":
            {
                options.Type = LeaderboardsType.REPUTATION;
                argument     = argument?.Next();
            }
            break;

            case "pasta":
            case "pastas":
            {
                options.Type = LeaderboardsType.PASTA;
                argument     = argument?.Next();
            }
            break;

            case "experience":
            case "exp":
            {
                options.Type = LeaderboardsType.EXPERIENCE;
                argument     = argument?.Next();
            }
            break;

            case "guild":
            case "guilds":
            {
                options.Type = LeaderboardsType.GUILDS;
                argument     = argument?.Next();
            }
            break;

            default:
            {
                options.Type = LeaderboardsType.EXPERIENCE;
            }
            break;
            }

            if (argument?.Argument.ToLower() == "local")
            {
                if (options.Type != LeaderboardsType.PASTA)
                {
                    options.GuildId = e.Guild.Id;
                }
                argument = argument.Next();
            }

            if ((argument?.TakeInt() ?? 0) != 0)
            {
                options.Offset = Math.Max(0, argument.TakeInt().Value - 1) * 12;
                argument       = argument?.Next();
            }

            options.Amount = 12;

            using (var context = new MikiContext())
            {
                int p = Math.Max(options.Offset - 1, 0);

                using (var api = new MikiApi(Global.Config.MikiApiBaseUrl, Global.Config.MikiApiKey))
                {
                    LeaderboardsObject obj = await api.GetPagedLeaderboardsAsync(options);

                    Utils.RenderLeaderboards(new EmbedBuilder(), obj.items, obj.currentPage * 12)
                    .SetFooter(
                        e.Locale.GetString("page_index", obj.currentPage + 1, Math.Ceiling((double)obj.totalPages / 10)),
                        ""
                        )
                    .SetAuthor(
                        "Leaderboards: " + options.Type + " (click me!)",
                        null,
                        api.BuildLeaderboardsUrl(options)
                        )
                    .ToEmbed()
                    .QueueToChannel(e.Channel);
                }
            }
        }
Exemple #10
0
        public async Task LeaderboardsAsync(CommandContext e)
        {
            LeaderboardsOptions options = new LeaderboardsOptions();

            e.Arguments.Peek(out string argument);

            switch (argument?.ToLower() ?? "")
            {
            case "commands":
            case "cmds":
            {
                options.Type = LeaderboardsType.COMMANDS;
                e.Arguments.Skip();
            }
            break;

            case "currency":
            case "mekos":
            case "money":
            case "bal":
            {
                options.Type = LeaderboardsType.CURRENCY;
                e.Arguments.Skip();
            }
            break;

            case "rep":
            case "reputation":
            {
                options.Type = LeaderboardsType.REPUTATION;
                e.Arguments.Skip();
            }
            break;

            case "pasta":
            case "pastas":
            {
                options.Type = LeaderboardsType.PASTA;
                e.Arguments.Skip();
            }
            break;

            case "experience":
            case "exp":
            {
                options.Type = LeaderboardsType.EXPERIENCE;
                e.Arguments.Skip();
            }
            break;

            case "guild":
            case "guilds":
            {
                options.Type = LeaderboardsType.GUILDS;
                e.Arguments.Skip();
            }
            break;

            default:
            {
                options.Type = LeaderboardsType.EXPERIENCE;
            }
            break;
            }

            if (e.Arguments.Peek(out string localArg))
            {
                if (localArg.ToLower() == "local")
                {
                    if (options.Type != LeaderboardsType.PASTA)
                    {
                        options.GuildId = e.Guild.Id;
                    }
                    e.Arguments.Skip();
                }
            }

            if (e.Arguments.Peek(out int index))
            {
                options.Offset = Math.Max(0, index - 1) * 12;
                e.Arguments.Skip();
            }

            options.Amount = 12;

            var api = e.GetService <MikiApiClient>();

            LeaderboardsObject obj = await api.GetPagedLeaderboardsAsync(options);

            await Utils.RenderLeaderboards(new EmbedBuilder(), obj.items, obj.currentPage * 12)
            .SetFooter(
                e.Locale.GetString("page_index", obj.currentPage + 1, Math.Ceiling((double)obj.totalPages / 10)),
                ""
                )
            .SetAuthor(
                "Leaderboards: " + options.Type + " (click me!)",
                null,
                api.BuildLeaderboardsUrl(options)
                )
            .ToEmbed()
            .QueueToChannelAsync(e.Channel);
        }
Exemple #11
0
        public async Task LeaderboardsAsync(EventContext e)
        {
            LeaderboardsOptions options = new LeaderboardsOptions();

            Args      args     = new Args(e.arguments);
            ArgObject argument = args.Get(0);

            switch (argument?.Argument.ToLower() ?? "")
            {
            case "commands":
            case "cmds":
            {
                options.type = LeaderboardsType.COMMANDS;
                argument     = argument?.Next();
            }
            break;

            case "currency":
            case "mekos":
            case "money":
            case "bal":
            {
                options.type = LeaderboardsType.CURRENCY;
                argument     = argument?.Next();
            }
            break;

            case "rep":
            case "reputation":
            {
                options.type = LeaderboardsType.REPUTATION;
                argument     = argument?.Next();
            }
            break;

            case "pasta":
            case "pastas":
            {
                options.type = LeaderboardsType.PASTA;
                argument     = argument?.Next();
            }
            break;

            case "experience":
            case "exp":
            {
                options.type = LeaderboardsType.EXPERIENCE;
                argument     = argument?.Next();
            }
            break;

            default:
            {
                options.type = LeaderboardsType.EXPERIENCE;
            }
            break;
            }

            if (argument?.Argument.ToLower() == "local")
            {
                if (options.type != LeaderboardsType.PASTA)
                {
                    options.guildId = e.Guild.Id;
                }
                argument = argument.Next();
            }

            // Null-conditional operators do not apply on async methods.
            if (argument != null)
            {
                IDiscordUser user = (await argument.GetUserAsync(e.Guild));
                if (user != null)
                {
                    options.mentionedUserId = user.Id;
                    argument = argument.Next();
                }
            }

            if ((argument?.AsInt(0) ?? 0) != 0)
            {
                options.pageNumber = argument.AsInt();
                argument           = argument?.Next();
            }

            await ShowLeaderboardsAsync(e.message, options);
        }
Exemple #12
0
        /*[Command(Name = "setrolelevel")]
         * public async Task SetRoleLevelAsync(EventContext e)
         * {
         *      using (var context = new MikiContext())
         *      {
         *              Locale locale = new Locale(e.Channel.Id.ToDbLong());
         *
         *              List<string> allArgs = new List<string>();
         *              allArgs.AddRange(e.arguments.Split(' '));
         *              if (allArgs.Count >= 2)
         *              {
         *                      int levelrequirement = int.Parse(allArgs[allArgs.Count - 1]);
         *                      allArgs.RemoveAt(allArgs.Count - 1);
         *                      IDiscordRole role = e.Guild.Roles
         *                              .Find(r => r.Name.ToLower() == string.Join(" ", allArgs).TrimEnd(' ').TrimStart(' ').ToLower());
         *
         *                      if (role == null)
         *                      {
         *                              e.ErrorEmbed(e.GetResource("error_role_not_found"))
         *                                      .QueueToChannel(e.Channel);
         *                              return;
         *                      }
         *
         *                      LevelRole lr = await context.LevelRoles.FindAsync(e.Guild.Id.ToDbLong(), role.Id.ToDbLong());
         *                      if (lr == null)
         *                      {
         *                              lr = context.LevelRoles.Add(new LevelRole()
         *                              {
         *                                      GuildId = e.Guild.Id.ToDbLong(),
         *                                      RoleId = role.Id.ToDbLong(),
         *                                      RequiredLevel = levelrequirement
         *                              }).Entity;
         *
         *                              IDiscordEmbed embed = Utils.Embed;
         *                              embed.Title = "Added Role!";
         *                              embed.Description = $"I'll give someone the role {role.Name} when he/she reaches level {levelrequirement}!";
         *
         *                              IDiscordUser currentUser = await e.GetCurrentUserAsync();
         *
         *                              if (!currentUser.HasPermissions(e.Channel, DiscordGuildPermission.ManageRoles))
         *                              {
         *                                      embed.AddInlineField(e.GetResource("miki_warning"), e.GetResource("setrolelevel_error_no_permissions", $"`{e.GetResource("permission_manage_roles")}`"));
         *                              }
         *
         *                              embed.QueueToChannel(e.Channel);
         *                      }
         *                      else
         *                      {
         *                              lr.RequiredLevel = levelrequirement;
         *
         *                              IDiscordEmbed embed = Utils.Embed;
         *                              embed.Title = "Updated Role!";
         *                              embed.Description = $"I'll give someone the role {role.Name} when he/she reaches level {levelrequirement}!";
         *                              embed.QueueToChannel(e.Channel);
         *                      }
         *                      await context.SaveChangesAsync();
         *              }
         *              else
         *              {
         *                      e.ErrorEmbed("Make sure to fill out both the role and the level when creating this!")
         *                              .QueueToChannel(e.Channel);
         *              }
         *      }
         * }*/

        //[Command(Name = "mybadges")]
        //public async Task MyBadgesAsync(EventContext e)
        //{
        //	int page = 0;
        //	using (var context = new MikiContext())
        //	{
        //		User u = await context.Users.FindAsync(e.Author.Id.ToDbLong());

        //		string output = string.Join<long>(" ", u.BadgesOwned.Select(x => x.Id).ToList());

        //		await e.Channel.SendMessage(output.DefaultIfEmpty("none, yet!"));
        //	}
        //}

        public async Task ShowLeaderboardsAsync(IDiscordMessage mContext, LeaderboardsOptions leaderboardOptions)
        {
            using (var context = new MikiContext())
            {
                Locale locale = new Locale(mContext.Channel.Id);

                int p = Math.Max(leaderboardOptions.pageNumber - 1, 0);

                if (Global.MikiApi == null)
                {
                    IDiscordEmbed embed = Utils.Embed
                                          .SetColor(1.0f, 0.6f, 0.4f);

                    switch (leaderboardOptions.type)
                    {
                    case LeaderboardsType.COMMANDS:
                    {
                        embed.Title = locale.GetString("miki_module_accounts_leaderboards_commands_header");
                        if (leaderboardOptions.mentionedUserId != 0)
                        {
                            long mentionedId = leaderboardOptions.mentionedUserId.ToDbLong();

                            var mentionedUser = await context.Users.FindAsync(mentionedId);

                            p = (int)Math.Ceiling((double)(((await mentionedUser.GetGlobalCommandsRankAsync()) - 1) / 12));
                        }
                        List <User> output = await context.Users
                                             .OrderByDescending(x => x.Total_Commands)
                                             .Skip(12 * p)
                                             .Take(12)
                                             .ToListAsync();

                        for (int i = 0; i < output.Count; i++)
                        {
                            string nameToOutput = leaderboardOptions.mentionedUserId != 0 ? string.Join("", output[i].Name.Take(16)) : "~" + string.Join("", output[i].Name.Take(16)) + "~";
                            embed.AddInlineField($"#{i + (12 * p) + 1}: {nameToOutput}", $"{output[i].Total_Commands} commands used!");
                        }
                    }
                    break;

                    case LeaderboardsType.CURRENCY:
                    {
                        embed.Title = locale.GetString("miki_module_accounts_leaderboards_mekos_header");
                        if (leaderboardOptions.mentionedUserId != 0)
                        {
                            long mentionedId   = leaderboardOptions.mentionedUserId.ToDbLong();
                            var  mentionedUser = await context.Users.FindAsync(mentionedId);

                            p = (int)Math.Ceiling((double)(((await mentionedUser.GetGlobalMekosRankAsync()) - 1) / 12));
                        }
                        List <User> output = await context.Users
                                             .OrderByDescending(x => x.Currency)
                                             .Skip(12 * p)
                                             .Take(12)
                                             .ToListAsync();

                        for (int i = 0; i < output.Count; i++)
                        {
                            embed.AddInlineField($"#{i + (12 * p) + 1}: {string.Join("", output[i].Name.Take(16))}",
                                                 $"{output[i].Currency} mekos!");
                        }
                    }
                    break;

                    case LeaderboardsType.EXPERIENCE:
                    {
                        embed.Title = locale.GetString("miki_module_accounts_leaderboards_header");
                        if (leaderboardOptions.mentionedUserId != 0)
                        {
                            long mentionedId   = leaderboardOptions.mentionedUserId.ToDbLong();
                            var  mentionedUser = await context.Users.FindAsync(mentionedId);

                            p = (int)Math.Ceiling((double)(((await mentionedUser.GetGlobalRankAsync()) - 1) / 12));
                        }
                        List <User> output = await context.Users
                                             .OrderByDescending(x => x.Total_Experience)
                                             .Skip(12 * p)
                                             .Take(12)
                                             .ToListAsync();

                        for (int i = 0; i < output.Count; i++)
                        {
                            embed.AddInlineField($"#{i + (12 * p) + 1}: {string.Join("", output[i].Name.Take(16))}",
                                                 $"{output[i].Total_Experience} experience!");
                        }
                    }
                    break;

                    case LeaderboardsType.REPUTATION:
                    {
                        embed.Title = locale.GetString("miki_module_accounts_leaderboards_reputation_header");
                        if (leaderboardOptions.mentionedUserId != 0)
                        {
                            long mentionedId   = leaderboardOptions.mentionedUserId.ToDbLong();
                            var  mentionedUser = await context.Users.FindAsync(mentionedId);

                            p = (int)Math.Ceiling((double)(((await mentionedUser.GetGlobalReputationRankAsync()) - 1) / 12));
                        }
                        List <User> output = await context.Users
                                             .OrderByDescending(x => x.Reputation)
                                             .Skip(12 * p)
                                             .Take(12)
                                             .ToListAsync();

                        for (int i = 0; i < output.Count; i++)
                        {
                            embed.AddInlineField($"#{i + (12 * p) + 1}: {string.Join("", output[i].Name.Take(16))}",
                                                 $"{output[i].Reputation} reputation!");
                        }
                    }
                    break;

                    case LeaderboardsType.PASTA:
                    {
                        List <GlobalPasta> leaderboards = await context.Pastas
                                                          .OrderByDescending(x => x.Score)
                                                          .Skip(12 * p)
                                                          .Take(12)
                                                          .ToListAsync();

                        embed.SetTitle(locale.GetString("toppasta_title"));

                        foreach (GlobalPasta t in leaderboards)
                        {
                            int amount = t.Score;
                            embed.AddInlineField(t.Id, (t == leaderboards.First() ? "💖 " + amount : (amount < 0 ? "💔 " : "� ") + amount));
                        }
                    }
                    break;
                    }


                    embed.SetFooter(locale.GetString("page_index", p + 1, Math.Ceiling(context.Users.Count() / 12f)), "")
                    .QueueToChannel(mContext.Channel);
                }
                else
                {
                    LeaderboardsObject obj = await Global.MikiApi.GetPagedLeaderboardsAsync(leaderboardOptions);

                    Utils.RenderLeaderboards(Utils.Embed, obj.items, obj.currentPage * 10)
                    .SetFooter(locale.GetString("page_index", p + 1, Math.Ceiling((double)obj.totalItems / 10)), "")
                    .SetTitle($"Leaderboards: {leaderboardOptions.type.ToString()}")
                    .QueueToChannel(mContext.Channel);
                }
            }
        }
Exemple #13
0
        public async Task LeaderboardsAsync(EventContext e)
        {
            string[] args    = e.arguments.Split(' ');
            int      parseId = 1;

            LeaderboardsOptions options = new LeaderboardsOptions();

            switch (args[0].ToLower())
            {
            case "local":
            case "server":
            case "guild":
            {
                options.guildId = e.Guild.Id;
            }
            break;

            case "commands":
            case "cmds":
            {
                options.type = LeaderboardsType.COMMANDS;
            }
            break;

            case "currency":
            case "mekos":
            case "money":
            case "bal":
            {
                options.type = LeaderboardsType.CURRENCY;
            }
            break;

            case "rep":
            case "reputation":
            {
                options.type = LeaderboardsType.REPUTATION;
            }
            break;

            case "pasta":
            case "pastas":
            {
                options.type = LeaderboardsType.PASTA;
            }
            break;

            default:
            {
                options.type = LeaderboardsType.EXP;
                parseId      = 0;
            }
            break;
            }

            if (e.message.MentionedUserIds.Count > 0)
            {
                options.mentionedUserId = e.message.MentionedUserIds.First();
            }
            else
            {
                string s = "";

                if (args.Length > parseId)
                {
                    s = args[parseId];

                    if (s.StartsWith("me") || s.StartsWith("self"))
                    {
                        options.mentionedUserId = e.message.Author.Id;
                    }
                    else if (s.StartsWith("#"))
                    {
                        s = s?.Substring(1);
                        if (int.TryParse(s, out int parsedNumber))
                        {
                            options.pageNumber = (int)Math.Ceiling(parsedNumber / 12.0);
                        }
                    }
                    else
                    {
                        int.TryParse(s, out options.pageNumber);
                    }
                }
            }

            await ShowLeaderboardsAsync(e.message, options);
        }