Example #1
0
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        # Logger
        self.logger = Logger('Client', onlyErrors=False)

        # Loading files for gui
        self.ui = uic.loadUi('gui/ui/main.ui', self)
        self.notify = QtGui.QSound('gui/sound/notify.wav')
        self.red = QtGui.QIcon('gui/icon/red.png')
        self.green = QtGui.QIcon('gui/icon/green.png')

        # Connecting triggers to functions
        self.ui.sendButton.clicked.connect(self.handleInput)
        self.ui.textInput.returnPressed.connect(self.handleInput)
        self.ui.actionConnect.triggered.connect(self.startToConnect)
        self.ui.actionDisconnect.triggered.connect(self.disconnect)
        self.ui.actionExit.triggered.connect(self.shutdown)
        self.ui.actionHelp.triggered.connect(self.printHelp)
        self.ui.actionGui.triggered.connect(self.openGuiOptions)
        self.ui.actionGenerate_RSA_Keys.triggered.connect(self.generateRSAKey)
        self.ui.actionLoad_RSA_Keys.triggered.connect(self.loadRSAKey)

        # GUI
        self.font = self.chatHistory.currentFont()
        self.theme = 0
        self.link_color = '#0000ff'
        self.server_color = '#ff0000'
        self.highlight_color = '#ff4500'
        self.hide_color = '#999999'
        self.preamble_color = '#000000'
        self.generateCSS()

        # Formating
        self.timestamps = True
        self.seconds = False
        self.tokens = False
        self.formatUrls = True
        
        # Network and Encryption
        self.clientlist = None
        self.listener = ServerListener(None, self)
        self.listener.running = False
        self.rsa_key = None

        # Whispering
        self.ui.userList.clicked.connect(self.handleWhisper)
        self.whispering = False
        self.whisper_dest = None

        # QT-Signals
        self.connect(self.listener, QtCore.SIGNAL('update'), self.addChatHistory)
        self.connect(self.listener, QtCore.SIGNAL('updateUsers'), self.updateUserList)
        self.connect(self.listener, QtCore.SIGNAL('appendServerMessage'), self.appendServerMessage)
        self.connect(self.listener, QtCore.SIGNAL('appendNormalMessage'), self.appendNormalMessage)

        self.logger.log('Frame initialized.')
