命令运行成功2次后需要10分钟



我有一个命令,允许我编辑文本通道信息,如名称,主题等。

当运行命令时,我每次都会运行它:.channel > React with E, React with N, type name我会重复这两到三次,通常在第三次尝试时,它会等待10分钟才能真正更改名称和编辑嵌入,我问过一个朋友,我们都不知道在这种情况下该怎么做。

我也不知道定义'editstart'函数以便我可以使用'back'是否是最好的做事方式,但这是我遇到困境时首先想到的事情之一。

代码:(我删除了很多,但保留了所有重要的位)

@commands.command()
@commands.has_permissions(manage_channels=True)
async def channel(self, ctx):
embed=discord.Embed(colour=author.colour)
...
message=await ctx.send(embed=embed)
try:
def check(reaction, user):
return user == ctx.author and str(reaction.emoji) in emojis
reaction, user=await self.client.wait_for('reaction_add', timeout=15, check=check)
if str(reaction.emoji) == '🇪':
information=discord.Embed(colour=author.colour)
...
reactions=[...]
async def addreact():
for reaction in reactions:
await message.add_reaction(f'{reaction}')
await addreact()
async def editstart():
try:
def check(reaction, user):
return user == ctx.author and str(reaction.emoji) in reactions
reaction, user=await self.client.wait_for('reaction_add', timeout=30, check=check)
if str(reaction.emoji) == '🇳':
...
try:
def check(name):
return name.author == ctx.author and name.channel == ctx.channel
name=await self.client.wait_for('message', timeout=30, check=check)
if name.content.lower() == 'back':
await name.delete()
await message.edit(embed=information)
await addreact()
await editstart()
elif name.content.lower() == 'cancel':
embed=discord.Embed(colour=author.colour)
...
await name.delete()
await message.edit(embed=embed)
else:
embed=discord.Embed(colour=author.colour)
...
await channel.edit(name=f"{name.content}")
await name.delete()
await message.edit(embed=embed)
except asyncio.TimeoutError:
await ctx.send(embed=timeouterror, delete_after=3)
elif str(reaction.emoji) == ...:
...
...
except asyncio.TimeoutError:
...
await editstart()
except asyncio.TimeoutError:
...

Discord API除了全局速率限制外,还有许多未记录的每路由子限制。他们没有记录这些限制的官方理由是"它们随时都可能改变"。我们不保证利率限制将保持不变。(源).

目前,频道名称更改请求以及许多其他公会更新(如频道主题更改,频道nsfw切换等)被限制为每10分钟两次。

您的代码"停止";因为在底层,Discord API返回给Discord .py一个429 Rate Limit响应和一个重试时间,然后Discord .py内部处理速率限制并等待速率限制,然后再次重新运行您的命令。如果您不想要这种行为,建议通过asyncio.wait_for()设置命令冷却时间和/或添加强制请求超时。

import asyncio
# twice per 600 seconds (10 minutes), per channel
@commands.cooldown(2, 600, commands.BucketType.channel)
@bot.command()
async def changename(ctx, channel: discord.TextChannel, *, name):
try:
# waits at most 5 seconds, raise exception if takes longer than that
await asyncio.wait_for(channel.edit(name=name), 5)
except asyncio.TimeoutError:
await ctx.send("Failed to change name! Try again later.")
else:
await ctx.send("Name was changed!")

@bot.event
async def on_command_error(ctx, error):
if isinstance(error, commands.CommandOnCooldown):
await ctx.send(f"This command is on cooldown! Try again in {error.retry_after:.1f} second(s).")

相关内容

  • 没有找到相关文章

最新更新