Иногда возникает необходимость выполнять какую-либо задачу с определенным временным интервалом. Например, каждые 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 (🔊 Название голосового канала)