Кнопки бота 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.

→ Ссылка