Repository: daniyal-rashid-00/dark-path--messaging-app Files analyzed: 5
Estimated tokens: 8.1k
Directory structure: └── daniyal-rashid-00-dark-path--messaging-app/ ├── Admin_Client.py ├── Client_App.py ├── Server.py ├── test_server.py └── test_user.py
import tkinter as tk from tkinter import messagebox from tkinter import scrolledtext import socket import threading from cryptography.fernet import Fernet from dotenv import load_dotenv load_dotenv() import os
HOST = os.getenv("client_HOST") PORT = int(os.getenv("PORT")) # Port to connect to the server
class ChatClient: def init(self, master): self.master = master master.title("Dark Path by Daniyal") master.geometry("500x800") master.minsize(400, 600) master.configure(bg="#2C3E50")
self.username = "" # Initialize username as empty
self.secret_key = b'pJSJnJuppVabvm4yKpOJ610CScLinR8dtnOV09ZMWx8=' # Replace with your actual key
self.cipher = Fernet(self.secret_key)
self.login_screen()
def login_screen(self):
# Clear previous widgets
for widget in self.master.winfo_children():
widget.destroy()
# Login Screen UI
self.login_frame = tk.Frame(self.master, bg="#2C3E50", pady=10)
self.login_frame.pack(fill=tk.BOTH, expand=True)
# App Title
self.app_title = tk.Label(self.login_frame, text="Dark Path", font=("Helvetica", 30, "bold"), fg="#ECF0F1", bg="#2C3E50")
self.app_title.pack(pady=10)
self.login_label = tk.Label(self.login_frame, text="Enter Your Username", font=("Helvetica", 20, "bold"), bg="#2C3E50", fg="#ECF0F1")
self.login_label.pack(pady=10)
# Username Entry
self.username_entry = tk.Entry(self.login_frame, font=("Helvetica", 14), bg="#ECF0F1", fg="#2C3E50", bd=0, relief="flat", justify="center")
self.username_entry.pack(pady=10, ipadx=10, ipady=10)
self.username_entry.bind("<FocusIn>", self.on_focus_in)
self.username_entry.bind("<FocusOut>", self.on_focus_out)
# Join Button
self.login_button = tk.Button(self.login_frame, text="Join Chat", font=("Helvetica", 14, "bold"), bg="#1ABC9C", fg="white", command=self.on_login, relief="flat", width=20)
self.login_button.pack(pady=20)
# "By Daniyal" Footer
self.footer_label = tk.Label(self.login_frame, text="By Daniyal", font=("Helvetica", 10), fg="#ECF0F1", bg="#2C3E50")
self.footer_label.pack(side=tk.BOTTOM, pady=20)
def on_focus_in(self, event):
event.widget.config(bg="#dff9f1", fg="#2C3E50")
def on_focus_out(self, event):
event.widget.config(bg="#ECF0F1", fg="#2C3E50")
def on_login(self):
username = self.username_entry.get().strip()
if not username:
messagebox.showerror("Invalid Username", "Please enter a valid username.")
return
# Set the username and move to chat screen
self.username = username
self.setup_chat_screen()
# Send the username to the server
self.client_socket.send(self.cipher.encrypt(self.username.encode('utf-8')))
def setup_chat_screen(self):
for widget in self.master.winfo_children():
widget.destroy()
master = self.master
master.title("Dark Path by Daniyal")
master.geometry("500x800")
master.minsize(400, 600)
master.configure(bg="#2C3E50")
# Header
self.header = tk.Label(master, text="Welcome to Dark Path", font=("Helvetica", 16, "bold"), bg="#1ABC9C", fg="white", pady=20)
self.header.pack(fill=tk.X)
# Profile Section
self.profile_frame = tk.Frame(master, bg="#34495E", pady=10)
self.profile_frame.pack(fill=tk.X)
self.profile_icon = tk.Label(self.profile_frame, text="👤", font=("Helvetica", 40), fg="white", bg="#34495E")
self.profile_icon.pack(side=tk.LEFT, padx=10)
self.username_label = tk.Label(self.profile_frame, text="Username: ", font=("Helvetica", 12), fg="white", bg="#34495E")
self.username_label.pack(side=tk.LEFT)
self.username_display = tk.Label(self.profile_frame, text=self.username, font=("Helvetica", 12, "bold"), fg="white", bg="#34495E")
self.username_display.pack(side=tk.LEFT)
# User Count Display
self.user_count_label = tk.Label(self.profile_frame, text="Users: 0", font=("Helvetica", 12, "bold"), fg="white", bg="#34495E")
self.user_count_label.pack(side=tk.LEFT, padx=20)
# Chat display area
self.chat_area = scrolledtext.ScrolledText(master, state='disabled', wrap='word', bg="#2C3E50", fg="#ECF0F1", font=("Helvetica", 12))
self.chat_area.pack(padx=10, pady=10, fill=tk.BOTH, expand=True)
# Recipient entry
self.recipient_frame = tk.Frame(master, bg="#34495E")
self.recipient_frame.pack(padx=10, pady=(5, 0), fill=tk.X)
self.recipient_label = tk.Label(self.recipient_frame, text="Sender (leave blank for public message):", bg="#34495E", fg="white", font=("Helvetica", 10))
self.recipient_label.pack(side=tk.LEFT)
self.recipient_entry = tk.Entry(self.recipient_frame, bg="#ECF0F1", fg="#2C3E50", font=("Helvetica", 12))
self.recipient_entry.pack(side=tk.RIGHT, fill=tk.X, expand=True)
# Message entry
self.message_frame = tk.Frame(master, bg="#34495E")
self.message_frame.pack(padx=10, pady=(10, 0), fill=tk.X)
self.message_label = tk.Label(self.message_frame, text="Your Message:", bg="#34495E", fg="white", font=("Helvetica", 10))
self.message_label.pack(side=tk.LEFT)
self.message_entry = tk.Entry(self.message_frame, bg="#ECF0F1", fg="#2C3E50", font=("Helvetica", 12))
self.message_entry.pack(side=tk.RIGHT, fill=tk.X, expand=True)
self.message_entry.bind("<Return>", self.send_message)
# Send button
self.send_button = tk.Button(master, text="Send", bg="#1ABC9C", fg="white", font=("Helvetica", 12, "bold"), command=self.send_message)
self.send_button.pack(padx=10, pady=10, fill=tk.X)
# Connect to server
self.client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
self.client_socket.connect((HOST, PORT))
except Exception as e:
messagebox.showerror("Connection Error", f"Could not connect to server: {e}")
master.destroy()
return
threading.Thread(target=self.receive_messages, daemon=True).start()
def send_message(self, event=None):
if not self.username:
messagebox.showerror("Username Required", "You must enter a valid username to send a message.")
return
recipient = self.recipient_entry.get().strip()
message = self.message_entry.get().strip()
if message:
if recipient:
formatted_message = f"{recipient}:{message}"
else:
formatted_message = message
try:
encrypted_message = self.cipher.encrypt(formatted_message.encode('utf-8'))
self.client_socket.send(encrypted_message)
self.chat_area.config(state='normal')
self.chat_area.insert(tk.END, f"You: {message}\n")
self.chat_area.config(state='disabled')
self.chat_area.see(tk.END) # Scroll to the bottom
self.message_entry.delete(0, tk.END)
except Exception as e:
messagebox.showerror("Send Error", f"Failed to send message: {e}")
def receive_messages(self):
while True:
try:
encrypted_message = self.client_socket.recv(1024)
if encrypted_message:
print(f"Received encrypted message: {encrypted_message}")
try:
message = self.cipher.decrypt(encrypted_message).decode('utf-8')
print(f"Decrypted message: {message}")
if "has joined the chat" not in message and "has left the chat" not in message:
if message.startswith("USER_COUNT:"):
user_count = message.split(":")[1]
self.user_count_label.config(text=f"Users: {user_count}")
else:
self.chat_area.config(state='normal')
self.chat_area.insert(tk.END, message + "\n")
self.chat_area.config(state='disabled')
self.chat_area.see(tk.END)
except Exception as e:
print(f"Error decrypting message: {e}")
print(f"Encrypted message: {encrypted_message}")
except Exception as e:
print(f"Error receiving message: {e}")
break
if name == "main": root = tk.Tk() client = ChatClient(root) root.mainloop()
import tkinter as tk from tkinter import messagebox from tkinter import scrolledtext import socket import threading from cryptography.fernet import Fernet from dotenv import load_dotenv load_dotenv() import os
HOST = os.getenv("client_HOST") # Orignal: 127.0.0.1 PORT = int(os.getenv("PORT")) # Port to connect to the server
class ChatClient: def init(self, master): self.master = master master.title("Dark Path by Daniyal") master.geometry("500x800") master.minsize(400, 600) master.configure(bg="#2C3E50")
self.username = "" # Initialize username as empty
self.secret_key = b'pJSJnJuppVabvm4yKpOJ610CScLinR8dtnOV09ZMWx8=' # Encryption key
self.cipher = Fernet(self.secret_key)
self.login_screen()
def login_screen(self):
# Clear previous widgets
for widget in self.master.winfo_children():
widget.destroy()
# Login Screen UI
self.login_frame = tk.Frame(self.master, bg="#2C3E50", pady=10)
self.login_frame.pack(fill=tk.BOTH, expand=True)
# App Title
self.app_title = tk.Label(self.login_frame, text="Dark Path", font=("Helvetica", 30, "bold"), fg="#ECF0F1", bg="#2C3E50")
self.app_title.pack(pady=10)
self.login_label = tk.Label(self.login_frame, text="Enter Your Username", font=("Helvetica", 20, "bold"), bg="#2C3E50", fg="#ECF0F1")
self.login_label.pack(pady=10)
# Username Entry
self.username_entry = tk.Entry(self.login_frame, font=("Helvetica", 14), bg="#ECF0F1", fg="#2C3E50", bd=0, relief="flat", justify="center")
self.username_entry.pack(pady=10, ipadx=10, ipady=10)
self.username_entry.bind("<FocusIn>", self.on_focus_in)
self.username_entry.bind("<FocusOut>", self.on_focus_out)
# Join Button
self.login_button = tk.Button(self.login_frame, text="Join Chat", font=("Helvetica", 14, "bold"), bg="#1ABC9C", fg="white", command=self.on_login, relief="flat", width=20)
self.login_button.pack(pady=20)
# "By Daniyal" Footer
self.footer_label = tk.Label(self.login_frame, text="By Daniyal", font=("Helvetica", 10), fg="#ECF0F1", bg="#2C3E50")
self.footer_label.pack(side=tk.BOTTOM, pady=20)
def on_focus_in(self, event):
event.widget.config(bg="#dff9f1", fg="#2C3E50")
def on_focus_out(self, event):
event.widget.config(bg="#ECF0F1", fg="#2C3E50")
def on_login(self):
username = self.username_entry.get().strip()
if not username:
messagebox.showerror("Invalid Username", "Please enter a valid username.")
return
# Set the username and move to chat screen
self.username = username
self.setup_chat_screen()
# Send the username to the server
self.client_socket.send(self.cipher.encrypt(self.username.encode('utf-8')))
def setup_chat_screen(self):
for widget in self.master.winfo_children():
widget.destroy()
master = self.master
master.title("Dark Path by Daniyal")
master.geometry("500x800")
master.minsize(400, 600)
master.configure(bg="#2C3E50")
# Header
self.header = tk.Label(master, text="Welcome to Dark Path", font=("Helvetica", 16, "bold"), bg="#1ABC9C", fg="white", pady=20)
self.header.pack(fill=tk.X)
# Profile Section
self.profile_frame = tk.Frame(master, bg="#34495E", pady=10)
self.profile_frame.pack(fill=tk.X)
self.profile_icon = tk.Label(self.profile_frame, text="👤", font=("Helvetica", 40), fg="white", bg="#34495E")
self.profile_icon.pack(side=tk.LEFT, padx=10)
self.username_label = tk.Label(self.profile_frame, text="Username: ", font=("Helvetica", 12), fg="white", bg="#34495E")
self.username_label.pack(side=tk.LEFT)
self.username_display = tk.Label(self.profile_frame, text=self.username, font=("Helvetica", 12, "bold"), fg="white", bg="#34495E")
self.username_display.pack(side=tk.LEFT)
# User Count Display
self.user_count_label = tk.Label(self.profile_frame, text="Users: 0", font=("Helvetica", 12, "bold"), fg="white", bg="#34495E")
self.user_count_label.pack(side=tk.LEFT, padx=20)
# Chat display area
self.chat_area = scrolledtext.ScrolledText(master, state='disabled', wrap='word', bg="#2C3E50", fg="#ECF0F1", font=("Helvetica", 12))
self.chat_area.pack(padx=10, pady=10, fill=tk.BOTH, expand=True)
# Recipient entry
self.recipient_frame = tk.Frame(master, bg="#34495E")
self.recipient_frame.pack(padx=10, pady=(5, 0), fill=tk.X)
self.recipient_label = tk.Label(self.recipient_frame, text="Receiver Username:", bg="#34495E", fg="white", font=("Helvetica", 10))
self.recipient_label.pack(side=tk.LEFT)
self.recipient_entry = tk.Entry(self.recipient_frame, bg="#ECF0F1", fg="#2C3E50", font=("Helvetica", 12))
self.recipient_entry.pack(side=tk.RIGHT, fill=tk.X, expand=True)
# Message entry
self.message_frame = tk.Frame(master, bg="#34495E")
self.message_frame.pack(padx=10, pady=(10, 0), fill=tk.X)
self.message_label = tk.Label(self.message_frame, text="Your Message:", bg="#34495E", fg="white", font=("Helvetica", 10))
self.message_label.pack(side=tk.LEFT)
self.message_entry = tk.Entry(self.message_frame, bg="#ECF0F1", fg="#2C3E50", font=("Helvetica", 12))
self.message_entry.pack(side=tk.RIGHT, fill=tk.X, expand=True)
self.message_entry.bind("<Return>", self.send_message)
# Send button
self.send_button = tk.Button(master, text="Send", bg="#1ABC9C", fg="white", font=("Helvetica", 12, "bold"), command=self.send_message)
self.send_button.pack(padx=10, pady=10, fill=tk.X)
# Connect to server
self.client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
self.client_socket.connect((HOST, PORT))
except Exception as e:
messagebox.showerror("Connection Error", f"Could not connect to server: {e}")
master.destroy()
return
threading.Thread(target=self.receive_messages, daemon=True).start()
def send_message(self, event=None):
if not self.username:
messagebox.showerror("Username Required", "You must enter a valid username to send a message.")
return
recipient = self.recipient_entry.get().strip()
message = self.message_entry.get().strip()
if not recipient:
messagebox.showerror("Receiver Required", "Please enter the Receiver's Username.")
return
if message:
formatted_message = f"{recipient}:{message}"
try:
encrypted_message = self.cipher.encrypt(formatted_message.encode('utf-8'))
self.client_socket.send(encrypted_message)
self.chat_area.config(state='normal')
self.chat_area.insert(tk.END, f"{self.username}: {message}\n") # Display sender's username
self.chat_area.config(state='disabled')
self.chat_area.see(tk.END) # Scroll to the bottom
self.message_entry.delete(0, tk.END)
except Exception as e:
messagebox.showerror("Send Error", f"Failed to send message: {e}")
def receive_messages(self):
while True:
try:
encrypted_message = self.client_socket.recv(1024)
if encrypted_message:
print(f"Received encrypted message: {encrypted_message}")
try:
message = self.cipher.decrypt(encrypted_message).decode('utf-8')
print(f"Decrypted message: {message}")
if "has joined the chat" not in message and "has left the chat" not in message:
if message.startswith("USER_COUNT:"):
user_count = message.split(":")[1]
self.user_count_label.config(text=f"Users: {user_count}")
else:
self.chat_area.config(state='normal')
self.chat_area.insert(tk.END, message + "\n")
self.chat_area.config(state='disabled')
self.chat_area.see(tk.END)
except Exception as e:
print(f"Error decrypting message: {e}")
print(f"Encrypted message: {encrypted_message}")
except Exception as e:
print(f"Error receiving message: {e}")
break
if name == "main": root = tk.Tk() client = ChatClient(root) root.mainloop()
import socket import threading from cryptography.fernet import Fernet from dotenv import load_dotenv load_dotenv() import os
HOST = os.getenv("HOST") # Listen on all interfaces PORT = int(os.getenv("PORT")) # Port to listen on secret_key = b'pJSJnJuppVabvm4yKpOJ610CScLinR8dtnOV09ZMWx8=' # Replace with your actual key
cipher = Fernet(secret_key)
clients = {} usernames = {}
def broadcast(message, sender=None): encrypted_message = cipher.encrypt(message.encode('utf-8')) for client_socket in clients: if clients[client_socket] != sender: client_socket.send(encrypted_message)
def send_user_count(): user_count_message = f"USER_COUNT:{len(clients)}" encrypted_message = cipher.encrypt(user_count_message.encode('utf-8')) for client_socket in clients: client_socket.send(encrypted_message)
def handle_client(client_socket): try: # Get the username from the client encrypted_username = client_socket.recv(1024) username = cipher.decrypt(encrypted_username).decode('utf-8') if username in usernames: client_socket.send(cipher.encrypt("Username already taken. Disconnecting.".encode('utf-8'))) client_socket.close() return
clients[client_socket] = username
usernames[username] = client_socket
print(f"{username} has connected.")
# Broadcast join message without the user count
broadcast(f"{username} has joined the chat.", sender=None)
# Send the current user count separately
send_user_count()
while True:
encrypted_message = client_socket.recv(1024)
if not encrypted_message:
break
message = cipher.decrypt(encrypted_message).decode('utf-8')
# Log all messages to the server
log_message(username, message)
# Check for private messages
if ':' in message:
recipient, msg = message.split(':', 1)
send_private_message(username, recipient.strip(), msg.strip())
else:
broadcast(f"{username}: {message}", sender=username)
except Exception as e:
print(f"Error handling client {username}: {e}")
finally:
# Clean up when the client disconnects
disconnect_client(client_socket)
def log_message(sender, message): print(f"Log - {sender} to {message}")
def send_private_message(sender, recipient, message): if recipient in usernames: recipient_socket = usernames[recipient] encrypted_message = cipher.encrypt(f"{sender}: {message}".encode('utf-8')) recipient_socket.send(encrypted_message) else: sender_socket = usernames[sender] encrypted_message = cipher.encrypt(f"User {recipient} not found.".encode('utf-8')) sender_socket.send(encrypted_message)
def disconnect_client(client_socket): username = clients.get(client_socket, "Unknown") print(f"{username} has disconnected.") client_socket.close() if client_socket in clients: del clients[client_socket] if username in usernames: del usernames[username] broadcast(f"{username} has left the chat.", sender=None)
def start_server(): server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind((HOST, PORT)) server_socket.listen(5) print("Server started. Waiting for connections...") try: while True: client_socket, addr = server_socket.accept() threading.Thread(target=handle_client, args=(client_socket,), daemon=True).start() finally: server_socket.close()
if name == "main": start_server()
import socket import threading from cryptography.fernet import Fernet from dotenv import load_dotenv load_dotenv() import os
HOST = os.getenv("HOST") # Listen on all interfaces PORT = int(os.getenv("PORT")) # Port to listen on secret_key = b'pJSJnJuppVabvm4yKpOJ610CScLinR8dtnOV09ZMWx8=' # Replace with your actual key
cipher = Fernet(secret_key)
clients = {} usernames = {}
def broadcast(message, sender=None): encrypted_message = cipher.encrypt(message.encode('utf-8')) for client_socket in clients: if clients[client_socket] != sender: client_socket.send(encrypted_message)
def send_user_count(): user_count_message = f"USER_COUNT:{len(clients)}" encrypted_message = cipher.encrypt(user_count_message.encode('utf-8')) for client_socket in clients: client_socket.send(encrypted_message)
def handle_client(client_socket): try: # Get the username from the client encrypted_username = client_socket.recv(1024) username = cipher.decrypt(encrypted_username).decode('utf-8') if username in usernames: client_socket.send(cipher.encrypt("Username already taken. Disconnecting.".encode('utf-8'))) client_socket.close() return
clients[client_socket] = username
usernames[username] = client_socket
print(f"{username} has connected.")
# Broadcast join message without the user count
broadcast(f"{username} has joined the chat.", sender=None)
# Send the current user count separately
send_user_count()
while True:
encrypted_message = client_socket.recv(1024)
if not encrypted_message:
break
message = cipher.decrypt(encrypted_message).decode('utf-8')
# Log all messages to the server
log_message(username, message)
# Check for private messages
if ':' in message:
recipient, msg = message.split(':', 1)
send_private_message(username, recipient.strip(), msg.strip())
else:
broadcast(f"{username}: {message}", sender=username)
except Exception as e:
print(f"Error handling client {username}: {e}")
finally:
# Clean up when the client disconnects
disconnect_client(client_socket)
def log_message(sender, message): print(f"Log - {sender} to {message}")
def send_private_message(sender, recipient, message): if recipient in usernames: recipient_socket = usernames[recipient] encrypted_message = cipher.encrypt(f"{sender}: {message}".encode('utf-8')) recipient_socket.send(encrypted_message) else: sender_socket = usernames[sender] encrypted_message = cipher.encrypt(f"User {recipient} not found.".encode('utf-8')) sender_socket.send(encrypted_message)
def disconnect_client(client_socket): username = clients.get(client_socket, "Unknown") print(f"{username} has disconnected.") client_socket.close() if client_socket in clients: del clients[client_socket] if username in usernames: del usernames[username] broadcast(f"{username} has left the chat.", sender=None)
def start_server(): server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind((HOST, PORT)) server_socket.listen(5) print("Server started. Waiting for connections...") try: while True: client_socket, addr = server_socket.accept() threading.Thread(target=handle_client, args=(client_socket,), daemon=True).start() finally: server_socket.close()
if name == "main": start_server()
import tkinter as tk from tkinter import messagebox from tkinter import scrolledtext import socket import threading from cryptography.fernet import Fernet from dotenv import load_dotenv load_dotenv() import os
HOST = os.getenv("client_HOST") # Orignal: 127.0.0.1 PORT = int(os.getenv("PORT")) # Port to connect to the server
class ChatClient: def init(self, master): self.master = master master.title("Dark Path by Daniyal") master.geometry("500x800") master.minsize(400, 600) master.configure(bg="#2C3E50")
self.username = "" # Initialize username as empty
self.secret_key = b'pJSJnJuppVabvm4yKpOJ610CScLinR8dtnOV09ZMWx8=' # Replace with your actual key
self.cipher = Fernet(self.secret_key)
self.login_screen()
def login_screen(self):
# Clear previous widgets
for widget in self.master.winfo_children():
widget.destroy()
# Login Screen UI
self.login_frame = tk.Frame(self.master, bg="#2C3E50", pady=10)
self.login_frame.pack(fill=tk.BOTH, expand=True)
# App Title
self.app_title = tk.Label(self.login_frame, text="Dark Path", font=("Helvetica", 30, "bold"), fg="#ECF0F1", bg="#2C3E50")
self.app_title.pack(pady=10)
self.login_label = tk.Label(self.login_frame, text="Enter Your Username", font=("Helvetica", 20, "bold"), bg="#2C3E50", fg="#ECF0F1")
self.login_label.pack(pady=10)
# Username Entry
self.username_entry = tk.Entry(self.login_frame, font=("Helvetica", 14), bg="#ECF0F1", fg="#2C3E50", bd=0, relief="flat", justify="center")
self.username_entry.pack(pady=10, ipadx=10, ipady=10)
self.username_entry.bind("<FocusIn>", self.on_focus_in)
self.username_entry.bind("<FocusOut>", self.on_focus_out)
# Join Button
self.login_button = tk.Button(self.login_frame, text="Join Chat", font=("Helvetica", 14, "bold"), bg="#1ABC9C", fg="white", command=self.on_login, relief="flat", width=20)
self.login_button.pack(pady=20)
# "By Daniyal" Footer
self.footer_label = tk.Label(self.login_frame, text="By Daniyal", font=("Helvetica", 10), fg="#ECF0F1", bg="#2C3E50")
self.footer_label.pack(side=tk.BOTTOM, pady=20)
def on_focus_in(self, event):
event.widget.config(bg="#dff9f1", fg="#2C3E50")
def on_focus_out(self, event):
event.widget.config(bg="#ECF0F1", fg="#2C3E50")
def on_login(self):
username = self.username_entry.get().strip()
if not username:
messagebox.showerror("Invalid Username", "Please enter a valid username.")
return
# Set the username and move to chat screen
self.username = username
self.setup_chat_screen()
# Send the username to the server
self.client_socket.send(self.cipher.encrypt(self.username.encode('utf-8')))
def setup_chat_screen(self):
for widget in self.master.winfo_children():
widget.destroy()
master = self.master
master.title("Dark Path by Daniyal")
master.geometry("500x800")
master.minsize(400, 600)
master.configure(bg="#2C3E50")
# Header
self.header = tk.Label(master, text="Welcome to Dark Path", font=("Helvetica", 16, "bold"), bg="#1ABC9C", fg="white", pady=20)
self.header.pack(fill=tk.X)
# Profile Section
self.profile_frame = tk.Frame(master, bg="#34495E", pady=10)
self.profile_frame.pack(fill=tk.X)
self.profile_icon = tk.Label(self.profile_frame, text="👤", font=("Helvetica", 40), fg="white", bg="#34495E")
self.profile_icon.pack(side=tk.LEFT, padx=10)
self.username_label = tk.Label(self.profile_frame, text="Username: ", font=("Helvetica", 12), fg="white", bg="#34495E")
self.username_label.pack(side=tk.LEFT)
self.username_display = tk.Label(self.profile_frame, text=self.username, font=("Helvetica", 12, "bold"), fg="white", bg="#34495E")
self.username_display.pack(side=tk.LEFT)
# User Count Display
self.user_count_label = tk.Label(self.profile_frame, text="Users: 0", font=("Helvetica", 12, "bold"), fg="white", bg="#34495E")
self.user_count_label.pack(side=tk.LEFT, padx=20)
# Chat display area
self.chat_area = scrolledtext.ScrolledText(master, state='disabled', wrap='word', bg="#2C3E50", fg="#ECF0F1", font=("Helvetica", 12))
self.chat_area.pack(padx=10, pady=10, fill=tk.BOTH, expand=True)
# Recipient entry
self.recipient_frame = tk.Frame(master, bg="#34495E")
self.recipient_frame.pack(padx=10, pady=(5, 0), fill=tk.X)
self.recipient_label = tk.Label(self.recipient_frame, text="Receiver Username:", bg="#34495E", fg="white", font=("Helvetica", 10))
self.recipient_label.pack(side=tk.LEFT)
self.recipient_entry = tk.Entry(self.recipient_frame, bg="#ECF0F1", fg="#2C3E50", font=("Helvetica", 12))
self.recipient_entry.pack(side=tk.RIGHT, fill=tk.X, expand=True)
# Message entry
self.message_frame = tk.Frame(master, bg="#34495E")
self.message_frame.pack(padx=10, pady=(10, 0), fill=tk.X)
self.message_label = tk.Label(self.message_frame, text="Your Message:", bg="#34495E", fg="white", font=("Helvetica", 10))
self.message_label.pack(side=tk.LEFT)
self.message_entry = tk.Entry(self.message_frame, bg="#ECF0F1", fg="#2C3E50", font=("Helvetica", 12))
self.message_entry.pack(side=tk.RIGHT, fill=tk.X, expand=True)
self.message_entry.bind("<Return>", self.send_message)
# Send button
self.send_button = tk.Button(master, text="Send", bg="#1ABC9C", fg="white", font=("Helvetica", 12, "bold"), command=self.send_message)
self.send_button.pack(padx=10, pady=10, fill=tk.X)
# Connect to server
self.client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
self.client_socket.connect((HOST, PORT))
except Exception as e:
messagebox.showerror("Connection Error", f"Could not connect to server: {e}")
master.destroy()
return
threading.Thread(target=self.receive_messages, daemon=True).start()
def send_message(self, event=None):
if not self.username:
messagebox.showerror("Username Required", "You must enter a valid username to send a message.")
return
recipient = self.recipient_entry.get().strip()
message = self.message_entry.get().strip()
if not recipient:
messagebox.showerror("Receiver Required", "Please enter the Receiver's Username.")
return
if message:
formatted_message = f"{recipient}:{message}"
try:
encrypted_message = self.cipher.encrypt(formatted_message.encode('utf-8'))
self.client_socket.send(encrypted_message)
self.chat_area.config(state='normal')
self.chat_area.insert(tk.END, f"{self.username}: {message}\n") # Display sender's username
self.chat_area.config(state='disabled')
self.chat_area.see(tk.END) # Scroll to the bottom
self.message_entry.delete(0, tk.END)
except Exception as e:
messagebox.showerror("Send Error", f"Failed to send message: {e}")
def receive_messages(self):
while True:
try:
encrypted_message = self.client_socket.recv(1024)
if encrypted_message:
print(f"Received encrypted message: {encrypted_message}")
try:
message = self.cipher.decrypt(encrypted_message).decode('utf-8')
print(f"Decrypted message: {message}")
if "has joined the chat" not in message and "has left the chat" not in message:
if message.startswith("USER_COUNT:"):
user_count = message.split(":")[1]
self.user_count_label.config(text=f"Users: {user_count}")
else:
self.chat_area.config(state='normal')
self.chat_area.insert(tk.END, message + "\n")
self.chat_area.config(state='disabled')
self.chat_area.see(tk.END)
except Exception as e:
print(f"Error decrypting message: {e}")
print(f"Encrypted message: {encrypted_message}")
except Exception as e:
print(f"Error receiving message: {e}")
break
if name == "main": root = tk.Tk() client = ChatClient(root) root.mainloop()