import re from icalendar import Event from core.enums import Continent from data.alert import Alert from providers.alert.ical_alert_provider import ICALAlertProvider class RSGBICALAlertProvider(ICALAlertProvider): """Generic alert provider for RSGB contest iCal calendars. Builds on the generic iCal alert provider by adding handling specific to how RSGB's iCal events are formatted. This is still effectively an abstract class itself; RSGB has two contest calendars (HF & VHF) that each subclass this.""" def __init__(self, name, provider_config, url, poll_interval): super().__init__(name, provider_config, url, poll_interval) FREQ_PATTERN = re.compile(r"([\d.]+(?:MHz|GHz))|SHF") def event_to_alert(self, event: Event) -> Alert: """Convert an iCal event in RSGB's format to an Alert object.""" summary = str(event.get("summary", "")).strip() # Ensure summaries start with "RSGB" to avoid any confusion if not summary.startswith("RSGB "): summary = "RSGB " + summary # Extract freq from summary. HF contests don't give frequencies, all VHF ones do match = self.FREQ_PATTERN.search(summary) if match: freqs_modes = match.group() else: freqs_modes = "HF bands" freqs_modes = freqs_modes + ", " # Extract mode from summary if "FMAC" in summary: freqs_modes = freqs_modes + "FM" elif "CW" in summary: freqs_modes = freqs_modes + "CW" elif "SSB" in summary: freqs_modes = freqs_modes + "SSB" elif "FT8" in summary: freqs_modes = freqs_modes + "FT8" elif "FT4" in summary: freqs_modes = freqs_modes + "FT4" elif "DATA" in summary: freqs_modes = freqs_modes + "Data modes" else: freqs_modes = freqs_modes + "All modes" dtstart = event.get("dtstart") dtend = event.get("dtend") start_timestamp = self._to_utc_timestamp(dtstart.dt) end_timestamp = self._to_utc_timestamp(dtend.dt) - 1 if dtend is not None else start_timestamp # Convert to our alert format alert = Alert( source=self.name, dx_calls=[], dx_country="United Kingdom", dx_dxcc_id=235, dx_continent=Continent.EU, dx_cq_zone=14, dx_itu_zone=27, dx_flag="🇬🇧", freqs_modes=freqs_modes, comment=summary, start_time=start_timestamp, end_time=end_timestamp, sig="Contest", ) return alert