"""Location command for the Signal bot.""" from __future__ import annotations from typing import TYPE_CHECKING, Any import requests if TYPE_CHECKING: from python.signal_bot.models import SignalMessage from python.signal_bot.signal_client import SignalClient def _get_entity_state(ha_url: str, ha_token: str, entity_id: str) -> dict[str, Any]: """Fetch an entity's state from Home Assistant.""" response = requests.get( f"{ha_url}/api/states/{entity_id}", headers={"Authorization": f"Bearer {ha_token}"}, timeout=30, ) response.raise_for_status() return response.json() def _format_location(latitude: str, longitude: str) -> str: """Render a friendly location response.""" return ( f"Van location: {latitude}, {longitude}\n" f"https://maps.google.com/?q={latitude},{longitude}" ) def handle_location_request( message: SignalMessage, signal: SignalClient, ha_url: str | None, ha_token: str | None, ) -> None: """Reply with van location from Home Assistant.""" if ha_url is None or ha_token is None: signal.reply(message, "Location command is not configured (missing HA_URL or HA_TOKEN).") return try: lat_payload = _get_entity_state(ha_url, ha_token, "sensor.van_last_known_latitude") lon_payload = _get_entity_state(ha_url, ha_token, "sensor.van_last_known_longitude") except requests.RequestException: signal.reply(message, "Couldn't fetch van location from Home Assistant right now.") return latitude = lat_payload.get("state", "") longitude = lon_payload.get("state", "") if not latitude or not longitude or latitude == "unavailable" or longitude == "unavailable": signal.reply(message, "Van location is unavailable in Home Assistant right now.") return signal.reply(message, _format_location(latitude, longitude))