diff --git a/html/realtimechat.js b/html/realtimechat.js index 79f6538..ce777c8 100644 --- a/html/realtimechat.js +++ b/html/realtimechat.js @@ -9,8 +9,9 @@ const HTML_SERVER_OFFLINE_MARKER = "❌"; let ajaxUrl = document.getElementById("ajaxPath").innerText; let lastMessageId = document.getElementById("LMId").innerText; +let reqIsFailed = false; -function appendMessage(nick /* if == "***", then error */, message) +function appendMessage(nick /* if == "***", then system message */, message) { let messageObject = document.createElement("div"); messageObject.setAttribute("class", "main_payload__chat"); @@ -52,6 +53,11 @@ function toAJAX() { let xhttp = new XMLHttpRequest(); xhttp.onload = function() { + if (reqIsFailed) { + reqIsFailed = false; + appendMessage("", "Fine: you are online again") + } + const answer = JSON.parse(xhttp.responseText); if (!answer.status) { appendMessage("***", answer.message); @@ -72,8 +78,6 @@ function toAJAX() changeOnlineList(onlineInfo.list); } if (answer.LMIdChanged) { - console.log("old", lastMessageId); - console.log("new", answer.LMId); lastMessageId = answer.LMId; let msgArray = answer.newMessages; msgArray.forEach(function(singleMsg) { @@ -81,6 +85,13 @@ function toAJAX() }); } } + xhttp.onerror = function() { + if (!reqIsFailed) { + reqIsFailed = true; + appendMessage("", "Request is failed: no response from server") + } + } + let currentServerStatus = objCurrentServerStatus.innerText === HTML_SERVER_ONLINE_MARKER; xhttp.open("GET", "/ajax/"+ajaxUrl+"?onlineCounter="+objOnlineCounter.innerText+"&messageId="+lastMessageId+"&serverStatus="+currentServerStatus); xhttp.send(); diff --git a/html/svg/airplane.svg b/html/svg/airplane.svg new file mode 100755 index 0000000..07d4f78 --- /dev/null +++ b/html/svg/airplane.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/html/svg/folder.svg b/html/svg/folder.svg index 14313ab..42066cd 100644 --- a/html/svg/folder.svg +++ b/html/svg/folder.svg @@ -1,5 +1,4 @@ -
", "
"); - - QString year {QDateTime::currentDateTime().toString("yyyy")}; - QString month {QDateTime::currentDateTime().toString("MM")}; - QString day {QDateTime::currentDateTime().toString("dd")}; bool logsExisted {false}; QFile file; QDir fsPath(m_logFolder+server+global::slash+channel); @@ -1434,6 +1445,7 @@ void HttpServer::writeAjaxAnswer(QTcpSocket *socket, QString &urlPath, bool isHe if (not m_messageCache.contains(channelId)) { m_messageCache.insert(channelId, new MessagePool); + consoleLog("Message caching enabled for "+server+"/#"+channel+". Real time reading started."); } else { auto messages = *(m_messageCache[channelId]->getMessages()); @@ -1508,9 +1520,15 @@ void MessagePool::saveNewMessage(const QString &nick, const QString &text) const std::map* MessagePool::getMessages() { + m_lastPing = QDateTime::currentMSecsSinceEpoch(); return &m_messages; } +qint64 MessagePool::getLastPing() +{ + return m_lastPing; +} + void MessagePool::messageToDelete(qint64 timestamp) { auto it = m_messages.find(timestamp); diff --git a/httpserver.h b/httpserver.h index 4497a4a..ced3780 100644 --- a/httpserver.h +++ b/httpserver.h @@ -9,6 +9,8 @@ #include constexpr int MSECS_TO_AUTOREMOVE_MESSAGES_FROM_BUFFER {10000}; // 10 secs +const QString HTTP_ACTUAL_ETAG {"2021-12-29"}; // Change it if svg, css or ico was modified + class Message : public QObject { Q_OBJECT @@ -34,6 +36,7 @@ public: MessagePool(QObject *parent = nullptr); void saveNewMessage(const QString& nick, const QString& text); const std::map* getMessages(); + qint64 getLastPing(); private: qint64 m_lastPing; @@ -43,7 +46,8 @@ public slots: void messageToDelete(qint64 timestamp); }; -const QString HTTP_ACTUAL_ETAG {"2021-12-24"}; // Change it if svg, css or ico was modified +////////////////////////////////////////////////// + class HttpServer : public QObject { Q_OBJECT