class Client: def importScripts(self): self.decEncHelper = DecodingEncodingHelper() self.inputHandler = InputHandler(self.output) self.fileHelper = FileHelper(self.output) self.guiHelper = GUIHelper(self.output) def setConfig(self): Config = self.fileHelper.getConfig() self.ipV4 = Config.ip self.port = Config.port def inizializeClient(self, username, password): self.clientObject = ClientObject(username, None, self.ipV4, self.port, "Welcome_Channel") self.connected = False self.password = password def tryConnect(self): try: self.clientObject.socketObject = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.clientObject.socketObject.connect((self.clientObject.ip, self.clientObject.port)) threading.Thread(target=ServerHandler,args=[self.clientObject,self.windows]).start() self.clientObject.socketObject.sendall(self.decEncHelper.stringToBytes("011" + self.clientObject.username + ":" + self.password)) self.connected = True except: self.connected = False def sendInput(self, message): if self.connected: if str(message).startswith("/"): self.inputHandler.handleInput(str(message[1:]), self.clientObject) else: self.output.append("you: " + message) try: self.clientObject.socketObject.sendall(self.decEncHelper.stringToBytes("001" + message)) except: self.connected = False else: self.guiHelper.printOutput("not connected") def __init__(self, username, password, windows): #Imports self.windows = windows self.output = self.windows[0].output self.importScripts() #Config self.setConfig() #Client initializations self.inizializeClient(username, password) #Client trying to establish a connection self.tryConnect()
class InputHandler: commandList = list() def importScripts(self): self.decEncHelper = DecodingEncodingHelper() self.channelManager = ChannelManager() self.clientManager = ClientManager() self.fileHelper = FileHelper() self.logHelper = LogHelper() self.mysqlHelper = MysqlHelper() def createCommand(self, name, syntax, arguments, description): command = Command(name, syntax, arguments, description) self.commandList.append(command) return command def initializeCommands(self): self.cmdListClients = self.createCommand( "listClients", "/listClients", "NONE", "Lists all connected clients with their name, ip and channel their in." ) self.cmdClear = self.createCommand("Clear", "/clear", "NONE", "Clears your interpreter console.") self.cmdHelp = self.createCommand( "Help", "/help", "NONE", "Shows a list of available commands.") self.cmdKick = self.createCommand( "Kick", "/kick <name/ip>", "<NAME/IP>", "Kicks the given IP from the server.") self.cmdBan = self.createCommand( "Ban", "/ban <name/ip> <time>", "<NAME/IP> <TIME>", "Bans the specified client for the given amount of time in minutes." ) self.cmdMonitorMode = self.createCommand("monitorMode", "/monitorMode", "NONE", "Switches to monitor mode.") self.cmdChangeRank = self.createCommand( "changeRank", "/changeRank <name/ip> <rank>", "<NAME/IP> <RANK>", "Changes the rank of the given client.") self.cmdListChannel = self.createCommand( "listChannel", "/listChannel", "NONE", "Lists all channels with their belonging clients.") self.cmdCreateChannel = self.createCommand( "createChannel", "/createChannel <name> <description> <password> <accessLevel>", "<NAME/DESCRIPTION/PASSWORD/ACCESSLEVEL>", "Creates a temporary Channel.") self.cmdRemoveChannel = self.createCommand( "removeChannel", "/removeChannel <name>", "<NAME>", "Removes the give Channel.") def __init__(self, upTime): self.upTime = upTime #Imports self.importScripts() #Create Commands self.initializeCommands() def handleInput(self, command): command = command.split() if command[0] == self.cmdClear.name: os.system('cls' if os.name == 'nt' else 'clear') elif command[0] == self.cmdListClients.name: if len(self.clientManager.clientList) < 1: self.logHelper.log("error", "No clients connected") else: self.logHelper.log("error", "Connected clients:") for clientObject in self.clientManager.clientList: self.logHelper.log( "info", clientObject.ip + " with name " + clientObject.username + " in " + clientObject.channelObject.name) elif command[0] == self.cmdHelp.name: self.logHelper.log("info", "Commands:") self.logHelper.log( "info", "----------------------------------------------------------") for command in self.commandList: self.logHelper.log( "info", command.syntax + " : " + command.description) self.logHelper.log( "info", "----------------------------------------------------------") elif command[0] == self.cmdKick.name: if len(self.clientManager.clientList) < 1: self.logHelper.log("error", "No clients connected") else: client = None try: client = command[1] except IndexError: self.logHelper.log("error", "Syntax: " + self.cmdKick.syntax) if client != None: if self.clientManager.ipExists(client): for clientObject in self.clientManager.clientList: if clientObject.ip == client: self.logHelper.log( "info", clientObject.ip + " : " + clientObject.username + " got kicked") clientObject.socketObject.sendall( self.decEncHelper.stringToBytes("402")) clientObject.socketObject.close() elif self.clientManager.usernameExists(client): for clientObject in self.clientManager.clientList: if clientObject.username.lower() == client: self.logHelper.log( "info", clientObject.ip + " : " + clientObject.username + " got kicked") clientObject.socketObject.sendall( self.decEncHelper.stringToBytes("402")) clientObject.socketObject.close() else: self.logHelper.log( "error", "Your given Ip/Name doesn't exist.") elif command[0] == self.cmdBan.name: if len(self.clientManager.clientList) < 1: self.logHelper.log("error", "No clients connected") else: client = None banTime = None try: client = command[1] banTime = int(command[2]) except IndexError: if client or banTime == None: self.logHelper.log("error", "Syntax: " + self.cmdBan.syntax) if client != None: if self.clientManager.ipExists(client): for clientObject in self.clientManager.clientList: if clientObject.ip == client: if banTime != None: if banTime == 0: self.fileHelper.addClientToBanList( clientObject.ip) self.logHelper.log( "info", clientObject.ip + " : " + clientObject.username + " got permanantly banned") clientObject.socketObject.sendall( self.decEncHelper.stringToBytes( "405" + "You got permanantly banned by the console" )) clientObject.socketObject.close() else: currentTimeStamp = datetime.datetime.now( ).timestamp() self.fileHelper.addClientToBanList( clientObject.ip + ":" + str(currentTimeStamp + int(banTime) * 60)) self.logHelper.log( "info", clientObject.ip + " : " + clientObject.username + " got banned for " + str(banTime) + "minutes") clientObject.socketObject.sendall( self.decEncHelper.stringToBytes( "405" + "You got banned for " + str(banTime) + " minutes by the console")) clientObject.socketObject.close() else: self.fileHelper.addClientToBanList( clientObject.ip) self.logHelper.log( "info", clientObject.ip + " : " + clientObject.username + " got permanantly banned") clientObject.socketObject.sendall( self.decEncHelper.stringToBytes( "405" + "You got permanantly banned by the console" )) clientObject.socketObject.close() elif self.clientManager.usernameExists(client): for clientObject in self.clientManager.clientList: if clientObject.username.lower() == client: if banTime != None: if banTime == 0: self.fileHelper.addClientToBanList( clientObject.ip) self.logHelper.log( "info", clientObject.ip + " : " + clientObject.username + " got permanantly banned") clientObject.socketObject.sendall( self.decEncHelper.stringToBytes( "405" + "You got permanantly banned by the console" )) clientObject.socketObject.close() else: currentTimeStamp = datetime.datetime.now( ).timestamp() self.fileHelper.addClientToBanList( clientObject.ip + ":" + str(currentTimeStamp + int(banTime) * 60)) self.logHelper.log( "info", clientObject.ip + " : " + clientObject.username + " got banned for " + str(banTime) + "minutes") clientObject.socketObject.sendall( self.decEncHelper.stringToBytes( "405" + "You got banned for " + str(banTime) + " minutes by the console")) clientObject.socketObject.close() else: self.fileHelper.addClientToBanList( clientObject.ip) self.logHelper.log( "info", clientObject.ip + " : " + clientObject.username + " got permanantly banned") clientObject.socketObject.sendall( self.decEncHelper.stringToBytes( "405" + "You got permanantly banned by the console" )) clientObject.socketObject.close() else: print( "[Server/Error] Your given Ip/Name doesn't exist.") elif command[0] == self.cmdListChannel.name: self.logHelper.log("info", "Channels:") self.logHelper.log( "info", "----------------------------------------------------------") for channel in self.channelManager.channelList: self.logHelper.log( "info", "-" + channel.name + " : Description:" + channel.description) self.logHelper.log("info", " Clients:") if len(channel.clientList) < 1: self.logHelper.log("info", " -channel is empty") else: for client in channel.clientList: self.logHelper.log( "info", " -" + client.ip + " : " + client.username) self.logHelper.log( "info", "----------------------------------------------------------") elif command[ 0] == self.cmdCreateChannel.name: #TODO: add things to remove user error when acces level isnst int and description contains spaces name = None description = None password = None accessLevel = None try: name = command[1] description = command[2] password = command[3] accessLevel = int(command[4]) self.channelManager.addChannel( Channel(name, description, password, accessLevel, list())) self.logHelper.log("info", "Channel " + name + " created.") except: if name or description or password or accessLevel == None: self.logHelper.log( "error", "Syntax: " + self.cmdCreateChannel.syntax) elif command[0] == self.cmdRemoveChannel.name: name = None try: name = command[1] for channel in self.channelManager.channelList: if channel.name == name: self.channelManager.removeChannel(channel) self.logHelper.log("info", "Channel " + name + " was removed.") except: if name == None: self.logHelper.log( "error", "Syntax: " + self.cmdRemoveChannel.syntax) elif command[ 0] == self.cmdChangeRank.name: #TODO: add things to remove user error for rank and check if rank isnt even a rank if len(self.clientManager.clientList) < 1: self.logHelper.log("error", "No clients connected") else: client = None rank = None try: client = command[1] rank = command[2] except IndexError: self.logHelper.log("error", "Syntax: " + self.cmdChangeRank.syntax) if client != None: if rank != None: if self.clientManager.ipExists(client): for clientObject in self.clientManager.clientList: if clientObject.ip == client: prevRank = clientObject.rank clientObject.rank = rank self.mysqlHelper.updateAccountRank( clientObject) self.logHelper.log( "info", "Changed " + clientObject.ip + ":" + str(clientObject.port) + " " + clientObject.username + " 's rank from " + prevRank + " to " + rank) elif self.clientManager.usernameExists(client): for clientObject in self.clientManager.clientList: if clientObject.username.lower() == client: prevRank = clientObject.rank clientObject.rank = rank self.mysqlHelper.updateAccountRank( clientObject) #clientObject.sendall(self.decEncHelper.stringToBytes("904" + rank))TODO: self.logHelper.log( "info", "Changed " + clientObject.ip + ":" + str(clientObject.port) + " " + clientObject.username + " 's rank from " + prevRank + " to " + rank) else: self.logHelper.log( "error", "Your given Ip/Name doesn't exist.") elif command[0] == self.cmdMonitorMode.name: monitor = True config = self.fileHelper.getConfig("Server Config") ip = config.ip + ":" + str(config.port) if len(ip) != 20: ip = " " * (20 - len(ip)) + ip while monitor: clearCount = 0 connectedClients = str(len(self.clientManager.clientList)) connectedAdmins = str(len(self.clientManager.getAdmins())) if len(connectedClients) != 3: connectedClients = "0" * ( 3 - len(connectedClients)) + connectedClients if len(connectedAdmins) != 3: connectedAdmins = "0" * ( 3 - len(connectedAdmins)) + connectedAdmins os.system('cls' if os.name == 'nt' else 'clear') try: print( "##############Monitoring##############\n#Server Ip/Port: " + ip + "#\n#Uptime: " + time.strftime( '%H:%M:%S', time.gmtime(int(time.time() - self.upTime))) + "#\n#Connected Clients: " + connectedClients + "#\n#Connected Admins: " + connectedAdmins + "#\n##############Monitoring##############") while clearCount != 5: sys.stdout.write("\x1b[1A") sys.stdout.write("\x1b[2K") clearCount = clearCount + 1 time.sleep(0.5) except KeyboardInterrupt: monitor = False os.system('cls' if os.name == 'nt' else 'clear') self.logHelper.log("info", "Exited monitor mode.") else: self.logHelper.log("error", "Unknown command: " + command[0]) self.logHelper.log("error", "type /help for a list of commands")
class ClientHandler(socketserver.BaseRequestHandler): appendClient = True tryRecv = False loggedIn = False def handle( self ): #overwrite TODO: find a way to import script only once not once per handle call self.decEncHelper = DecodingEncodingHelper() self.channelManager = ChannelManager() self.clientManager = ClientManager() self.mysqlHelper = MysqlHelper() self.fileHelper = FileHelper() self.logHelper = LogHelper() if self.appendClient: self.clientObject = Client(self.request, "*NOT_ASSIGNED*", "*NOT_ASSIGNED*", "*NOT_ASSIGNED*") if len(self.fileHelper.readTXTFile("data/", "banList")) > 1: for client in self.fileHelper.readTXTFile("data/", "banList"): try: banTime = client.split(":")[1] except IndexError: pass if self.clientObject.ip + "\n" == client: self.logHelper.log( "info", self.clientObject.ip + ":" + str(self.clientObject.port) + " is permanantly banned on the server") self.clientObject.socketObject.sendall( self.decEncHelper.stringToBytes( "405[Client/Info] You are permanantly banned on this server" )) self.clientObject.socketObject.close() self.appendClient = False elif self.clientObject.ip + ":" + banTime == client: currentTimeStamp = datetime.datetime.now().timestamp() banTime = banTime[:-1] if (currentTimeStamp > float(banTime)): self.fileHelper.removeClientFromBanList( self.clientObject.ip) self.clientManager.addClient(self.clientObject) self.logHelper.log( "info", str(self.clientObject.ip) + ":" + str(self.clientObject.port) + " connected to the server") print( self.mysqlHelper.getAccountRank( self.clientObject)) if len( self.mysqlHelper.getAccountRank( self.clientObject)) < 3: self.clientObject.rank = "user" self.mysqlHelper.updateAccountRank( self.clientObject) self.appendClient = False self.tryRecv = True else: self.logHelper.log( "info", self.clientObject.ip + ":" + str(self.clientObject.port) + " is temporary banned on the server. Remaining Time: " + str( int((float(banTime) - currentTimeStamp) / 60)) + "Minutes") self.clientObject.socketObject.sendall( self.decEncHelper.stringToBytes( "405[Client/Info] You are temporary banned on this server. Remaining Time: " + str( int((float(banTime) - currentTimeStamp) / 60)) + " Minutes")) self.channelManager.removeChannelMember( self.clientObject.channelObject, self.clientObject) self.clientObject.socketObject.close() self.appendClient = False break elif "BanList:\n" == client: pass else: self.clientManager.addClient(self.clientObject) self.logHelper.log( "info", str(self.clientObject.ip) + ":" + str(self.clientObject.port) + " connected to the server.") self.appendClient = False self.tryRecv = True else: self.clientManager.addClient(self.clientObject) self.logHelper.log( "info", str(self.clientObject.ip) + ":" + str(self.clientObject.port) + " connected to the server.") self.appendClient = False self.tryRecv = True if self.tryRecv: try: self.data = self.decEncHelper.bytesToString( self.clientObject.socketObject.recv(1024)) self.handleRequest(self.data, self.clientObject) except: for clientObjectInList in self.clientManager.clientList: if clientObjectInList != self.clientObject: if self.loggedIn: if self.channelManager.channelContains( clientObjectInList, self.clientObject.channelObject.name): clientObjectInList.socketObject.sendall( self.decEncHelper.stringToBytes( "811[Client/Info] " + self.clientObject.username + " quit.")) self.logHelper.log( "info", self.clientObject.ip + ":" + str(self.clientObject.port) + " Disconnected") self.mysqlHelper.logoutAccount(self.clientObject) self.clientManager.removeClient(self.clientObject) if self.loggedIn: self.channelManager.removeChannelMember( self.clientObject.channelObject, self.clientObject) def handleRequest(self, request, clientObject): requestId = request[:3] requestdata = request[3:] if requestId == "001": #chatting self.logHelper.channelLog( "info", clientObject.channelObject.name, clientObject.ip + ":" + str(clientObject.port) + " [" + clientObject.rank + "]" + clientObject.username + " : " + requestdata) for clientObjectFromList in self.clientManager.clientList: if clientObjectFromList.channelObject.name == clientObject.channelObject.name: if clientObjectFromList != clientObject: clientObjectFromList.socketObject.sendall( self.decEncHelper.stringToBytes( "001[" + clientObject.rank + "]" + clientObject.username + " : " + requestdata)) elif requestId == "011": #try logging in requestdata = requestdata.split(":") self.logHelper.log( "info", str(self.clientObject.ip) + ":" + str(self.clientObject.port) + " tried logging in.") self.clientManager.updateClientUsername(clientObject, requestdata[0]) if self.mysqlHelper.tryLogin(clientObject, requestdata[1]): self.loggedIn = True self.clientObject.channelObject = self.channelManager.channelList[ 0] self.clientObject.channelObject.clientList.append( self.clientObject) self.clientManager.updateClientRank( clientObject, self.mysqlHelper.getAccountRank(clientObject)) for clientObjectInList in self.clientManager.clientList: if clientObjectInList != clientObject: if self.channelManager.channelContains( clientObjectInList, "Welcome_Channel"): clientObjectInList.socketObject.sendall( self.decEncHelper.stringToBytes( "811[" + clientObject.rank + "]" + clientObject.username + " joined.")) self.logHelper.log( "info", str(self.clientObject.ip) + ":" + str(self.clientObject.port) + " logged in as " + clientObject.username + " succesfully.") if len(self.mysqlHelper.getAccountRank(self.clientObject)) < 3: self.clientObject.rank = "user" self.mysqlHelper.updateAccountRank(self.clientObject) for clientObjectInList in self.clientManager.clientList: if clientObjectInList != clientObject: if self.channelManager.channelContains( clientObjectInList, "Welcome_Channel"): clientObjectInList.socketObject.sendall( self.decEncHelper.stringToBytes( "811[" + clientObject.rank + "]" + clientObject.username + " joined.")) clientObject.socketObject.sendall( self.decEncHelper.stringToBytes("903")) else: self.logHelper.log( "info", str(self.clientObject.ip) + ":" + str(self.clientObject.port) + " couldn't log in.") self.clientObject.socketObject.sendall( self.decEncHelper.stringToBytes("902")) self.clientObject.socketObject.close() elif requestId == "611": #sent current clients in given channel self.logHelper.log( "info", str(self.clientObject.ip) + ":" + str(self.clientObject.port) + " " + clientObject.username + " requested the clients from channel " + requestdata + ".") for channel in self.channelManager.channelList: if channel.name == requestdata: if len(channel.clientList) < 1: self.clientObject.socketObject.sendall( self.decEncHelper.stringToBytes("611Empty")) else: clientsInChannel = list() for client in channel.clientList: clientsInChannel.append(client.username) self.clientObject.socketObject.sendall( self.decEncHelper.stringToBytes( "611" + requestdata + ";" + str(clientsInChannel))) break elif requestId == "541": #sent client rank self.logHelper.log( "info", clientObject.ip + " " + clientObject.username + " requested rank.") self.clientObject.socketObject.sendall( self.decEncHelper.stringToBytes("541" + str(self.clientObject.rank))) elif requestId == "022": #channel request self.logHelper.log( "info", clientObject.ip + " " + clientObject.username + " requested channel.") channelNames = list() channelDescriptions = list() channelPasswords = list() channelAccessLevels = list() for channelObject in self.channelManager.channelList: channelNames.append(channelObject.name) channelDescriptions.append(channelObject.description) channelPasswords.append(channelObject.password) channelAccessLevels.append(channelObject.accessLevel) self.clientObject.socketObject.sendall( self.decEncHelper.stringToBytes("022" + str(channelNames) + ":" + str(channelDescriptions) + ":" + str(channelPasswords) + ":" + str(channelAccessLevels))) elif requestId == "023": #changing channels if self.channelManager.channelExists(requestdata): if self.channelManager.channelContains(self.clientObject, requestdata): clientObject.socketObject.sendall( self.decEncHelper.stringToBytes( "023[Client/Info] you are already in this channel." )) self.logHelper.log( "info", clientObject.ip + ":" + str(clientObject.port) + " " + clientObject.username + " tried to join a channel which he is already part of." ) else: for channelObject in self.channelManager.channelList: if channelObject.name == requestdata: oldChannel = clientObject.channelObject.name self.channelManager.removeChannelMember( clientObject.channelObject, clientObject) clientObject.channelObject = channelObject self.channelManager.addChannelMember( channelObject, clientObject) clientObject.socketObject.sendall( self.decEncHelper.stringToBytes( "023[Client/Info] You succesfully changed to " + requestdata + ".")) self.logHelper.log( "info", clientObject.ip + ":" + str(clientObject.port) + " " + clientObject.username + " changed from " + oldChannel + " to " + requestdata + ".") for clientInList in self.clientManager.clientList: clientInList.socketObject.sendall( self.decEncHelper.stringToBytes("811")) else: clientObject.socketObject.sendall( self.decEncHelper.stringToBytes( "023[Client/Info] This Channel doesn't exists.")) self.logHelper.log( "info", clientObject.ip + " : " + clientObject.username + " tried to join a channel that doesn't exists.") elif requestId == "031": #changing namesFIXME: doesnt work with rank not tested witohut if self.clientManager.hasRank(clientObject, "admin"): self.fileHelper.removeClientRank(clientObject) clientObject.username = requestdata self.fileHelper.addClientRank(clientObject, "admin") clientObject.socketObject.sendall( self.decEncHelper.stringToBytes( "031[Client/Info] you succesfully changed your name.")) self.logHelper.log( "info", clientObject.ip + ":" + str(clientObject.port) + " " + clientObject.username + " changed name.") else: clientObject.socketObject.sendall( self.decEncHelper.stringToBytes( "031[Client/Info] You don't have access to that command." )) self.logHelper.log( "info", clientObject.ip + ":" + str(clientObject.port) + " " + clientObject.username + " had no access to that command. Rank:(" + clientObject.rank.strip("\n") + ")") elif requestId == "411": #kicking clients if self.clientManager.hasRank(clientObject, "admin"): if self.clientManager.usernameExists(requestdata): if requestdata == self.clientObject.username: clientObject.socketObject.sendall( self.decEncHelper.stringToBytes( "411[Client/Info] You can't kick yourself.")) else: for clientObjectInList in self.clientManager.clientList: if clientObjectInList.username == requestdata: clientObjectInList.socketObject.sendall( self.decEncHelper.stringToBytes( "402[Client/Info] You got kicked by: " + self.clientObject.username)) clientObjectInList.socketObject.close() time.sleep(0.1) self.logHelper.log( "info", clientObject.ip + ":" + str(clientObject.port) + " " + clientObject.username + " kicked : " + requestdata) clientObject.socketObject.sendall( self.decEncHelper.stringToBytes( "411[Client/Info] You sucessfully kicked: " + requestdata)) break elif self.clientManager.ipExists(requestdata): if requestdata == self.clientObject.ip: clientObject.socketObject.sendall( self.decEncHelper.stringToBytes( "411[Client/Info] You can't kick yourself.")) else: for clientObjectInList in self.clientManager.clientList: if clientObjectInList.ip == requestdata: clientObjectInList.socketObject.sendall( self.decEncHelper.stringToBytes( "402[Client/Info] You got kicked by: " + self.clientObject.username)) clientObjectInList.socketObject.close() self.logHelper.log( "info", clientObject.ip + ":" + str(clientObject.port) + " " + clientObject.username + " kicked : " + requestdata) clientObject.socketObject.sendall( self.decEncHelper.stringToBytes( "411[Client/Info] You sucessfully kicked: " + requestdata)) break else: clientObject.socketObject.sendall( self.decEncHelper.stringToBytes( "411[Client/Info] Username or ip doesnt exists on the server." )) else: clientObject.socketObject.sendall( self.decEncHelper.stringToBytes( "031[Client/Info] You don't have access to that command." )) self.logHelper.log( "info", clientObject.ip + ":" + str(clientObject.port) + " " + clientObject.username + " had no access to that command. Rank:(" + clientObject.rank.strip("\n") + ")") elif requestId == "711": #banning clients if self.clientManager.hasRank(clientObject, "admin"): requestdata = requestdata.split() client = requestdata[0] banTime = requestdata[1] if self.clientManager.usernameExists(client): if client == self.clientObject.username: clientObject.socketObject.sendall( self.decEncHelper.stringToBytes( "711[Client/Info] You can't ban yourself.")) else: for clientObjectInList in self.clientManager.clientList: if clientObjectInList.username == client: if banTime == 0: self.fileHelper.addClientToBanList( clientObjectInList.ip) self.logHelper.log( "info", clientObjectInList.ip + ":" + str(clientObjectInList.port) + " " + clientObjectInList.username + " got permanantly banned by " + clientObject.username) clientObjectInList.socketObject.sendall( self.decEncHelper.stringToBytes( "711" + "[Client/Info] You got permanantly banned by " + clientObject.username)) clientObjectInList.socketObject.close() clientObject.socketObject.sendall( self.decEncHelper.stringToBytes( "711[Client/Info] You sucessfully banned: " + clientObjectInList.username)) else: currentTimeStamp = datetime.datetime.now( ).timestamp() self.fileHelper.addClientToBanList( clientObjectInList.ip + ":" + str(currentTimeStamp + int(banTime) * 60)) self.logHelper.log( "info", clientObjectInList.ip + ":" + str(clientObjectInList.port) + " " + clientObjectInList.username + " got banned for " + str(banTime) + "minutes by " + clientObject.username) clientObjectInList.socketObject.sendall( self.decEncHelper.stringToBytes( "711" + "[Client/Info] You got banned for " + str(banTime) + "Minutes by " + clientObject.username)) clientObjectInList.socketObject.close() clientObject.socketObject.sendall( self.decEncHelper.stringToBytes( "711[Client/Info] You sucessfully banned: " + clientObjectInList.username + " for " + str(banTime))) elif self.clientManager.ipExists(client): if client == self.clientObject.ip: clientObject.socketObject.sendall( self.decEncHelper.stringToBytes( "711[Client/Info] You can't ban yourself.")) else: for clientObjectInList in self.clientManager.clientList: if clientObjectInList.ip == client: if banTime == 0: self.fileHelper.addClientToBanList( clientObjectInList.ip) self.logHelper.log( "info", clientObjectInList.ip + ":" + str(clientObjectInList.port) + " " + clientObjectInList.username + " got permanantly banned by " + clientObject.username) clientObjectInList.socketObject.sendall( self.decEncHelper.stringToBytes( "711" + "[Client/Info] You got permanantly banned by " + clientObject.username)) clientObjectInList.socketObject.close() clientObject.socketObject.sendall( self.decEncHelper.stringToBytes( "711[Client/Info] You sucessfully banned: " + clientObjectInList.username)) else: currentTimeStamp = datetime.datetime.now( ).timestamp() self.fileHelper.addClientToBanList( clientObjectInList.ip + ":" + str(currentTimeStamp + int(banTime) * 60)) self.logHelper.log( "info", clientObjectInList.ip + ":" + str(clientObjectInList.port) + " " + clientObjectInList.username + " got banned for " + str(banTime) + "minutes by " + clientObject.username) clientObjectInList.socketObject.sendall( self.decEncHelper.stringToBytes( "711" + "[Client/Info] You got banned for " + str(banTime) + "Minutes by " + clientObject.username)) clientObjectInList.socketObject.close() clientObject.socketObject.sendall( self.decEncHelper.stringToBytes( "711[Client/Info] You sucessfully banned: " + clientObjectInList.username + " for " + str(banTime))) else: clientObject.socketObject.sendall( self.decEncHelper.stringToBytes( "711[Client/Info] Username or ip doesnt exists on the server." )) else: clientObject.socketObject.sendall( self.decEncHelper.stringToBytes( "031[Client/Info] You don't have access to that command." )) self.logHelper.log( "info", clientObject.ip + ":" + str(clientObject.port) + " " + clientObject.username + " had no access to that command. Rank:(" + clientObject.rank.strip("\n") + ")") elif requestId == "901": #GUI get all channel with clients channelList = list() for channel in self.channelManager.channelList: memberList = list() for client in channel.clientList: if client.username == clientObject.username: memberList.append(client.username + "(you)") else: memberList.append(client.username) channelList.append(channel.name + ":" + str(memberList) + ";") clientObject.socketObject.sendall( self.decEncHelper.stringToBytes("901" + str(channelList))) else: #any other requestId if len(requestId) == 0: raise SystemExit() else: clientObject.socketObject.sendall( self.decEncHelper.stringToBytes( "401[Client/Error] Unknown request ID")) self.logHelper.log( "error", clientObject.ip + ":" + str(clientObject.port) + " sent unknown request ID") self.handle()
class Server: def importScripts(self): self.decEncHelper = DecodingEncodingHelper() self.channelManager = ChannelManager() self.clientManager = ClientManager() self.inputHandler = InputHandler(self.upTime) self.fileHelper = FileHelper() self.logHelper = LogHelper() def setConfig(self): config = self.fileHelper.getConfig("Server Config") self.port = config.port self.ipV4 = config.ip def inizializeChannel(self): self.welcomeChannel = Channel("Welcome_Channel", "welcome to the server", "No", 0, list()) self.channel1 = Channel("Channel_1", "Description of channel 1", "No", 0, list()) self.channel2 = Channel("Channel_2", "Description of channel 1", "No", 0, list()) self.channel3 = Channel("Channel_3", "Description of channel 1", "No", 0, list()) self.channelManager.addChannel(self.welcomeChannel) self.channelManager.addChannel(self.channel1) self.channelManager.addChannel(self.channel2) self.channelManager.addChannel(self.channel3) def inizializeServer(self): self.server = ServerThread((self.ipV4, self.port), ClientHandler) serverThread = threading.Thread(target=self.server.serve_forever) serverThread.daemon = True serverThread.start() self.logHelper.log("info" ,"Started server (version: " + self.fileHelper.getConfig("Version") + ") on ip: " + self.ipV4 + " port: " + str(self.port)) def askForInput(self): while True: try: command = input() except KeyboardInterrupt: self.logHelper.log("info", "Gracefully stopping server...") if len(self.clientManager.clientList) < 1: self.logHelper.log("info", "Gracefully stopped server") break else: for clientObject in self.clientManager.clientList: clientObject.socketObject.sendall(self.decEncHelper.stringToBytes("403")) self.logHelper.log("info", "Gracefully stopped server") break if str(command).startswith("/"): try: self.inputHandler.handleInput(str(command[1:]).lower()) except IndexError: self.logHelper.log("info", "type /help for a list of commands.") else: self.logHelper.log("info", "Commands always start with (/)") def __init__(self): self.upTime = time.time() #Imports self.importScripts() #Config self.setConfig() #Channel initialization self.inizializeChannel() #Server initializations self.inizializeServer() #Console Input self.askForInput()
class InputHandler: commandList = list() def initializeCommands(self): self.cmdClear = self.createCommand("Clear", "/clear", "NONE", "Clears your interpreter console.") self.cmdHelp = self.createCommand("Help", "/help", "NONE", "Shows a list of available commands.") self.cmdSetName = self.createCommand("SetName", "/setName <Name>", "NAME", "Changes your name to the specified one.") self.cmdListChannel = self.createCommand("ListChannel", "/listChannel", "NONE", "Lists all Channel.") self.cmdChangeChannel = self.createCommand("ChangeChannel", "/changeChannel <CHANNEL NAME>", "ChannelName", "Enter the specified channel.") self.cmdDisconnect = self.createCommand("Disconnect", "/disconnect", "NONE", "Disconnects you from the server.") self.cmdListClients = self.createCommand("ListClients", "/listClients <CHANNEL NAME>", "Channel Name", "Shows you a list of clients connected to the specified channel.") self.cmdKick = self.createCommand("Kick", "/kick <name/ip>", "<NAME/IP>", "Kicks the specified client from the server.") self.cmdBan = self.createCommand("Ban", "/ban <name/ip> <time>", "<NAME/IP> <TIME>", "Bans the specified client for the given amount of time in minutes.") def createCommand(self, name, syntax, arguments, description): command = Command(name, syntax, arguments, description) self.commandList.append(command) return command def __init__(self, output): #Imports self.decEncHelper = DecodingEncodingHelper() self.guiHelper = GUIHelper(output) #Create Commands self.initializeCommands() def handleInput(self, command, clientObject): isCommand = True command = command.split() try: var = command[0] except IndexError: isCommand = False self.guiHelper.printOutput("[Client/Error] type /help for a list of commands") if isCommand: if str(command[0]).lower() == self.cmdClear.name: os.system('cls' if os.name=='nt' else 'clear') elif str(command[0]).lower() == self.cmdHelp.name: self.guiHelper.printOutput("[Client/Info] Commands:") self.guiHelper.printOutput("----------------------------------------------------------") for command in self.commandList: self.guiHelper.printOutput(command.syntax + " : " + command.description) self.guiHelper.printOutput("----------------------------------------------------------") elif str(command[0]).lower() == self.cmdListChannel.name: clientObject.socketObject.sendall(self.decEncHelper.stringToBytes("022")) elif str(command[0]).lower() == self.cmdChangeChannel.name: newChannelName = None try: newChannelName = command[1] except IndexError: self.guiHelper.printOutput("[Client/Error] Syntax: " + self.cmdChangeChannel.syntax) if newChannelName != None: clientObject.channel = newChannelName clientObject.socketObject.sendall(self.decEncHelper.stringToBytes("023" + newChannelName)) time.sleep(0.1) clientObject.socketObject.sendall(self.decEncHelper.stringToBytes("611" + newChannelName)) time.sleep(0.1) clientObject.socketObject.sendall(self.decEncHelper.stringToBytes("901")) elif str(command[0]).lower() == self.cmdSetName.name: newUsername = None try: newUsername = command[1] except IndexError: self.guiHelper.printOutput("[Client/Error] Syntax: " + self.cmdSetName.syntax) if newUsername != None: clientObject.username = newUsername clientObject.socketObject.sendall(self.decEncHelper.stringToBytes("031" + newUsername)) elif str(command[0]).lower() == self.cmdDisconnect.name: clientObject.socketObject.shutdown(1) clientObject.socketObject.close() elif str(command[0]).lower() == self.cmdListClients.name: channel = None try: channel = command[1] except: self.guiHelper.printOutput("[Client/Error] Syntax: " + self.cmdListClients.syntax) if channel != None: clientObject.socketObject.sendall(self.decEncHelper.stringToBytes("611" + channel)) elif str(command[0]).lower() == self.cmdKick.name: client = None try: client = command[1] except: self.guiHelper.printOutput("[Client/Error] Syntax: " + self.cmdKick.syntax) if client != None: clientObject.socketObject.sendall(self.decEncHelper.stringToBytes("411" + client)) elif str(command[0]).lower() == self.cmdBan.name: client = None banTime = None try: client = command[1] banTime = command[2] except: self.guiHelper.printOutput("[Client/Error] Syntax: " + self.cmdBan.syntax) if client != None and banTime != None: clientObject.socketObject.sendall(self.decEncHelper.stringToBytes("711" + client + " " + banTime)) else: self.guiHelper.printOutput("[Client/Error] Unknown command: " + command[0]) self.guiHelper.printOutput("[Client/Error] type /help for a list of commands")
class Client: def importScripts(self): self.decEncHelper = DecodingEncodingHelper() self.inputHandler = InputHandler(self.output) self.fileHelper = FileHelper(self.output) self.guiHelper = GUIHelper(self.output) def setConfig(self): Config = self.fileHelper.getConfig() self.ipV4 = Config.ip self.port = Config.port def inizializeClient(self, username, password): self.clientObject = ClientObject(username, None, self.ipV4, self.port, "Welcome_Channel") self.connected = False self.password = password def button(self): if self.mainWindow.statusButton.text() != "Offline": self.sendInput("/disconnect") self.mainWindow.statusButton.setText("Offline") self.mainWindow.output.clear() self.mainWindow.channelTree.clear() self.connected = False else: data = CustomDialog().getData() if data == ":": self.mainWindow.close() else: data = data.split(":") self.inizializeClient(data[0], data[1]) self.tryConnect() def tryConnect(self): trys = 0 while not self.connected: try: self.clientObject.socketObject = socket.socket( socket.AF_INET, socket.SOCK_STREAM) self.clientObject.socketObject.connect( (self.clientObject.ip, self.clientObject.port)) threading.Thread(target=ServerHandler, args=[self.clientObject, self.mainWindow]).start() self.clientObject.socketObject.sendall( self.decEncHelper.stringToBytes( "011" + self.clientObject.username + ":" + self.password)) self.connected = True except: trys = trys + 1 os.system('cls' if os.name == 'nt' else 'clear') self.guiHelper.printOutput( "[Client/Info] Attempting to connect to server with ip: " + self.clientObject.ip + ". Attempts: " + str(trys)) time.sleep(5) def sendInput(self, message): if self.connected: if str(message).startswith("/"): self.inputHandler.handleInput(str(message[1:]), self.clientObject) else: self.output.append("you: " + message) try: self.clientObject.socketObject.sendall( self.decEncHelper.stringToBytes("001" + message)) except: self.connected = False else: self.guiHelper.printOutput("not connected") def __init__(self, username, password, mainWindow): #Imports self.mainWindow = mainWindow self.mainWindow.statusButton.clicked.connect(self.button) self.output = mainWindow.output self.importScripts() #Config self.setConfig() #Client initializations self.inizializeClient(username, password) #Client trying to establish a connection self.tryConnect()