python-3.x Nextcord(discord.py fork)-我如何返回Discord命令当前正在运行?

vaj7vani  于 2023-02-10  发布在  Python
关注(0)|答案(1)|浏览(155)

我有一个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.'))

(我只提供了命令代码,否则它的代码与最小可复制代码相同)
有人能帮忙吗?

rqqzpn5f

rqqzpn5f1#

如果您的命令需要一段时间才能执行,那么您可以通过defer()告诉Discord您的命令需要一段时间(并获得“Bot is thinking...”消息)。
因此,在命令的开头添加await ctx.response.defer(),然后可以使用followup属性发送消息并“响应”斜杠命令。

@bot.slash_command(name='axolotl')
async def axolotl(ctx):
    await ctx.response.defer()
    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.followup.send('', embed=embed)
        else:
            await ctx.followup.send('', embed=nextcord.Embed(title='Axolotl !', description='There was an error while contacting the API.'))

相关问题