Skip to content

Latest commit

 

History

History
70 lines (51 loc) · 4.2 KB

tasks.md

File metadata and controls

70 lines (51 loc) · 4.2 KB

Иногда возникает необходимость выполнять какую-либо задачу с определенным временным интервалом. Например, каждые X секунд/минут/часов сохранять какие-то данные или проверять какие-нибудь условия.

Чтобы не заморачиваться с циклом и задержками в коде самостоятельно, можно просто использовать функционал модуля discord.ext.tasks.

Создадим задачу, которая каждые 10 секунд выводит в консоль пользователей, находящихся в голосовом канале.

Для начала подключим модуль:

from discord.ext import tasks

Для того, чтобы пометить функцию, как задачу для выполнения с временным интервалом, воспользуемся декоратором @tasks.loop(). В декоратор можно передать следующие параметры:

  • seconds: int/float — количество секунд, между итерациями выполнения задачи
  • minutes: int/float — количество минут, между итерациями выполнения задачи
  • hours: int/float — количество часов, между итерациями выполнения задачи

Также можно передать:

  • time: datetime.time — точное время запуска задачи
  • count: int — сколько раз необходимо выполнить задачу

Создадим функцию и в декораторе укажем интервал в 10 секунд:

@tasks.loop(seconds=10)
async def my_loop():
    . . .

Теперь прописываем логику функции:

@tasks.loop(seconds=10)
async def my_loop():
    # будем выводить уастников в голосовых каналах
    # для каждого сервера из всех серверов, где есть бот
    for guild in bot.guilds:
        # выводим название сервера
        print(guild.name, end='')
        #              берем в генератор только тех участников, у которых свойство voice != None
        for member in (member for member in guild.members if member.voice):
            # выводим имя участника и название канала
            print(f'\t{member.name} ({member.voice.channel.name})')

Теперь, задачу нужно запустить. Многие забывают это сделать и потом довольно часто возникает вопрос о том, почему же правильно прописанная задача не работает (Подробный разбор проблемы)

Задачу нужно запускать тогда, когда бот полностью готов к работе. А для этого, как нельзя лучше, подходит обработчик события on_ready(). Почитать про него можно здесь.

@bot.event
async def on_ready():
    my_loop.start()

В результате должен получиться примерно такой код.

А в консоль каждые 10 секунд будет выводиться информация примерно следующего содержания:

Название сервера
        dennys (🔊 Название голосового канала)