Exemplo n.º 1
0
    async def task_menu(self, ctx, tasks, message: Optional[discord.Message] = None):

        color = await ctx.embed_color()

        async def task_killer(
            cog: "Scheduler",
            page_mapping: dict,
            ctx: commands.Context,
            pages: list,
            controls: dict,
            message: discord.Message,
            page: int,
            timeout: float,
            emoji: str,
        ):
            to_cancel = page_mapping.pop(page)
            await cog._remove_tasks(to_cancel)
            if page_mapping:
                tasks = list(page_mapping.values())
                await cog.task_menu(ctx, tasks, message)
            else:
                with contextlib.suppress(discord.NotFound):
                    await message.delete()

        count = len(tasks)
        embeds = [
            t.to_embed(index=i, page_count=count, color=color)
            for i, t in enumerate(tasks, 1)
        ]

        controls = DEFAULT_CONTROLS.copy()
        page_mapping = {i: t for i, t in enumerate(tasks)}
        actual_task_killer = functools.partial(task_killer, self, page_mapping)
        controls.update({"\N{NO ENTRY SIGN}": actual_task_killer})
        await menu(ctx, embeds, controls, message=message)
Exemplo n.º 2
0
 async def history(self, ctx, region, summoner, count : int = 5):
     """Shows X last game of a summoner (default: 5).
     NB: if your summoner name contains spaces, use "" (eg: "My summoner name")"""
     msg = await ctx.send(f"Loading last {count} games of {summoner} ...")
     region = region.lower()
     async with ctx.typing():
         histo = await self.stats.get_history(count, region, summoner)
         if not histo:
             return await ctx.send("Unknown region or summoner.\nList of league of legends regions:" + '\n'.join(self.stats.regions.keys()))
         emb = discord.Embed()
         emblist = []
         for i in histo:
             cur = histo[i]
             champ = cur["champ"]
             horo = cur["horo"]
             role = cur["role"]
             duree = cur["Durée"]
             mode = cur["Gamemode"]
             res = cur["resultat"]
             kda = cur["kda"]
             stats = cur["stats"]
             golds = cur["golds"]
             emb.add_field(name=champ, value=mode + " : " + res, inline=True)
             emb.add_field(name=role, value=duree, inline=False)
             emb.add_field(name=golds, value=horo, inline=False)
             emb.add_field(name=kda, value=stats, inline=True)
             emblist.append(emb)
             emb = discord.Embed()
     start_adding_reactions(msg, DEFAULT_CONTROLS.keys())#, self.bot.loop)
     await menu(ctx=ctx, pages=emblist, controls=DEFAULT_CONTROLS, message=msg, page=0)
     await msg.edit(content="")
Exemplo n.º 3
0
 def get_button_controls(results, query_type):
     all_buttons = [
         "\U0001F1E6",  # :regional_indicator_a:
         "\U0001F1E7",  # :regional_indicator_b:
         "\U0001F1E8",  # :regional_indicator_c:
         "\U0001F1E9",  # :regional_indicator_d:
         "\U0001F1EA",  # :regional_indicator_e:
         "\U0001F1EB",  # :regional_indicator_f:
         "\U0001F1EC",  # :regional_indicator_g:
         "\U0001F1ED",  # :regional_indicator_h:
         "\U0001F1EE",  # :regional_indicator_i:
         "\U0001F1EF",  # :regional_indicator_j:
     ][:per_embed_page]
     buttons_count = min(len(results), len(all_buttons))
     buttons = all_buttons[:buttons_count]
     if query_type == "obs":
         controls = {
             "⬆️": prev_result_reaction,
             "⬇️": next_result_reaction,
             "⬅️": prev_page_reaction,
             "➡️": next_page_reaction,
             "✅": display_selected_reaction,
             "❌": DEFAULT_CONTROLS["❌"],
         }
     else:
         controls = DEFAULT_CONTROLS.copy()
     letter_button_reaction = (select_result_reaction
                               if query_type == "obs" else
                               update_and_display_selected_reaction)
     for button in buttons:
         controls[button] = letter_button_reaction
     return (buttons, controls)
