示例#1
0
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()
示例#2
0
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")
示例#3
0
class InputHandler:

    CommandList = dict()

    fileHelper = None
    logHelper = None

    clients = None

    #helper
    def BytesToString(self, bytes):
        return str(bytes, "utf-8")

    def StringToBytes(self, string):
        return bytes(string, "utf-8")

    def __init__(self):
        self.fileHelper = FileHelper()
        self.logHelper = LoggingHelper()
        self.clients = Clients()

    def handleInput(self, command):
        command = command.split()
        if command[0] == "clear":
            os.system('cls' if os.name == 'nt' else 'clear')
        elif command[0] == "listClients":
            if len(self.clients.clientList) < 1:
                self.logHelper.printAndWriteServerLog(
                    "[Server/Error] No clients connected")
            else:
                self.logHelper.printAndWriteServerLog(
                    "[Server/Info] Connected clients:")
                for client in self.clients.clientList:
                    for key in client.keys():
                        self.logHelper.printAndWriteServerLog(
                            "[Server/Info] " + str(key.getpeername()) + " : " +
                            str(client[key]))
        elif command[0] == "kick":
            try:
                user = command[1]
                if len(self.clients.clientList) < 1:
                    self.logHelper.printAndWriteServerLog(
                        "[Server/Error] No clients connected")
                else:
                    for client in self.clients.clientList:
                        for key in client.keys():
                            if key.getpeername()[0] == user:
                                self.logHelper.printAndWriteServerLog(
                                    "[Server/Info] " + user + " : " +
                                    client[key] + " got kicked")
                                key.sendall(
                                    self.StringToBytes(
                                        "402" +
                                        "[Client/Info] You got kicked by the console"
                                    ))
                                key.close()
                            else:
                                self.logHelper.printAndWriteServerLog(
                                    "[Server/Error] No client with ip: " +
                                    user)
            except IndexError:
                self.logHelper.printAndWriteServerLog(
                    "[Server/Info] /kick <client>")
        elif command[0] == "ban":
            try:
                time = 0
                user = command[1]
                permanantly = True
                try:
                    time = command[2]
                except:
                    permanantly = True
                if int(time) > 0:
                    permanantly = False
                if len(self.clients.clientList) < 1:
                    self.logHelper.printAndWriteServerLog(
                        "[Server/Error] No clients connected")
                else:
                    for client in self.clients.clientList:
                        for key in client.keys():
                            if key.getpeername()[0] == user:
                                if permanantly:
                                    self.fileHelper.addClientToBanList(user)
                                    self.logHelper.printAndWriteServerLog(
                                        "[Server/Info] " + user + " : " +
                                        client[key] +
                                        " got permanantly banned")
                                    key.sendall(
                                        self.StringToBytes(
                                            "405" +
                                            "[Client/Info] You got permanantly banned by the console"
                                        ))
                                    key.close()
                                else:
                                    self.fileHelper.addClientToBanList(user +
                                                                       ":" +
                                                                       time)
                                    self.logHelper.printAndWriteServerLog(
                                        "[Server/Info] " + user + " : " +
                                        client[key] + " got banned for " +
                                        str(time) + "minutes")
                                    key.sendall(
                                        self.StringToBytes(
                                            "405" +
                                            "[Client/Info] You got banned for "
                                            + str(time) +
                                            "Minutes by the console"))
                                    key.close()
                            else:
                                self.logHelper.printAndWriteServerLog(
                                    "[Server/Error] No client with ip: " +
                                    user)
            except IndexError:
                self.logHelper.printAndWriteServerLog(
                    "[Server/Info] /ban <client> <time>")
        else:
            self.logHelper.printAndWriteServerLog(
                "[Server/Error] Unknown command: (" + str(command) + ")")
            self.logHelper.printAndWriteServerLog(
                "[Server/Error] type /help for a list of commands")