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)
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="")
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)
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)
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()