@Alexsey566

Disnake как сделать страницы в команде help?

@bot.command()
async def help(ctx):
    embed=disnake.Embed(
    title="Список команд",
    colour=000000)
    embed.add_field(
    name="Ban",
    value="Заблокировать пользователя"
    )
    embed.add_field(
    name="Unban",
    value="Разблокировать пользователя по его ID"
    )
    embed.add_field(
    name="Kick",
    value="Выгнать пользователя с сервера"
    )
    embed.add_field(
    name="Mute",
    value="Заглушить пользователя"
    )
    embed.add_field(
    name="Unmute",
    value="Разглушить пользователя"
    )
    embed.add_field(
    name="Muted",
    value="Посмотреть список заглушённых пользователей"
    )
    embed.add_field(
    name="Tempmute",
    value="Заглушить пользователя на определённое время"
    )
    embed.add_field(
    name="Reverse",
    value="Перевернуть текст"
    )
    embed.add_field(
    name="Serverinfo",
    value="Посмотреть информацию о сервере"
    )
    embed.add_field(
    name="Userinfo",
    value="Посмотреть информацию о пользователе"
    )
    embed.add_field(
    name="Emojiinfo",
    value="Посмотреть информацию о эмодзи"
    )
    embed.add_field(
    name="Botinfo",
    value="Посмотреть информацию о боте"
    )
    embed.add_field(
    name="Info",
    value="Посмотреть информацию о ForzaBot"
    )
    embed.add_field(
    name="Ping",
    value="Узнать пинг бота"
    )
    embed.add_field(
    name="Say",
    value="Сказать от имени бота"
    )
    embed.add_field(
    name="Addrole", 
    value="Выдать роль пользователю"
    )
    embed.add_field(
    name="Removerole",
    value="Убрать роль с пользователя"
    )
    embed.add_field(
    name="8Ball",
    value="Задать вопрос шару"
    )
    embed.add_field(
    name="Clear",
    value="Очистить количество сообщений"
    )
    embed.add_field(
    name="Random",
    value="Отправка случайных чисел"
    )
    embed.add_field(
    name="Roleinfo",
    value="Посмотреть информацию о роли"
    )
    embed.add_field(
    name="Channelinfo",
    value="Посмотреть информацию о канале"
    )
    embed.add_field(
    name="Temprole",
    value="Выдать временную роль"
    )
    embed.add_field(
    name="Ownerinfo",
    value="Посмотреть информацию о владельце бота"
    )
    await ctx.send(embed=embed)

@bot.command()
async def help2(ctx):
    embed=disnake.Embed(
    title="Второй список команд",
    colour=000000)
    embed.add_field(
    name="Lock",
    value="Закрыть каналы"
    )
    embed.add_field(
    name="Unlock",
    value="Открыть доступ к каналам"
    )
    embed.add_field(
    name="Info",
    value="Показать подробную информацию о боте"
    )
    embed.add_field(
    name="Quote",
    value="Отправка случайной цитаты"
    )
    embed.add_field(
    name="Avatar",
    value="Показать аватар пользователя"
    )
    embed.add_field(
    name="Voice_channelinfo",
    value="Показать информацию о голосовом канале"
    )
    await ctx.send(embed=embed)


Как реализовать в одну большую страницу по нажатию на реакции для дискорд бота на библиотеке disnake в версии библиотеки disnake 2.9.1 на языке программировании python?
  • Вопрос задан
  • 126 просмотров
Пригласить эксперта
Ответы на вопрос 1
fenrir1121
@fenrir1121 Куратор тега discord.py
Начни с документации
Разделения контента на страницы зовется пагинацией.
Встроенной в диснейк пагинации нет.
Писать ее на реакциях это очень плохое решение, пишите на кнопках, для них функционал значительно шире.

Код как это можно сделать
class Simple(disnake.ui.View):
    """
    Embed Paginator.

    Parameters:
    ----------
    timeout: int
        How long the Paginator should timeout in, after the last interaction. (In seconds) (Overrides default of 60)
    PreviousButton: disnake.ui.Button
        Overrides default previous button.
    NextButton: disnake.ui.Button
        Overrides default next button.
    PageCounterStyle: disnake.ButtonStyle
        Overrides default page counter style.
    InitialPage: int
        Page to start the pagination on.
    """

    def __init__(self, *,
                 timeout: int = 60,
                 PreviousButton: disnake.ui.Button = disnake.ui.Button(emoji=disnake.PartialEmoji(name="\U000025c0")),
                 NextButton: disnake.ui.Button = disnake.ui.Button(emoji=disnake.PartialEmoji(name="\U000025b6")),
                 PageCounterStyle: disnake.ButtonStyle = disnake.ButtonStyle.grey,
                 InitialPage: int = 0) -> None:
        self.PreviousButton = PreviousButton
        self.NextButton = NextButton
        self.PageCounterStyle = PageCounterStyle
        self.InitialPage = InitialPage

        self.pages = None
        self.ctx = None
        self.message = None
        self.current_page = None
        self.page_counter = None
        self.total_page_count = None

        super().__init__(timeout=timeout)

    async def start(self, ctx: commands.Context, pages: list[disnake.Embed]):
        self.pages = pages
        self.total_page_count = len(pages)
        self.ctx = ctx
        self.current_page = self.InitialPage

        self.PreviousButton.callback = self.previous_button_callback
        self.NextButton.callback = self.next_button_callback

        self.page_counter = SimplePaginatorPageCounter(style=self.PageCounterStyle,
                                                       TotalPages=self.total_page_count,
                                                       InitialPage=self.InitialPage)

        self.add_item(self.PreviousButton)
        self.add_item(self.page_counter)
        self.add_item(self.NextButton)

        self.message = await ctx.send(embed=self.pages[self.InitialPage], view=self)

    async def previous(self):
        if self.current_page == 0:
            self.current_page = self.total_page_count - 1
        else:
            self.current_page -= 1

        self.page_counter.label = f"{self.current_page + 1}/{self.total_page_count}"
        await self.message.edit(embed=self.pages[self.current_page], view=self)

    async def next(self):
        if self.current_page == self.total_page_count - 1:
            self.current_page = 0
        else:
            self.current_page += 1

        self.page_counter.label = f"{self.current_page + 1}/{self.total_page_count}"
        await self.message.edit(embed=self.pages[self.current_page], view=self)

    async def next_button_callback(self, interaction: disnake.Interaction):
        if interaction.user != self.ctx.author:
            embed = disnake.Embed(description="You cannot control this pagination because you did not execute it.",
                                  color=disnake.Colour.red())
            return await interaction.response.send_message(embed=embed, ephemeral=True)
        await interaction.response.defer()
        await self.next()

    async def previous_button_callback(self, interaction: disnake.Interaction):
        if interaction.user != self.ctx.author:
            embed = disnake.Embed(description="You cannot control this pagination because you did not execute it.",
                                  color=disnake.Colour.red())
            return await interaction.response.send_message(embed=embed, ephemeral=True)
        await interaction.response.defer()
        await self.previous()

class SimplePaginatorPageCounter(disnake.ui.Button):
    def __init__(self, style: disnake.ButtonStyle, TotalPages, InitialPage):
        super().__init__(label=f"{InitialPage + 1}/{TotalPages}", style=style, disabled=True)
Код как использовать
embeds = [disnake.Embed(title="First embed"),
          disnake.Embed(title="Second embed"),
          disnake.Embed(title="Third embed")]

await Simple().start(ctx, pages=embeds)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы