Ответ на команду потребовал больше 3 секунд

Рейтинг: 0Ответов: 1Опубликовано: 27.05.2023

У меня возникла проблема с stats командами для моего дискорд бота. Видимо они используют слишком много циклов, из-за чего вместо статистики, в консоль выводится ошибка

disnake.errors.InteractionTimedOut: Interaction took more than 3 seconds to be responded to. 
Please defer it using "interaction.response.defer" on the start of your command. Later you may send a response by editing the deferred message using "interaction.edit_original_response"
Note: This might also be caused by a misconfiguration in the components make sure you do not respond twice in case this is a component.

Пытался исправить её строками await ctx.defer(), ctx.response.send_message(), await ctx.respond() в начале функции, но за собой они призывали еще ошибки.

Вот функции с которыми у меня возникла проблема:

# member stats command
@bot.slash_command(name="member_stats", description="Отображает статистику пользователя на сервере")
async def stats(ctx, member: disnake.Member = commands.Param(description="Участник для отображения его статистики")):
    if not member:
        member = ctx.author

    message_count = await ctx.channel.history(limit=None).filter(lambda m: m.author == member).flatten()
    last_message_time = member.joined_at.strftime('%Y-%m-%d %H:%M:%S') if not message_count else message_count[-1].created_at.strftime('%Y-%m-%d %H:%M:%S')

    embed = disnake.Embed(title=f"Статистика {member.display_name}:", colour=disnake.Colour.gold())
    embed.set_author(name=member.name, icon_url=member.avatar.url)
    embed.add_field(name="Количество сообщений", value=len(message_count))
    embed.add_field(name="Последнее сообщение", value=last_message_time)
    embed.add_field(name="Дата создания аккаунта", value=member.created_at.strftime('%Y-%m-%d %H:%M:%S'))
    embed.add_field(name="Дата присоединения к серверу", value=member.joined_at.strftime('%Y-%m-%d %H:%M:%S'))
    embed.add_field(name="Кол-во ролей", value=len(member.roles))
    reaction_count = 0
    async for message in ctx.channel.history(limit=None):
        if message.author != member:
            for reaction in message.reactions:
                async for user in reaction.users():
                    if user == member:
                        reaction_count += 1
    embed.add_field(name="Реакций проставлено", value=reaction_count)

    await ctx.send(embed=embed)

# server stats command
@bot.slash_command(name="server_stats", description="Вывод статистики всего сервера")
async def serverstats(ctx):

    member_count = len(ctx.guild.members)
    online_member_count = len([m for m in ctx.guild.members if m.status != disnake.Status.offline])

    text_channel_count = len([c for c in ctx.guild.channels if isinstance(c, disnake.TextChannel)])
    voice_channel_count = len([c for c in ctx.guild.channels if isinstance(c, disnake.VoiceChannel)])
    forum_channel_count = len([c for c in ctx.guild.channels if isinstance(c, disnake.ForumChannel)])

    messages = []
    for channel in await ctx.guild.fetch_channels():
        if isinstance(channel, disnake.TextChannel):
            messages.extend(await channel.history(limit=None, after=(datetime.now() - timedelta(days=7))).flatten())
    users_dict = {}
    for message in messages:
        if not message.author.bot:
            if message.author.id in users_dict:
                users_dict[message.author.id] += 1
            else:
                users_dict[message.author.id] = 1
    top_users = sorted(users_dict.items(), key=lambda x: x[1], reverse=True)[:10]
    top_users_str = ""
    for i, (user_id, message_count) in enumerate(top_users):
        user = ctx.guild.get_member(user_id)
        if user:
            top_users_str += f"{i + 1}. {user.mention} - {message_count}\n"

    total_messages_count = sum(users_dict.values())

    bans = ctx.guild.bans()
    bans_count = len(await bans.flatten())
    bots_count = len([m for m in ctx.guild.members if m.bot])

    embed = disnake.Embed(title=f"Статистика сервера {ctx.guild.name}:", color=disnake.Colour.red())
    embed.add_field(name="Пользователи", value=f"Всего: {member_count}\nОнлайн: {online_member_count}\nЗабанено пользователей: {bans_count}\nБотов на сервере: {bots_count}")
    embed.add_field(name="Топ-10 активных участников за неделю:", value=top_users_str)
    embed.add_field(name="Сообщения", value=f"Всего отправлено: {total_messages_count}")
    embed.add_field(name="Каналы", value=f"Текстовые: {text_channel_count}\nГолосовые: {voice_channel_count}\nФорумы: {forum_channel_count}")

    await ctx.send(embed=embed)

Ответы

▲ 0

я тоже столкнулся с такой проблемой. Я делаю бота с командой /profile. после ввода этой команды, высвечивается картинка с разными данными о пользователе. И я так понимаю из-за этого бот нагружался. Я решил проблему так. В конце, когда нам нужно отправить сообщение, В вашем случае это await ctx.send(embed=embed), пишите две строки.

  1. await ctx.response.defer()
  2. await ctx.edit_original_message(embed=embed)