mirror of
https://github.com/Xevion/tcp-chat.git
synced 2025-12-06 15:16:43 -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):
|
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'<<span style="color: {color}">{nickname}</span>> {message}')
|
self.messageHistory.append(f'<<span style="color: {message["color"]}">{message["nickname"]}</span>> {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])
|
||||||
|
|||||||
Reference in New Issue
Block a user