Как вести счетчик времени от даты в таблице? 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 шт):
Я думаю, что как первичное решение вы могли бы реализовать что-то общее для всех пользователей:
Написать скрипт, который будет раз в сутки циклично проходиться по всем записям в базе данных и сравнивать текущие дату и время с указанными в заявке, а затем отправлять уведомления с информацией необходимым пользователям.
В будущем вы могли бы поработать с 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()