Задать вопрос
@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()
  • Вопрос задан
  • 359 просмотров
Подписаться 2 Средний 3 комментария
Решения вопроса 1
@n293 Автор вопроса
Аналитик
Да, решил, проблема оказалась в другом участке кода. Я использовал декоратор @run_acync из библиотеки python-telegram-bot немного в нем не разобравшись.
Получалось так, что я командой /activate запускал несколько потоков (несколько раз вводил), а команду /deactivate я вводил один раз. Вместо того количества сколько вводил команду /activate.

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

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

Похожие вопросы
SpectrumData Екатеринбург
от 200 000 до 300 000 ₽
Akronix Санкт-Петербург
от 150 000 до 200 000 ₽
19 янв. 2025, в 02:12
70000 руб./за проект
19 янв. 2025, в 01:58
20000 руб./за проект
18 янв. 2025, в 23:27
50000 руб./за проект