@Un1code

Discord.py Discord_components Как заставить кнопки прикрепленные к эмбеду работать после перезапуска бота?

Всем привет, столкнулся с проблемой, которую не могу решить своими силами. Перепробовал уже кучу вариантов написания, с переносом в один модуль, с использованием различных вариантов решения. Но всегда прихожу к одному и тому же, после перезапуска бота не работают кнопки в сообщениях.

Весь лишний код перекрыл ***, что бы уместилось.
Прикладываю код main файла, где подключаются все модули через Cog.
***
from cmd_raid import Raidcog
from cmd_dyp import Dypcog
from cmd_moder import Modcog
from cmd_event import Eventcog
***
bot = commands.Bot(command_prefix=('mo='), intents = discord.Intents.all(), help_command=None)

***
bot.add_cog(Raidcog(bot))
bot.add_cog(Dypcog(bot))
bot.add_cog(Modcog(bot))
bot.add_cog(Eventcog(bot)) 
***


И сам код модуля с проверкой нажатия на кнопки:
from datetime import datetime
from operator import ne
from queue import Empty
from types import new_class
from unicodedata import name
from attr import field
import discord
from discord.ext import commands
from discord_components import DiscordComponents, Button, ButtonStyle

class Eventcog(commands.Cog):
    def __init__(self, bot):
        self.bot = bot
        DiscordComponents(commands.bot)
        print('CMD EVENT LOADING...')

    #Добавить новость в канал 'Расписание'
    @commands.command()
    async def addevent(self, news, sday='', stime='', stype='', chan='', voip='', ntext=''):
        if news.message.author.guild_permissions.manage_roles:
            await news.channel.purge(limit = 1)
            namea = ''
            timestamp = datetime.now()
            if news.author.nick is None:
                namea=news.author.name
            else:
                namea=news.author.nick

            if stype == 'PVE':
                await news.send('<@&913796484762316800>')
                addnews=discord.Embed(title=f'{sday} в {stime} пойдём в {stype} рейд на {chan}. Голосовой канал: {voip}', description=f'**Цель рейда:** {ntext}', color=0x4dff00)
                addnews.set_footer(text=f'Создал ивент: {namea}. Дата создания: {timestamp.strftime(r"%d.%m.%y %H:%M")}')
                addnews.add_field(name='✅ Придут: (0)', value='-', inline=True)
                addnews.add_field(name='❌ Не придут: (0)', value='-', inline=True)
                addnews.add_field(name='❔ Не знаю: (0)', value='-', inline=True)
                msg = await news.send(
                embed=addnews,
                components = [
                    [
                    Button(style = ButtonStyle.grey, label = '✅', custom_id = "abtn"),
                    Button(style = ButtonStyle.grey, label = '❌', custom_id = "dbtn"),
                    Button(style = ButtonStyle.grey, label = '❔', custom_id = "ibtn"),
                    Button(style = ButtonStyle.green, label = 'Закрыть', custom_id = "delbtn"),
                    ]
                ])
***           
            acceptlist = ['-']
            declinelist = ['-']
            idklist = ['-']
            whiletrue = 0

            #Делаем бесконечный цикл ожидающий нажатие кнопки
            while whiletrue == 0:
                interaction = await self.bot.wait_for('button_click')
            #Отслеживание первой кнопки
                if interaction.component.custom_id == 'abtn':
                    if msg.id == interaction.message.id:
                        memb = interaction.user
                        if memb.nick is None:
                            if memb.name not in acceptlist:
                                acceptlist.append(memb.name)
                                if '-' in acceptlist:
                                    acceptlist.remove('-')
                                if acceptlist==[]:
                                    acceptlist.append('-')
                                if memb.name in declinelist:
                                    declinelist.remove(memb.name)
                                    if '-' in declinelist:
                                        declinelist.remove('-')
                                    if declinelist==[]:
                                        declinelist.append('-')
                                if memb.name in idklist:
                                    idklist.remove(memb.name)
                                    if '-' in idklist:
                                        idklist.remove('-')
                                    if idklist==[]:
                                        idklist.append('-')                    
                        else:
                            if memb.nick not in acceptlist:
                                acceptlist.append(memb.nick)
                                if '-' in acceptlist:
                                    acceptlist.remove('-')
                                if acceptlist==[]:
                                    acceptlist.append('-')
                                if memb.nick in declinelist:
                                    declinelist.remove(memb.nick)
                                    if '-' in declinelist:
                                        declinelist.remove('-')
                                    if declinelist==[]:
                                        declinelist.append('-')
                                if memb.nick in idklist:
                                    idklist.remove(memb.nick)
                                    if '-' in idklist:
                                        idklist.remove('-')
                                    if idklist==[]:
                                        idklist.append('-')   

                        a1 = '\n'
                        a2 = f'{a1} {a1.join(acceptlist)}'
                        b1 = '\n'
                        b2 = f'{b1} {b1.join(declinelist)}'
                        c1 = '\n'
                        c2 = f'{c1} {c1.join(idklist)}'
                        a2len = len(acceptlist)
                        if a2len == 1:
                            if '-' in acceptlist:
                                a2len = a2len-1
                        b2len = len(declinelist)
                        if b2len == 1:
                            if '-' in declinelist:
                                b2len = b2len-1 
                        c2len = len(idklist)
                        if c2len == 1:
                            if '-' in idklist:
                                c2len = c2len-1

                        embednew=discord.Embed(title=f'{sday} в {stime} пойдём в {stype} рейд на {chan}. Голосовой канал: {voip}', description=f'**Цель рейда:** {ntext}', color=0x4dff00)
                        embednew.set_footer(text=f'Создал ивент: {namea}. Дата создания: {timestamp.strftime(r"%d.%m.%y %H:%M")}')
                        embednew.add_field(name=f'✅ Придут: ({a2len})', value=f'{a2}', inline=True)
                        embednew.add_field(name=f'❌ Не придут: ({b2len})', value=f'{b2}', inline=True)
                        embednew.add_field(name=f'❔ Не знаю: ({c2len})', value=f'{c2}', inline=True)
                        await msg.edit(embed=embednew)
                        await interaction.respond(type=6)
***
        else:
            if news.author.nick is None:
                await news.channel.purge(limit = 1)
                await news.send(f'**{news.author.name},** вы не можете добавлять события в расписание')
            else:
                await news.channel.purge(limit = 1)
                await news.send(f'**{news.author.nick},** вы не можете добавлять события в расписание')


До перезапуска бота с этим кодом само собой всё работает отлично, но так же логично что после перезапуска код не работает, так как команда еще не вызвана и цикл не запущен. Подскажите как вынести цикл за предел команды, что бы он работал.

По задумке люди кликая по кнопке попадают в определённый филд и формируется список потенциальных участников эвента.
  • Вопрос задан
  • 979 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
18 мая 2024, в 22:58
3000 руб./за проект
18 мая 2024, в 21:07
5000 руб./за проект
18 мая 2024, в 20:58
5000 руб./за проект