This commit is contained in:
2026-01-06 12:39:39 +07:00
parent 922ba1195f
commit c293912b7e
2 changed files with 97 additions and 17 deletions

114
bot.py
View File

@@ -662,25 +662,105 @@ async def edit_value_handler(update: Update, context: ContextTypes.DEFAULT_TYPE)
# ----------------- History (7 days) -----------------
async def history_handler(update: Update, context: ContextTypes.DEFAULT_TYPE):
user_id = update.effective_user.id
cursor.execute('SELECT id, name FROM pills WHERE user_id=?', (user_id,))
pills = cursor.fetchall()
if not pills:
await update.message.reply_text("Нет данных о лекарствах.", reply_markup=main_menu_kb())
return
now = datetime.utcnow().date()
lines = []
for pid, name in pills:
lines.append(f"💊 {name}:")
conn = get_db_connection()
cursor = conn.cursor()
try:
# Получаем сегодняшнюю дату в UTC
today = datetime.utcnow().date()
# Получаем все лекарства пользователя
cursor.execute(
'SELECT id, name FROM pills WHERE user_id=? ORDER BY name',
(user_id,)
)
pills = cursor.fetchall()
if not pills:
await update.message.reply_text(
"💊 У вас пока нет добавленных лекарств.\n"
"Нажмите ' Добавить лекарство', чтобы начать.",
reply_markup=main_menu_kb()
)
conn.close()
return
# Формируем заголовок с датами
date_range = []
for d in range(6, -1, -1):
day = now - timedelta(days=d)
day_str = day.strftime("%Y-%m-%d")
cursor.execute('SELECT COUNT(*) FROM history WHERE pill_id=? AND user_id=? AND date(ts)=?', (pid, user_id, day_str))
cnt = cursor.fetchone()[0]
mark = "" if cnt>0 else ""
lines.append(f"{day.strftime('%d.%m')}: {mark}")
day = today - timedelta(days=d)
date_range.append(day)
date_header = " | ".join([d.strftime("%d.%m") for d in date_range])
lines = [f"📅 История за 7 дней:\n📅 {date_header}"]
total_pills_with_history = 0
for pill in pills:
pid = pill["id"]
name = pill["name"]
# Проверяем историю для каждого дня
day_marks = []
pill_has_history = False
for day in date_range:
day_str = day.strftime("%Y-%m-%d")
cursor.execute(
'''SELECT COUNT(*) as cnt FROM history
WHERE pill_id=? AND user_id=? AND date(ts)=? AND taken=1''',
(pid, user_id, day_str)
)
cnt = cursor.fetchone()["cnt"]
if cnt > 0:
day_marks.append("")
pill_has_history = True
else:
day_marks.append("")
# Добавляем только если есть хотя бы одна отметка
if pill_has_history:
total_pills_with_history += 1
marks_str = " | ".join(day_marks)
# Обрезаем длинное название лекарства
display_name = name[:20] + "..." if len(name) > 20 else name
lines.append(f"💊 {display_name:<23} {marks_str}")
# Добавляем статистику
lines.append("")
await update.message.reply_text("\n".join(lines), reply_markup=main_menu_kb())
lines.append(f"📊 Статистика: {total_pills_with_history}/{len(pills)} лекарств с историей")
if total_pills_with_history == 0:
await update.message.reply_text(
"📭 История приёмов пуста.\n\n"
"Как использовать:\n"
"1. Бот пришлёт напоминание в указанное время\n"
"2. Нажмите кнопку '✅ Выпил(-а)' в напоминании\n"
"3. Здесь появится история ваших приёмов\n\n"
"Ждём первого подтверждения приёма! 💊",
reply_markup=main_menu_kb()
)
else:
response = "\n".join(lines)
# Добавляем легенду
response += "\n\n✅ - принято\n❌ - не принято"
await update.message.reply_text(
response,
reply_markup=main_menu_kb()
)
except Exception as e:
logger.error(f"Error getting history: {e}")
await update.message.reply_text(
"❌ Произошла ошибка при получении истории.\n"
"Попробуйте позже или обратитесь к администратору.",
reply_markup=main_menu_kb()
)
finally:
conn.close()
# ----------------- Callback: taken -----------------
async def callback_taken(update: Update, context: ContextTypes.DEFAULT_TYPE):
query = update.callback_query

BIN
data/pills.db Normal file

Binary file not shown.