import json from datetime import datetime from core.sig_utils import get_icon_for_sig from data.spot import Spot from spotproviders.sse_spot_provider import SSESpotProvider # Spot provider for Worldwide Bunkers on the Air class WWBOTA(SSESpotProvider): SPOTS_URL = "https://api.wwbota.net/spots/" def __init__(self, provider_config): super().__init__(provider_config, self.SPOTS_URL) def sse_message_to_spot(self, message): source_spot = json.loads(message) # Convert to our spot format. First we unpack references, because WWBOTA spots can have more than one for # n-fer activations. refs = [] ref_names = [] ref_urls = [] for ref in source_spot["references"]: refs.append(ref["reference"]) ref_names.append(ref["name"]) # Bunkerbase URLs only work for UK bunkers, so only add a URL if we have a B/G prefix. In theory this could # lead to array alignment mismatches if there was e.g. a B/F bunker followed by a B/G one, we'd end up with # the B/G URL in index 0. But in practice there are no overlaps between B/G bunkers and any others, so an # activation will either be entirely B/G or not B/G at all. if ref["reference"].startswith("B/G"): ref_urls.append("https://bunkerwiki.org/?s=" + ref["reference"]) spot = Spot(source=self.name, dx_call=source_spot["call"].upper(), de_call=source_spot["spotter"].upper(), freq=float(source_spot["freq"]) * 1000000, mode=source_spot["mode"].upper(), comment=source_spot["comment"], sig="WWBOTA", sig_refs=refs, sig_refs_names=ref_names, icon=get_icon_for_sig("WWBOTA"), time=datetime.fromisoformat(source_spot["time"]).timestamp(), # WWBOTA spots can contain multiple references for bunkers being activated simultaneously. For # now, we will just pick the first one to use as our grid, latitude and longitude. dx_grid=source_spot["references"][0]["locator"], dx_latitude=source_spot["references"][0]["lat"], dx_longitude=source_spot["references"][0]["long"], qrt=source_spot["type"] == "QRT") # WWBOTA does support a special "Test" spot type, we need to avoid adding that. return spot if source_spot["type"] != "Test" else None