From d1a5bfe9c3059c2e0239534f968f324d2ea4a813 Mon Sep 17 00:00:00 2001 From: Ian Renton Date: Sun, 11 Jan 2026 12:09:36 +0000 Subject: [PATCH] Make allowing RBN spots via cluster a configurable option. --- config-example.yml | 14 ++++++++++++-- spotproviders/dxcluster.py | 14 +++++++++----- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/config-example.yml b/config-example.yml index c5b751a..bb6e73e 100644 --- a/config-example.yml +++ b/config-example.yml @@ -60,10 +60,15 @@ spot-providers: host: "hrd.wa9pie.net" port: 8000 # Prompt the cluster node gives when asking for a callsign to log in. Varies between cluster node software. - login_prompt: "login: " + login_prompt: "login:" # Callsign Spothole will use to log into this cluster. Ensure the SSID (e.g. -99) is different to any personal # connection you might make to this cluster node. login_callsign: "N0CALL-99" + # Whether to allow RBN spots that come via this cluster. If you don't want RBN spots or you are making a separate + # connection to RBN directly, leave this as False. If you want RBN spots from this cluster, set this to True. (Make + # sure you aren't also separately connecting to RBN directly, otherwise you may get duplicate spots.) Note that not + # all clusters sent RBN spots anyway. + allow_rbn_spots: false - class: "DXCluster" name: "W3LPL Cluster" @@ -71,10 +76,15 @@ spot-providers: host: "w3lpl.net" port: 7373 # Prompt the cluster node gives when asking for a callsign to log in. Varies between cluster node software. - login_prompt: "Please enter your call: " + login_prompt: "Please enter your call:" # Callsign Spothole will use to log into this cluster. Ensure the SSID (e.g. -99) is different to any personal # connection you might make to this cluster node. login_callsign: "N0CALL-99" + # Whether to allow RBN spots that come via this cluster. If you don't want RBN spots or you are making a separate + # connection to RBN directly, leave this as False. If you want RBN spots from this cluster, set this to True. (Make + # sure you aren't also separately connecting to RBN directly, otherwise you may get duplicate spots.) Note that not + # all clusters sent RBN spots anyway. + allow_rbn_spots: false - class: "RBN" name: "RBN CW/RTTY" diff --git a/spotproviders/dxcluster.py b/spotproviders/dxcluster.py index 7fde769..ceb84e0 100644 --- a/spotproviders/dxcluster.py +++ b/spotproviders/dxcluster.py @@ -12,15 +12,17 @@ from data.spot import Spot from spotproviders.spot_provider import SpotProvider -# Spot provider for a DX Cluster. Hostname, port, login_prompt and login_callsign are provided in config. +# Spot provider for a DX Cluster. Hostname, port, login_prompt, login_callsign and allow_rbn_spots are provided in config. +# See config-example.yml for examples. class DXCluster(SpotProvider): - # Note the callsign pattern deliberately excludes calls ending in "-#", which are from RBN and can be enabled by - # default on some clusters. If you want RBN spots, there is a separate provider for that. CALLSIGN_PATTERN = "([a-z|0-9|/]+)" FREQUENCY_PATTERN = "([0-9|.]+)" - LINE_PATTERN = re.compile( + LINE_PATTERN_EXCLUDE_RBN = re.compile( "^DX de " + CALLSIGN_PATTERN + ":\\s+" + FREQUENCY_PATTERN + "\\s+" + CALLSIGN_PATTERN + "\\s+(.*)\\s+(\\d{4}Z)", re.IGNORECASE) + LINE_PATTERN_ALLOW_RBN = re.compile( + "^DX de " + CALLSIGN_PATTERN + "-?#?:\\s+" + FREQUENCY_PATTERN + "\\s+" + CALLSIGN_PATTERN + "\\s+(.*)\\s+(\\d{4}Z)", + re.IGNORECASE) # Constructor requires hostname and port def __init__(self, provider_config): @@ -29,6 +31,8 @@ class DXCluster(SpotProvider): self.port = provider_config["port"] self.login_prompt = provider_config["login_prompt"] if "login_prompt" in provider_config else "login:" self.login_callsign = provider_config["login_callsign"] if "login_callsign" in provider_config else SERVER_OWNER_CALLSIGN + self.allow_rbn_spots = provider_config["allow_rbn_spots"] if "allow_rbn_spots" in provider_config else False + self.spot_line_pattern = self.LINE_PATTERN_ALLOW_RBN if self.allow_rbn_spots else self.LINE_PATTERN_EXCLUDE_RBN self.telnet = None self.thread = Thread(target=self.handle) self.thread.daemon = True @@ -64,7 +68,7 @@ class DXCluster(SpotProvider): try: # Check new telnet info against regular expression telnet_output = self.telnet.read_until("\n".encode("latin-1")) - match = self.LINE_PATTERN.match(telnet_output.decode("latin-1")) + match = self.spot_line_pattern.match(telnet_output.decode("latin-1")) if match: spot_time = datetime.strptime(match.group(5), "%H%MZ") spot_datetime = datetime.combine(datetime.today(), spot_time.time()).replace(tzinfo=pytz.UTC)