diff --git a/client/gui.py b/client/gui.py index 3baab77..1ee4cc5 100644 --- a/client/gui.py +++ b/client/gui.py @@ -17,7 +17,7 @@ HEADER_LENGTH = 10 class ReceiveWorker(QThread): - messages = pyqtSignal(str, str, str, int) + messages = pyqtSignal(dict) client_list = pyqtSignal(list) error = pyqtSignal() sent_nick = pyqtSignal() @@ -27,6 +27,15 @@ class ReceiveWorker(QThread): self.client = client self.nickname = nickname + def __extract_message(self, data) -> dict: + return { + 'nickname': data['nickname'], + 'message': data['content'], + 'color': data['color'], + 'time': data['time'], + 'id': data['id'] + } + def run(self): while True: try: @@ -48,10 +57,14 @@ class ReceiveWorker(QThread): )) self.sent_nick.emit() elif message['type'] == constants.Types.MESSAGE: - self.messages.emit(message['nickname'], message['content'], message['color'], message['time']) + self.messages.emit(self.__extract_message(message)) elif message['type'] == constants.Types.USER_LIST: self.client_list.emit(message['users']) - except: + elif message['type'] == constants.Types.MESSAGE_HISTORY: + for submessage in message['messages']: + self.messages.emit(self.__extract_message(submessage)) + + except Exception as e: traceback.print_exc() self.error.emit() self.client.close() @@ -80,26 +93,30 @@ class MainWindow(QMainWindow, Ui_MainWindow): # Setup message receiving thread worker self.receiveThread = ReceiveWorker(self.client, self.nickname) self.receiveThread.messages.connect(self.addMessage) - self.receiveThread.client_list.connect(self.updateConnectionsList) + self.receiveThread.client_list.connect(self.update_connections) self.receiveThread.start() self.connectionsListTimer = QTimer() - self.connectionsListTimer.timeout.connect(self.refreshConnectionsList) + self.connectionsListTimer.timeout.connect(self.refresh_connections) self.connectionsListTimer.start(1000 * 30) - self.receiveThread.sent_nick.connect(self.refreshConnectionsList) + self.receiveThread.sent_nick.connect(self._ready) self.messageBox.setPlaceholderText('Type your message here...') self.messageBox.installEventFilter(self) self.messages = [] + def _ready(self): + self.refresh_connections() + self.get_message_history() + def closeEvent(self, event): if self.nicknameDialog: self.closed = True self.nicknameDialog.close() event.accept() # let the window close - def eventFilter(self, obj, event): + def eventFilter(self, obj, event) -> bool: if event.type() == QEvent.KeyPress and obj is self.messageBox: if event.key() == Qt.Key_Return and self.messageBox.hasFocus(): self.sendMessage(self.messageBox.toPlainText()) @@ -111,9 +128,9 @@ class MainWindow(QMainWindow, Ui_MainWindow): return True return super().eventFilter(obj, event) - def addMessage(self, nickname: str, message: str, color: str, time: int) -> None: - self.messages.append([nickname, message, color, time]) - self.messageHistory.append(f'<{nickname}> {message}') + def addMessage(self, message: dict) -> None: + self.messages.append(message) + self.messageHistory.append(f'<{message["nickname"]}> {message["message"]}') def sendMessage(self, message: str) -> None: message = message.strip() @@ -125,7 +142,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): } )) - def refreshConnectionsList(self): + def refresh_connections(self) -> None: self.client.send(helpers.prepare_json( { 'type': constants.Types.REQUEST, @@ -133,7 +150,14 @@ class MainWindow(QMainWindow, Ui_MainWindow): } )) - def updateConnectionsList(self, users): - self.connectionsList.clear() + def get_message_history(self) -> None: + self.client.send(helpers.prepare_json( + { + 'type': constants.Types.REQUEST, + 'request': constants.Requests.GET_MESSAGE_HISTORY + } + )) + def update_connections(self, users): + self.connectionsList.clear() self.connectionsList.addItems([user['nickname'] for user in users])