verse command

the other BBS have  Fortune it seems to be a popular thing to do. here is a verse command hidden enable like 🐝 to return bible verses better? @joshbowyer
This commit is contained in:
SpudGunMan
2025-11-03 15:29:09 -08:00
parent f51cace2c3
commit 1122d6007e
8 changed files with 91 additions and 6 deletions

1
.gitignore vendored
View File

@@ -12,6 +12,7 @@ etc/*.service
# fileMonitor test file # fileMonitor test file
bee.txt bee.txt
bible.txt
# data files # data files
data/*.json data/*.json

View File

@@ -394,7 +394,7 @@ enable_read_news = False
news_file_path = ../data/news.txt news_file_path = ../data/news.txt
# only return a single random (head)line from the news file # only return a single random (head)line from the news file
news_random_line = False 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 news_block_mode = True
# enable the use of exernal shell commands, this enables some data in `sysinfo` # enable the use of exernal shell commands, this enables some data in `sysinfo`

View File

@@ -519,6 +519,25 @@ exit 0
# sudo rm -rf ~/.ollama # 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. # add 'bee = True' to config.ini General section.
# wget https://gist.githubusercontent.com/MattIPv4/045239bc27b16b2bcf7a3a9a4648c08a/raw/2411e31293a35f3e565f61e7490a806d4720ea7e/bee%2520movie%2520script -O bee.txt # 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..

View File

@@ -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), "tic-tac-toe": lambda: handleTicTacToe(message, message_from_id, deviceID),
"tide": lambda: handle_tide(message_from_id, deviceID, channel_number), "tide": lambda: handle_tide(message_from_id, deviceID, channel_number),
"valert": lambda: get_volcano_usgs(), "valert": lambda: get_volcano_usgs(),
"verse": lambda: read_verse(),
"videopoker": lambda: handleVideoPoker(message, message_from_id, deviceID), "videopoker": lambda: handleVideoPoker(message, message_from_id, deviceID),
"whereami": lambda: handle_whereami(message_from_id, deviceID, channel_number), "whereami": lambda: handle_whereami(message_from_id, deviceID, channel_number),
"whoami": lambda: handle_whoami(message_from_id, deviceID, hop, snr, rssi, pkiStatus), "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}") logger.debug(f"System: File Monitor News Reader Enabled for {my_settings.news_file_path}")
if my_settings.bee_enabled: if my_settings.bee_enabled:
logger.debug("System: File Monitor Bee Monitor Enabled for 🐝bee.txt") 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: 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}") 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: if my_settings.enableDEalerts:

View File

@@ -24,14 +24,18 @@ trap_list_filemon = ("readnews",)
NEWS_DATA_DIR = os.path.join(os.path.dirname(__file__), '..', 'data') NEWS_DATA_DIR = os.path.join(os.path.dirname(__file__), '..', 'data')
newsSourcesList = [] newsSourcesList = []
def read_file(file_monitor_file_path, random_line_only=False, news_block_mode=False): def read_file(file_monitor_file_path, random_line_only=False, news_block_mode=False, verse_only=False):
logger.debug(f"FileMon: Reading file: {file_monitor_file_path} options - random_line_only: {random_line_only}, news_block_mode: {news_block_mode}")
try: try:
if not os.path.exists(file_monitor_file_path): if not os.path.exists(file_monitor_file_path):
if file_monitor_file_path == "bee.txt": if file_monitor_file_path == "bee.txt":
return "🐝buzz 💐buzz buzz🍯" return "🐝buzz 💐buzz buzz🍯"
if news_block_mode: if file_monitor_file_path == 'bible.txt':
# read a random block (separated by 2+ blank lines, robust to line endings) 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: with open(file_monitor_file_path, 'r', encoding='utf-8') as f:
content = f.read().replace('\r\n', '\n').replace('\r', '\n') content = f.read().replace('\r\n', '\n').replace('\r', '\n')
blocks = [] 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) return read_file(file_path, random_line_only=True, news_block_mode=False)
else: else:
return read_file(file_path) 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): def write_news(content, append=False):
# write the news file on demand # write the news file on demand

View File

@@ -174,6 +174,12 @@ def setup_scheduler(
lambda: send_message(handle_sun(0, schedulerInterface, schedulerChannel), schedulerChannel, 0, schedulerInterface) 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}") 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: elif 'custom' in schedulerValue:
try: try:
from modules.custom_scheduler import setup_custom_schedules # type: ignore from modules.custom_scheduler import setup_custom_schedules # type: ignore

View File

@@ -255,6 +255,7 @@ try:
dad_jokes_enabled = config['general'].getboolean('DadJokes', False) dad_jokes_enabled = config['general'].getboolean('DadJokes', False)
dad_jokes_emojiJokes = config['general'].getboolean('DadJokesEmoji', False) dad_jokes_emojiJokes = config['general'].getboolean('DadJokesEmoji', False)
bee_enabled = config['general'].getboolean('bee', False) # 🐝 off by default undocumented 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) solar_conditions_enabled = config['general'].getboolean('spaceWeather', True)
wikipedia_enabled = config['general'].getboolean('wikipedia', False) wikipedia_enabled = config['general'].getboolean('wikipedia', False)
use_kiwix_server = config['general'].getboolean('useKiwixServer', False) use_kiwix_server = config['general'].getboolean('useKiwixServer', False)

View File

@@ -303,6 +303,9 @@ if file_monitor_enabled or read_news_enabled or bee_enabled or enable_runShellCm
# Bee Configuration uses file monitor module # Bee Configuration uses file monitor module
if bee_enabled: if bee_enabled:
trap_list = trap_list + ("🐝",) trap_list = trap_list + ("🐝",)
if bible_enabled:
trap_list = trap_list + ("verse",)
help_message = help_message + ", verse"
# x: command for shell access # x: command for shell access
if enable_runShellCmd and allowXcmd: if enable_runShellCmd and allowXcmd:
trap_list = trap_list + ("x:",) trap_list = trap_list + ("x:",)