mirror of
https://github.com/Xevion/tcp-chat.git
synced 2025-12-06 13:16:42 -06:00
improve message data extraction and recording, improve connection refreshing/message history processing after nickname sent
This commit is contained in:
@@ -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'<<span style="color: {color}">{nickname}</span>> {message}')
|
||||
def addMessage(self, message: dict) -> None:
|
||||
self.messages.append(message)
|
||||
self.messageHistory.append(f'<<span style="color: {message["color"]}">{message["nickname"]}</span>> {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])
|
||||
|
||||
Reference in New Issue
Block a user