import json from datetime import datetime import pytz from core.enums import Mode from data.activity_ref import ActivityRef from data.spot import Spot from providers.spot.websocket_spot_provider import WebsocketSpotProvider class XOTA(WebsocketSpotProvider): """Spot provider for servers based on the "xOTA" software at https://github.com/nischu/xOTA/ The provider typically doesn't give us a lat/lon or activity explicitly, so our own config provides an activity which we can then use for lookups. This functionality is implemented for Toilets on the Air events, of which there are several - so a plain lookup of a "TOTA reference" doesn't make sense, it depends on which TOTA, which is why we also provide a sig_ref_prefix in our config. This is applied to the reference ID, so e.g. "T-01" at C3 might become "C3 T-01". This allows us to provide location lookups for TOTA at several conferences.""" ACTIVITY = None def __init__(self, provider_config): name = provider_config.get("name", "xOTA") super().__init__(name, provider_config, provider_config["url"]) self.ACTIVITY = str(provider_config["sig"]) if "sig" in provider_config else None self._activity_ref_prefix = str(provider_config["sig_ref_prefix"]) if "sig_ref_prefix" in provider_config else "" def _ws_message_to_spot(self, b): string = b.decode("utf-8") source_spot = json.loads(string) ref_id = f"{self._activity_ref_prefix} {source_spot['reference']['title']}" spot = Spot( source=self.name, source_id=source_spot["id"], dx_call=source_spot["stationCallSign"].upper(), freq=float(source_spot["freq"]) * 1000, mode=Mode.from_name(source_spot["mode"].upper()), sig=self.ACTIVITY, sig_refs=[ ActivityRef( id=ref_id, sig=self.ACTIVITY or "", url=source_spot["reference"]["website"], ) ], time=datetime.now(pytz.UTC).timestamp(), qrt=source_spot["state"] != "active", ) return spot