@n293
Аналитик

Как запускать и отключать программу через телеграм?

Привет!

Есть программа, для которой я создал телеграм-бота. Через него я хочу с помощью команды запускать и отключать программу.
Сейчас получается так, что она только запускается, а остановить ее, по факту, не получается. Несмотря на отправку команды /deactivate работа программы продолжается.

Может быть я что-то с задержками напутал? Или еще с чем-то, не могу понять.
Вот код телеграм-бота, он принимает от меня команды и по идее должен их выполнять (/activate срабатывает, а /deactivate нет):

from telegram.ext import Updater, CommandHandler
from telegram_features.telegram_private_keys import telegram_api_key,tel_id
from telegram_features.telegram_notification import send_notification
from main import init_program
from functools import wraps


def restricted(func):
    @wraps(func)
    def wrapped(bot, update, *args, **kwargs):
        user_id = update.effective_user.id
        if user_id != tel_id:
            send_notification('Неавторизованный доступ с ID: {}.'.format(user_id))
            return
        return func(bot, update, *args, **kwargs)
    return wrapped


@restricted
def activate_program_bot(bot, update, job_queue, user_data):
    program_job = job_queue.run_repeating(init_program, 300, first=1)
    user_data['program_job'] = program_job
    send_notification('программа начала работу')


@restricted
def deactivate_program_bot(bot, update, user_data):
    program_job = user_data.get('program_job')
    if program_job:
        program_job.schedule_removal()
        send_notification('программа завершила работу')
    send_notification('программа видимо не завершила работу')

def main():
    updater = Updater(telegram_api_key)
    dp = updater.dispatcher
    dp.add_handler(CommandHandler("activate", activate_program_bot, pass_job_queue=True, pass_user_data=True))
    dp.add_handler(CommandHandler("deactivate", deactivate_program_bot, pass_user_data=True))
    updater.start_polling(timeout=1000)

if __name__ == '__main__':
    main()
  • Вопрос задан
  • 348 просмотров
Решения вопроса 1
@n293 Автор вопроса
Аналитик
Да, решил, проблема оказалась в другом участке кода. Я использовал декоратор @run_acync из библиотеки python-telegram-bot немного в нем не разобравшись.
Получалось так, что я командой /activate запускал несколько потоков (несколько раз вводил), а команду /deactivate я вводил один раз. Вместо того количества сколько вводил команду /activate.

В итоге пришел к выводу, что мне асинхронность для данной задачи не нужна.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы