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.')
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('<','<').replace('>', '>').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(' ', ' ') # 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(' ', ' ') 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;}')