Как создать поток cycli c, который можно запускать / останавливать в любое время с помощью команды python -telegram-bot? - PullRequest
1 голос
/ 22 января 2020

Я пишу бота Telegram (с python -telegram-bot ), который на основе команды циклически отправляет сообщения пользователю каждый час.

Я хочу Запустите / остановите это с помощью команд бота, добавив такие обработчики команд, как /start_cycle и /stop_cycle. Чтобы уточнить, это то, что я имею в виду:

def start_cycle()
    # start in some way send_hourly_message()

def stop_cycle()
    # stop in some way send_hourly_message()

def main():
    """Entrypoint of the bot"""
    # Create updater and get dispatcher
    updater = Updater(...)
    dp = updater.dispatcher

    # Add command handlers
    dp.add_handler(CommandHandler("start_cycle", start_cycle))
    dp.add_handler(CommandHandler("stop_cycle", stop_cycle))

    # Start the bot until interrupt
    updater.start_polling(timeout=3)
    updater.idle()

Меня удивляет то, что для того, как задумана библиотека Telegram, уже существует логика на основе событий c, запущенная updater.start_polling() и updater.idle(). Я не нашел никакой документации / спецификаций c о том, как правильно работать с триггерными событиями, основанными на времени.

Какой, по вашему мнению, лучший способ сделать то, что я имею в виду? Я немного заглянул в asyncio , но, может быть, он слишком сложен для того, что мне действительно нужно?

Заранее спасибо за любые предложения!

1 Ответ

1 голос
/ 22 января 2020

Благодаря @GaganTK я смог найти то, что мне нужно:

def start_notify(update, context):
    new_job = context.job_queue.run_repeating(my_callback, interval=3, first=0, name="my_job")

def stop_notify(update, context):
    job = context.job_queue.get_jobs_by_name("my_job")
    job[0].schedule_removal()

def my_callback(context: telegram.ext.CallbackContext):
    print(datetime.datetime.now())
...