Exemplo n.º 4
0
    async def note_menu(self,
                        ctx,
                        member: discord.Member,
                        message: Optional[discord.Message] = None) -> list:
        color = await ctx.embed_color()

        # defines deleting a note for the user
        async def delete_note(
            ctx: commands.GuildContext,
            pages: list,
            controls: dict,
            message: discord.Message,
            page: int,
            timeout: float,
            emoji: str,
        ):
            async with self.config.member(member).notes() as notes:
                del notes[page]
            # resend menu, delete old menu with removed note
            if len(pages) <= 1:
                # no more notes, delete menu
                try:
                    await message.delete()
                except discord.NotFound:
                    pass
                return

            # remove reaction
            if ctx.channel.permissions_for(ctx.me).manage_messages:
                try:
                    await message.remove_reaction("\N{NO ENTRY SIGN}",
                                                  ctx.author)
                except discord.HTTPException:
                    pass

            # call menu function again with updated menu
            await self.note_menu(ctx, member, message)

        notes = await self.config.member(member).notes()
        embeds = []
        for i, note in enumerate(notes):
            embed = discord.Embed(title=f"Notes for {member.display_name}",
                                  color=color)
            mod = ctx.guild.get_member(note["moderator"])
            mod = "Mod id({})".format(
                note["moderator"]) if not mod else mod.display_name
            embed = embed.set_author(name=mod)
            for page in pagify(note["note"], page_length=1000):
                embed = embed.add_field(name="Note", value=page)
            embed = embed.set_footer(text=f"Page {i+1} out of {len(notes)}")
            embeds.append(embed)

        controls = DEFAULT_CONTROLS.copy()
        controls.update({"\N{NO ENTRY SIGN}": delete_note})
        await menu(ctx, embeds, controls, message=message)
Exemplo n.º 5
0
async def hockey_menu(
    ctx: Context,
    display_type: str,
    post_list: list,
    message: discord.Message = None,
    page=0,
    timeout: int = 30,
):
    """menu control logic for this taken from
       https://github.com/Lunar-Dust/Dusty-Cogs/blob/master/menu/menu.py"""
    if ctx.channel.permissions_for(ctx.me).embed_links:
        if display_type == "standings":
            em = await Standings.build_standing_embed(post_list, page)
        if display_type == "division":
            em = await Standings.build_standing_embed(post_list, page)
        if display_type == "conference":
            em = await Standings.build_standing_embed(post_list, page)
        if display_type == "teams":
            em = await Standings.build_standing_embed(post_list, page)
        if display_type == "all":
            em = await Standings.all_standing_embed(post_list, page)
        if display_type == "roster":
            em = await roster_embed(post_list, page)
        if display_type == "game":
            em = await Game.get_game_embed(post_list, page)
        if display_type == "season":
            leaderboard = {"type": "Seasonal", "lists": post_list}
            em = await make_leaderboard_embed(ctx.guild, leaderboard, page)
        if display_type == "weekly":
            leaderboard = {"type": "Weekly", "lists": post_list}
            em = await make_leaderboard_embed(ctx.guild, leaderboard, page)
        if display_type == "worst":
            leaderboard = {"type": "Worst", "lists": post_list}
            em = await make_leaderboard_embed(ctx.guild, leaderboard, page)
    else:
        await ctx.send(_("I don't have embed links permission!"))
        return

    if not message:
        message = await ctx.send(embed=em)
        start_adding_reactions(message, DEFAULT_CONTROLS.keys())
        # await message.add_reaction("⬅")
        # await message.add_reaction("❌")
        # await message.add_reaction("➡")
    else:
        # message edits don't return the message object anymore lol
        await message.edit(embed=em)
    check = (
        lambda react, user: user == ctx.message.author
        and react.emoji in ["➡", "⬅", "❌"]
        and react.message.id == message.id
    )
    try:
        react, user = await ctx.bot.wait_for("reaction_add", check=check, timeout=timeout)
    except asyncio.TimeoutError:
        await message.remove_reaction("⬅", ctx.me)
        await message.remove_reaction("❌", ctx.me)
        await message.remove_reaction("➡", ctx.me)
        return None
    else:
        reacts = {v: k for k, v in numbs.items()}
        react = reacts[react.emoji]
        if react == "next":
            next_page = 0
            if page == len(post_list) - 1:
                next_page = 0  # Loop around to the first item
            else:
                next_page = page + 1
            if ctx.channel.permissions_for(ctx.me).manage_messages:
                await message.remove_reaction("➡", ctx.message.author)
            return await hockey_menu(
                ctx, display_type, post_list, message=message, page=next_page, timeout=timeout
            )
        elif react == "back":
            next_page = 0
            if page == 0:
                next_page = len(post_list) - 1  # Loop around to the last item
            else:
                next_page = page - 1
            if ctx.channel.permissions_for(ctx.me).manage_messages:
                await message.remove_reaction("⬅", ctx.message.author)
            return await hockey_menu(
                ctx, display_type, post_list, message=message, page=next_page, timeout=timeout
            )
        else:
            return await message.delete()