Я делал (расширенную) команду создания встраивания. В основном все, что вы набираете, будет отображаться как вставка. Короче говоря, я сказал своему другу проверить его на наличие ошибок. Первым делом он попытался запустить ту же самую команду, не используя ее. Что я имею в виду? Он просто набрал /createembed примерно x раз. Бот начал отвечать на каждый сделанный звонок, и в конечном итоге это закончилось спамом:

enter image description here

Думаю, теперь стало немного легче понять, что я имею в виду. В любом случае, есть идеи, как я могу остановить это, сказав боту, что пользователь может использовать эту точную команду только один раз для каждого пользователя?

@commands.command()
async def cad(self, ctx, channel : discord.TextChannel = None):
    def check(message):
        return message.author == ctx.author and message.channel == ctx.channel

    aPP = ctx.author.avatar_url

    if not channel:
        await ctx.channel.send(f"**{ctx.author}** | Waiting for an Advanced Embed Title. If you wish to cancel this action, just type `Cancel`.")
        title = await self.client.wait_for("message", check=check)

        if title.content.lower() == "cancel" or title.content.upper() == "Cancel":
            await ctx.channel.send(f'**{ctx.author}** | Action has been canceled.')
            return

        else:
            await ctx.send(f"**{ctx.author}** | Waiting for an Advanced Embed Description. If you wish to cancel this action, just type `Cancel`.")
            desc = await self.client.wait_for('message', check=check)

            if desc.content.lower() == "cancel" or desc.content.upper() == "Cancel":
                await ctx.channel.send(f'**{ctx.author}** | Action has been canceled.')
                return
            
            else:
                await ctx.send(f"**{ctx.author}** | Waiting for an Advanced Embed Author Text. If you wish to skip this type `Skip` otherwise if you want to cancel this action, just type `Cancel`.")
                authortext = await self.client.wait_for('message', check=check)

                if authortext.content.lower() == "cancel" or authortext.content.upper() == "Cancel":
                    await ctx.channel.send(f'**{ctx.author}** | Action has been canceled.')
                    return

В нем примерно на 500 строк больше, но в основном то же самое с большим количеством возвратов и т. Д.

0
xXSkillexZ 2 Мар 2021 в 15:26

1 ответ

Лучший ответ

Вы можете использовать этот декоратор от Discord. ext.commands.

Например :

from discord.ext import commands

@commands.command()
@commands.max_concurrency(number=1, per=commands.BucketType.user, wait=False)
async def cad(self, ctx):
    #your command

Позволит вашему пользователю запустить команду один раз одновременно.

1
Baptiste 2 Мар 2021 в 13:37