def __init__(self, ctx, message, *, timeout=30.0, delete_message_after=False, confirmation_message=True): super().__init__(timeout=timeout, delete_message_after=delete_message_after) self.ctx = ctx self.result = None if ctx.guild is not None: self.permissions = ctx.channel.permissions_for(ctx.guild.me) else: self.permissions = ctx.channel.permissions_for(ctx.bot.user) if not self.permissions.external_emojis: # Clear buttons and fallback to the Unicode emojis self.clear_buttons() confirm = menus.Button("\N{WHITE HEAVY CHECK MARK}", self.do_confirm) deny = menus.Button("\N{CROSS MARK}", self.do_deny) self.add_button(confirm) self.add_button(deny) if confirmation_message is True: reactbuttons = list(self.buttons.keys()) self.msg = f"{message}\n\nReact with {reactbuttons[0]} to confirm or"\ f" {reactbuttons[1]} to deny." else: self.msg = message
def generate_buttons(self): self.choices = list(enumerate(self.choices)) for (i, choice) in self.choices: self.add_button( menus.Button(emoji=f'{i+1}\N{COMBINING ENCLOSING KEYCAP}', action=self.button_fn(choice))) self.add_button( menus.Button(emoji=f'\N{CROSS MARK}', action=self.button_fn(None)))
async def start(self, ctx, opponent, *, channel=None, wait=False, ranked: bool = True, cls: type[Board] = Board): self.players = (ctx.author, opponent) self.ranked = ranked if self.ranked: for player in self.players: async with ctx.db as connection: await Ranking.insert(connection, ignore_on_conflict=True, user_id=player.id) self.board = cls.new_game() if self.players[self.board.current_player].bot: await self._ai_turn() # Setup buttons for emoji in REGIONAL_INDICATOR_EMOJI: self.add_button(menus.Button(emoji, self.place)) await super().start(ctx, channel=channel, wait=wait)
async def make_buttons(self, react: bool = False) -> None: """Adds all keycaps emojis as buttons""" for key in self.keycaps: async def keycap_placeholder(self, payload: discord.RawReactionActionEvent): await self.on_keycap(payload) maybecoro = self.add_button(menus.Button(key, keycap_placeholder), react=react) if maybecoro is not None: await maybecoro async def on_french(self, payload: discord.RawReactionActionEvent): # not very dry, but we clear the buttons everytime self.stop() maybecoro = self.add_button(menus.Button(self.white_flag, on_french), react=react) if maybecoro is not None: await maybecoro
def __init__(self, **kwargs): super().__init__(**kwargs) self.value = None self.map = self.get_map() for button in [menus.Button(e, self.do_emoji_react) for e in self.map]: self.add_button(button)
def __init__(self, cogs, main_embed, instance): super().__init__(clear_reactions_after=True) self.cogs = cogs self.main_embed = main_embed self.instance = instance for cog in cogs: self.add_button(menus.Button(cog.emoji, self.cog_embed))
def __init__(self, *, tracks: typing.List[mlavalink.Track]): super().__init__(timeout=60.0, delete_message_after=True, check_embeds=True, message=None) self._tracks = {} emojis = list(util.EMOJI_CHARS.values()) for i, track in enumerate(tracks[:5]): emoji = emojis[i] self._tracks[emoji] = track self.add_button(menus.Button(emoji, self.selection_button)) self.add_button( menus.Button('<:stop:678961746869747739>', self.stop_button)) self._selection: typing.Optional[mlavalink.Track] = None
def __init__(self, embed, moves, initial_setup): super().__init__(clear_reactions_after=True) self.embed = embed self.moves = moves self.active = 'A' self.board, index, mapping = [[], [], [], [], [], []], 0, {} for count, cell in enumerate(initial_setup): if cell in ['o', 'x', 'A']: self.board[count // 6].append(cell) else: if cell not in mapping: mapping[cell] = index index += 1 self.board[count // 6].append(mapping[cell]) self.add_button(menus.Button(ESCAPE_MAPPING['A'], self.piece)) for cell in list(mapping.values()): self.add_button(menus.Button(ESCAPE_MAPPING[cell], self.piece))
def __init__(self, ctx, layout, embed): super().__init__(clear_reactions_after=True) self.ctx = ctx self.layout = layout self.embed = embed self.active = 1 types = {cell for row in self.layout for cell in row if cell != 0} for cell in types: self.add_button(menus.Button(ESCAPE_MAPPING[cell], self.car))
def __init__(self, options: list[T]) -> None: super().__init__(delete_message_after=True) if len(options) > 9: raise RuntimeError("Too many options for choice menu.") self.options = options self.selection: Optional[T] = None for i, _ in enumerate(self.options, 1): emoji = f"{i}\ufe0f\N{COMBINING ENCLOSING KEYCAP}" self.add_button(menus.Button(emoji, self.choose))
def __init__(self, *args, **kwargs): event_data = kwargs.pop('event_data') self.load_data(event_data) super().__init__(*args, **kwargs) # add the buttons upon instanciation for role in ALL_ROLES: button = menus.Button(BUTTONS[role], self._button_add_role, skip_if=self._skip_role(role)) self.add_button(button)
def __init__(self, player: typing.Optional[discord.Member] = None, opponent: typing.Optional[discord.Member] = None, **kwargs): super().__init__(**kwargs) self.player_move = 3 self.player = player self.opponent = opponent self.bot_move = 3 if opponent else random.randrange(3) self.timed_out = False for emoji in _emojis: self.add_button(menus.Button(emoji, self.my_action))
def __init__(self, **kwargs): super().__init__(**kwargs) self.tries = 10 self.value = None self.position = 0 self.entry = ["X"] * 5 self.previous_tries = [] self.code = self.get_code() for button in [ menus.Button(e, self.do_entry_button) for e in self.EMOJI_LIST ]: self.add_button(button)
def __init__(self, msg, timeout=60.0, emoji=UNICODE_EMOJI["CHECK"]): super().__init__(timeout=timeout, clear_reactions_after=True) self.msg = msg self.result = None def button_callback(): async def do_confirm(_, payload): self.result = True self.stop() return do_confirm button = menus.Button(emoji, button_callback()) self.add_button(button)
def __init__(self, player1: discord.Member, player2: discord.Member, **kwargs): super().__init__(**kwargs) self.players = (player1, player2) self._player_ids = {p.id for p in self.players} self.player_cycle = cycle(self.players) self.current_player = next(self.player_cycle) self.last_move = None self.winner = None # noinspection PyTypeChecker self.board = numpy.full((6, 7), self.filler) for button in [ menus.Button(num, self.do_number_button) for num in self.numbers ]: self.add_button(button)
def __init__(self, **kwargs): super().__init__(**kwargs) self.board = self.get_board() self.positon = self._find_spacer() self._randomize_board() self.moves = 0 self.has_won = False for button in [ menus.Button(e, self.do_arrow_move) for e in [ self.ARROW_LEFT, self.ARROW_DOWN, self.ARROW_UP, self.ARROW_RIGHT ] ]: self.add_button(button)
def __init__(self, **kwargs): super().__init__(**kwargs) self.selection = None def action_maker(selection_num): async def action(_, payload): page = await self.source.get_page(self.current_page) self.selection = page[selection_num - 1] self.stop() return action for i in range(1, self.source.per_page + 1): button = menus.Button(NUMBER_TO_EMOJI[i], action_maker(i), position=menus.Last(1)) self.add_button(button)
async def start(self, ctx, opponent, *, channel=None, wait=False): if random.random() < 0.5: self.players = (ctx.author, opponent) else: self.players = (opponent, ctx.author) for player in self.players: async with MaybeAcquire() as connection: await Ranking.insert(connection=connection, ignore_on_conflict=True, user_id=player.id) self.board = Board() self.current_player = 0 # Setup buttons for emoji in REGIONAL_INDICATOR_EMOJI: self.add_button(menus.Button(emoji, self.place)) await super().start(ctx, channel=channel, wait=wait)
def create_buttons(self, reactions): # override if you want button to do something different try: for index, emoji in enumerate(reactions): # each button calls `self.button_response(payload)` so you can do based on that def callback(items): async def inside(self, payload): await self.button_response(payload, **items) self.stop() return inside self.add_button( menus.Button(emoji, callback(reactions[emoji]), position=menus.Position(index))) except IndexError: pass
def __init__(self, source): super().__init__(source=source, check_embeds=False) EmojiB = namedtuple("EmojiB", "emoji position explain") def_dict_emoji = { "\N{BLACK LEFT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR}\ufe0f": EmojiB( "<:backward2:816457785167314987>", menus.First(0), "Goes to the first page.", ), "\N{BLACK LEFT-POINTING TRIANGLE}\ufe0f": EmojiB( "<:backward:816458218145579049>", menus.First(1), "Goes to the previous page.", ), "\N{BLACK RIGHT-POINTING TRIANGLE}\ufe0f": EmojiB("<:forward:816458167835820093>", menus.Last(0), "Goes to the next page."), "\N{BLACK RIGHT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR}\ufe0f": EmojiB( "<:forward2:816457685905440850>", menus.Last(1), "Goes to the last page.", ), "\N{BLACK SQUARE FOR STOP}\ufe0f": EmojiB("<:trash:816463111958560819>", menus.Last(4), "Remove this message."), } self.dict_emoji = def_dict_emoji for emoji in self.buttons: callback = self.buttons[emoji].action if emoji.name not in self.dict_emoji: continue new_but = self.dict_emoji[emoji.name] new_button = menus.Button(new_but.emoji, callback, position=new_but.position) del self.dict_emoji[emoji.name] self.dict_emoji[new_but.emoji] = new_but self.add_button(new_button) self.remove_button(emoji)
def __init__( self, *, main_source: menus.ListPageSource, extra_sources: Union[Tuple[menus.ListPageSource], tuple] = (), **options, ): self.initial_source = main_source super().__init__(self.initial_source, delete_message_after=True, timeout=60, **options) self.extra_sources = {} for index, source in enumerate(extra_sources, 3): self.extra_sources[source.emoji] = source position = menus.Last(index) button = menus.Button(source.emoji, self._extra_source_button, position=position) self.add_button(button)
def __init__(self, *args, **kwargs): event_data = kwargs.pop('event_data') self.trigger_at = event_data['trigger_at'] self.event_id = event_data['event_id'] self.event_name = event_data['event_name'] self.event_type = event_data['event_type'] if self.event_type == "trial": self.template = {**BASE_DICT, **TRIALS_DATA[self.event_name]} # in py 3.9: # self.template = BASE_DICT | TRIALS_DATA[self.event_name] else: raise ValueError super().__init__(*args, **kwargs) # add the buttonsupon instanciation for role in ALL_ROLES: button = menus.Button( BUTTONS[role], self._button_add_role, skip_if=self._skip_role(role) ) self.add_button(button)
return self.game.participants.add(member) await self._update_embed() if self._still_needed() < 1: # add the start button await self.add_button( self.on_start_button, react=True, ) @menus.button("\N{CROSS MARK}") async def on_cancel(self, payload: discord.RawReactionActionEvent) -> None: if payload.user_id != self.game.creator.id: return self.was_cancelled = True self.stop() async def on_start(self, payload: discord.RawReactionActionEvent) -> None: if payload.user_id != self.game.creator.id: return self.stop() on_start_button = menus.Button("\N{WHITE HEAVY CHECK MARK}", action=on_start) def reaction_check(self, payload: discord.RawReactionActionEvent) -> bool: if (member := payload.member) is not None and member.bot: return False return payload.message_id == self.message.id and payload.emoji in self.buttons