diff --git a/src/handlers/user.py b/src/handlers/user.py index 40a81eb..fb251a2 100644 --- a/src/handlers/user.py +++ b/src/handlers/user.py @@ -16,6 +16,39 @@ _pending_confirmations: dict = {} REMINDER_KEYWORDS = ["ingatkan", "pengingat", "remind", "jadwalkan", "tolong ingat"] REMINDER_BYPASS_KEYWORDS = ["ingatkan", "pengingat", "remind", "diingatkan", "jadwalkan", "kapan diingat"] + +def _build_context(user_db_id: int, rag_results: list) -> str: + parts = [] + + # Waktu sekarang + now = datetime.now(ZoneInfo(BOT_TIMEZONE)) + parts.append(f"Waktu sekarang: {now.strftime('%A, %d %B %Y %H:%M WIB')}") + + # Reminder aktif + reminders = db.get_user_reminders(user_db_id) + if reminders: + lines = ["Agenda/Pengingat aktif pengguna:"] + for r in reminders: + if r["is_recurring"]: + lines.append(f"- [Setiap hari {r['remind_at'][:5]} WIB] {r['message']}") + else: + try: + dt = datetime.fromisoformat(r["remind_at"]).replace(tzinfo=ZoneInfo(BOT_TIMEZONE)) + lines.append(f"- [{dt.strftime('%a, %d %b %Y %H:%M')} WIB] {r['message']}") + except Exception: + lines.append(f"- {r['message']}") + parts.append("\n".join(lines)) + + # RAG context + if rag_results: + rag_lines = ["Konteks dari Second Brain pengguna:"] + [ + f"[{'Global' if r['scope'] == 'global' else 'Pribadi'}] {r['content']}" + for r in rag_results + ] + parts.append("\n".join(rag_lines)) + + return "\n\n".join(parts) + _client = AsyncOpenAI(api_key=DEEPSEEK_API_KEY, base_url=DEEPSEEK_BASE_URL) ACADEMIC_SYSTEM_PROMPT = ( @@ -145,18 +178,13 @@ async def ask(update: Update, context: ContextTypes.DEFAULT_TYPE): return relevant = await rag.search(user_data["id"], question, n_results=5) - context_text = "" - if relevant: - context_text = "\n\nKonteks dari Second Brain pengguna:\n" + "\n".join( - f"[{'Global' if r['scope'] == 'global' else 'Pribadi'}] {r['content']}" - for r in relevant - ) + extra_context = _build_context(user_data["id"], relevant) history = db.get_conversation_history(user_data["id"]) system_prompt = ( f"{ACADEMIC_SYSTEM_PROMPT}\n\n" - f"Nama dosen: {user_data['full_name']}" - f"{context_text}" + f"Nama dosen: {user_data['full_name']}\n\n" + f"{extra_context}" ) messages = [{"role": "system", "content": system_prompt}] @@ -335,18 +363,13 @@ async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE): return relevant = await rag.search(user_data["id"], question, n_results=5) - context_text = "" - if relevant: - context_text = "\n\nKonteks dari Second Brain pengguna:\n" + "\n".join( - f"[{'Global' if r['scope'] == 'global' else 'Pribadi'}] {r['content']}" - for r in relevant - ) + extra_context = _build_context(user_data["id"], relevant) history = db.get_conversation_history(user_data["id"]) system_prompt = ( f"{ACADEMIC_SYSTEM_PROMPT}\n\n" - f"Nama dosen: {user_data['full_name']}" - f"{context_text}" + f"Nama dosen: {user_data['full_name']}\n\n" + f"{extra_context}" ) messages = [{"role": "system", "content": system_prompt}]