Discord Python Bot - отправка сообщения в функции Aux с помощью APScheduler - PullRequest
0 голосов
/ 24 февраля 2020

Я думаю, что я делаю что-то не так.

То, что я пытаюсь выполнить sh, имеет функцию, которая всякий раз, когда пользователь остается в течение определенного времени c, оглушает его, отправляет сообщение в текстовый канал.

Не компилируется sh при компиляции. Это работает. Он дает только:

RuntimeWarning: сопрограмма 'check_pomada_state' никогда не ожидалась

Таймеры работают нормально, поэтому с ними проблем не должно быть. Каждый метод asyn c.

Я действительно считаю, что проблема связана с вызовом scheduler.add_job (...) . Возможно, мне не хватает какого-либо аргумента или чего-то еще, но в документации нет ничего, что упоминало бы это.

import ...

client = commands.Bot(command_prefix = ids.prefix)
times_check_pomada = [5, 3600, 10800, 18000]
timers_da_pomada = {...}

scheduler = BackgroundScheduler()
scheduler.start()

@client.event
async def on_ready():
    print('Bot is ready.')

@client.event
async def on_voice_state_update(member, before, after):
    if before.self_mute != after.self_mute and before.self_deaf != after.self_deaf:
        if after.self_mute and after.self_deaf:
            t = Timer()
            t.start()
            timers_da_pomada[member] = t
            scheduler.add_job(check_pomada_state, 'interval', seconds = 1, id=f'{member}_sched', args=[member])
        else:
            if member in timers_da_pomada and timers_da_pomada[member].isRunning():
                timers_da_pomada[member].stop()
                scheduler.remove_job(f'{member}_sched')

async def check_pomada_state(member):
    if not timers_da_pomada[member].isRunning():
        scheduler.remove_job(f'{member}_sched')

    else:
        curr = timers_da_pomada[member].current()
        if curr in times_check_pomada:
            channel = client.get_channel(<channel_id>)
            await channel.send(f'{member}... {curr // 60} minutes deafened')

client.run(ids.TOKEN)

1 Ответ

1 голос
/ 25 февраля 2020

Вы должны использовать AsyncIOScheduler вместо BackgroundScheduler. Его сопровождающий AsyncIOExecutor является единственным исполнителем, способным выполнять запланированные функции сопрограмм.

...