Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
115 changes: 104 additions & 11 deletions bitchat.py
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down Expand Up @@ -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")
Expand Down