class Processor(object):
    def __init__(self, prefix, users, logger):
        self.prefix = prefix
        self.ackTime = str(datetime.datetime.now().time())
        self.clientHandler = ClientHandler(users)
        self.logger = logger

    def terminated(self):
        return self.isTerminated

    def getType(self, message):
        return unpack_from('B', message, 8)[0]

    ''' Main method- processing the data, given connection established with the user'''

    def process(self, data, connection):
        """

        :param data:
        :param connection:
        :return:
        """

        current_sender, msg_type, bodyLen = connection, self.getType(
            data), unpack_from('>i', data, 9)[0]

        if self.checkForAuthCode(data) is not 0:
            self.send_to_user(current_sender,
                              NotAuthorizedErrorPacket().build_packet())
            return
        ''' GOT KEEP-ALIVE PACKET'''
        if msg_type == 0x00:
            self.logger.info("Got from client Keep Alive Packet")
            self.clientHandler.handle_keep_alive(current_sender)
            ''' GOT CONNECT PACKET'''
        elif msg_type == 0x01:
            self.logger.info("Got from client CONNECT Packet")
            self.clientHandler.handle_connect(current_sender, bodyLen, data)
            ''' GOT DISCONNECT PACKET'''
        elif msg_type == 0x02:
            self.logger.info("Got from client DISCONNECT Packet")
            self.clientHandler.handle_disconnect(current_sender)
            ''' GOT PUBLIC MESSAGE PACKET'''
        elif msg_type == 0x03:
            self.logger.info("Got from client PUBLIC MESSAGE Packet")
            self.clientHandler.handle_public(current_sender, bodyLen, data)
            ''' GOT PRIVATE MESSAGE PACKET'''
        elif msg_type == 0x04:
            self.logger.info("Got from client PRIVATE MESSAGE Packet")
            self.clientHandler.handle_private(current_sender, bodyLen, data)
            ''' GOT SUDDEN DISCONNECT PACKET'''
        elif msg_type == 0x05:
            self.logger.info("Got from client SUDDEN DISCONNECT Packet")
            self.clientHandler.handle_SuddenDiscconnect(current_sender)
            ''' GOT UNIDENTIFIED PACKET'''
        else:
            self.logger.info("Got from client UNIDENTIFIED Packet")
            self.clientHandler.handle_unidentified(current_sender)

    ''' Checks weather given message is formatted according to protocol'''

    def checkForAuthCode(self, authBuffer):
        msCode = unpack_from('B' * 8, authBuffer, 0)
        return cmp(msCode, self.prefix)