Discord Python Bot - 使用 APScheduler 在辅助功能中发送消息
Discord Python Bot - Send Message in Aux Function Using APScheduler
我觉得我做错了什么。
我想要完成的是拥有一个功能,只要用户保持超过特定时间的耳聋,它就会向文本频道发送一条消息。
编译时不会崩溃。它运行。它只给出:
RuntimeWarning: coroutine 'check_pomada_state' was never awaited
定时器工作正常,所以应该不是问题。每个方法都是异步的。
我认为问题与 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)
您必须使用 AsyncIOScheduler
而不是 BackgroundScheduler
。它附带的 AsyncIOExecutor
是唯一能够 运行 预定协程函数的执行器。
我觉得我做错了什么。
我想要完成的是拥有一个功能,只要用户保持超过特定时间的耳聋,它就会向文本频道发送一条消息。
编译时不会崩溃。它运行。它只给出:
RuntimeWarning: coroutine 'check_pomada_state' was never awaited
定时器工作正常,所以应该不是问题。每个方法都是异步的。
我认为问题与 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)
您必须使用 AsyncIOScheduler
而不是 BackgroundScheduler
。它附带的 AsyncIOExecutor
是唯一能够 运行 预定协程函数的执行器。