Как остановить event on_message discord py
У меня есть команда с вложенной функцией on_message. Как мне остановить его при выполнеии определённого условия?
Пример:
@bot.command()
async def test(ctx):
await ctx.send('started')
@bot.event
async def on_message(mes):
if mes.author.bot:
return
msg = mes.content
if msg != 'break':
await ctx.send('do something')
else:
await ctx.send('stoped')
await bot.process_commands(mes)
return
При вводе break бот пишет stoped, но не перестаёт говорить do something на каждое сообщение
Ответы (1 шт):
Вы верно подметили, что цикл while True: pass в данном случае не лучшее решение. Ведь после "остановки" функции через написание "break", она не больше не будет реагировать, но по прежнему будет работать и использовать системные ресурсы.
Событие on_message() лучше создавать отдельно от других функций и использовать глобально, для получения всех сообщений бота.
В общем, в данном случае вам лучше отказаться от функции on_message() внутри команды бота test().
Из документации узнаем о методе wait_for(), который уже будем использовать внутри отдельной команды.
В данном коде в цикле мы постоянно ждем сообщения, и в случае написания "break", return прервет выполнение функции, полноценно завершив ее.
import asyncio
@bot.command()
async def test(ctx):
await ctx.send('started')
def check(msg):
if msg.author.bot:
return
else:
return msg
while True:
message = await bot.wait_for('message', check = check)
if message.content == 'break':
await ctx.send('stoped')
return
else:
await ctx.send('do something')