import csv from pyhamtools.locator import latlong_to_locator from core.cache_utils import SEMI_STATIC_URL_DATA_CACHE from core.constants import SIGS, HTTP_HEADERS from core.geo_utils import wab_wai_square_to_lat_lon # Utility function to get the icon for a named SIG. If no match is found, the "circle-question" icon will be returned. def get_icon_for_sig(sig): for s in SIGS: if s.name == sig: return s.icon return "circle-question" # Utility function to get the regex string for a SIG reference for a named SIG. If no match is found, None will be returned. def get_ref_regex_for_sig(sig): for s in SIGS: if s.name == sig: return s.ref_regex return None # Look up details of a SIG reference (e.g. POTA park) such as name, lat/lon, and grid. def get_sig_ref_info(sig, sig_ref_id): if sig.upper() == "POTA": data = SEMI_STATIC_URL_DATA_CACHE.get("https://api.pota.app/park/" + sig_ref_id, headers=HTTP_HEADERS).json() if data: return {"name": data["name"] if "name" in data else None, "grid": data["grid6"] if "grid6" in data else None, "latitude": data["latitude"] if "latitude" in data else None, "longitude": data["longitude"] if "longitude" in data else None} elif sig.upper() == "SOTA": data = SEMI_STATIC_URL_DATA_CACHE.get("https://api-db2.sota.org.uk/api/summits/" + sig_ref_id, headers=HTTP_HEADERS).json() if data: return {"name": data["name"] if "name" in data else None, "grid": data["locator"] if "locator" in data else None, "latitude": data["latitude"] if "latitude" in data else None, "longitude": data["longitude"] if "longitude" in data else None} elif sig.upper() == "WWBOTA": data = SEMI_STATIC_URL_DATA_CACHE.get("https://api.wwbota.org/bunkers/" + sig_ref_id, headers=HTTP_HEADERS).json() if data: return {"name": data["name"] if "name" in data else None, "grid": data["locator"] if "locator" in data else None, "latitude": data["lat"] if "lat" in data else None, "longitude": data["long"] if "long" in data else None} elif sig.upper() == "GMA" or sig.upper() == "ARLHS" or sig.upper() == "ILLW" or sig.upper() == "WCA" or sig.upper() == "MOTA" or sig.upper() == "IOTA": data = SEMI_STATIC_URL_DATA_CACHE.get("https://www.cqgma.org/api/ref/?" + sig_ref_id, headers=HTTP_HEADERS).json() if data: return {"name": data["name"] if "name" in data else None, "grid": data["locator"] if "locator" in data else None, "latitude": data["latitude"] if "latitude" in data else None, "longitude": data["longitude"] if "longitude" in data else None} elif sig.upper() == "SIOTA": siota_csv_data = SEMI_STATIC_URL_DATA_CACHE.get("https://www.silosontheair.com/data/silos.csv", headers=HTTP_HEADERS) siota_dr = csv.DictReader(siota_csv_data.content.decode().splitlines()) for row in siota_dr: if row["SILO_CODE"] == sig_ref_id: return {"name": row["NAME"] if "NAME" in row else None, "grid": row["LOCATOR"] if "LOCATOR" in row else None, "latitude": float(row["LAT"]) if "LAT" in row else None, "longitude": float(row["LNG"]) if "LNG" in row else None} elif sig.upper() == "WOTA": data = SEMI_STATIC_URL_DATA_CACHE.get("https://www.wota.org.uk/mapping/data/summits.json", headers=HTTP_HEADERS).json() if data: for feature in data["features"]: if feature["properties"]["wotaId"] == sig_ref_id: return {"name": feature["properties"]["title"], "grid": feature["properties"]["qthLocator"], "latitude": feature["geometry"]["coordinates"][1], "longitude": feature["geometry"]["coordinates"][0]} elif sig.upper() == "ZLOTA": data = SEMI_STATIC_URL_DATA_CACHE.get("https://ontheair.nz/assets/assets.json", headers=HTTP_HEADERS).json() if data: for asset in data: if asset["code"] == sig_ref_id: return {"name": asset["name"], "grid": latlong_to_locator(asset["y"], asset["x"], 6), "latitude": asset["y"], "longitude": asset["x"]} elif sig.upper() == "WAB" or sig.upper() == "WAI": ll = wab_wai_square_to_lat_lon(sig_ref_id) if ll: return {"name": sig_ref_id, "grid": latlong_to_locator(ll[0], ll[1], 6), "latitude": ll[0], "longitude": ll[1]} return None # Regex matching any SIG ANY_SIG_REGEX = r"(" + r"|".join(list(map(lambda p: p.name, SIGS))) + r")" # Regex matching any SIG reference ANY_XOTA_SIG_REF_REGEX = r"[\w\/]+\-\d+"