Кнопки бота Discord не работают после перезапуска
У меня есть бот в Discord, у него есть команда .op, которая отправляет сообщение, внутри которого есть кнопка. После перезапуска эта кнопка не функционирует и приходится заново отправлять это сообщение с помощью команды. Как сделать так, чтоб кнопка в сообщении которое было вызвано до перезапуска, работала даже после перезапуска?
Код:
import discord
from discord.ext import commands
TOKEN = 'token'
PREFIX = '.'
intents = discord.Intents.all()
bot = commands.Bot(command_prefix=PREFIX, intents=intents)
def read_ticket_counter():
try:
with open("ticket_counter.txt", "r") as file:
return int(file.read())
except FileNotFoundError:
return 0
def write_ticket_counter(counter):
with open("ticket_counter.txt", "w") as file:
file.write(str(counter))
ticket_counter = read_ticket_counter()
class MyView(discord.ui.View):
@discord.ui.button(label="Close ticket.", style=discord.ButtonStyle.primary)
async def button_callback(self, interaction: discord.Interaction, button: discord.ui.Button):
member = interaction.user
role_ids = {role_id1, role_id2}
has_required_role = any(role.id in role_ids for role in member.roles)
if has_required_role:
await interaction.channel.delete()
else:
await interaction.response.send_message("У вас нет прав для закрытия тикета.", ephemeral=True)
class RentATentView(discord.ui.View):
def __init__(self):
super().__init__()
self.add_item(RentATentButton())
async def send_initial_message(self, ctx, channel):
message_content = "Нажмите на кнопку, чтобы выбрать услугу"
return await channel.send(message_content, view=self)
class RentATentButton(discord.ui.Button):
def __init__(self):
super().__init__(style=discord.ButtonStyle.primary, label="Выбрать услугу")
async def callback(self, interaction: discord.Interaction):
message_content = "Список услуг:"
view = ServiceSelectionView()
await interaction.response.send_message(message_content, ephemeral=True, view=view)
class ServiceSelectionView(discord.ui.View):
def __init__(self):
super().__init__()
self.add_item(ServiceButton("Аренда палатки"))
self.add_item(ServiceButton("Заявка на работу"))
self.create_ticket_button = CreateTicketButton()
class CreateTicketButton(discord.ui.Button):
def __init__(self):
super().__init__(style=discord.ButtonStyle.primary, label="Create ticket")
async def callback(self, interaction: discord.Interaction):
global ticket_counter
category = discord.utils.get(interaction.guild.categories, name="Tickets")
if category is None:
category = await interaction.guild.create_category("Tickets", overwrites={interaction.guild.default_role: discord.PermissionOverwrite(view_channel=False)})
ticket_counter += 1
channel_name = f"ticket-{ticket_counter}"
channel_overwrites = {
interaction.guild.default_role: discord.PermissionOverwrite(view_channel=False),
interaction.user: discord.PermissionOverwrite(view_channel=True)
}
channel = await category.create_text_channel(channel_name, overwrites=channel_overwrites)
message = f"Тикет создан: {channel.mention}"
message_channel = f"{interaction.user.mention} z"
view = MyView()
await interaction.response.send_message(message, ephemeral=True)
await channel.send(message_channel, view=view)
write_ticket_counter(ticket_counter)
class ServiceButton(discord.ui.Button):
def __init__(self, label):
super().__init__(style=discord.ButtonStyle.primary, label=label)
self.label = label
async def callback(self, interaction: discord.Interaction):
if self.label == "Аренда палатки":
message_content = ("Доп услуги:\n"
"・Палатка (первый этаж) +5 ар в неделю.\n"
"・Добавление второй палатки (в дополнение к первой): +5 ар в неделю.\n"
"・1 Бочка: +1 ар.\n"
"・Название Палатке: + 3 ар")
elif self.label == "Заявка на работу":
message_content = ("Свободные вакансии:\n"
":man_technologist: Менеджеры (оплата от 48АР в неделю).\n"
":man_police_officer: Охранники (оплата 6АР за час)\n"
":man_construction_worker: Строители (оплата от 48АР за постройку).\n"
":man_in_tuxedo: Разнорабочие (оплата 6АР за час) ")
view = discord.ui.View()
view.add_item(CreateTicketButton())
await interaction.response.send_message(message_content, ephemeral=True, view=view)
@bot.command()
async def op(ctx):
view = RentATentView()
await view.send_initial_message(ctx, ctx.channel)
@bot.event
async def on_ready():
print("Бот готов к работе.")
bot.run(TOKEN)
Ответы (1 шт):
Автор решения: q r t s
→ Ссылка
Просто добавьте обработчик on_interaction по Custom ID кнопок.
on_interaction в документации
Обработчик on_interaction будет обрабатывать все запросы по типу кнопок, селектов и т.д.
Пример:
async def on_interaction(self, interaction: discord.Interaction):
custom_id = interaction.data['custom_id']
Далее - сама обработка нажатия на кнопку с Custom ID.