diff --git a/config.template b/config.template index 7337fc0..38fa08c 100644 --- a/config.template +++ b/config.template @@ -57,7 +57,9 @@ spaceWeather = True # enable or disable the RSS module, and truncate the story rssEnable = True -rssFeedURL = http://www.hackaday.com/rss.xml +rssFeedURL = http://www.hackaday.com/rss.xml,https://news.sparkfun.com/feeds/news +# RSS feed names must match the order of the URLs above, default is used if no match +rssFeedNames = default,sparkfun rssMaxItems = 3 rssTruncate = 100 diff --git a/mesh_bot.py b/mesh_bot.py index 5907b34..ae38dcd 100755 --- a/mesh_bot.py +++ b/mesh_bot.py @@ -77,7 +77,7 @@ def auto_response(message, snr, rssi, hop, pkiStatus, message_from_id, channel_n "q:": lambda: quizHandler(message, message_from_id, deviceID), "quiz": lambda: quizHandler(message, message_from_id, deviceID), "readnews": lambda: handleNews(message_from_id, deviceID, message, isDM), - "readrss": lambda: get_rss_feed() if rssEnable else "RSS feed module is disabled", + "readrss": lambda: get_rss_feed(message), "riverflow": lambda: handle_riverFlow(message, message_from_id, deviceID), "rlist": lambda: handle_repeaterQuery(message_from_id, deviceID, channel_number), "satpass": lambda: handle_satpass(message_from_id, deviceID, channel_number, message), diff --git a/modules/rss.py b/modules/rss.py index 7d01927..bb4167d 100644 --- a/modules/rss.py +++ b/modules/rss.py @@ -3,13 +3,31 @@ from modules.log import * import urllib.request import xml.etree.ElementTree as ET -RSS_FEED_URL = rssFeedURL +RSS_FEED_URLS = rssFeedURL +RSS_FEED_NAMES = rssFeedNames RSS_RETURN_COUNT = rssMaxItems RSS_TRIM_LENGTH = rssTruncate -def get_rss_feed(): +def get_rss_feed(msg): + # Determine which feed to use + feed_name = "default" + if msg and any(name in msg for name in RSS_FEED_NAMES): + for name in RSS_FEED_NAMES: + if name in msg: + feed_name = name + break + try: - with urllib.request.urlopen(RSS_FEED_URL) as response: + idx = RSS_FEED_NAMES.index(feed_name) + feed_url = RSS_FEED_URLS[idx] + except (ValueError, IndexError): + return f"Feed '{feed_name}' not found." + + if "?" in msg: + return f"Fetches the latest {RSS_RETURN_COUNT} entries from the {feed_name} RSS feed." + + try: + with urllib.request.urlopen(feed_url) as response: xml_data = response.read() root = ET.fromstring(xml_data) items = root.findall('.//item')[:RSS_RETURN_COUNT] @@ -30,4 +48,4 @@ def get_rss_feed(): formatted_entries.append(f"{title}\n{description}\n") return "\n".join(formatted_entries) except Exception as e: - return f"Error fetching RSS feed: {e}" + return ERROR_FETCHING_DATA diff --git a/modules/settings.py b/modules/settings.py index 60ec670..d882d15 100644 --- a/modules/settings.py +++ b/modules/settings.py @@ -241,9 +241,10 @@ try: enableEcho = config['general'].getboolean('enableEcho', False) # default False echoChannel = config['general'].getint('echoChannel', '9') # default 9, empty string to ignore rssEnable = config['general'].getboolean('rssEnable', True) # default True - rssFeedURL = config['general'].get('rssFeedURL', 'http://www.hackaday.com/rss.xml') + rssFeedURL = config['general'].get('rssFeedURL', 'http://www.hackaday.com/rss.xml,https://www.arrl.org/rss/arrl.rss').split(',') rssMaxItems = config['general'].getint('rssMaxItems', 3) # default 3 items rssTruncate = config['general'].getint('rssTruncate', 100) # default 100 characters + rssFeedNames = config['general'].get('rssFeedNames', 'default,arrl').split(',') # emergency response emergency_responder_enabled = config['emergencyHandler'].getboolean('enabled', False)