diff --git a/index.mu b/index.mu index 407675c..3a93a59 100644 --- a/index.mu +++ b/index.mu @@ -1,15 +1,14 @@ #!/usr/bin/env python3 import os, sys, json, time, random, re, sqlite3 -######## SYS & FILE PATHS +######## SYS & FILE PATHS ######## DB_PATH = os.path.join(os.path.dirname(__file__), "chatusers.db") EMO_DB = os.path.join(os.path.dirname(__file__), "emoticons.txt") ######### EDITABLE SETTINGS: ######## MAX_CHARS = 108 # Adjust as needed to split messages after N chars MAX_LINES = 28 # Max lines on screen -DISPLAY_LIMIT = 27 # Adjust how many visible messages you want in the UI (obsolete) -SYSADMIN = "fr4dm1n@@@" # SET YOUR ADMIN NICKNAME FOR CHAT ADMIN COMMANDS +SYSADMIN = "YourSysAdminNickname" # SET YOUR ADMIN NICKNAME FOR CHAT ADMIN COMMANDS ######## UI Unicode Emojis: ######## user_icon = "\U0001F464" # "\U0001F464" # "\U0001F465" - "\U0001FAAA" @@ -85,13 +84,13 @@ spam_patterns = [ r"\bmake\s+money\s+(with|from)\s+(bitcoin|bitcoins|crypto|ethereum|tokens|coins)\b" ] -################# ##### Color system ############# ######### +################# Nickname AutoColor System ############# ######### colors = [ "B900", "B090", "B009", "B099", "B909", "B066", "B933", "B336", "B939", "B660", "B030", "B630", "B363", "B393", "B606", "B060", "B003", "B960", "B999", "B822", "B525", "B255", "B729", "B279", "B297", "B972", "B792", "B227", "B277", "B377", "B773", "B737", "B003", "B111", "B555", "B222", "B088", "B808", "B180" ] def get_color(name): return colors[sum(ord(c) for c in name.lower()) % len(colors)] -# Recover input from environment variables +######### Recover input from os environment variables ######## def recover_input(key_suffix): for k, v in os.environ.items(): if k.lower().endswith(key_suffix): @@ -112,7 +111,7 @@ if not message and len(sys.argv) > 2: if not dest and len(sys.argv) > 3: dest = sys.argv[3].strip() -# Extract hash code from remote identity and LXMF address +# Extract hash code from remote identity and LXMF address, if sent by the user with the fingerprint button hash_code = remote_identity[-4:] if remote_identity else "" dest_code = dest[-4:] if dest else "" @@ -120,11 +119,11 @@ dest_code = dest[-4:] if dest else "" if nickname: display_name = nickname elif dest: - display_name = f"Guest_{dest_code}" + display_name = f"Guest_{dest_code}" # temporary nickname on first fingerprint usage else: - display_name = "Guest" + display_name = "Guest" # default nickname on missing fingerprint -# os env print for debug test +# os env print for debug test , commented, can be removed if unused #print("> Meshchat Environment Variables:\n") #for key, value in os.environ.items(): # print(f"{key} = {value}") @@ -209,6 +208,7 @@ save_user_to_db(remote_identity, dest, display_name) # ----------------------------------------------- +######## nickname input sanitization ######## safe_username = ( raw_username.replace("`", "").replace("<", "").replace(">", "") .replace("\n", "").replace("\r", "").replace('"', "").replace("'", "") @@ -220,6 +220,7 @@ safe_username = ( .replace("$", "").replace(" ", "").strip() or "Guest" ) +######## reading chatroom topic from file or set a default if missing ######## topic_file = os.path.join(os.path.dirname(__file__), "topic.json") try: with open(topic_file, "r") as tf: @@ -242,10 +243,9 @@ except Exception as e: log = [] debug.append(f"Failed to load log: {e}") -# USER COMMANDS LOGIC: +######################### USER COMMANDS LOGIC: ######################## cmd = message.strip().lower() - ##### ADMIN COMMANDS ##### if safe_username == SYSADMIN and cmd.startswith("/clear"): parts = cmd.split() @@ -302,7 +302,7 @@ elif safe_username == SYSADMIN and cmd == "/clearall": -########## CHAT USERS COMMANDS ######### +################## CHAT USERS COMMANDS ################# #### STATS COMMAND #### elif cmd == "/stats": @@ -447,7 +447,8 @@ elif cmd == "/version": version_text3 = "Latest Implementations in v1.3b: AntiSpam Filter and Nickname persistency (Thanks To: Thomas!!)" version_text4 = "Latest Implementations in v1.4b: Improved UI with Message splitting on long messages" version_text5 = "Latest Implementations in v1.44b: Improved UI, resolved few ui bugs, added Menu Bar on the bottom, added /search command, added 'Read Last 100 Messages', started implementing user settings (for future user preferences implementations: custom nickname colors, multiple chat themes and more...coming soon!)" - version_text6 = "Latest Implementations in v1.45b: Added Social Interactions Commands, for full command list: /cmd \n Improved UI and readability" + version_text6 = "Latest Implementations in v1.45b: Added Social Interactions Commands, for full command list: /cmd \n Improved UI and readability\n" + version_text7 = "Get The ChatRoom on: https://github.com/fr33n0w/thechatroom/" log.append({"time": time.strftime("[%H:%M]"), "user": "System", "text": version_text}) log.append({"time": time.strftime("[%H:%M]"), "user": "System", "text": version_text2}) @@ -455,6 +456,7 @@ elif cmd == "/version": log.append({"time": time.strftime("[%H:%M]"), "user": "System", "text": version_text4}) log.append({"time": time.strftime("[%H:%M]"), "user": "System", "text": version_text5}) log.append({"time": time.strftime("[%H:%M]"), "user": "System", "text": version_text6}) + log.append({"time": time.strftime("[%H:%M]"), "user": "System", "text": version_text7}) ######## LASTSEEN COMMAND ######## elif cmd.startswith("/lastseen "): @@ -896,17 +898,17 @@ elif cmd.startswith("/welcome"): }) -##################### END OF COMMANDS, CONTINUE SCRIPT ############################## +##################### END OF COMMANDS, CONTINUE SCRIPT PAGE ############################## elif raw_username and message and message.lower() != "null": - sanitized_message = message.replace("`", "").replace("[", "") # remove backticks and [ to prevent formatting issues + sanitized_message = message.replace("`", "").replace("[", "") # remove backticks and [ to prevent formatting issues or code injection ######### Spam detection logic ######## banned_words = ["buy now", "free money", "click here", "subscribe", "win big", "limited offer", "act now"] is_spam = any(re.search(pattern, sanitized_message.lower()) for pattern in spam_patterns) if is_spam: - # ?? Don't write to JSON, just log the system message + # Don't write to JSON, just log the system message log.append({ "time": time.strftime("[%H:%M]"), "user": "System", @@ -914,7 +916,7 @@ elif raw_username and message and message.lower() != "null": }) debug.append(f" Spam blocked from '{safe_username}'") else: - # ? Normal message flow + # Normal message flow log.append({ "time": time.strftime("[%H:%M]"), "user": safe_username, @@ -946,17 +948,7 @@ def split_message(text, max_chars): lines.append(current_line) return lines -######### dynamic ui displayed messages adaptation ######## -#def calculate_effective_limit(log, display_limit, max_chars): -# limit = display_limit -# for msg in log[-display_limit:]: -# if len(split_message(msg["text"], max_chars)) > 1: -# limit -= 1 -# return max(limit, 20) # Minimum of 20 messages shown -# -#effective_limit = calculate_effective_limit(log, DISPLAY_LIMIT, MAX_CHARS) - -##new: +######### dynamic ui display messages adaptation ######## def calculate_effective_limit(log, max_lines, max_chars): total_lines = 0 effective_limit = 0 @@ -1004,16 +996,6 @@ template += "-\n" template += f"`c`B000`Ff2e`!` ########## Room Topic: {topic_text} `! (Set by: {topic_author}, {topic_data.get('time')}) `!` ########## `!`f`b`a\n" template += "-\n" -# CHATLOG READING AND RENDERING (original): -#for msg in log[-effective_limit:]: -# color = get_color(msg["user"]) -# message_lines = split_message(msg["text"], MAX_CHARS) -# total_parts = len(message_lines) -# for i, line in enumerate(message_lines, start=1): -# marker = f"({i}/{total_parts})" if total_parts > 1 else "" -# template += f"\\\[{msg['time']} `!` `*` `{color}{msg['user']}:`b `!`*` {line} \n" -#template += "-" - # Build set of known usernames known_users = {msg["user"] for msg in log} @@ -1038,12 +1020,9 @@ template += "-" safe_display_name = display_name.replace("`", "'") # User Interaction Bar (Nick & Messages ) -# template += f"\n`Ffff`! {user_icon} Nickname: `Bddf`F000`<12|username`{safe_display_name}>`!`B000`Ffff`[{nickset_icon} `:/page/index.mu`username]`! | {message_icon} Message: `Bddf`F000`<52|message`>`b`!" -# template += f" `!`Ffff`[{send_icon} Send Message`:/page/index.mu`username|message]`! | `!`[{reload_icon} Reload`:/page/index.mu`username]`!\n" template += f"\n>`!` {user_icon} Nickname: `Baac`F000`<12|username`{safe_display_name}>`!`b`[{nickset_icon} `:/page/index.mu`username]`! {message_icon} Message: `Baac`<52|message`>`b`!" template += f" `!`[{send_icon} Send Message`:/page/index.mu`username|message]`! | `!`[{reload_icon} Reload`:/page/index.mu`username]`!\n" - template += "-\n" # STATUS BAR (incomplete)