@QueenChrysalis

Как заставить бота регулярно отправлять сообщения на канал в определённое время?

Библиотека disnake
Необходимо чтобы бот отправлял сообщение ( результат некой функции ) на регулярной основе в некоторый канал. Например отправлял сообщение регулярно каждый день, без вмешательства пользователя.
Как это можно реализовать?
  • Вопрос задан
  • 64 просмотра
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Почитать про asyncio.create_task() и как им пользоваться.
Создаёшь таск при старте бота (читаем доки на диснейк как реагировать на старт бота), в таске крутишь while True: в комбинации с asyncio.sleep(), пока не наступит нужный момент. Затем делаешь что нужно, и снова ждёшь.
Оговорка 1

1. Сохрани результат create_task() в переменную (глобальную или атрибут класса бота, если у тебя класс). Иначе со временем сборщик мусора соберёт объект задачи и задача прибьётся.
2. Перед запуском фоновой задачи проверяй, а не запущена ли она уже. Вроде как on_startup() может вызываться неоднократно при некоторых обстоятельствах.
3. При выходе из бота берешь этот объект задачи и делаешь что-то типа
my_bg_task.cancel()
try:
    await my_bg_task
except asyncio.CancelledError:
    pass

чтобы дать фоновой задаче спокойно завершиться.

Оговорка 2

Если у тебя только одна задача с ожиданием, то можно ждать самому, через asyncio.sleep(). В противном случае может пригодиться aioschedule или подобная библиотека. Тогда в фоновой задаче крутишь рабочий цикл этой библиотеки, а свои задачи планируешь уже через неё.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы