Разработка Discord-ботов на discord.py
Я пишу функцию, которая изменяет название канала когда кто-либо покидает или приходит на сервер.
Она выводит количество участников сервера. Но иногда она лагает и не реагирует на то, что кто-то пришел или ушел с сервера.
Вот код:
@bot.event
async def on_member_join(member:discord.Member):
CountChannel = bot.get_channel(727401938001461298)
await CountChannel.edit(
name = "Участников: {}".format(len(member.guild.members))
)
@bot.event
async def on_member_remove(member:discord.Member):
CountChannel = bot.get_channel(727401938001461298)
await CountChannel.edit(
name = "Участников: {}".format(len(member.guild.members))
)
В чем проблема? Может, так происходит потому что у меня комп тормозит?
Ответы (2 шт):
Discord с недавних пор имеет ограничение на 2 редактирования названия/описания канала в 10 минут:

После двух редактирований срабатывает "ratelimit" и библиотека задерживает изменение канала до окончания задержки.
Возможные решения:
- Отказаться от каналов со статистикой
- Добавить проверку на время прошедшее с момента последнего изменения канала
- Изменять канал каждые 5 минут, например при помощи
discord.ext.tasks:
from discord.ext import tasks
...
update_required = False
@bot.event
async def on_member_join(member:discord.Member):
update_required = True
@bot.event
async def on_member_remove(member:discord.Member):
update_required = True
@tasks.loop(minutes=5)
async def stats_update():
if update_required:
count_channel = bot.get_channel(727401938001461298) # CamelCase обычно обозначают Classы: https://www.python.org/dev/peps/pep-0008/#prescriptive-naming-conventions
await count_channel.edit(name = f"Участников: {len(channel.guild.members)}")
update_required = False
stats_update.start()
Просто сделайте цикл, в котором бот будет удалять канал и менять его название на текущее количество участников, когда кто-то присоединяется к серверу:
@client.event
async def on_member_join(member):
overwrites={
member.guild.default_role: discord.PermissionOverwrite(connect=False),
member.guild.me: discord.PermissionOverwrite(connect=False)}
category = await member.guild.create_category('Инфо')
await member.guild.create_voice_channel('Участников:'
.format(member.guild.member_count), overwrites=overwrites, category=category)
await channel.delete()
# И так по кругу