Example #2
0
class Frame(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        # Logger
        self.logger = Logger('Client', onlyErrors=False)

        # Loading files for gui
        self.ui = uic.loadUi('gui/ui/main.ui', self)
        self.notify = QtGui.QSound('gui/sound/notify.wav')
        self.red = QtGui.QIcon('gui/icon/red.png')
        self.green = QtGui.QIcon('gui/icon/green.png')

        # Connecting triggers to functions
        self.ui.sendButton.clicked.connect(self.handleInput)
        self.ui.textInput.returnPressed.connect(self.handleInput)
        self.ui.actionConnect.triggered.connect(self.startToConnect)
        self.ui.actionDisconnect.triggered.connect(self.disconnect)
        self.ui.actionExit.triggered.connect(self.shutdown)
        self.ui.actionHelp.triggered.connect(self.printHelp)
        self.ui.actionGui.triggered.connect(self.openGuiOptions)
        self.ui.actionGenerate_RSA_Keys.triggered.connect(self.generateRSAKey)
        self.ui.actionLoad_RSA_Keys.triggered.connect(self.loadRSAKey)

        # GUI
        self.font = self.chatHistory.currentFont()
        self.theme = 0
        self.link_color = '#0000ff'
        self.server_color = '#ff0000'
        self.highlight_color = '#ff4500'
        self.hide_color = '#999999'
        self.preamble_color = '#000000'
        self.generateCSS()

        # Formating
        self.timestamps = True
        self.seconds = False
        self.tokens = False
        self.formatUrls = True
        
        # Network and Encryption
        self.clientlist = None
        self.listener = ServerListener(None, self)
        self.listener.running = False
        self.rsa_key = None

        # Whispering
        self.ui.userList.clicked.connect(self.handleWhisper)
        self.whispering = False
        self.whisper_dest = None

        # QT-Signals
        self.connect(self.listener, QtCore.SIGNAL('update'), self.addChatHistory)
        self.connect(self.listener, QtCore.SIGNAL('updateUsers'), self.updateUserList)
        self.connect(self.listener, QtCore.SIGNAL('appendServerMessage'), self.appendServerMessage)
        self.connect(self.listener, QtCore.SIGNAL('appendNormalMessage'), self.appendNormalMessage)

        self.logger.log('Frame initialized.')

    def handleInput(self):
        msg = self.textInput.text()
        self.logger.log('handleInput: ' + msg)
        if msg != '':
            msg = msg.strip()
            self.textInput.setText('')
            if self.whispering:
                msg = msg[msg.find(':')+1:].strip()
                self.listener.whisper(self.whisper_dest, msg)
                self.whispering = False
                self.whisper_dest = None
                return
            if msg == '/quit' or msg == '/exit':
                self.shutdown()
            elif msg == '/connect':
                self.startToConnect()
            elif msg == '/disconnect':
                self.disconnect()
            elif msg == '/help':
                self.printHelp()
            elif msg == '/afk':
                self.listener.sendAFKReport()
            elif msg == '/pong':
                self.listener.sendPong()
            elif msg == '/info':
                self.printInfo()
            elif msg[:3] == '/to':
                msg = msg.split(' ')
                self.listener.whisper(msg[1], msg[2])
            else:
                if self.listener.server is None:
                    self.addChatHistory('Not connected to a server. Try "/connect".')
                else:
                    self.listener.send(msg)

    def handleWhisper(self, list_index):
        name = list_index.data()
        if self.tokens:
            name = name[:-35]
        self.whispering = True
        self.whisper_dest = name
        self.textInput.setText('To ' + name + ': ')

    def addChatHistory(self, data, tag='font'):
        self.chatHistory.moveCursor(QtGui.QTextCursor.End)
        if type(data) is str:
            name = ''
            text = data
        else:
            name = data[0] + ': '
            text = data[1]
            if data[2]:
                tag = 'hm'
        self.logger.log('Added: ' + text)
        text = self.formatForHTML(text)
        timestamp = ''
        if self.timestamps:
            timestamp = strftime('%X')
            if not self.seconds:
                timestamp = timestamp[:5]
            timestamp += ' - '
        if not text.startswith('/me'):
            self.chatHistory.insertHtml('<br/><pa>' + timestamp + name + '</pa><' + tag + '>' + text + '</' + tag + '>')
        else:
            self.chatHistory.insertHtml('<br/><pa>' + timestamp + name[:-2] + text[3:] + '</pa>')

        if not self.isActiveWindow() and self.listener.server is not None:
            self.notify.play()
        self.chatHistory.moveCursor(QtGui.QTextCursor.End)

    def updateUserList(self, clientlist=None):
        if clientlist is not None:
            self.clientlist = clientlist
        else:
            clientlist = self.clientlist
        self.userList.clear()
        if clientlist is None:
            return
        for token in clientlist.keys():
            user = clientlist[token][0]
            if self.tokens:
                user += ' [' + toHex(token) + ']'
            if clientlist[token][2]:
                icon = self.red
            else:
                icon = self.green
            self.userList.addItem(QtGui.QListWidgetItem(icon, user))

    def appendServerMessage(self, text):
        self.addChatHistory(text, 'sm')

    def appendNormalMessage(self, text):
        self.addChatHistory(text, 'nm')

    def disconnect(self):
        if self.listener.server is None:
            self.addChatHistory('Not connected to a server. Try "/connect".')
        else:
            self.listener.disconnect()
            self.appendNormalMessage('Disconnected from {}'.format(self.listener.server_name))
            self.userList.clear()

    def startToConnect(self):
        connect_dialog = ConnectFrame(self)
        connect_dialog.show()

    def openGuiOptions(self):
        options_dialog = GuiOptionsFrame(self)
        options_dialog.show()

    def shutdown(self):
        self.logger.log('Shutting down Frame.')
        self.listener.disconnect()
        self.logger.close()
        self.close()
	
    def formatForHTML(self, msg):
        #
        # The text will be interpreted as HTML-code. This is problematic
        # due to the fact that users could insert code destroying the 
        # formatting or worse. So '<' and '>' have to be replaced by
        # placeholders so that no tags can be set.
        #
        msg = msg.replace('<','&lt;').replace('>', '&gt;').replace('\\\\', '<br/>').strip()
        #
        # Checking wether any hyperlinks are present in the message.
        # If so we have to format the links for HTML. The right scheme
        # for HTML is '<a href=' URL '> Text representing the URL </a>'.
        # Since URLs can become quiet lengthy there is an option for
        # shortening them.
        # It is also important to keep in mind that 'https' is also a
        # valid scheme that is callable in the browser. The formated
        # message has to be checked for both schemes.
        #
        if 'http://' not in msg and 'https://' not in msg:
            return msg.replace(' ', '&nbsp;')
        # Split by all string that start with 'http://' or 'https://' and end
        # with a whitespace
        parts = re.split('(https?:\/\/\S+)', msg)
        new_msg = ''
        for part in parts:
            part = part.replace(' ', '&nbsp;')
            if part.startswith('http://') or part.startswith('https://'):
                if self.formatUrls:
                    link = urlparse(part).netloc
                else:
                    link = part
                part = '<a href="{}">{}</a>'.format(part, link)
            new_msg += part
        return new_msg

    def printHelp(self):
        self.chatHistory.moveCursor(QtGui.QTextCursor.End)
        self.chatHistory.insertHtml('<br/><font>/help - This prompt<br/> \
                                    /quit - Quit the program<br/> \
                                    /connect - Connect to a server<br/> \
                                    /disconnect - Disconnect from a server<br/> \
                                    /afk - Report that you are going away from keyboard or came back<br/> \
                                    /info - Get information on the server<br/> \
                                    /to Name Message - Whisper a message to another user<br/> \
                                    Of course you can also use the buttons for easier control.</font>')
        self.chatHistory.moveCursor(QtGui.QTextCursor.End)

    def printInfo(self):
        self.chatHistory.moveCursor(QtGui.QTextCursor.End)
        self.chatHistory.insertHtml('<br/><font>=== SERVER-INFO ===<br/> \
                                    Name: ' + self.listener.server_name +  '<br/> \
                                    IP: ' + self.listener.server.getsockname()[0] + '<br/> \
                                    Token: ' + toHex(self.listener.server_id) + '</font>')
        self.chatHistory.moveCursor(QtGui.QTextCursor.End)
    def generateRSAKey(self):
        generate_dialog = RSAManager(self, False)
        generate_dialog.show()

    def loadRSAKey(self):
        load_dialog = RSAManager(self, True)
        load_dialog.show()

    def generateCSS(self):
        self.chatHistory.document().setDefaultStyleSheet('  a {color:' + self.link_color + ';} \
                                                            sm {color:' + self.server_color + ';} \
                                                            nm {color:' + self.highlight_color + ';} \
                                                            hm {color:' + self.hide_color + ';} \
                                                            pa {color:' + self.preamble_color + ';} \
                                                            * {font-size:11pt;}')