Предотвратить блокировку канала.отправить (), если канал находится в режиме замедленного восстановления

#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() функция не будет заблокирована.