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) |
@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?
Дополнительно:
Ответы:
Разделения контента на страницы зовется пагинацией.
Встроенной в диснейк пагинации нет.
Писать ее на реакциях это очень плохое решение, пишите на кнопках, для них функционал значительно шире.
Код как это можно сделать
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) |
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) |
embeds = [disnake.Embed(title="First embed"), disnake.Embed(title="Second embed"), disnake.Embed(title="Third embed")] await Simple().start(ctx, pages=embeds)
- fenrir, Хорошо, я всё понял, но как это будет выглядеть в файле main.py в команде help на библиотеке disnake?
- Alexsey566, я приложил как вложить эмбеды
- fenrir, всё равно непонятно, пожалуйста, напишите код без классов в файле main.py чтобы показать как будет выглядеть команда help в коде дискорд бота на библиотеке disnake
- Alexsey566, умрете логику описывать.
- fenrir, не умру :)
- Alexsey566, значит делайте :)
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для создания страницы справки в боте, использующем библиотеку Disnake, вы можете создать команду с именем "help", которая будет выводить информацию о доступных командах и их использовании. Вот пример того, как это можно сделать на языке программирования Python с использованием Disnake:
```python
import disnake
from disnake.ext import commands
bot = commands.Bot(command_prefix='!')
@bot.command()
async def help(ctx):
embed = disnake.Embed(
title="Справка по командам",
description="Список доступных команд:",
color=disnake.Color.blue()
)
for command in bot.commands:
embed.add_field(name=command.name, value=command.help, inline=False)
await ctx.send(embed=embed)
bot.run("YOUR_BOT_TOKEN")
```
В этом примере мы создаем команду "help", которая создает встроенное сообщение с информацией о доступных командах. Мы проходим по всем командам бота и добавляем их название и описание во встроенное сообщение.
Вы можете дополнить этот код, добавив более подробные описания к каждой команде, а также стилизовав встроенные сообщения с помощью других параметров, таких как изображения, ссылки и т. д.
Надеюсь, это поможет вам создать страницу справки в вашем боте на основе Disnake! Если у вас возникнут дополнительные вопросы, не стесняйтесь задавать.