68 lines
2.3 KiB
Python
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
|