diff --git a/.gitignore b/.gitignore index cbfc570..72afff7 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,7 @@ etc/*.service # fileMonitor test file bee.txt +bible.txt # data files data/*.json diff --git a/config.template b/config.template index 5b3aa58..3009c4d 100644 --- a/config.template +++ b/config.template @@ -394,7 +394,7 @@ enable_read_news = False news_file_path = ../data/news.txt # only return a single random (head)line from the news file news_random_line = False -# only return news 'block' (seprated by two newlines) randomly (precidence over news_random_line) +# only return random news 'block' (seprated by two newlines) randomly (precidence over news_random_line) news_block_mode = True # enable the use of exernal shell commands, this enables some data in `sysinfo` diff --git a/install.sh b/install.sh index a7d1e3e..1262d93 100755 --- a/install.sh +++ b/install.sh @@ -519,6 +519,25 @@ exit 0 # sudo rm -rf ~/.ollama -# after install shenannigans +# if install done manually +# copy modules/custom_scheduler.py template if it does not exist +# copy data files from etc/data to data/ + + +#### after install shenannigans # add 'bee = True' to config.ini General section. # wget https://gist.githubusercontent.com/MattIPv4/045239bc27b16b2bcf7a3a9a4648c08a/raw/2411e31293a35f3e565f61e7490a806d4720ea7e/bee%2520movie%2520script -O bee.txt +# place bee.txt in project root + +#### +# download bible in text from places like https://www.biblesupersearch.com/bible-downloads/ +# in the project root place bible.txt and use verse = True +# to use machine reading format like this +# Genesis 1:1 In the beginning God created the heavens and the earth. +# Genesis 1:2 And the earth was waste and void.. +# or simple format like this (less preferred) +# Chapter 1 +# 1 In the beginning God created the heavens and the earth. +# 2 And the earth was waste and void.. + + diff --git a/mesh_bot.py b/mesh_bot.py index a2260bf..1f8e98c 100755 --- a/mesh_bot.py +++ b/mesh_bot.py @@ -119,6 +119,7 @@ def auto_response(message, snr, rssi, hop, pkiStatus, message_from_id, channel_n "tic-tac-toe": lambda: handleTicTacToe(message, message_from_id, deviceID), "tide": lambda: handle_tide(message_from_id, deviceID, channel_number), "valert": lambda: get_volcano_usgs(), + "verse": lambda: read_verse(), "videopoker": lambda: handleVideoPoker(message, message_from_id, deviceID), "whereami": lambda: handle_whereami(message_from_id, deviceID, channel_number), "whoami": lambda: handle_whoami(message_from_id, deviceID, hop, snr, rssi, pkiStatus), @@ -1655,6 +1656,8 @@ def handle_boot(mesh=True): logger.debug(f"System: File Monitor News Reader Enabled for {my_settings.news_file_path}") if my_settings.bee_enabled: logger.debug("System: File Monitor Bee Monitor Enabled for 🐝bee.txt") + if my_settings.bible_enabled: + logger.debug("System: File Monitor Bible Verse Enabled for bible.txt") if my_settings.usAlerts: logger.debug(f"System: Emergency Alert Broadcast Enabled on channel {my_settings.emergency_responder_alert_channel} for interface {my_settings.emergency_responder_alert_interface}") if my_settings.enableDEalerts: diff --git a/modules/filemon.py b/modules/filemon.py index 0c36cac..5ac2a73 100644 --- a/modules/filemon.py +++ b/modules/filemon.py @@ -24,14 +24,18 @@ trap_list_filemon = ("readnews",) NEWS_DATA_DIR = os.path.join(os.path.dirname(__file__), '..', 'data') newsSourcesList = [] -def read_file(file_monitor_file_path, random_line_only=False, news_block_mode=False): - logger.debug(f"FileMon: Reading file: {file_monitor_file_path} options - random_line_only: {random_line_only}, news_block_mode: {news_block_mode}") +def read_file(file_monitor_file_path, random_line_only=False, news_block_mode=False, verse_only=False): try: if not os.path.exists(file_monitor_file_path): if file_monitor_file_path == "bee.txt": return "🐝buzz 💐buzz buzz🍯" - if news_block_mode: - # read a random block (separated by 2+ blank lines, robust to line endings) + if file_monitor_file_path == 'bible.txt': + return "🐝Go, and make disciples of all nations." + if verse_only: + # process verse/bible file + verse = get_verses(file_monitor_file_path) + return verse + elif news_block_mode: with open(file_monitor_file_path, 'r', encoding='utf-8') as f: content = f.read().replace('\r\n', '\n').replace('\r', '\n') blocks = [] @@ -74,6 +78,54 @@ def read_news(source=None, random_line_only=False, news_block_mode=False): return read_file(file_path, random_line_only=True, news_block_mode=False) else: return read_file(file_path) + +def read_verse(): + # Reads a random verse from the file bible.txt in the data/ directory + verses = get_verses('bible.txt') + if verses: + return random.choice(verses) + return None + +def get_verses(file_monitor_file_path): + # Handles both "4 ..." and "1 Timothy 4:15 ..." style verse starts + verses = [] + current_verse = [] + with open(file_monitor_file_path, 'r', encoding='utf-8') as f: + for line in f: + stripped = line.strip() + # Check for "number space" OR "Book Chapter:Verse" at start + is_numbered = stripped and len(stripped) > 1 and stripped[0].isdigit() and stripped[1] == ' ' + is_reference = ( + stripped and + ':' in stripped and + any(stripped.startswith(book + ' ') for book in [ + "Genesis", "Exodus", "Leviticus", "Numbers", "Deuteronomy", "Joshua", "Judges", "Ruth", + "1 Samuel", "2 Samuel", "1 Kings", "2 Kings", "1 Chronicles", "2 Chronicles", "Ezra", "Nehemiah", + "Esther", "Job", "Psalms", "Proverbs", "Ecclesiastes", "Song of Solomon", "Isaiah", "Jeremiah", + "Lamentations", "Ezekiel", "Daniel", "Hosea", "Joel", "Amos", "Obadiah", "Jonah", "Micah", + "Nahum", "Habakkuk", "Zephaniah", "Haggai", "Zechariah", "Malachi", "Matthew", "Mark", "Luke", + "John", "Acts", "Romans", "1 Corinthians", "2 Corinthians", "Galatians", "Ephesians", "Philippians", + "Colossians", "1 Thessalonians", "2 Thessalonians", "1 Timothy", "2 Timothy", "Titus", "Philemon", + "Hebrews", "James", "1 Peter", "2 Peter", "1 John", "2 John", "3 John", "Jude", "Revelation" + ]) + ) + if is_numbered or is_reference: + if current_verse: + verses.append(' '.join(current_verse).strip()) + current_verse = [] + # For numbered, drop the number; for reference, keep the whole line + if is_numbered: + current_verse.append(stripped.split(' ', 1)[1]) + else: + current_verse.append(stripped) + elif stripped and not stripped.lower().startswith('psalm'): + current_verse.append(stripped) + elif not stripped and current_verse: + verses.append(' '.join(current_verse).strip()) + current_verse = [] + if current_verse: + verses.append(' '.join(current_verse).strip()) + return verses def write_news(content, append=False): # write the news file on demand diff --git a/modules/scheduler.py b/modules/scheduler.py index 544a38b..929d8c9 100644 --- a/modules/scheduler.py +++ b/modules/scheduler.py @@ -174,6 +174,12 @@ def setup_scheduler( lambda: send_message(handle_sun(0, schedulerInterface, schedulerChannel), schedulerChannel, 0, schedulerInterface) ) logger.debug(f"System: Starting the scheduler to send solar information at {schedulerTime} on Device:{schedulerInterface} Channel:{schedulerChannel}") + elif 'verse' in schedulerValue: + from modules.filemon import read_verse + schedule.every().day.at(schedulerTime).do( + lambda: send_message(read_verse(), schedulerChannel, 0, schedulerInterface) + ) + logger.debug(f"System: Starting the verse scheduler to send a verse at {schedulerTime} on Device:{schedulerInterface} Channel:{schedulerChannel}") elif 'custom' in schedulerValue: try: from modules.custom_scheduler import setup_custom_schedules # type: ignore diff --git a/modules/settings.py b/modules/settings.py index 2c1f6cf..754cf0a 100644 --- a/modules/settings.py +++ b/modules/settings.py @@ -255,6 +255,7 @@ try: dad_jokes_enabled = config['general'].getboolean('DadJokes', False) dad_jokes_emojiJokes = config['general'].getboolean('DadJokesEmoji', False) bee_enabled = config['general'].getboolean('bee', False) # 🐝 off by default undocumented + bible_enabled = config['general'].getboolean('verse', False) # verse command solar_conditions_enabled = config['general'].getboolean('spaceWeather', True) wikipedia_enabled = config['general'].getboolean('wikipedia', False) use_kiwix_server = config['general'].getboolean('useKiwixServer', False) diff --git a/modules/system.py b/modules/system.py index 099036d..69b0f43 100644 --- a/modules/system.py +++ b/modules/system.py @@ -303,6 +303,9 @@ if file_monitor_enabled or read_news_enabled or bee_enabled or enable_runShellCm # Bee Configuration uses file monitor module if bee_enabled: trap_list = trap_list + ("🐝",) + if bible_enabled: + trap_list = trap_list + ("verse",) + help_message = help_message + ", verse" # x: command for shell access if enable_runShellCmd and allowXcmd: trap_list = trap_list + ("x:",)