Beispiel #1
0
    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
Beispiel #2
0
    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)))
Beispiel #3
0
    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)
Beispiel #4
0
    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
Beispiel #5
0
    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)
Beispiel #6
0
 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))
Beispiel #7
0
    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
Beispiel #8
0
    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))
Beispiel #9
0
        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))
Beispiel #10
0
    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))
Beispiel #11
0
    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))
Beispiel #13
0
    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)
Beispiel #14
0
    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)
Beispiel #15
0
 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)
Beispiel #16
0
    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)
Beispiel #17
0
    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)
Beispiel #18
0
    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)
Beispiel #19
0
    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
Beispiel #20
0
 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)
Beispiel #21
0
    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)
Beispiel #22
0
    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)
Beispiel #23
0
            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