I’m working on a Telegram bot using python-telegram-bot and I want to stop running a telegram.job object.
for example I want to stop running this hello function while it is in while loop.
def hello(context):
while True:
context.bot.send_message(chat_id=context.job.context, text="Hi!")
I’m using the start command to call hello function and run a job:
def start(update,context):
context.job_queue.run_once(hello, 10, context=update.message.chat_id, name=update.effective_chat.id)
And using the end command, I remove the job from job queue:
def end(update,context):
for job in context.job_queue._queue.queue:
if job[1].name == update.effective_chat.id:
context.job_queue._queue.queue.remove(job)
The problem is when I use end command before starting of the job(at first 10 seconds) it works correctly and stops the job but when I use end command while running the job it does nothing because the running job is not in the job queue.
Do you have any idea? How can I stop the running job?
2
Answers
I don’t think that there’s a straight way to do it via PTB itself, but it’s quite easy to program yourself. You always have access to
context.bot_data
dictionary.So store a variable there like
run_job_a = True
and check it on each iteration of your loop. Then you’ll be able to stop the job by changing it’s value to False.If omitting the while loop in your job function is an option for you, you could also start a repeating job. This way the job would be still in your job queue and you can easily stop it.