From 304d917fd233e2d7c7f476160a7433c64643508a Mon Sep 17 00:00:00 2001 From: acetone Date: Fri, 11 Feb 2022 02:19:32 -0500 Subject: [PATCH] web page anchors --- html/style.css | 6 ++- httpserver.cpp | 139 +++++++++++++++++++++++++++++++++++++++++++++---- httpserver.h | 21 +++++++- version.h | 9 ---- 4 files changed, 153 insertions(+), 22 deletions(-) delete mode 100644 version.h diff --git a/html/style.css b/html/style.css index 85ba9ce..0eba16a 100644 --- a/html/style.css +++ b/html/style.css @@ -358,15 +358,19 @@ body { width: 95%; margin: 1% 0 0 2.5%; font-size: 18px; - color: #821010; } .main_payload__chat_username { + text-decoration: none; flex: 10%; margin-right: 1%; font-weight: bold; } +.main_payload__chat_username:hover { + background-color: #d4d4d4; +} + .main_payload__chat_mail { flex: 89%; color: #2f444c; diff --git a/httpserver.cpp b/httpserver.cpp index c827950..1403ee9 100644 --- a/httpserver.cpp +++ b/httpserver.cpp @@ -898,6 +898,12 @@ void HttpServer::writeRegularPage(QTcpSocket *socket, QString &urlPath, bool isH //// Main section body compilation QString payloadBlock; + std::pair lastGreenNickname; // nick, color + std::pair lastRedNickname; // nick, color + quint64 messageAnchorCounter = 0; + NickColorist nickColorist; + bool colorEdited = false; + // Search request if (not searchRequest.isEmpty()) { uint counter = 0; @@ -969,6 +975,7 @@ void HttpServer::writeRegularPage(QTcpSocket *socket, QString &urlPath, bool isH QString buffer {file.readLine()}; while (not buffer.isEmpty()) { removeBrakelineSymbols(buffer); + messageAnchorCounter++; bool finded = false; if (rgxIsValid) { @@ -992,13 +999,34 @@ void HttpServer::writeRegularPage(QTcpSocket *socket, QString &urlPath, bool isH message.replace("class=\"main_payload__chat\"", "class=\"main_payload__chat\" style=\"opacity: .5\""); } + message.remove(" name=\"{{ANCHOR}}\""); for (const auto &user: m_servers[originalServerName][originalChannelName]) { if (QRegularExpression("^(.*;|~|@|\\&|\\+)?"+rawMessage.first+"$").match(user).hasMatch()) { - message.replace("class=\"main_payload__chat_username\"", - "class=\"main_payload__chat_username\" style=\"color: green\""); + if (lastGreenNickname.first == rawMessage.first) { + replaceTag(message, "COLOR", lastGreenNickname.second); + }else{ + replaceTag(message, "COLOR", nickColorist.getGreenColor()); + lastGreenNickname.first = rawMessage.first; + lastGreenNickname.second = nickColorist.getGreenColor(false); + } break; } } + if (not colorEdited) { + if (lastRedNickname.first == rawMessage.first) { + replaceTag(message, "COLOR", lastRedNickname.second); + }else{ + replaceTag(message, "COLOR", nickColorist.getRedColor()); + lastRedNickname.first = rawMessage.first; + lastRedNickname.second = nickColorist.getRedColor(false); + } + } + QString logFolder {m_dataFolder}; + logFolder.remove(QRegularExpression(".$")); + QString link {path}; + link.remove(logFolder); + link.remove(QRegularExpression("\\.txt$")); + replaceTag(message, "ANCHOR", link+"#"+ANCHOR_SUFFIX+QString::number(messageAnchorCounter-1)); replaceTag(message, "USERNAME", rawMessage.first); replaceTag(message, "MESSAGE_TEXT", rawMessage.second); matchedPathsAndMessages[path].push_back(message); @@ -1006,6 +1034,7 @@ void HttpServer::writeRegularPage(QTcpSocket *socket, QString &urlPath, bool isH buffer = file.readLine(); } file.close(); + messageAnchorCounter = 0; } } else if (month.isEmpty() and not year.isEmpty()){ @@ -1029,6 +1058,7 @@ void HttpServer::writeRegularPage(QTcpSocket *socket, QString &urlPath, bool isH } QString buffer {file.readLine()}; while (not buffer.isEmpty()) { + messageAnchorCounter++; removeBrakelineSymbols(buffer); bool finded = false; @@ -1053,13 +1083,34 @@ void HttpServer::writeRegularPage(QTcpSocket *socket, QString &urlPath, bool isH message.replace("class=\"main_payload__chat\"", "class=\"main_payload__chat\" style=\"opacity: .5\""); } + message.remove(" name=\"{{ANCHOR}}\""); for (const auto &user: m_servers[originalServerName][originalChannelName]) { - if (QRegularExpression("^^(.*;|~|@|\\&|\\+)?"+rawMessage.first+"$").match(user).hasMatch()) { - message.replace("class=\"main_payload__chat_username\"", - "class=\"main_payload__chat_username\" style=\"color: green\""); + if (QRegularExpression("^(.*;|~|@|\\&|\\+)?"+rawMessage.first+"$").match(user).hasMatch()) { + if (lastGreenNickname.first == rawMessage.first) { + replaceTag(message, "COLOR", lastGreenNickname.second); + }else{ + replaceTag(message, "COLOR", nickColorist.getGreenColor()); + lastGreenNickname.first = rawMessage.first; + lastGreenNickname.second = nickColorist.getGreenColor(false); + } break; } } + if (not colorEdited) { + if (lastRedNickname.first == rawMessage.first) { + replaceTag(message, "COLOR", lastRedNickname.second); + }else{ + replaceTag(message, "COLOR", nickColorist.getRedColor()); + lastRedNickname.first = rawMessage.first; + lastRedNickname.second = nickColorist.getRedColor(false); + } + } + QString logFolder {m_dataFolder}; + logFolder.remove(QRegularExpression(".$")); + QString link {path}; + link.remove(logFolder); + link.remove(QRegularExpression("\\.txt$")); + replaceTag(message, "ANCHOR", link+"#"+ANCHOR_SUFFIX+QString::number(messageAnchorCounter-1)); replaceTag(message, "USERNAME", rawMessage.first); replaceTag(message, "MESSAGE_TEXT", rawMessage.second); matchedPathsAndMessages[path].push_back(message); @@ -1067,6 +1118,7 @@ void HttpServer::writeRegularPage(QTcpSocket *socket, QString &urlPath, bool isH buffer = file.readLine(); } file.close(); + messageAnchorCounter = 0; } } } @@ -1108,6 +1160,7 @@ void HttpServer::writeRegularPage(QTcpSocket *socket, QString &urlPath, bool isH QString buffer {file.readLine()}; while (not buffer.isEmpty()) { removeBrakelineSymbols(buffer); + messageAnchorCounter++; bool finded = false; if (rgxIsValid) { @@ -1131,13 +1184,34 @@ void HttpServer::writeRegularPage(QTcpSocket *socket, QString &urlPath, bool isH message.replace("class=\"main_payload__chat\"", "class=\"main_payload__chat\" style=\"opacity: .5\""); } + message.remove(" name=\"{{ANCHOR}}\""); for (const auto &user: m_servers[originalServerName][originalChannelName]) { - if (QRegularExpression("^^(.*;|~|@|\\&|\\+)?"+rawMessage.first+"$").match(user).hasMatch()) { - message.replace("class=\"main_payload__chat_username\"", - "class=\"main_payload__chat_username\" style=\"color: green\""); + if (QRegularExpression("^(.*;|~|@|\\&|\\+)?"+rawMessage.first+"$").match(user).hasMatch()) { + if (lastGreenNickname.first == rawMessage.first) { + replaceTag(message, "COLOR", lastGreenNickname.second); + }else{ + replaceTag(message, "COLOR", nickColorist.getGreenColor()); + lastGreenNickname.first = rawMessage.first; + lastGreenNickname.second = nickColorist.getGreenColor(false); + } break; } } + if (not colorEdited) { + if (lastRedNickname.first == rawMessage.first) { + replaceTag(message, "COLOR", lastRedNickname.second); + }else{ + replaceTag(message, "COLOR", nickColorist.getRedColor()); + lastRedNickname.first = rawMessage.first; + lastRedNickname.second = nickColorist.getRedColor(false); + } + } + QString logFolder {m_dataFolder}; + logFolder.remove(QRegularExpression(".$")); + QString link {path}; + link.remove(logFolder); + link.remove(QRegularExpression("\\.txt$")); + replaceTag(message, "ANCHOR", link+"#"+ANCHOR_SUFFIX+QString::number(messageAnchorCounter-1)); replaceTag(message, "USERNAME", rawMessage.first); replaceTag(message, "MESSAGE_TEXT", rawMessage.second); matchedPathsAndMessages[path].push_back(message); @@ -1145,6 +1219,7 @@ void HttpServer::writeRegularPage(QTcpSocket *socket, QString &urlPath, bool isH buffer = file.readLine(); } file.close(); + messageAnchorCounter = 0; } } @@ -1321,11 +1396,27 @@ void HttpServer::writeRegularPage(QTcpSocket *socket, QString &urlPath, bool isH } for (const auto &user: m_servers[originalServerName][originalChannelName]) { if (QRegularExpression("^(.*;|~|@|\\&|\\+)?"+rawMessage.first+"$").match(user).hasMatch()) { - message.replace("class=\"main_payload__chat_username\"", - "class=\"main_payload__chat_username\" style=\"color: green\""); + if (lastGreenNickname.first == rawMessage.first) { + replaceTag(message, "COLOR", lastGreenNickname.second); + }else{ + replaceTag(message, "COLOR", nickColorist.getGreenColor()); + lastGreenNickname.first = rawMessage.first; + lastGreenNickname.second = nickColorist.getGreenColor(false); + } break; } } + if (not colorEdited) { + if (lastRedNickname.first == rawMessage.first) { + replaceTag(message, "COLOR", lastRedNickname.second); + }else{ + replaceTag(message, "COLOR", nickColorist.getRedColor()); + lastRedNickname.first = rawMessage.first; + lastRedNickname.second = nickColorist.getRedColor(false); + } + } + message.replace("href=\"", "href=\"#"); + replaceTag(message, "ANCHOR", ANCHOR_SUFFIX+QString::number(messageAnchorCounter++)); replaceTag(message, "USERNAME", rawMessage.first); replaceTag(message, "MESSAGE_TEXT", rawMessage.second); payloadBlock += message; @@ -2098,3 +2189,31 @@ void MessagePool::messageToDelete(qint64 timestamp) m_messages.erase(it); } } + +const QString &NickColorist::getGreenColor(bool next) +{ + if (not next) { + return *m_currentGreen; + } + + if (m_currentGreen == &GREEN_1) { + m_currentGreen = &GREEN_2; + }else{ + m_currentGreen = &GREEN_1; + } + return *m_currentGreen; +} + +const QString &NickColorist::getRedColor(bool next) +{ + if (not next) { + return *m_currentRed; + } + + if (m_currentRed == &RED_1) { + m_currentRed = &RED_2; + }else{ + m_currentRed = &RED_1; + } + return *m_currentRed; +} diff --git a/httpserver.h b/httpserver.h index ec35db0..1f8ab56 100644 --- a/httpserver.h +++ b/httpserver.h @@ -13,6 +13,23 @@ constexpr int MAX_MESSAGE_LENGTH_WITHOUT_WBR = 30; constexpr int MAX_NICKNAME_LENGTH_WITHOUT_WBR = 20; constexpr int BUFFER_SIZE = 2048; const QString HTTP_ACTUAL_ETAG {__DATE__ __TIME__}; +const QString ANCHOR_SUFFIX {"msg"}; + +const QString RED_1 {"#753d08"}; +const QString RED_2 {"#b83e3e"}; +const QString GREEN_1 {"#60940c"}; +const QString GREEN_2 {"#27940c"}; + +class NickColorist +{ +public: + const QString& getGreenColor(bool next = true); + const QString& getRedColor(bool next = true); + +private: + const QString* m_currentGreen = &GREEN_1; + const QString* m_currentRed = &RED_1; +}; class Message : public QObject { @@ -193,9 +210,9 @@ Content-Length: {{SIZE}}\r\n\r\n"; const QString HTML_PAYLOAD_LIST_CHAT_MESSAGE = "\
\n\ - \n\ + \n\ {{USERNAME}}\n\ - \n\ + \n\ \n\ {{MESSAGE_TEXT}}\n\ \n\ diff --git a/version.h b/version.h deleted file mode 100644 index 4d4f0cb..0000000 --- a/version.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef VERSION_H -#define VERSION_H - -#include - -const QString IRCABOT_VERSION {"2.1.0"}; -const QString COPYRIGHT_YEAR {"2021-2022"}; - -#endif // VERSION_H