python 如何避免任务超过3s时出现“应用程序无响应”的情况

wko9yo5t  于 2023-01-16  发布在  Python
关注(0)|答案(1)|浏览(158)

我试着使用interaction.response.defer()来避免我的程序中的“应用程序没有响应”错误,当它在不和谐上花费超过3秒时,它会向一个类别的所有通道发送消息,它工作,但它在不和谐上返回错误,而不是“工作”。有人有解决方案吗?提前感谢您的帮助
下面是我机器人:

import asyncio
import discord
from discord import app_commands
from discord.ext import commands

intents = discord.Intents().all()
bot = commands.Bot(command_prefix='!', intents=intents)

@bot.event
async def on_ready():
    print("Bot is up and ready! ")
    try:
        synced = await bot.tree.sync()
        print(f"Synced {len(synced)} command(s)")
    except Exception as e:
        print(e)

@bot.tree.command(name="sendall", description="Send a message to all the channels in a category")
@app_commands.describe(category_name="Name of the category where you want to send the message.",
                       msg="The message you want to send")
async def sendall(interaction: discord.Interaction, category_name: str, *, msg: str):
    # Récupère la catégorie correspondante
    category = None
    for c in interaction.guild.categories:
        if c.name.lower() == category_name.lower():
            category = c
            break

    # Vérifie si la catégorie est valide
    if category is None:
        await interaction.response.send_message("La catégorie spécifiée n'existe pas.")
        return

    # Envoie le message dans tous les salons de la catégorie
    for channel in category.text_channels:
        await channel.send(msg)
    await interaction.response.defer(ephemeral=True)  # defer before 3 seconds
    await asyncio.sleep(15)
    await interaction.followup.send("working")  # any follow up message you want to send


bot.run("*****")

我期待从我的机器人得到“工作”消息后,它发送消息到所有渠道的类别,我尝试了一个较小的类别,需要不到3秒发送一切,它的工作,但当我尝试了一个类别,有更多的渠道,需要超过3秒,它的工作,但它返回给我“应用程序没有响应”错误

3mpgtkmj

3mpgtkmj1#

你需要把interaction.response.defer放在那些需要花费大量时间的代码上面,把它放在通道循环的上面(甚至放在交互的最顶端),我非常肯定这会解决你的问题。
即:

@bot.tree.command(name="sendall", description="Send a message to all the channels in a category")
@app_commands.describe(category_name="Name of the category where you want to send the message.",
                       msg="The message you want to send")
async def sendall(interaction: discord.Interaction, category_name: str, *, msg: str):
    await interaction.response.defer(ephemeral=True)  # defer
    # Récupère la catégorie correspondante
    category = None
    for c in interaction.guild.categories:
        if c.name.lower() == category_name.lower():
            category = c
            break

    # Vérifie si la catégorie est valide
    if category is None:
        # this needs to use followup now as we deffered earlier
        await interaction.followup.send("La catégorie spécifiée n'existe pas.")
        return

    # Envoie le message dans tous les salons de la catégorie
    for channel in category.text_channels:
        await channel.send(msg)
    await asyncio.sleep(15)
    await interaction.followup.send("working")

相关问题