Как вести счетчик времени от даты в таблице? PytelegramBotApi, Python, SQLite

Всех приветствую! Возник вопрос при написании Telegram bot'а на библиотеке PyTelegramBotAPI с базой данных SQLite.

Есть задача. Пользователь вызывает команду /remont (условно) -> Отвечает на вопрос "Что именно?" -> Отвечает на вопрос "Какая неисправность?". Далее это все заносится в базу данных SQLite в строки: user_id, what_broke, defect, date

user_id и date получаю таким образом:

tconv = lambda x: time.strftime("%H:%M:%S %d.%m.%Y", time.localtime(x))

id = message.from_user.id
date = tconv(message.date)

Собственно вопрос: Какие существуют способы реализовать счетчик или таймер, который смотрел дату занесения неисправности в таблицу пользователем и каждые два дня оповещал в группе (в которую он добавлен), что заявка "такая-то" не исправлена?

Или по умолчанию заявке даётся 7 дней срока и каждый день отнимается единица и приходит оповещение(но в данном случае при перезапуске бота будет все стираться, а это не хотелось бы)

На сколько я понял также необходима асинхронность, чтобы бот не только считал и вроде для этого существует:

bot = telebot.AsyncTeleBot('<Token>')

Буду очень благодарен примерам или хотя бы, чтобы кто-то натолкнул на мысль какая структура должна быть процесса. Большая просьба чуть более подробно, для профессионалов все будет понятно, а я могу не сообразить)


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

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

Я думаю, что как первичное решение вы могли бы реализовать что-то общее для всех пользователей:

Написать скрипт, который будет раз в сутки циклично проходиться по всем записям в базе данных и сравнивать текущие дату и время с указанными в заявке, а затем отправлять уведомления с информацией необходимым пользователям.

В будущем вы могли бы поработать с CRON, чтобы сервер самостоятельно отвечал за активацию скрипта.

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

Начальный скрипт мог бы выглядеть подобным образом:

import time
import sqlite3
from sqlite3 import Error

# Функция для отправки сообщения через Telebot
def send_message(chat_id, text):
    import telebot
    bot = telebot.TeleBot('1234')
    bot.send_message(chat_id, text)

# Функция для проверки прохождения суток от полученной даты
def check_date(date):
    import datetime
    # получаем текущую дату
    now = datetime.datetime.now()
    # преобразуем дату из строки в дату
    date_from_sql = datetime.datetime.strptime(date, '%Y-%m-%d %H:%M:%S')
    # получаем время в секундах между датами
    delta = now - date_from_sql
    # преобразуем время в секундах в часы, минуты и секунды
    delta_hours = delta.seconds // 3600
    delta_minutes = (delta.seconds // 60) % 60
    delta_seconds = delta.seconds % 60
    # выводим время в часах, минутах и секундах
    print(f'С записи прошло {delta.days} дней {delta_hours} часов, {delta_minutes} минут и {delta_seconds} секунд')
    # проверяем прошли ли сутки от записи в sqlite
    if delta.days > 0: 
        print ('прошли сутки')
        

# Функция для подключения к БД
def create_connection(db_file):

    conn = None
    try:
        conn = sqlite3.connect(db_file)
    except Error as e:
        print(e)

    return conn


# Основная функция для сравнения дат и отправки уведомлений
def select_yesterday_tasks(conn):

    cur = conn.cursor()
    
    # Первый вариант (тогда доп. проверки через check_date не нужны): 
    # Получаем все записи из таблицы record где дата записи больше текущей даты на день
    # cur.execute("SELECT * FROM record WHERE date > date('now', '-1 day')")
    
    # Второй вариант: с использованием свой проверки даты
    # Получаем все записи из таблицы record
    cur.execute("SELECT * FROM record")

    rows = cur.fetchall()

    for row in rows:
        date = row[1] # находим значение колонки даты для конкретной записи
        if check_date(date): # Если прошли сутки, то отправляем уведомление:
            send_message(row[0], 'Прошли сутки!') # Отправляем сообщение через Telebot

def main():
    # Здесь указываете местоположение вашей БД
    database = r"C:\sqlite\db\pythonsqlite.db"

    # Подключаемся к БД
    conn = create_connection(database)
    with conn:
        while True:
        # Указываем время ожидания в секундах (1 день)
            time.sleep(86400)
            # Вызываем функцию получения записей и отправки уведомлений
            select_yesterday_tasks(conn, 1)


if __name__ == '__main__':
    main()
→ Ссылка