Я рассмотрел несколько вариантов, но они либо были слишком базовы для моих нужд, либо требовательны к ресурсам.А как по вашему библиотека должна понимать что правильно? Придётся разбираться в "слишком базовых" вещах.
Грамматические ошибки (например, "Я не знает куда он пошёл." должно стать "Я не знаю, куда он пошёл.").А может быть "Она не знает куда он пошёл"?
str
int
float
bool
disnake.abc.GuildChannel*
disnake.User or disnake.Member**
disnake.Role**
disnake.Attachment
disnake.abc.Snowflake***
Как исправить ошибкуЛибо переписать функцию, потому что во взаимодействии нет методов и атрибутов, которые вы пытаетесь использовать, либо оставить команду обычной.
for key, value in inter.text_values.items():
embed.add_field(
name=key.capitalize(),
value=value[:1024],
inline=False,
)
embed.add_field(
name='Заголовок',
value=f'{inter.text_values.get("date", "")}{inter.text_values.get("time", "")',
inline=False,
)
В чём проблема?В том что класс staffapp наследуется от commands.Cog, а не ui.Modal. Эффекта от того что вы сделаете в произвольном классе функцию callback не будет.
<@user_id>
. Любая работа с ней аналогична работе со строками.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)
Как вызвать Secret в Dockerfile?Secrets или multi-stage.
git clone
и сомнительных секретов. Реализация «Формы» как это сделать?Открыть документацию и посмотреть
Реализация в плане кода. Подойдёт простой пример создания "Формы"Ну ладно, откроем её
import asyncio
import os
import disnake
from disnake.ext import commands
bot = commands.Bot(command_prefix=commands.when_mentioned)
class MyModal(disnake.ui.Modal):
def __init__(self) -> None:
components = [
disnake.ui.TextInput(
label="Name",
placeholder="The name of the tag",
custom_id="name",
style=disnake.TextInputStyle.short,
min_length=5,
max_length=50,
),
disnake.ui.TextInput(
label="Content",
placeholder="The content of the tag",
custom_id="content",
style=disnake.TextInputStyle.paragraph,
min_length=5,
max_length=1024,
),
]
super().__init__(title="Create Tag", custom_id="create_tag", components=components)
async def callback(self, inter: disnake.ModalInteraction) -> None:
tag_name = inter.text_values["name"]
tag_content = inter.text_values["content"]
embed = disnake.Embed(title=f"Tag created: `{tag_name}`")
embed.add_field(name="Content", value=tag_content)
await inter.response.send_message(embed=embed)
async def on_error(self, error: Exception, inter: disnake.ModalInteraction) -> None:
await inter.response.send_message("Oops, something went wrong.", ephemeral=True)
@bot.slash_command()
async def create_tag(inter: disnake.CommandInteraction):
await inter.response.send_modal(modal=MyModal())
@bot.event
async def on_ready():
print(f"Logged in as {bot.user} (ID: {bot.user.id})\n------")
if __name__ == "__main__":
bot.run(os.getenv("BOT_TOKEN"))
on_raw_reaction_add
и метод await bot.wait_for()
относятся к низкоуровневым компонентам библиотеки и их использование оправдано только если нет других способов решения проблемы.while True
, а во вторых все нажатия на реакции начнут приводить к выполнению логики