way to 2.1.0
|
@ -9,8 +9,9 @@ const HTML_SERVER_OFFLINE_MARKER = "❌";
|
||||||
|
|
||||||
let ajaxUrl = document.getElementById("ajaxPath").innerText;
|
let ajaxUrl = document.getElementById("ajaxPath").innerText;
|
||||||
let lastMessageId = document.getElementById("LMId").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");
|
let messageObject = document.createElement("div");
|
||||||
messageObject.setAttribute("class", "main_payload__chat");
|
messageObject.setAttribute("class", "main_payload__chat");
|
||||||
|
@ -52,6 +53,11 @@ function toAJAX()
|
||||||
{
|
{
|
||||||
let xhttp = new XMLHttpRequest();
|
let xhttp = new XMLHttpRequest();
|
||||||
xhttp.onload = function() {
|
xhttp.onload = function() {
|
||||||
|
if (reqIsFailed) {
|
||||||
|
reqIsFailed = false;
|
||||||
|
appendMessage("", "<b style=\"color: green\">Fine: you are online again</b>")
|
||||||
|
}
|
||||||
|
|
||||||
const answer = JSON.parse(xhttp.responseText);
|
const answer = JSON.parse(xhttp.responseText);
|
||||||
if (!answer.status) {
|
if (!answer.status) {
|
||||||
appendMessage("***", answer.message);
|
appendMessage("***", answer.message);
|
||||||
|
@ -72,8 +78,6 @@ function toAJAX()
|
||||||
changeOnlineList(onlineInfo.list);
|
changeOnlineList(onlineInfo.list);
|
||||||
}
|
}
|
||||||
if (answer.LMIdChanged) {
|
if (answer.LMIdChanged) {
|
||||||
console.log("old", lastMessageId);
|
|
||||||
console.log("new", answer.LMId);
|
|
||||||
lastMessageId = answer.LMId;
|
lastMessageId = answer.LMId;
|
||||||
let msgArray = answer.newMessages;
|
let msgArray = answer.newMessages;
|
||||||
msgArray.forEach(function(singleMsg) {
|
msgArray.forEach(function(singleMsg) {
|
||||||
|
@ -81,6 +85,13 @@ function toAJAX()
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
xhttp.onerror = function() {
|
||||||
|
if (!reqIsFailed) {
|
||||||
|
reqIsFailed = true;
|
||||||
|
appendMessage("", "<b style=\"color: red\">Request is failed: no response from server</b>")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let currentServerStatus = objCurrentServerStatus.innerText === HTML_SERVER_ONLINE_MARKER;
|
let currentServerStatus = objCurrentServerStatus.innerText === HTML_SERVER_ONLINE_MARKER;
|
||||||
xhttp.open("GET", "/ajax/"+ajaxUrl+"?onlineCounter="+objOnlineCounter.innerText+"&messageId="+lastMessageId+"&serverStatus="+currentServerStatus);
|
xhttp.open("GET", "/ajax/"+ajaxUrl+"?onlineCounter="+objOnlineCounter.innerText+"&messageId="+lastMessageId+"&serverStatus="+currentServerStatus);
|
||||||
xhttp.send();
|
xhttp.send();
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||||
|
viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
|
||||||
|
<style type="text/css">
|
||||||
|
.st0{fill:#6493BC;}
|
||||||
|
</style>
|
||||||
|
<polygon class="st0" points="161.3,287.2 161.3,445 288.4,350.3 415.5,508.1 510.8,3.2 2.4,255.7 "/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 422 B |
|
@ -1,5 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
|
||||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||||
width="512px" height="512px" viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
|
width="512px" height="512px" viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
|
||||||
<style type="text/css">
|
<style type="text/css">
|
||||||
|
|
Before Width: | Height: | Size: 915 B After Width: | Height: | Size: 819 B |
|
@ -1,5 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
|
||||||
<svg version="1.1" id="Glyph" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
<svg version="1.1" id="Glyph" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||||
width="32px" height="32px" viewBox="0 0 32 32" style="enable-background:new 0 0 32 32;" xml:space="preserve">
|
width="32px" height="32px" viewBox="0 0 32 32" style="enable-background:new 0 0 32 32;" xml:space="preserve">
|
||||||
<style type="text/css">
|
<style type="text/css">
|
||||||
|
|
Before Width: | Height: | Size: 706 B After Width: | Height: | Size: 610 B |
|
@ -1,5 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
|
||||||
<svg version="1.1" id="Слой_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
<svg version="1.1" id="Слой_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||||
width="48px" height="48px" viewBox="0 0 48 48" style="enable-background:new 0 0 48 48;" xml:space="preserve">
|
width="48px" height="48px" viewBox="0 0 48 48" style="enable-background:new 0 0 48 48;" xml:space="preserve">
|
||||||
<style type="text/css">
|
<style type="text/css">
|
||||||
|
|
Before Width: | Height: | Size: 765 B After Width: | Height: | Size: 669 B |
|
@ -142,7 +142,7 @@ std::pair<QString, QString> HttpServer::splitUserNameAndMessage(const QString &r
|
||||||
|
|
||||||
void HttpServer::consoleLog(const QString &message)
|
void HttpServer::consoleLog(const QString &message)
|
||||||
{
|
{
|
||||||
qInfo().noquote() << "[WEBINTERFACE]" << message;
|
qInfo().noquote() << "[WEB_UI]" << message;
|
||||||
}
|
}
|
||||||
|
|
||||||
void HttpServer::debugLog(const QString &req)
|
void HttpServer::debugLog(const QString &req)
|
||||||
|
@ -357,7 +357,17 @@ void HttpServer::ircMessageCache(QString server, QString channel, QString nick,
|
||||||
{
|
{
|
||||||
QString channelId {server+channel};
|
QString channelId {server+channel};
|
||||||
if (not m_messageCache.contains(channelId)) return;
|
if (not m_messageCache.contains(channelId)) return;
|
||||||
else m_messageCache[channelId]->saveNewMessage(nick, text);
|
// remove timed out session
|
||||||
|
if (QDateTime::currentMSecsSinceEpoch() - MSECS_TO_AUTOREMOVE_MESSAGES_FROM_BUFFER >
|
||||||
|
m_messageCache[channelId]->getLastPing())
|
||||||
|
{
|
||||||
|
consoleLog("Message caching disabled for "+server+"/#"+channel+". No active reader.");
|
||||||
|
m_messageCache.remove(channelId);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
m_messageCache[channelId]->saveNewMessage(nick, text);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QString HttpServer::getRequestPath(const QString &req)
|
QString HttpServer::getRequestPath(const QString &req)
|
||||||
|
@ -1173,6 +1183,10 @@ void HttpServer::writeRealTimeChatPage(QTcpSocket *socket, QString &urlPath, boo
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString year {QDateTime::currentDateTime().toString("yyyy")};
|
||||||
|
QString month {QDateTime::currentDateTime().toString("MM")};
|
||||||
|
QString day {QDateTime::currentDateTime().toString("dd")};
|
||||||
|
|
||||||
//// Left menu compilation
|
//// Left menu compilation
|
||||||
QString htmlServersSectionS;
|
QString htmlServersSectionS;
|
||||||
for (const auto &s: m_onlineUsers) {
|
for (const auto &s: m_onlineUsers) {
|
||||||
|
@ -1197,7 +1211,8 @@ void HttpServer::writeRealTimeChatPage(QTcpSocket *socket, QString &urlPath, boo
|
||||||
|
|
||||||
QString channelNameForUrl {c.first};
|
QString channelNameForUrl {c.first};
|
||||||
channelNameForUrl.remove('#');
|
channelNameForUrl.remove('#');
|
||||||
QString channelLink = "/" + global::toLowerAndNoSpaces(s.first) + "/" + channelNameForUrl;
|
QString channelLink = "/" + global::toLowerAndNoSpaces(s.first) +
|
||||||
|
"/" + channelNameForUrl + "/" + year + "/" + month + "/" + day;
|
||||||
replaceTag(htmlChannelLine, "CHANNEL_LINK", channelLink);
|
replaceTag(htmlChannelLine, "CHANNEL_LINK", channelLink);
|
||||||
|
|
||||||
htmlChannelLineS += htmlChannelLine;
|
htmlChannelLineS += htmlChannelLine;
|
||||||
|
@ -1259,10 +1274,6 @@ void HttpServer::writeRealTimeChatPage(QTcpSocket *socket, QString &urlPath, boo
|
||||||
|
|
||||||
//// Payload
|
//// Payload
|
||||||
page.replace("<div class=\"main_payload\">", "<div class=\"main_payload\" id=\"payload\">");
|
page.replace("<div class=\"main_payload\">", "<div class=\"main_payload\" id=\"payload\">");
|
||||||
|
|
||||||
QString year {QDateTime::currentDateTime().toString("yyyy")};
|
|
||||||
QString month {QDateTime::currentDateTime().toString("MM")};
|
|
||||||
QString day {QDateTime::currentDateTime().toString("dd")};
|
|
||||||
bool logsExisted {false};
|
bool logsExisted {false};
|
||||||
QFile file;
|
QFile file;
|
||||||
QDir fsPath(m_logFolder+server+global::slash+channel);
|
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)) {
|
if (not m_messageCache.contains(channelId)) {
|
||||||
m_messageCache.insert(channelId, new MessagePool);
|
m_messageCache.insert(channelId, new MessagePool);
|
||||||
|
consoleLog("Message caching enabled for "+server+"/#"+channel+". Real time reading started.");
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
auto messages = *(m_messageCache[channelId]->getMessages());
|
auto messages = *(m_messageCache[channelId]->getMessages());
|
||||||
|
@ -1508,9 +1520,15 @@ void MessagePool::saveNewMessage(const QString &nick, const QString &text)
|
||||||
|
|
||||||
const std::map<qint64, Message *>* MessagePool::getMessages()
|
const std::map<qint64, Message *>* MessagePool::getMessages()
|
||||||
{
|
{
|
||||||
|
m_lastPing = QDateTime::currentMSecsSinceEpoch();
|
||||||
return &m_messages;
|
return &m_messages;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
qint64 MessagePool::getLastPing()
|
||||||
|
{
|
||||||
|
return m_lastPing;
|
||||||
|
}
|
||||||
|
|
||||||
void MessagePool::messageToDelete(qint64 timestamp)
|
void MessagePool::messageToDelete(qint64 timestamp)
|
||||||
{
|
{
|
||||||
auto it = m_messages.find(timestamp);
|
auto it = m_messages.find(timestamp);
|
||||||
|
|
|
@ -9,6 +9,8 @@
|
||||||
#include <queue>
|
#include <queue>
|
||||||
|
|
||||||
constexpr int MSECS_TO_AUTOREMOVE_MESSAGES_FROM_BUFFER {10000}; // 10 secs
|
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
|
class Message : public QObject
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
@ -34,6 +36,7 @@ public:
|
||||||
MessagePool(QObject *parent = nullptr);
|
MessagePool(QObject *parent = nullptr);
|
||||||
void saveNewMessage(const QString& nick, const QString& text);
|
void saveNewMessage(const QString& nick, const QString& text);
|
||||||
const std::map<qint64, Message*>* getMessages();
|
const std::map<qint64, Message*>* getMessages();
|
||||||
|
qint64 getLastPing();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
qint64 m_lastPing;
|
qint64 m_lastPing;
|
||||||
|
@ -43,7 +46,8 @@ public slots:
|
||||||
void messageToDelete(qint64 timestamp);
|
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
|
class HttpServer : public QObject
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|