import socket
import threading
class Server:
    connections = []
    total_connections = 0
    class Client(threading.Thread):
        def __init__(self, socket, address, id, name, server):
            threading.Thread.__init__(self)
            self.socket = socket
            self.address = address
            self.id = id
            self.name = name
            self.server = server
       
        def __str__(self):
            return str(self.id) + " " + str(self.address)
        def run(self):
            try:
                data = self.socket.recv(1024)
            except:
                print("Recieve failed!")
            if data != "":
                print(f"ID {self.id}: \"{data.decode("utf-8")}\" | non-decoded: \"{data}\"")
            if data.decode("utf-8") == "server:kill":
                print("Server kill requested. Dying now.")
                self.server.sock.shutdown(socket.SHUT_RDWR)
                self.server.sock.close()
                exit(0)
            print("Client " + str(self.address) + " has disconnected")
            self.server.connections.remove(self)
           
   
    def __init__(self, host, port):
        self.host = host
        self.port = port
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
   
    def accept_connection(self):
        try:
            while True:
                sock, addr = self.sock.accept()
                self.connections.append(self.Client(sock, addr, self.total_connections, "Name", self))
                self.connections[len(self.connections) - 1].start()
                print(f"New client connection at ID {self.connections[len(self.connections) - 1]}")
                self.total_connections += 1
        except:
            print("Server seems to be dead. Can't continue accepting.")
    def Start(self):
        self.sock.bind((self.host, self.port))
        self.sock.listen(5)
        t = threading.Thread(target = self.accept_connection)
        t.start()
if __name__ == "__main__":
    server = Server("127.0.0.1", 8080)
    server.Start()