Files
daily-blackout-check/src/blackout_notifier/messages.py
Meghdad 4218e4ac36
All checks were successful
Test blackout notifier / test (push) Successful in 3m41s
Hourly blackout check / check (push) Successful in 8s
Implemented the full clean rewrite for Gitea
2026-07-17 04:33:16 +03:30

86 lines
2.7 KiB
Python

from __future__ import annotations
from datetime import datetime
import jdatetime
from blackout_notifier.models import TEHRAN, Outage
RTL = "\u200f"
def new_outage_message(bill_id: str, outage: Outage, now: datetime) -> str:
return _join(
"⚡ اطلاعیه خاموشی جدید",
*_outage_lines(bill_id, outage),
_sent_at(now),
)
def updated_outage_message(bill_id: str, previous: Outage, current: Outage, now: datetime) -> str:
labels = {
"outage_date": "تاریخ",
"start_time": "ساعت شروع",
"stop_time": "ساعت پایان",
"address": "محل",
"reason": "دلیل",
"is_planned": "وضعیت برنامه‌ریزی",
}
changes = []
for field, label in labels.items():
old_value = _display_value(getattr(previous, field))
new_value = _display_value(getattr(current, field))
if old_value != new_value:
changes.append(f"✏️ {label}: {old_value}{new_value}")
return _join(
"🔄 تغییر در برنامه خاموشی",
f"🆔 شناسه قبض: {bill_id}",
f"🔖 شماره خاموشی: {current.outage_number}",
*changes,
_sent_at(now),
)
def cancelled_outage_message(bill_id: str, outage: Outage, now: datetime) -> str:
return _join(
"✅ لغو احتمالی برنامه خاموشی",
"این خاموشی در دو بررسی پیاپی مشاهده نشد.",
*_outage_lines(bill_id, outage),
_sent_at(now),
)
def reactivated_outage_message(bill_id: str, outage: Outage, now: datetime) -> str:
return _join(
"⚠️ بازگشت برنامه خاموشی",
*_outage_lines(bill_id, outage),
_sent_at(now),
)
def _outage_lines(bill_id: str, outage: Outage) -> tuple[str, ...]:
return (
f"🆔 شناسه قبض: {bill_id}",
f"🔖 شماره خاموشی: {outage.outage_number}",
f"📅 تاریخ: {outage.outage_date}",
f"⏰ ساعت: {outage.start_time} تا {outage.stop_time}",
f"📍 محل: {outage.address or 'نامشخص'}",
f"📝 دلیل: {outage.reason or 'اعلام نشده'}",
)
def _sent_at(now: datetime) -> str:
local_now = now.astimezone(TEHRAN)
jalali_now = jdatetime.datetime.fromgregorian(datetime=local_now.replace(tzinfo=None))
return f"📥 ارسال در {jalali_now.strftime('%Y/%m/%d %H:%M:%S')}"
def _display_value(value: str | bool) -> str:
if isinstance(value, bool):
return "برنامه‌ریزی‌شده" if value else "برنامه‌ریزی‌نشده"
return value or "نامشخص"
def _join(*lines: str) -> str:
return f"{RTL}\n{RTL}".join(lines)