Ответ на команду потребовал больше 3 секунд
У меня возникла проблема с 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)
Источник: Stack Overflow на русском