improve message data extraction and recording, improve connection refreshing/message history processing after nickname sent

This commit is contained in:
Xevion
2021-01-21 15:51:08 -06:00
parent 25b1f9f92a
commit aa0b37cdaf

View File

@@ -17,7 +17,7 @@ HEADER_LENGTH = 10
class ReceiveWorker(QThread): class ReceiveWorker(QThread):
messages = pyqtSignal(str, str, str, int) messages = pyqtSignal(dict)
client_list = pyqtSignal(list) client_list = pyqtSignal(list)
error = pyqtSignal() error = pyqtSignal()
sent_nick = pyqtSignal() sent_nick = pyqtSignal()
@@ -27,6 +27,15 @@ class ReceiveWorker(QThread):
self.client = client self.client = client
self.nickname = nickname 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): def run(self):
while True: while True:
try: try:
@@ -48,10 +57,14 @@ class ReceiveWorker(QThread):
)) ))
self.sent_nick.emit() self.sent_nick.emit()
elif message['type'] == constants.Types.MESSAGE: 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: elif message['type'] == constants.Types.USER_LIST:
self.client_list.emit(message['users']) 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() traceback.print_exc()
self.error.emit() self.error.emit()
self.client.close() self.client.close()
@@ -80,26 +93,30 @@ class MainWindow(QMainWindow, Ui_MainWindow):
# Setup message receiving thread worker # Setup message receiving thread worker
self.receiveThread = ReceiveWorker(self.client, self.nickname) self.receiveThread = ReceiveWorker(self.client, self.nickname)
self.receiveThread.messages.connect(self.addMessage) 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.receiveThread.start()
self.connectionsListTimer = QTimer() self.connectionsListTimer = QTimer()
self.connectionsListTimer.timeout.connect(self.refreshConnectionsList) self.connectionsListTimer.timeout.connect(self.refresh_connections)
self.connectionsListTimer.start(1000 * 30) 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.setPlaceholderText('Type your message here...')
self.messageBox.installEventFilter(self) self.messageBox.installEventFilter(self)
self.messages = [] self.messages = []
def _ready(self):
self.refresh_connections()
self.get_message_history()
def closeEvent(self, event): def closeEvent(self, event):
if self.nicknameDialog: if self.nicknameDialog:
self.closed = True self.closed = True
self.nicknameDialog.close() self.nicknameDialog.close()
event.accept() # let the window 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.type() == QEvent.KeyPress and obj is self.messageBox:
if event.key() == Qt.Key_Return and self.messageBox.hasFocus(): if event.key() == Qt.Key_Return and self.messageBox.hasFocus():
self.sendMessage(self.messageBox.toPlainText()) self.sendMessage(self.messageBox.toPlainText())
@@ -111,9 +128,9 @@ class MainWindow(QMainWindow, Ui_MainWindow):
return True return True
return super().eventFilter(obj, event) return super().eventFilter(obj, event)
def addMessage(self, nickname: str, message: str, color: str, time: int) -> None: def addMessage(self, message: dict) -> None:
self.messages.append([nickname, message, color, time]) self.messages.append(message)
self.messageHistory.append(f'&lt;<span style="color: {color}">{nickname}</span>&gt; {message}') self.messageHistory.append(f'&lt;<span style="color: {message["color"]}">{message["nickname"]}</span>&gt; {message["message"]}')
def sendMessage(self, message: str) -> None: def sendMessage(self, message: str) -> None:
message = message.strip() 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( self.client.send(helpers.prepare_json(
{ {
'type': constants.Types.REQUEST, 'type': constants.Types.REQUEST,
@@ -133,7 +150,14 @@ class MainWindow(QMainWindow, Ui_MainWindow):
} }
)) ))
def updateConnectionsList(self, users): def get_message_history(self) -> None:
self.connectionsList.clear() 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]) self.connectionsList.addItems([user['nickname'] for user in users])