| const groqHandler = require('./groqHandler'); |
| const statsTracker = require('./statsTracker'); |
|
|
| class RecapManager { |
| constructor() { |
| this.activeRecaps = new Map(); |
| } |
|
|
| |
| |
| |
| async initiateRecap(jid, type = 'monthly') { |
| const now = new Date(); |
| const lastMonth = new Date(now.getFullYear(), now.getMonth() - 1, 1); |
| const year = lastMonth.getFullYear().toString(); |
| const month = (lastMonth.getMonth() + 1).toString().padStart(2, '0'); |
| |
| const stats = statsTracker.getUserStats(jid, year, month); |
| if (!stats || stats.total_messages < 5) return null; |
|
|
| const monthName = lastMonth.toLocaleString('id-ID', { month: 'long' }); |
| |
| |
| this.activeRecaps.set(jid, { |
| type, |
| step: 0, |
| monthName, |
| stats, |
| history: [] |
| }); |
|
|
| return this.getNextStep(jid); |
| } |
|
|
| async getNextStep(jid, userReply = '') { |
| const session = this.activeRecaps.get(jid); |
| if (!session) return null; |
|
|
| session.step++; |
| |
| const { stats, monthName, step, type } = session; |
| |
| |
| const systemPrompt = `Anda adalah asisten yang sedang memberikan kilas balik (recap) ${type} kepada user. |
| Gunakan gaya bahasa anak muda zaman sekarang yang puitis tapi santai, gunakan plesetan atau tren terkait bulan ${monthName}. |
| Urutan ini harus terasa personal (psychologically moving). |
| Jangan berikan semua info sekaligus. HANYA berikan bagian untuk STEP ${step}. |
| Gunakan Bahasa Indonesia yang sangat akrab.`; |
|
|
| let prompt = ""; |
| |
| if (type === 'monthly') { |
| switch(step) { |
| case 1: |
| prompt = "Berikan kalimat pembuka yang sangat menarik tentang perjalanan kita di bulan ${monthName}. Mention bahwa kita sudah melewati banyak hal bersama."; |
| break; |
| case 2: |
| prompt = "Berikan data: Kita ngobrol selama ${stats.days_active.length} hari dengan total ${stats.total_messages} pesan. Berikan komentar unik tentang angka ini."; |
| break; |
| case 3: |
| const peakHour = Object.entries(stats.hourly_activity).sort((a,b) => b[1]-a[1])[0][0]; |
| prompt = `Bahas tentang puncak aktivitas kita yang biasanya jam ${peakHour}.00. Juga bahas pola/kebiasaan baru yang kamu tangkap dari topik ini: ${stats.topics_summary.join(", ")}. Tanya pendapat user tentang kebiasaan ini untuk mengakhiri recap.`; |
| break; |
| default: |
| this.activeRecaps.delete(jid); |
| return null; |
| } |
| } |
|
|
| const response = await groqHandler.analyzeDocument(JSON.stringify(stats), `${systemPrompt}\n\n${prompt}`); |
| |
| |
| if (step >= 3) this.activeRecaps.delete(jid); |
| |
| return response; |
| } |
|
|
| isInRecap(jid) { |
| return this.activeRecaps.has(jid); |
| } |
| } |
|
|
| const recapManager = new RecapManager(); |
| module.exports = recapManager; |
|
|