diff --git a/libs/process_message.py b/libs/process_message.py index 65f9033..ed631af 100644 --- a/libs/process_message.py +++ b/libs/process_message.py @@ -20,6 +20,7 @@ class CommandProcessor: "join": self.cmd_join, "rooms": self.cmd_rooms, "createroom": self.cmd_createroom, + "quit": self.cmd_quit, } def process_command(self, message: str, addr: Tuple) -> str: @@ -46,6 +47,7 @@ class CommandProcessor: "login": "Login with username and password", "whoami": "Show current username", "register": "Register new user", + "quit": "Disconnect from server", } # Commands for authenticated users @@ -260,3 +262,7 @@ class CommandProcessor: if self.room_manager.create_room(name, description): return f"Room {name} created successfully" return "Room already exists" + + def cmd_quit(self, args, addr): + """Disconnect from the server.""" + return "@QUIT@" diff --git a/main.py b/main.py index 1d77738..43fe845 100644 --- a/main.py +++ b/main.py @@ -88,6 +88,11 @@ def process_complete_line(line, addr, active_connections, conn): ) return + if response.startswith("@QUIT@"): + conn.sendall(b"\r\nGoodbye!\r\n") + conn.close() + return + conn.sendall(f"\r\n{response}\r\n".encode("ascii")) else: # Regular chat message @@ -207,18 +212,37 @@ def cleanup_client_connection(addr): ) +def handle_server_input(): + """Handle input from server console.""" + fake_addr = ("console", 0) + user_manager.register_session(fake_addr, "admin") + room_manager.join_room(fake_addr, "lounge") + + while True: + try: + message = input() + if message.strip(): + process_complete_line( + message.encode("ascii"), fake_addr, active_connections, None + ) + except EOFError: + break + + def start_server(): - """ - Starts the server and listens for incoming connections. - """ + """Starts the server and listens for incoming connections.""" with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as server: server.bind((HOST, PORT)) server.listen(MAX_CONNECTIONS) print(f"[TELTCSERVER] Listening on port {PORT}...") print(f"[TELTCSERVER] Maximum connections allowed: {MAX_CONNECTIONS}") + # Start server console input thread + console_thread = threading.Thread(target=handle_server_input) + console_thread.daemon = True + console_thread.start() + while True: - # Accept new connection conn, addr = server.accept() # Check if maximum connections reached