我有一个Discord机器人,它的命令需要一些时间才能完成(大约5秒)。当命令花费太长时间才能完成,而没有任何响应到Discord服务器时,我看到Discord使命令崩溃,并删除上下文,所以当我发送响应时,它会引发一个错误,说上下文不存在。
例如MEE6,当执行命令时,Discord返回:Sending command...
当MEE6收到命令时,它会说:但是我的机器人没有。我怎么能像MEE6一样,回到我的命令还在运行的不和谐状态呢?
我使用的是Nextcord(一个discord.py分支),所以discord.py的回答也可以。
最小可复制代码:
import requests, nextcord
from nextcord.ext import commands
bot = commands.Bot(intents=nextcord.Intents.all()) # be sure to enable every discord intents in the discord dev portal
@bot.slash_command(name='axolotl')
async def axolotl(ctx): # do things that take a lot of time
r = requests.get('https://axolotlapi-test.kirondevcoder.repl.co/reddit?nsfw=0', timeout=2)
if r.status_code == 200:
data = r.json()['data'][0]
embed = nextcord.Embed(title='Axolotl !', description=data['text'] or 'No text content.')
medias = ""
for media in data['media']:
embed.set_image(media)
await ctx.send('', embed=embed)
else:
await ctx.send('', embed=nextcord.Embed(title='Axolotl !', description='There was an error while contacting the API.'))
bot.run('your token here')
我知道ctx
对象不是nextcord.Context
对象,而是nextcord.interaction.Interaction
对象,我认为此类的API文档可以在www.example.com上找到https://docs.nextcord.dev/en/stable/api.html#nextcord.Interaction,但我不确定。
我已经试过让机器人在频道上打字,但它没有改变任何东西:
@bot.slash_command(name='axolotl')
async def axolotl(ctx):
async with ctx.channel.typing():
r = requests.get('https://axolotlapi-test.kirondevcoder.repl.co/reddit?nsfw=0', timeout=2)
if r.status_code == 200:
data = r.json()['data'][0]
embed = nextcord.Embed(title='Axolotl !', description=data['text'] or 'No text content.')
medias = ""
for media in data['media']:
embed.set_image(media)
await ctx.send('', embed=embed)
else:
await ctx.send('', embed=nextcord.Embed(title='Axolotl !', description='There was an error while contacting the API.'))
(我只提供了命令代码,否则它的代码与最小可复制代码相同)
有人能帮忙吗?
1条答案
按热度按时间rqqzpn5f1#
如果您的命令需要一段时间才能执行,那么您可以通过
defer()
告诉Discord您的命令需要一段时间(并获得“Bot is thinking...”消息)。因此,在命令的开头添加
await ctx.response.defer()
,然后可以使用followup
属性发送消息并“响应”斜杠命令。