Дублируется вызов функции. Python

Рейтинг: 2Ответов: 1Опубликовано: 01.08.2023

Использую библиотеку Nextcord (асинхронный питон). Столкнулся с проблемой в написании кода. Код работает исправно за исключением повторного срабатывания функции.

class MyServer(commands.Cog):
    def __init__(self, bot):
        self.bot = bot
        self.game_message = None

    @commands.command(name='add_field')
    @commands.has_permissions(administrator=True)
    async def add_field_func(self, ctx):
        if ctx.author.id != Здесь ID:
            return

        input_text = ctx.message.content.split(' ')
        game_name = input_text[1]
        game_emoji = input_text[2:]
        game_emoji = ' '.join(game_emoji)

        embed = nextcord.Embed(
            title=":white_check_mark: Успешно!",
            description=f':video_game: {game_name} добавлен/на в список. Обозначаемая реакция: {game_emoji}',
            colour=nextcord.Colour.green()
        )
        embed.timestamp = datetime.datetime.utcnow()

        await ctx.send(embed=embed)

        if self.game_message is not None:
            message_id = self.game_message
            message = await ctx.fetch_message(message_id)

            embed = message.embeds[0]

            embed.add_field(name=f'{game_name} - {game_emoji}', value=" ", inline=False)

            await message.edit(embed=embed)

    @commands.command(name='create_game_message')
    @commands.has_permissions(administrator=True)
    async def create_game_message(self, ctx):
        if ctx.author.id != 436903034404995072:
            return
        guild = ctx.guild
        message_id = self.game_message

        if message_id is None:
            embed = nextcord.Embed(
                title=f'Выберите из списка ниже игру в которую вы играете',
                description='',
                colour=0x00e97d
            )
            embed.set_author(name=guild.name, icon_url=ctx.guild.icon.url)
            message = await ctx.send(embed=embed)
            self.game_message = message.id


def setup(bot):
    bot.add_cog(MyServer(bot))

Подскажите пожалуйста где косяк upd. Код дублируется с момента получения ID сообщения (message_id)

ТЫК

Ответы

▲ 0Принят

Покопавшись глубже в коде, пришел к неплохому решению проблемы, а именно перевести обе команды на slash. Функции перестали дублироваться и проблем больше не возникло. К сожалению корень проблемы, связанный с двойным исполнением любой функции в классе найти не удалось, но альтернативное решение тоже неплохо. Исправленный код:

@nextcord.slash_command(name='add_field', description='Добавьте игру в список получения ролей.')
    @commands.has_permissions(administrator=True)
    async def add_field_func(self, interaction: nextcord.Interaction, game=None, emoji=None):
        if interaction.user.id != 436903034404995072:
            return
        db = sqlite3.connect('database/database.db')
        cursor = db.cursor()

        game_name = game
        game_emoji = emoji

        class Buttons(nextcord.ui.View):
            def __init__(self):
                super().__init__()
                self.value = None

            @nextcord.ui.button(
                label=game_emoji,
                style=nextcord.ButtonStyle.grey
            )
            async def button(self, button: nextcord.ui.Button, interaction: nextcord.Interaction):
                guild = interaction.guild
                role = nextcord.utils.get(guild.roles, name=game_name)
                if role is None:
                    role = await guild.create_role(name=game_name, colour=nextcord.Colour.default())

                if role in interaction.user.roles:
                    await interaction.send(f'{interaction.user.name}, у вас уже есть роль - {game_name}!',
                                           ephemeral=True)
                else:
                    await interaction.user.add_roles(role)
                    await interaction.send(f'{interaction.user.name}, вам выдана роль - {game_name}!\n'
                                           f'Теперь вам доступны каналы данной тематики.',
                                           ephemeral=True)

        embed = nextcord.Embed(
            title=":white_check_mark: Успешно!",
            description=f':video_game: {game_name} добавлен/на в список. Обозначаемая реакция: {game_emoji}',
            colour=nextcord.Colour.green()
        )
        embed.timestamp = datetime.datetime.utcnow()
        await interaction.send(embed=embed, ephemeral=True)

        game_message_id = cursor.execute(
            f'SELECT game_msg_id FROM guild_param WHERE id = {interaction.guild.id}').fetchone()
        if game_message_id:
            game_message = int(game_message_id[0])

            message = await interaction.channel.fetch_message(game_message)
            embed = message.embeds[0]
            embed.add_field(name=f'{game_name} - {game_emoji}', value=" ", inline=False)
            view = Buttons()
            await message.edit(embed=embed, view=view)

    @nextcord.slash_command(name='create_game_message',
                            description='Создает обноляемый список игр для получения доступа в соотетстующие каналы.')
    @commands.has_permissions(administrator=True)
    async def create_game_message(self, interaction: nextcord.Interaction):
        if interaction.user.id != 436903034404995072:
            return

        db = sqlite3.connect('database/database.db')
        cursor = db.cursor()

        guild = interaction.guild
        embed = nextcord.Embed(
            title=f'Выберите из списка ниже игру в которую вы играете',
            description='',
            colour=0x00e97d
        )
        embed.set_author(name=guild.name, icon_url=guild.icon.url)

        await interaction.send(embed=embed, ephemeral=False)
        cursor.execute(f'UPDATE guild_param SET game_msg_id = {interaction.id} WHERE id = {guild.id}')
        db.commit()
    ```
    Огромное спасибо за максимальное содействие (аж целых 2 голосования за поднятие  в топ).