diff --git a/bot.py b/bot.py index 40d3b86..8ccaffd 100644 --- a/bot.py +++ b/bot.py @@ -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 diff --git a/data/pills.db b/data/pills.db new file mode 100644 index 0000000..fee50b6 Binary files /dev/null and b/data/pills.db differ