@x4zx
python developer

Как решить проблему?

Здравствуйте, пишу тикет бота, столкнулся с проблемой. Есть тикет меню которое отправляется на все сервера в указанный канал и там есть одна кнопка которая создает тикет.
И вот когда на эту кнопку нажимают с разных серверов то этот тикет создается на сервер ID которого находится в самом верху коллекции в базе данных

вот код:
@commands.Cog.listener()
    async def on_ready(self):
        for guild in self.bot.guilds:

            category_id = self.collticku.find({'_id': guild.id})
            category = guild.get_channel(category_id)
            if not category:
                pass
            else:
                support_id = self.collticku.find_one({'_id': guild.id})['support_id']
                support = guild.get_role(support_id)
                if not support:
                    pass
                else:
                    channel_id = self.collticku.find_one({'_id': guild.id})['channel_id']
                    channel = guild.get_channel(channel_id)
                    if not channel:
                        pass
                    else:
                        emb1 = discord.Embed(
                            description = 'Создать тикет можно нажав кнопку ниже',
                            colour = 0x5865f2,
                            timestamp = datetime.datetime.now()
                        )
                        emb1.set_thumbnail(
                            url = guild.icon_url
                        )
                        msg1 = await channel.send(embed = emb1, components = [buttons1])

                        on_click = msg1.create_click_listener()

                        @on_click.matching_id('1_button')
                        async def on_report_button(inter):
                            member = inter.author

                            self.collticku.update_one({'_id': guild.id}, {'$inc': {'tnum': +1}})
                            num = self.collticku.find_one({'_id': guild.id})['tnum']
                            member_ticket_channel1 = await guild.create_text_channel(name = f"ticket-{num}", category = category)
                            await member_ticket_channel1.set_permissions(member, overwrite = discord.PermissionOverwrite(view_channel = True, send_messages = True, read_message_history = True))
                            await member_ticket_channel1.set_permissions(support, overwrite = discord.PermissionOverwrite(view_channel = True, send_messages = True, read_message_history = True))

                            await inter.reply(f'Ваш репорт был создан. Для перехода нажмите -> <#{member_ticket_channel1.id}>', ephemeral = True)


Помогите пожалуйста, уже не знаю что и делать все перепробовал. Ответа нигде не нашел
  • Вопрос задан
  • 1045 просмотров
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
async def on_report_button(inter):
member = inter.author
self.collticku.update_one({'_id': guild.id}, {'$inc': {'tnum': +1}})
num = self.collticku.find_one({'_id': guild.id})['tnum']

Поздравляю, ты попался на замыкании. on_report_button() будет всегда ссылаться на ТЕКУЩЕЕ значение guild - а к моменту вызова on_report_button() это текущее значение уже прошло через весь цикл for guild in self.bot.guilds и остановилось на последней гильдии из списка. От того, что ты создал on_report_button() несколько раз, это не изменится.
Побороть можно через атрибуты функции. Внутри on_report_button() используй не guild, а on_report_button.guild. А после объявления on_report_button() (т.е. ВНЕ самой функции) присвой on_report_button.guild = guild. Тогда каждая версия on_report_button() будет иметь свою гильдию.
Это касается ВСЕХ переменных, которые on_report_button() захватывает из вышележащей области видимости. Если они изменяются, то все копии этой функции будут видеть только последнее текущее значение.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы