v0.0.2
This commit is contained in:
114
bot.py
114
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
|
||||
|
||||
BIN
data/pills.db
Normal file
BIN
data/pills.db
Normal file
Binary file not shown.
Reference in New Issue
Block a user