diff --git a/bitchat.py b/bitchat.py index a2bbf7c..da479b4 100644 --- a/bitchat.py +++ b/bitchat.py @@ -1541,9 +1541,9 @@ async def handle_user_input(self, line: str): elif len(new_name) > 20: print("\033[93m⚠ Nickname too long\033[0m") print("\033[90mMaximum 20 characters allowed.\033[0m") - elif not all(c.isalnum() or c in '-_' for c in new_name): + elif any(c in '\n\r\t\0' for c in new_name): print("\033[93m⚠ Invalid nickname\033[0m") - print("\033[90mNicknames can only contain letters, numbers, hyphens and underscores.\033[0m") + print("\033[90mNicknames cannot contain control characters.\033[0m") elif new_name in ["system", "all"]: print("\033[93m⚠ Reserved nickname\033[0m") print("\033[90mThis nickname is reserved and cannot be used.\033[0m") @@ -2481,15 +2481,108 @@ async def run(self): # Helper functions def print_banner(): - """Print the BitChat banner""" - print("\n\033[38;5;46m##\\ ##\\ ##\\ ##\\ ##\\") - print("## | \\__| ## | ## | ## |") - print("#######\\ ##\\ ######\\ #######\\ #######\\ ######\\ ######\\") - print("## __##\\ ## |\\_## _| ## _____|## __##\\ \\____##\\\\_## _|") - print("## | ## |## | ## | ## / ## | ## | ####### | ## |") - print("## | ## |## | ## |##\\ ## | ## | ## |## __## | ## |##\\") - print("####### |## | \\#### |\\#######\\ ## | ## |\\####### | \\#### |") - print("\\_______/ \\__| \\____/ \\_______|\\__| \\__| \\_______| \\____/\033[0m") + """Print a random BitChat banner""" + banners = [ + # Original LaTeX style banner + lambda: ( + print("\n\033[38;5;46m##\\ ##\\ ##\\ ##\\ ##\\"), + print("## | \\__| ## | ## | ## |"), + print("#######\\ ##\\ ######\\ #######\\ #######\\ ######\\ ######\\"), + print("## __##\\ ## |\\_## _| ## _____|## __##\\ \\____##\\\\_## _|"), + print("## | ## |## | ## | ## / ## | ## | ####### | ## |"), + print("## | ## |## | ## |##\\ ## | ## | ## |## __## | ## |##\\"), + print("####### |## | \\#### |\\#######\\ ## | ## |\\####### | \\#### |"), + print("\\_______/ \\__| \\____/ \\_______|\\__| \\__| \\_______| \\____/\033[0m") + ), + + # Big block letters style + lambda: ( + print("\n\033[38;5;201m██████╗ ██╗████████╗ ██████╗██╗ ██╗ █████╗ ████████╗"), + print("██╔══██╗██║╚══██╔══╝██╔════╝██║ ██║██╔══██╗╚══██╔══╝"), + print("██████╔╝██║ ██║ ██║ ███████║███████║ ██║ "), + print("██╔══██╗██║ ██║ ██║ ██╔══██║██╔══██║ ██║ "), + print("██████╔╝██║ ██║ ╚██████╗██║ ██║██║ ██║ ██║ "), + print("╚═════╝ ╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ \033[0m") + ), + + # Graffiti style + lambda: ( + print("\n\033[38;5;196m ▄▄▄▄ ██▓▄▄▄█████▓ ▄████▄ ██░ ██ ▄▄▄ ▄▄▄█████▓"), + print("▓█████▄ ▓██▒▓ ██▒ ▓▒▒██▀ ▀█ ▓██░ ██▒▒████▄ ▓ ██▒ ▓▒"), + print("▒██▒ ▄██▒██▒▒ ▓██░ ▒░▒▓█ ▄ ▒██▀▀██░▒██ ▀█▄ ▒ ▓██░ ▒░"), + print("▒██░█▀ ░██░░ ▓██▓ ░ ▒▓▓▄ ▄██▒░▓█ ░██ ░██▄▄▄▄██ ░ ▓██▓ ░ "), + print("░▓█ ▀█▓░██░ ▒██▒ ░ ▒ ▓███▀ ░░▓█▒░██▓ ▓█ ▓██▒ ▒██▒ ░ "), + print("░▒▓███▀▒░▓ ▒ ░░ ░ ░▒ ▒ ░ ▒ ░░▒░▒ ▒▒ ▓▒█░ ▒ ░░ "), + print("▒░▒ ░ ▒ ░ ░ ░ ▒ ▒ ░▒░ ░ ▒ ▒▒ ░ ░ "), + print(" ░ ░ ▒ ░ ░ ░ ░ ░░ ░ ░ ▒ ░ "), + print(" ░ ░ ░ ░ ░ ░ ░ ░ ░ "), + print(" ░ ░ \033[0m") + ), + + # Slant style + lambda: ( + print("\n\033[38;5;33m ▄▄▄▄ ██▓▄▄▄█████▓ ▄████▄ ██░ ██ ▄▄▄ ▄▄▄█████▓"), + print(" ▓█████▄ ▓██▒▓ ██▒ ▓▒▒██▀ ▀█ ▓██░ ██▒▒████▄ ▓ ██▒ ▓▒"), + print(" ▒██▒ ▄██▒██▒▒ ▓██░ ▒░▒▓█ ▄ ▒██▀▀██░▒██ ▀█▄▒ ▓██░ ▒░"), + print(" ▒██░█▀ ░██░░ ▓██▓ ░ ▒▓▓▄ ▄██▒░▓█ ░██ ░██▄▄▄▄██░ ▓██▓ ░"), + print(" ░▓█ ▀█▓░██░ ▒██▒ ░ ▒ ▓███▀ ░░▓█▒░██▓ ▓█ ▓██▒ ▒██▒ ░"), + print(" ░▒▓███▀▒░▓ ▒ ░░ ░ ░▒ ▒ ░ ▒ ░░▒░▒ ▒▒ ▓▒█░ ▒ ░░ "), + print(" ▒░▒ ░ ▒ ░ ░ ░ ▒ ▒ ░▒░ ░ ▒ ▒▒ ░ ░ "), + print(" ░ ░ ▒ ░ ░ ░ ░ ░░ ░ ░ ▒ ░ "), + print(" ░ ░ ░ ░ ░ ░ ░ ░ ░ "), + print(" ░ ░ \033[0m") + ), + + # ASCII art style + lambda: ( + print("\n\033[38;5;208m ____ _ _ _____ _ _ "), + print("| __ )(_) |_ / ____| |__ __ _| |_ "), + print("| _ \\| | __| | | '_ \\ / _` | __|"), + print("| |_) | | |_| |___| | | | (_| | |_ "), + print("|____/|_|\\__|\\____|_| |_|\\__,_|\\__|\033[0m") + ), + + # Modern minimal style + lambda: ( + print("\n\033[38;5;51m┌──────────────────────────────────────┐"), + print("│ ██████ ██ ████████ ██████ ██ ██ │"), + print("│ ██ ██ ██ ██ ██ ██ ██ │"), + print("│ ██████ ██ ██ ██ ███████ │"), + print("│ ██ ██ ██ ██ ██ ██ ██ │"), + print("│ ██████ ██ ██ ██████ ██ ██ │"), + print("│ BitChat │"), + print("└──────────────────────────────────────┘\033[0m") + ), + + # Cyberpunk style + lambda: ( + print("\n\033[38;5;46m╔══════════════════════════════════════════════════════╗"), + print("║ ██████ ██ ████████ ██████ ██ ██ █████ ████████ ║"), + print("║ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ║"), + print("║ ██████ ██ ██ ██ ███████ ███████ ██ ║"), + print("║ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ║"), + print("║ ██████ ██ ██ ██████ ██ ██ ██ ██ ██ ║"), + print("║ BitChat v2.0 ║"), + print("╚══════════════════════════════════════════════════════╝\033[0m") + ), + + # Matrix style + lambda: ( + print("\n\033[38;5;82m░▒▓███████▓▒░░▒▓█▓▒░▒▓████████▓▒░ ░▒▓██████▓▒░░▒▓█▓▒░░▒▓█▓▒░░▒▓██████▓▒░▒▓████████▓▒░"), + print("░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░ ░▒▓█▓▒░ "), + print("░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░ ░▒▓█▓▒░ "), + print("░▒▓███████▓▒░░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓████████▓▒░▒▓████████▓▒░ ░▒▓█▓▒░ "), + print("░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░ ░▒▓█▓▒░ "), + print("░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░ ░▒▓█▓▒░ "), + print("░▒▓███████▓▒░░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓██████▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░ ░▒▓█▓▒░ \033[0m") + ) + ] + + # Randomly select and execute a banner + selected_banner = random.choice(banners) + selected_banner() + + # Common footer for all banners print("\n\033[38;5;40m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\033[0m") print("\033[37mDecentralized • Encrypted • Peer-to-Peer • Open Source\033[0m") print(f"\033[37m bitchat@-python {VERSION} @kaganisildak\033[0m")