Files
daily-blackout-check/src/blackout_notifier/cli.py
T
Meghdad 42687ee651
Test blackout notifier / test (push) Failing after 4s
Hourly blackout check / check (push) Successful in 3s
feat: add multi-chat routing and bill-specific dashboard countdown
2026-07-22 02:14:45 +03:30

68 lines
2.3 KiB
Python

from __future__ import annotations
import argparse
import logging
import sys
from blackout_notifier.clients import EitaaClient, SaapaClient
from blackout_notifier.config import Config, ConfigurationError
from blackout_notifier.models import tehran_now
from blackout_notifier.service import OutageService
from blackout_notifier.state import StateError, StateRepository
class ConsoleNotifier:
def send(self, chat_id: str, text: str) -> None:
print(f"\n--- notification preview for chat {chat_id} ---")
print(text)
def build_parser() -> argparse.ArgumentParser:
parser = argparse.ArgumentParser(description="Check and announce planned power outages")
subparsers = parser.add_subparsers(dest="command", required=True)
check_parser = subparsers.add_parser("check", help="fetch and process planned outages")
check_parser.add_argument(
"--dry-run",
action="store_true",
help="print notifications without sending them or changing state",
)
return parser
def main(argv: list[str] | None = None) -> int:
arguments = build_parser().parse_args(argv)
logging.basicConfig(level=logging.INFO, format="%(levelname)s: %(message)s")
try:
config = Config.from_env()
state_repository = StateRepository(config.state_file)
notifier = (
ConsoleNotifier()
if arguments.dry_run
else EitaaClient(
config.eitaayar_token,
timeout=config.request_timeout_seconds,
)
)
service = OutageService(
bill_chat_ids=config.bill_chat_ids,
lookahead_days=config.lookahead_days,
saapa=SaapaClient(
config.bargheman_token,
timeout=config.request_timeout_seconds,
max_events_per_bill=config.max_events_per_bill,
),
notifier=notifier,
state_repository=state_repository,
)
result = service.run(tehran_now(), persist=not arguments.dry_run)
except (ConfigurationError, StateError) as error:
print(f"Configuration/state error: {error}", file=sys.stderr)
return 2
print(
f"Check complete: sent={result.sent}, state_changed={result.state_changed}, "
f"errors={len(result.errors)}"
)
return 1 if result.errors else 0