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):
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'&lt;<span style="color: {color}">{nickname}</span>&gt; {message}')
def addMessage(self, message: dict) -> None:
self.messages.append(message)
self.messageHistory.append(f'&lt;<span style="color: {message["color"]}">{message["nickname"]}</span>&gt; {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])