Bot & Automation

Activity Reminder Bot

/root/hermes-projects/Activity Reminder Bot

apps/activity_reminder_bot/services/formatters.py text
from datetime import datetime

from activity_reminder_bot.models import Reminder, ReminderDraft, ReminderRepeat, ReminderStatus

DATE_FORMAT = "%d %B %Y"
TIME_FORMAT = "%H:%M"
MONTH_NAMES = {
    1: "Januari",
    2: "Februari",
    3: "Maret",
    4: "April",
    5: "Mei",
    6: "Juni",
    7: "Juli",
    8: "Agustus",
    9: "September",
    10: "Oktober",
    11: "November",
    12: "Desember",
}


def format_date_id(value: datetime) -> str:
    return f"{value.day:02d} {MONTH_NAMES[value.month]} {value.year}"


def format_datetime(value: datetime) -> str:
    return f"{format_date_id(value)} jam {value.strftime(TIME_FORMAT)}"


def format_preview(draft: ReminderDraft) -> str:
    return (
        "🔔 Reminder Preview\n\n"
        f"Kegiatan:\n{draft.activity_name}\n\n"
        f"Tanggal:\n{format_date_id(datetime.combine(draft.reminder_date, draft.reminder_time))}\n\n"
        f"Jam:\n{draft.reminder_time.strftime(TIME_FORMAT)}\n\n"
        f"Repeat:\n{draft.repeat.value}\n\n"
        "Apakah data sudah benar?"
    )


def format_reminder_card(reminder: Reminder) -> str:
    status = reminder.status.value if isinstance(reminder.status, ReminderStatus) else str(reminder.status)
    repeat = reminder.repeat.value if isinstance(reminder.repeat, ReminderRepeat) else str(reminder.repeat)
    return (
        "📌 Reminder Card\n\n"
        f"ID: {reminder.public_id}\n"
        f"Kegiatan: {reminder.activity_name}\n"
        f"Deskripsi: {reminder.description or '-'}\n"
        f"Tanggal: {format_date_id(datetime.combine(reminder.reminder_date, reminder.reminder_time))}\n"
        f"Jam: {reminder.reminder_time.strftime(TIME_FORMAT)}\n"
        f"Repeat: {repeat}\n"
        f"Status: {status}"
    )


def format_alarm(reminder: Reminder, now: datetime) -> str:
    return (
        "🔔 Alarm Kegiatan\n\n"
        f"{reminder.activity_name}\n\n"
        f"⏰ Sekarang Jam {now.strftime(TIME_FORMAT)}\n\n"
        "Pilih aksi:"
    )


def format_list(title: str, reminders: list[Reminder]) -> str:
    if not reminders:
        return f"{title}\n\nBelum ada reminder."
    lines = [title, ""]
    for index, reminder in enumerate(reminders, start=1):
        lines.append(
            f"{index}. {reminder.activity_name} - "
            f"{reminder.reminder_date.strftime('%d/%m/%Y')} {reminder.reminder_time.strftime(TIME_FORMAT)} "
            f"({reminder.status.value})"
        )
    return "\n".join(lines)