Подриска на уведомления телеграм бота

def covid_in_country():
    d = covid.get_status_by_country_name('Ukraine')
    inf = str(d.get('confirmed'))+' - подтверждено случеев \n'+str(d.get('active'))+' - активных на данный момент \n'+str(d.get('recovered')) +' - выздоровело\n'+str(d.get('deaths'))+' - умерло\n'+ str(t.ctime(d.get('last_update')/1000))+' - последнее обновление'
    return inf


@bot.callback_query_handler(func = lambda call:True)
def callback_inline(call):
    if call.data == 'folow':
        def interval_timer():
            return covid_in_country()
            sleep(2)
            interval_timer()
        bot.send_message(call.from_user.id, interval_timer())

Суть: пользователь нажимает на inline кнопку в телеграмме "Подписаться на уведомления" и ему каждые 2 секунды приходит сообщение.

Проблема: при нажатии сообщение приходи только один раз, а не каждые 2с.

Как исправить?(это фрагмент кода )

Ссылка на бота - http://t.me/CovidInWorldBot (inline кнопка только на Украине)


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

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

Проблемы с текущей функцией описал в комментарии:

def interval_timer():
    return covid_in_country()  # Тут выход из функции, а значит код ниже не выполнится
    sleep(2)
    interval_timer()           # Из-за рекурсии тут будет ошибка RecursionError: maximum recursion depth exceeded

Попробуйте так:

@bot.callback_query_handler(func = lambda call:True)
def callback_inline(call):
    if call.data == 'folow':
        while True:
            text = covid_in_country()
            bot.send_message(call.from_user.id, text)
            sleep(2)

Но я не уверен, что в текущем варианте sleep не повесит бота при первом же запросе, или когда их будет много.

Лучше такое сохранять в базе данных и в отдельном потоке проходить по таблице базы и отправлять сообщение тем юзерам, кто подписался

→ Ссылка