From 5a07c144a15e6353fe04038f52e3c1e9a39dfc8d Mon Sep 17 00:00:00 2001 From: semenov Date: Thu, 31 Jul 2025 10:21:47 +0300 Subject: [PATCH] ref: segregate chat sytem --- DOCS/ChatSystem.md | 34 ++ DOCS/MainScheme.md | 444 ++++++++++++++---- .../connectorToServer/Core/sendsystem.cpp | 8 + .../connectorToServer/Core/sendsystem.h | 1 + .../connectorToServer/Core/tools.h | 1 + .../connectorToServer/connectortoserver.cpp | 5 + .../connectorToServer/connectortoserver.h | 2 + .../instructorsandtraineeswidget.cpp | 1 - .../messanger/messangerwidget.cpp | 40 +- .../messanger/messangerwidget.h | 4 +- .../messanger/tabdialogmessenger.cpp | 6 +- .../messanger/tabdialogmessenger.h | 8 +- ServerLMS/CMakeLists.txt | 2 + ServerLMS/Data/typesDataServerClient.h | 8 + ServerLMS/Systems/Parsers/processparser.cpp | 4 +- ServerLMS/Systems/chatsystem.cpp | 83 ++++ ServerLMS/Systems/chatsystem.h | 27 ++ ServerLMS/Systems/commonclienthandler.cpp | 19 - ServerLMS/Systems/commonclienthandler.h | 2 +- ServerLMS/Systems/processingsystem.cpp | 10 +- ServerLMS/Systems/processingsystem.h | 8 +- ServerLMS/Systems/recognizesystem.cpp | 5 - ServerLMS/serverlmswidget.cpp | 4 +- ServerLMS/serverlmswidget.h | 3 + 24 files changed, 585 insertions(+), 144 deletions(-) create mode 100644 DOCS/ChatSystem.md create mode 100644 ServerLMS/Systems/chatsystem.cpp create mode 100644 ServerLMS/Systems/chatsystem.h diff --git a/DOCS/ChatSystem.md b/DOCS/ChatSystem.md new file mode 100644 index 0000000..01f7808 --- /dev/null +++ b/DOCS/ChatSystem.md @@ -0,0 +1,34 @@ +--- + +excalidraw-plugin: parsed +tags: [excalidraw] + +--- +==⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠== You can decompress Drawing data with the command palette: 'Decompress current Excalidraw file'. For more info check in plugin settings under 'Saving' + + +# Excalidraw Data + +## Text Elements +Отправка ^yf1UxnG5 + +%% +## Drawing +```compressed-json +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 +``` +%% \ No newline at end of file diff --git a/DOCS/MainScheme.md b/DOCS/MainScheme.md index 184c151..3e7c193 100644 --- a/DOCS/MainScheme.md +++ b/DOCS/MainScheme.md @@ -80,7 +80,7 @@ Mainthread: *processingSystem *dataParser *MultiThreadServer -* commonClientHandler +*commonClientHandler ^ite9vjus @@ -175,6 +175,100 @@ ConnectionThread: *TaskPreparation *FIMTaskWidget ^O3pqGffr +*chatSystem ^b7EqD2zH + +*processParser ^QEHpQT3C + +Порядок приема! ^IhrFmEwa + +ClientHandler ^hA67NX92 + +пришел пакет ^vwSug0iv + +recognizeSystem ^gYoRaFjM + +signal ^s3BggWax + +PacketType ^eiUwEZk1 + +TYPE_QT ^bzVkNpgQ + +TYPE_UNITY ^lkF2Hfrk + +Client ^cZL9Lm6G + +TYPE_COMMAND ^c2enziXT + +TYPE_UPDATE ^aQlbZQfR + +TYPE_CHECKVERSION ^JjIbDSjq + +TYPE_XMLANSWER ^U6aCFgOm + +TYPE_BIGXML ^kIrvUW3G + +TYPE_FOLDER ^OaoJWB2v + +TYPE_FILESIZE ^jjh2X7VX + +TYPE_FILE ^kz1hpduO + +TYPE_FINISH ^DPK0X3mc + +CHANGE_DATA_VERSION ^hD9JlNEL + +COPY_VERSION ^Kj1GcL4q + +DELETE_DATA_VERSION ^R6Jr1xck + +TYPE_DISABLE ^FqZC4poj + +? ^kS0XE2js + +SendSystem ^d1FGddrv + +UpdateController ^O98uEJQE + +signal ^1sdwEl6p + +signal ^XbE1h3aA + +IO ^RoEr0kzs + +continue ^eTnS6u7E + +IO ^qfdbTB5d + +signal ^7zjZjI4t + +UpdateController ^97Le7A78 + +signal ^6OX2J6Ot + +UpdateController ^AECBhhHd + +signal ^dySrkXCr + +UpdateController ^ZeVz0UiF + +signal ^21vfbgpr + +UpdateController ^SlSJmLFk + +clientHandler ^vuFNvZ7S + +ProcessParser ^8cdlwzg0 + +ProcessingSystem ^sQJhZ7It + +ClientHandler ^IEdXlIQV + +send ^CUe8xVmm + +TYPE_COMMAND ^Qljc4T07 + +TYPE_DISABLE ^IIrBIFHt + %% ## Drawing ```compressed-json @@ -330,160 +424,352 @@ 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= +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 ``` %% \ No newline at end of file diff --git a/InstructorsAndTrainees/connectorToServer/Core/sendsystem.cpp b/InstructorsAndTrainees/connectorToServer/Core/sendsystem.cpp index c39f12f..998b50e 100644 --- a/InstructorsAndTrainees/connectorToServer/Core/sendsystem.cpp +++ b/InstructorsAndTrainees/connectorToServer/Core/sendsystem.cpp @@ -139,6 +139,14 @@ void SendSystem::sendChangeVersion(StreamingVersionData *streamingVersion) socket->waitForReadyRead(100); } +void SendSystem::sendOldMessages() +{ + QDataStream stream(socket); + stream.setVersion(QDataStream::Qt_DefaultCompiledVersion); + stream << PacketType::TYPE_GET_OLD_MESSAGES; + socket->waitForReadyRead(100); +} + void SendSystem::sendDeleteVersion(StreamingVersionData *streamingVersion) { QDataStream stream(socket); diff --git a/InstructorsAndTrainees/connectorToServer/Core/sendsystem.h b/InstructorsAndTrainees/connectorToServer/Core/sendsystem.h index 924b411..1b56898 100644 --- a/InstructorsAndTrainees/connectorToServer/Core/sendsystem.h +++ b/InstructorsAndTrainees/connectorToServer/Core/sendsystem.h @@ -27,6 +27,7 @@ public: void sendCopyVersion(QString versionName); void sendPacketType(PacketType packetType); + void sendOldMessages(); signals: void sigSend(); QByteArray sigGetXmlAnswer(QString); diff --git a/InstructorsAndTrainees/connectorToServer/Core/tools.h b/InstructorsAndTrainees/connectorToServer/Core/tools.h index 30ef3b3..cf0c29d 100644 --- a/InstructorsAndTrainees/connectorToServer/Core/tools.h +++ b/InstructorsAndTrainees/connectorToServer/Core/tools.h @@ -35,6 +35,7 @@ enum PacketType{ TYPE_QT = 9, TYPE_DISABLE = 11, TYPE_CHECKVERSION = 13, + TYPE_GET_OLD_MESSAGES = 22, TYPE_XMLANSWER_MESSAGE_FOR_GUI = 90, diff --git a/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp b/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp index 5c082b1..34160bc 100644 --- a/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp +++ b/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp @@ -471,3 +471,8 @@ void ConnectorToServer::clearListModelDB() listTaskFimArray.clear(); listTaskAmmArray.clear(); } + +SendSystem *ConnectorToServer::getSendSystem() const +{ + return sendSystem; +} diff --git a/InstructorsAndTrainees/connectorToServer/connectortoserver.h b/InstructorsAndTrainees/connectorToServer/connectortoserver.h index 8429372..254bf5c 100644 --- a/InstructorsAndTrainees/connectorToServer/connectortoserver.h +++ b/InstructorsAndTrainees/connectorToServer/connectortoserver.h @@ -67,6 +67,8 @@ public: ServerSettings getServerSettings(); bool getIsConnected(); + SendSystem *getSendSystem() const; + public slots: void slot_AnswerQueryToDB_ListInstructors(QList listInstructors); void slot_AnswerQueryToDB_ListGroups(QList listGroups); diff --git a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp index 0d08620..0b95077 100644 --- a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp +++ b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp @@ -218,7 +218,6 @@ void InstructorsAndTraineesWidget::checkLoginResult(ServerAuthorization *serverA connectorToServer->sendQueryTasksXML("fim"); connectorToServer->sendQueryTasksXML("amm"); - messangerWidget->initialize(idInstructorLoggedInLocal); //QMessageBox::information(this, tr("Instructor authorization"), tr("Successfully!")); } else diff --git a/InstructorsAndTrainees/messanger/messangerwidget.cpp b/InstructorsAndTrainees/messanger/messangerwidget.cpp index 0e36d1e..de1e2b9 100644 --- a/InstructorsAndTrainees/messanger/messangerwidget.cpp +++ b/InstructorsAndTrainees/messanger/messangerwidget.cpp @@ -11,8 +11,8 @@ MessangerWidget::MessangerWidget(QWidget *parent) : QWidget(parent), ui(new Ui::MessangerWidget), - currLogin(""), - currId("") + selectedUserLogin(""), + selectedUserId("") { ui->setupUi(this); @@ -38,7 +38,7 @@ void MessangerWidget::addMsgFromClient(Trainee trainee, QString text) QString login = trainee.getLogin(); foreach(TabDialogMessenger* tabDialog, listTabDialogMessenger) {//Есть такой - if(tabDialog->getLogin() == trainee.getLogin()) + if(tabDialog->getUserLogin() == trainee.getLogin()) { //Добавляем в существующую вкладку ui->tabWidget->setCurrentIndex(getIndexTab(login)); @@ -46,8 +46,8 @@ void MessangerWidget::addMsgFromClient(Trainee trainee, QString text) //Делаем ее текущей ui->tabWidget->setCurrentIndex(getIndexTab(login)); - currLogin = login; - currId = QString::number(trainee.getID()); + selectedUserLogin = login; + selectedUserId = QString::number(trainee.getID()); return; } } @@ -62,9 +62,9 @@ void MessangerWidget::addTabDialogMessenger(Trainee trainee) { if(listTabDialogMessenger.count() == 0) {//Самая первая вкладка, делаем ее активной - currLogin = trainee.getLogin(); - currId = QString::number(trainee.getID()); - emit signal_tabMessengerChanged(currLogin); + selectedUserLogin = trainee.getLogin(); + selectedUserId = QString::number(trainee.getID()); + emit signal_tabMessengerChanged(selectedUserLogin); ui->btnSend->setEnabled(true); ui->editMsg->setEnabled(true); } @@ -72,7 +72,7 @@ void MessangerWidget::addTabDialogMessenger(Trainee trainee) //Проверяем наличие диалога с этим клиентом foreach(TabDialogMessenger* dialogMsg, listTabDialogMessenger) { - if(dialogMsg->getLogin() == trainee.getLogin()) + if(dialogMsg->getUserLogin() == trainee.getLogin()) {//Диалог для этого клиента уже существует //Обновляем статус залогинивания if(trainee.getLoggedIn()) @@ -86,7 +86,7 @@ void MessangerWidget::addTabDialogMessenger(Trainee trainee) //Диалога для этого клиента еще не существует //Помещаем новый диалог в список диалогов - TabDialogMessenger* tabDialog = new TabDialogMessenger(0 /*TODO доделать передачу реального ID*/, trainee.getLogin(), this); + TabDialogMessenger* tabDialog = new TabDialogMessenger(trainee.getLogin(),QString::number(trainee.getID()), this); listTabDialogMessenger.append(tabDialog); //Добавляем новую вкладку диалога @@ -103,7 +103,7 @@ void MessangerWidget::actualizationTabsDialogMessenger() { foreach(TabDialogMessenger* tabDialog, listTabDialogMessenger) { - QString login = tabDialog->getLogin(); + QString login = tabDialog->getUserLogin(); bool exist = false; for(Trainee trainee : listTrainees) @@ -136,7 +136,7 @@ int MessangerWidget::getIndexTab(QString login) for(int index = 0; index < ui->tabWidget->count(); index++) { TabDialogMessenger* tabDialogMessenger = static_cast(ui->tabWidget->widget(index)); - if(tabDialogMessenger->getLogin() == login) + if(tabDialogMessenger->getUserLogin() == login) return index; } return -1; @@ -154,19 +154,19 @@ void MessangerWidget::on_btnSend_clicked() { QString text = ui->editMsg->toPlainText(); - emit signal_sendMessage(currClientId, currId, text); + emit signal_sendMessage(currClientId, selectedUserId, text); ui->editMsg->clear(); //Ищем нужный диалог foreach(TabDialogMessenger* tabDialog, listTabDialogMessenger) { - if(tabDialog->getLogin() == currLogin) + if(tabDialog->getUserLogin() == selectedUserLogin) { //Добавляем в существующую вкладку tabDialog->addMsgWidgetLocal(text); //Делаем ее активной - ui->tabWidget->setCurrentIndex(getIndexTab(currLogin)); + ui->tabWidget->setCurrentIndex(getIndexTab(selectedUserLogin)); return; } @@ -178,10 +178,12 @@ void MessangerWidget::on_tabWidget_currentChanged(int index) //Ищем нужный диалог foreach(TabDialogMessenger* tabDialog, listTabDialogMessenger) { - if(getIndexTab(tabDialog->getLogin()) == index) + + if(getIndexTab(tabDialog->getUserLogin()) == index) { - currLogin = tabDialog->getLogin(); - emit signal_tabMessengerChanged(currLogin); + selectedUserLogin = tabDialog->getUserLogin(); + selectedUserId = tabDialog->getUserId(); + emit signal_tabMessengerChanged(selectedUserLogin); return; } } @@ -192,7 +194,7 @@ void MessangerWidget::slot_traineeSelected(QString login) //Ищем нужный диалог foreach(TabDialogMessenger* tabDialog, listTabDialogMessenger) { - if(tabDialog->getLogin() == login) + if(tabDialog->getUserLogin() == login) { //Активируем нужную вкладку ui->tabWidget->setCurrentIndex(getIndexTab(login)); diff --git a/InstructorsAndTrainees/messanger/messangerwidget.h b/InstructorsAndTrainees/messanger/messangerwidget.h index 620f6ff..f0c5ea9 100644 --- a/InstructorsAndTrainees/messanger/messangerwidget.h +++ b/InstructorsAndTrainees/messanger/messangerwidget.h @@ -67,8 +67,8 @@ private: Ui::MessangerWidget *ui; QList listTabDialogMessenger; QList listTrainees; - QString currLogin; //Логин клиента текущего диалога - QString currId; //id клиента текущего диалога + QString selectedUserLogin; //Логин клиента текущего диалога + QString selectedUserId; //id клиента текущего диалога QString currClientId; //id этого клиента QTranslator qtLanguageTranslator; }; diff --git a/InstructorsAndTrainees/messanger/tabdialogmessenger.cpp b/InstructorsAndTrainees/messanger/tabdialogmessenger.cpp index 9ceaf31..6bf3cd7 100644 --- a/InstructorsAndTrainees/messanger/tabdialogmessenger.cpp +++ b/InstructorsAndTrainees/messanger/tabdialogmessenger.cpp @@ -3,12 +3,12 @@ #include "msgwidget.h" -TabDialogMessenger::TabDialogMessenger(int id, QString login, QWidget *parent): +TabDialogMessenger::TabDialogMessenger(QString login , QString userId, QWidget *parent): QListWidget(parent), login(""), - id(0) + userId("") { - this->id = id; + this->userId = userId; this->login = login; setWordWrap(true); diff --git a/InstructorsAndTrainees/messanger/tabdialogmessenger.h b/InstructorsAndTrainees/messanger/tabdialogmessenger.h index 97c3af6..92e3f0b 100644 --- a/InstructorsAndTrainees/messanger/tabdialogmessenger.h +++ b/InstructorsAndTrainees/messanger/tabdialogmessenger.h @@ -12,18 +12,18 @@ class TabDialogMessenger : public QListWidget Q_OBJECT public: - TabDialogMessenger(int id, QString login, QWidget *parent = nullptr); + TabDialogMessenger(QString userLogin, QString userId, QWidget *parent = nullptr); ~TabDialogMessenger(); - QString getLogin() {return login;}; - int getID() {return id;}; + QString getUserLogin() {return login;}; + QString getUserId() {return userId;} void addMsgWidgetLocal(QString text); void addMsgWidgetRemote(QString text); private: QString login; - int id; + QString userId; }; #endif // TABDIALOGMESSENGER_H diff --git a/ServerLMS/CMakeLists.txt b/ServerLMS/CMakeLists.txt index 2e5eeaf..04adf40 100644 --- a/ServerLMS/CMakeLists.txt +++ b/ServerLMS/CMakeLists.txt @@ -39,6 +39,8 @@ add_library(ServerLMS SHARED Systems/sendsystem.h Systems/tools.cpp Systems/tools.h + Systems/chatsystem.cpp + Systems/chatsystem.h providerdblms.cpp providerdblms.h resources.qrc diff --git a/ServerLMS/Data/typesDataServerClient.h b/ServerLMS/Data/typesDataServerClient.h index c1cfcbb..a948d39 100644 --- a/ServerLMS/Data/typesDataServerClient.h +++ b/ServerLMS/Data/typesDataServerClient.h @@ -101,6 +101,14 @@ public: QString From; QString To; QString Text; + + ClientMessage(){} + ClientMessage(QString from,QString to,QString text) + { + From = from; + To = to; + Text = text; + } }; class ServerTask diff --git a/ServerLMS/Systems/Parsers/processparser.cpp b/ServerLMS/Systems/Parsers/processparser.cpp index c36a0b2..ec26ce1 100644 --- a/ServerLMS/Systems/Parsers/processparser.cpp +++ b/ServerLMS/Systems/Parsers/processparser.cpp @@ -1,7 +1,7 @@ #include "processparser.h" #include "tasksAmmFim.h" -ProcessParser::ProcessParser(QObject *parent) : QObject(parent) +ProcessParser::ProcessParser(QObject *parent) : QObject(parent) //TODO: переименовать в XMLProcessParser? { } @@ -500,7 +500,7 @@ void ProcessParser::clientMessage(QXmlStreamReader &xmlReader,ClientHandler *cli clientMessage.To = value; } - processingSystem->processingSendMessage(client, clientMessage); + processingSystem->processingSendMessage(clientMessage); } diff --git a/ServerLMS/Systems/chatsystem.cpp b/ServerLMS/Systems/chatsystem.cpp new file mode 100644 index 0000000..5602e4b --- /dev/null +++ b/ServerLMS/Systems/chatsystem.cpp @@ -0,0 +1,83 @@ +#include "chatsystem.h" + +ChatSystem::ChatSystem() +{ + +} + +void ChatSystem::initialize(CommonClientHandler *commonClientHandler, DataParser *dataParser, QMap *clientsMap) +{ + this->commonClientHandler = commonClientHandler; + this->dataParser = dataParser; + this->clientsMap = clientsMap; + clientNotSendedMessage = new QMap*>; + + auto stack = new QStack; + auto clientMessage1 = ClientMessage("1","102","Сообщение 1"); + stack->append(clientMessage1); + auto clientMessage2 = ClientMessage("1","102","Сообщение 2"); + stack->append(clientMessage2); + + clientNotSendedMessage->insert("102", stack); +} + +bool ChatSystem::sendTo(ClientMessage message) +{ + QByteArray byteArrayMsg = dataParser->ClientAnswer()->message(message.From,message.To,message.Text); + + foreach(int idSocket, clientsMap->keys()) + { + ClientHandler *handler = clientsMap->value(idSocket); + if(handler->getClient()->getId() == message.To) + { + handler->sendXmlAnswer(byteArrayMsg, PacketType::TYPE_XMLANSWER); + QString str = "Msg From Client [" + message.From + " to " + message.To + "] : " + message.Text; + + return true; + } + } + + return false; +} + +bool ChatSystem::sendMessage(ClientMessage message) +{ + bool isSended = false; + isSended = sendTo(message); + + if (!isSended) + { + if (clientNotSendedMessage->contains(message.To)) + { + clientNotSendedMessage->find(message.To).value()->append(message); + } + else + { + auto stack = new QStack; + stack->append(message); + clientNotSendedMessage->insert(message.To, stack); + } + + qDebug() << "Message stack count: " + QString::number(clientNotSendedMessage->count()); + } + + return true; +} + +void ChatSystem::sendOldMessages(QString id) +{ + if (clientNotSendedMessage->contains(id)) + { + auto stack = clientNotSendedMessage->find(id).value(); + + while (!stack->isEmpty()) + { + auto message = stack->pop(); + sendTo(message); + } + } + else + { + qDebug() << "client empty"; + } +} diff --git a/ServerLMS/Systems/chatsystem.h b/ServerLMS/Systems/chatsystem.h new file mode 100644 index 0000000..369cb17 --- /dev/null +++ b/ServerLMS/Systems/chatsystem.h @@ -0,0 +1,27 @@ +#ifndef CHATSYSTEM_H +#define CHATSYSTEM_H + +#include "commonclienthandler.h" +#include +#include + +class ChatSystem : public QObject +{ + Q_OBJECT +public: + ChatSystem(); + void initialize(CommonClientHandler *commonClientHandler, DataParser *dataParser, QMap *clientsMap); + bool sendMessage(ClientMessage message); + //логика хранения отложенных сообщений + //хендлеры для отправки и приема + + void sendOldMessages(QString id); +private: + CommonClientHandler *commonClientHandler; + DataParser *dataParser; + QMap *clientsMap; + QMap*> *clientNotSendedMessage; + bool sendTo(ClientMessage message); +}; + +#endif // CHATSYSTEM_H diff --git a/ServerLMS/Systems/commonclienthandler.cpp b/ServerLMS/Systems/commonclienthandler.cpp index 6786aec..34cc28a 100644 --- a/ServerLMS/Systems/commonclienthandler.cpp +++ b/ServerLMS/Systems/commonclienthandler.cpp @@ -120,26 +120,7 @@ void CommonClientHandler::slot_sendPacketToAllClients(PacketType packetType) } } -void CommonClientHandler::slotSendMessage(QString idFrom, QString idTo, QString text) -{ - QString textMsg = text; - QByteArray byteArrayMsg = dataParser->ClientAnswer()->message(idFrom,idTo,text); - - //Проходим все открытые сокеты, ищем нужный - foreach(int idSocket, clientsMap->keys()) - { - ClientHandler *handler = clientsMap->value(idSocket); - if(handler->getClient()->getId() == idTo) - { - handler->sendXmlAnswer(byteArrayMsg, PacketType::TYPE_XMLANSWER); - QString str = "Msg From Client [" + idFrom + " to " + idTo + "] : " + textMsg; - - emit sigSendToLogger(str); - break; - } - } -} void CommonClientHandler::slot_sendTaskToClient(QString fullNameClient,QString textTask) { diff --git a/ServerLMS/Systems/commonclienthandler.h b/ServerLMS/Systems/commonclienthandler.h index ae122a8..3e50560 100644 --- a/ServerLMS/Systems/commonclienthandler.h +++ b/ServerLMS/Systems/commonclienthandler.h @@ -24,7 +24,7 @@ public: void slot_StatusTasksAMMofTraineeChanged(int trainee_id); void slot_StatusTasksFIMofTraineeChanged(int trainee_id); void slot_sendPacketToAllClients(PacketType packetType); - void slotSendMessage(QString loginFrom, QString loginTo, QString text); + bool slotSendMessage(QString loginFrom, QString loginTo, QString text); void slot_sendTaskToClient(QString fullNameClient, QString textTask); signals: void sigSendToLogger(QString text); diff --git a/ServerLMS/Systems/processingsystem.cpp b/ServerLMS/Systems/processingsystem.cpp index 2a04b67..0da1138 100644 --- a/ServerLMS/Systems/processingsystem.cpp +++ b/ServerLMS/Systems/processingsystem.cpp @@ -15,12 +15,14 @@ void ProcessingSystem::initialize(ServerLMSWidget *server, DataParser *dataParser, CommonClientHandler *commonClientHandler, Logger *logger, - UpdateController *updateController) + UpdateController *updateController, + ChatSystem *chatSystem) { this->commonClientServer = commonClientHandler; this->dataParser = dataParser; this->server = server; this->updateController = updateController; + this->chatSystem = chatSystem; connect(this,&ProcessingSystem::sigListsInstructorsTraineesChanged,commonClientHandler, &CommonClientHandler::slot_ListsInstructorsTraineesChanged,Qt::AutoConnection); @@ -29,7 +31,6 @@ void ProcessingSystem::initialize(ServerLMSWidget *server, connect(this,&ProcessingSystem::sigUpdateListClients,server, &ServerLMSWidget::slotUpdateListClients,Qt::AutoConnection); connect(this,&ProcessingSystem::sigSetData,updateController,&UpdateController::setDataInfo,Qt::AutoConnection); - connect(this,&ProcessingSystem::sigSendMessage,commonClientHandler, &CommonClientHandler::slotSendMessage,Qt::AutoConnection); connect(this,&ProcessingSystem::sigLogMessage,logger,&Logger::addTextToLogger,Qt::QueuedConnection); } @@ -95,7 +96,6 @@ void ProcessingSystem::processingClientAutorization(ClientHandler *client, Clien QString str = QString(arrayAnswer); //logger->addTextToLogger("To Client: " + str); - //Извещаем об изменениях в авторизации emit sigListsInstructorsTraineesChanged(); } @@ -474,9 +474,9 @@ void ProcessingSystem::processingClientQueryTasksXML(ClientHandler *client, Clie } } -void ProcessingSystem::processingSendMessage(ClientHandler *client, ClientMessage clientMessage) +void ProcessingSystem::processingSendMessage(ClientMessage clientMessage) { - emit sigSendMessage(clientMessage.From, clientMessage.To, clientMessage.Text); + chatSystem->sendMessage(clientMessage); } void ProcessingSystem::processingClientNotify(ClientHandler *client, ClientNotify clientNotify) diff --git a/ServerLMS/Systems/processingsystem.h b/ServerLMS/Systems/processingsystem.h index 1b2f63b..2a9dd23 100644 --- a/ServerLMS/Systems/processingsystem.h +++ b/ServerLMS/Systems/processingsystem.h @@ -7,6 +7,7 @@ #include #include //#include "instructorsandtraineeswidget.h" +#include "chatsystem.h" #include "providerdblms.h" class SendSystem; @@ -27,14 +28,15 @@ public: DataParser* dataParser, CommonClientHandler *commonClientServer, Logger *logger, - UpdateController *updateComtroller); + UpdateController *updateComtroller, + ChatSystem *chatSystem); void processingClientAutorization(ClientHandler *client, ClientAutorization clientAutorization); void processingClientDeAutorization(ClientHandler *client, ClientDeAutorization clientDeAutorization); void processingClientQueryToDB(ClientHandler *client, ClientQueryToDB clientQueryToDB, int id = 0, void* data = nullptr); void processingClientQueryTasksXML(ClientHandler *client, ClientQueryTasksXML clientQueryTasksXML); - void processingSendMessage(ClientHandler *client, ClientMessage clientMessage); + void processingSendMessage(ClientMessage clientMessage); void processingClientNotify(ClientHandler *client, ClientNotify clientNotify); void setCurrentDataInfo(DataInfo *dataInfo); @@ -57,7 +59,6 @@ signals: void sigStatusTasksFIMofTraineeChanged(int trainee_id); void sigLogMessage(QString log); void sigAddToMessanger(QString login,QString text); - void sigSendMessage(QString loginFrom, QString loginTo, QString text); void sigSetData(DataInfo *dataInfo); private: @@ -66,6 +67,7 @@ private: DataParser *dataParser; UpdateController *updateController; ProviderDBLMS* providerDBLMS; + ChatSystem *chatSystem; void sendTaskListToUnity(ClientHandler *client); }; diff --git a/ServerLMS/Systems/recognizesystem.cpp b/ServerLMS/Systems/recognizesystem.cpp index 31f1710..a74ff5a 100644 --- a/ServerLMS/Systems/recognizesystem.cpp +++ b/ServerLMS/Systems/recognizesystem.cpp @@ -24,7 +24,6 @@ void RecognizeSystem::initialize(UpdateController *updateController,DataParser* socket = handler->getSocket(); connect(this,&RecognizeSystem::sigCalculateHash,updateController,&UpdateController::calculateFullHashWithSetup,Qt::AutoConnection); - //connect(this,&RecognizeSystem::sigCalculateHash,updateController,&UpdateController::setUpCurrentServerHash,Qt::AutoConnection); connect(this,&RecognizeSystem::sigChangeVersion,updateController,&UpdateController::changeAssetVersion,Qt::AutoConnection); connect(this,&RecognizeSystem::sigDeleteVersion,updateController,&UpdateController::deleteAssetVersion,Qt::AutoConnection); connect(this,&RecognizeSystem::sigCopyVersion,updateController,&UpdateController::createCopyVersion,Qt::AutoConnection); @@ -51,10 +50,6 @@ void RecognizeSystem::recognize() if(!isPackageTypeInited) //первичная инициализация для типа клиента { -// char *read = new char[0]; -// stream.readRawData(read,1); -// packetType = static_cast(QString(read[0]).toInt()); - char *read = new char[4]; stream.readRawData(read,4); diff --git a/ServerLMS/serverlmswidget.cpp b/ServerLMS/serverlmswidget.cpp index 770652b..64b8eed 100644 --- a/ServerLMS/serverlmswidget.cpp +++ b/ServerLMS/serverlmswidget.cpp @@ -43,6 +43,7 @@ ServerLMSWidget::ServerLMSWidget(QWidget *parent) : providerDBLMS->deAuthorizationAll(); logger = new Logger(); + chatSystem = new ChatSystem(); connect(providerDBLMS, &ProviderDBLMS::signal_BlockAutorization, this, &ServerLMSWidget::slot_BlockAutorization); connect(logger,&Logger::sigSendTextToLogger,this,&ServerLMSWidget::slotAddToLog,Qt::AutoConnection); @@ -66,7 +67,8 @@ ServerLMSWidget::ServerLMSWidget(QWidget *parent) : updateThread->start(); commonClientHandler->initialize(&clientsMap,processingSystem,dataParser,logger); - processingSystem->initialize(this,dataParser,commonClientHandler,logger,updateController); + processingSystem->initialize(this,dataParser,commonClientHandler,logger,updateController,chatSystem); + chatSystem->initialize(commonClientHandler,dataParser,&clientsMap); logger->setTypeLog("widget"); connect(dataParser,&DataParser::sigLogMessage,logger,&Logger::addTextToLogger); diff --git a/ServerLMS/serverlmswidget.h b/ServerLMS/serverlmswidget.h index c0c7205..e3ac3ab 100644 --- a/ServerLMS/serverlmswidget.h +++ b/ServerLMS/serverlmswidget.h @@ -19,6 +19,7 @@ #include #include #include +#include #include #include @@ -38,6 +39,7 @@ class RecognizeSystem; class ClientHandler; class MultiThreadServer; class AssetsManager; +class ChatSystem; class SERVERLMS_EXPORT ServerLMSWidget : public QWidget { @@ -125,6 +127,7 @@ private: AssetsManager *assetsManager; Logger *logger; CommonClientHandler *commonClientHandler; + ChatSystem *chatSystem; ProviderDBLMS* providerDBLMS;