#python #python-3.x #discord #discord.py
Вопрос:
У меня проблема с отправкой сообщений на канал discord.
Если канал находится в таймауте из-за восстановления канала discord, channel.send(msg)
функция заблокируется. Есть ли какой-либо способ узнать оставшееся время восстановления или проверить, будет ли send()
функция выполняться без блокировки до фактического вызова функции?
# this.channels is an array of objects type discord.TextChannel, API reference: https://discordpy.readthedocs.io/en/stable/api.html#textchannel
for l_channel in this.channels:
await l_channel.send(l_msg.text) # Blocks if channel is in cooldown due to slow mode, any way to check before sending?
await asyncio.sleep(2)
Ответ №1:
for l_channel in this.channels:
delay = l_channel.slowmode_delay
await l_channel.send(l_msg.text)
await asyncio.sleep(delay)
Вы можете получить задержку с помощью этого метода и подождать необходимое время между каждой отправкой, как я делаю в приведенном выше коде.
Комментарии:
1. к сожалению, я не могу так задерживаться, режим сна(2) существует из-за предотвращения нежелательной почты API, а не в медленном режиме… Я вообще не хочу, чтобы код блокировался, потому что я хочу, чтобы он отправлялся и на другие каналы, не дожидаясь завершения первого вызова
2. Я действительно неправильно понял цель. Но, к сожалению, вы не можете определить, когда время восстановления канала закончилось.
Ответ №2:
Решается путем изменения библиотеки discord:
- открыть http.py внутри папки модуля discord и замените
if r.status == 429:
if not r.headers.get('Via'):
# Banned by Cloudflare more than likely.
raise HTTPException(r, data)
на линии 213, с:
if r.status == 429:
if not r.headers.get('Via') or data["code"] == 20016: # Or is in slow mode
# Banned by Cloudflare more than likely.
raise HTTPException(r, data)
Это приведет к возникновению исключения, которое вы можете перехватить, и channel.send()
функция не будет заблокирована.