From c293912b7e5b6d56030e3e98e36f44e4cabc8adb Mon Sep 17 00:00:00 2001 From: smolkik-code Date: Tue, 6 Jan 2026 12:39:39 +0700 Subject: [PATCH] v0.0.2 --- bot.py | 114 ++++++++++++++++++++++++++++++++++++++++++-------- data/pills.db | Bin 0 -> 28672 bytes 2 files changed, 97 insertions(+), 17 deletions(-) create mode 100644 data/pills.db 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 0000000000000000000000000000000000000000..fee50b64d2c0c5f284a6dd03538a9ae792a7cfa1 GIT binary patch literal 28672 zcmeI)PiWg#90%|xTeh2~iFPRX5DYJev4qBs5;rOHp~P#vHPrSxTOP|{1kF}D5nF2X zlx|7sXxx@D80@m+#tysfvRqoiR;OdILk|P_JQ%E}LT@|wuqWA;W-s14L!p%K%b)k8 zr}y6PeV!B$=B4~jUbi*6X<7}{rfKpD5d^YADIw%E|B3ORUW)L7*gN34@VD}?;%SoF z+n(UH(UV6+s!Tkc`0iA7{D2=IK>z{}fB*y_009U<;C~D3o6%T&YD&1ZWUC+4wGVY> zo7QeOi(M$?vPzCB**Eez+C52UPSS4DYjmxsl;Cnpkjw<*0B{fqe|{QWsVP*Owx*Sf!caQW47A3O4oTx77EGLReJGa zrclU~%l=5Vx}_O@XuRnHH7zQ8^|SkOBoli|)H@+JSH)O-dRn+$_Cod`J&B+c=?gnJKXTwhSIZsP zUzXmTz>U3Cpt?cb<$R6Nx>;50)ZX)FU00dC!8F76TGQ3so7qZUp~Xr*@2)UU-9;W; z+WsD@rm?A84XyUiZvMT8*~{T*{LC3)-9u#Cb^hAM+Lm{Xd*cl(4_}!oyGG4TDyLG*v|t+i%2cYnG3)(d*)t7| zx~Tqyj(vK4_D-noySX4eB>Wo*0uX=z1Rwwb2tWV=5P$##AOL|EU10H-Ck}~_hhZ{Kq6wLf(ZotAUpeB~Ur@9_N4`O$s<=O6kL>Gv0Xf`|_S z5P$##AOHafKmY;|fB*y_0D(~jCZu19D7A?6r}S8ANxzNS586Qh0uX=z1Rwwb2tWV= z5P$##An=?7Cd1)rA=oYBZqAcQ$ly!lXxN&j*odeIZg@TgwWd=B>JEKmn8lb zG)4&m5P$##AOHafKmY;|fB*y_0D+fBzg9}lHW3