Таймер для телеграмм бота

Нужен таймер для телеграм-бота. Суть такова, что если пользователь не отправляет сообщение 1 час, то бот должен написать ему, в противном случае прервать цикл Код выглядит примерно так:

@bot.message_handler(content_typer=['text'])
def fio(message):
    text = message.text
    timing = time.time()
    while True:
        if message.text != text:
            break            
        if time.time() - timing > 3600:
            bot.send_message(message.chat.id,'ВНИМАНИЕ! Вы не ответили на вопросы!')
            timing = time.time()
        sleep(10)

Проблема в том, что message.text не изменяется, даже если написать что-то в бота. Поэтому я без понятия как выйти из этого цикла. Помогите кто-нибудь

python telegram-bot


Ответы (3 шт):

Автор решения: Miekrif

У тебя не стоит условие выхода из While(пока) поэтому он будет бесконечным

Задай условие для цикла в котором оно достигается ответом от пользователя или счетчиком который будет обновляться с каждым сообщением от пользователя цикл "While условие" логически выгляди так: "Пока условие не будет истино" В твоем случае условие истино всегда

→ Ссылка
Автор решения: Igor' Kantimirov

Я бы предложил следующий подход для решения данной задачи.

Можно использовать библиотеку schedule. Документация находится здесь. После того как бот получает сообщение от пользователя нужно создать job примерно так:

schedule.every(1).hours.do(send_warning).tag('CHAT-ID')

Где CHAT-ID — ид чата с пользователем. В функции send_warning нужно реализовать отправку сообщения с текстом предупреждения.

Если сообщение от пользователя все же пришло, то нужно отменить job по тегу так: schedule.clear('CHAT-ID')

Ну и нужно создать фоновый поток для schedule.

UPD: У меня получился такой код:

import schedule
import telebot
from threading import Thread
from time import sleep

TOKEN = "TOKEN"

bot = telebot.TeleBot(TOKEN)

def schedule_checker():
    while True:
        schedule.run_pending()
        sleep(1)

@bot.message_handler(func=lambda message: True)
def fio(message):
    text = message.text
    if text and len(schedule.get_jobs(message.chat.id)) >= 1:
        schedule.clear(message.chat.id)
        bot.send_message(message.chat.id, "Ответ получен")
    else:
        schedule.every(3).seconds.do(get_sending_function(message.chat.id)).tag(message.chat.id)

def get_sending_function(chatId):
    def send_function():
        bot.send_message(chatId, "ВНИМАНИЕ! Вы не ответили на вопросы!")
        return schedule.CancelJob
    return send_function

if __name__ == "__main__":
    scheduleThread = Thread(target=schedule_checker)
    scheduleThread.daemon = True
    scheduleThread.start()
    bot.polling()

Думаю, дальше можно адаптировать этот пример под Вашу задачу.

→ Ссылка
Автор решения: Max

У вас там в коде в message_handler написано content_typer а надо content_types, думаю как раз из-за этого message.text и не изменяется.

→ Ссылка