123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- #ifndef HTTPSERVER_H
- #define HTTPSERVER_H
- #include <QObject>
- #include <QTcpServer>
- #include <map>
- const QString HTTP_ACTUAL_ETAG {"2021-12-05"}; // Change it if svg, css or ico was modified
- class HttpServer : public QObject
- {
- Q_OBJECT
- public:
- explicit HttpServer(const QString& address, quint16 port, const QString& logFolder, const QString& mainChannel, QObject *parent = nullptr);
- ~HttpServer();
- private:
- QString convertToClickableLink(const QString &httpLine);
- std::pair<QString,QString> splitUserNameAndMessage(const QString& rawLine);
- QString getRequestPath(const QString &req);
- QString getWordFromPath(const QString& path);
- void writeMainPage(QTcpSocket* socket, QString& urlPath, bool isHeadRequest);
- void writeErrorPage(QTcpSocket*);
- void removeBrakelineSymbols(QString& line);
- void replaceTag(QString& page, const QString& tag, const QString& payload);
- void consoleLog(const QString &message);
- void debugLog(const QString &url);
- QTcpServer* m_TcpServer;
- QString m_mainChannel;
- QString m_logFolder;
- std::map<QString, std::map<QString, QStringList>> m_backendInfo; // server, {channel, users}
- std::map<QString, bool> m_serversOnline;
- std::map<QString, QString> m_botsNick;
- const QString HEADER_HTML = "\
- HTTP/1.1 200 OK\r\n\
- Content-Type: text/html; charset=utf-8\r\n\
- Content-Length: {{SIZE}}\r\n\r\n";
- const QString HEADER_TEXT = "\
- HTTP/1.1 200 OK\r\n\
- Content-Type: text/plain; charset=utf-8\r\n\
- Content-Length: {{SIZE}}\r\n\r\n";
- const QString HEADER_CSS = "\
- HTTP/1.1 200 OK\r\n\
- Content-Type: text/css\r\n\
- Cache-Control: public, max-age=31536000\r\n\
- ETag: \""+HTTP_ACTUAL_ETAG+"\"\r\n\
- Content-Length: {{SIZE}}\r\n\r\n";
- const QString HEADER_SVG = "\
- HTTP/1.1 200 OK\r\n\
- Content-Type: image/svg+xml\r\n\
- Cache-Control: public, max-age=31536000\r\n\
- ETag: \""+HTTP_ACTUAL_ETAG+"\"\r\n\
- Content-Length: {{SIZE}}\r\n\r\n";
- const QString HEADER_ICO = "\
- HTTP/1.1 200 OK\r\n\
- Content-Type: image/ico\r\n\
- Cache-Control: public, max-age=31536000\r\n\
- ETag: \""+HTTP_ACTUAL_ETAG+"\"\r\n\
- Content-Length: {{SIZE}}\r\n\r\n";
- const QString HEADER_304 = "HTTP/1.1 304 Not Modified\r\nContent-Length: 0\r\n\r\n";
- const QString HEADER_404 = "HTTP/1.1 404 Not found\r\n\r\n";
- const QString HTML_SERVER_SECTION = "\
- <div class=\"left_menu__item\">\n\
- <div class=\"left_menu__item_title\">\n\
- <span style=\"font-size: 17px;\">{{ONLINE_STATUS}}</span>{{SERVER_NAME}}\n\
- </div>\n\
- <div class=\"left_menu__item_rooms\">\n\
- {{CHANNELS}}\
- </div>\n\
- </div>\n";
- const QString HTML_SERVER_ONLINE_MARKER = "✅";
- const QString HTML_SERVER_OFFLINE_MARKER = "❌";
- const QString HTML_SERVER_SECTION_CHANNEL = "\
- <a href=\"{{CHANNEL_LINK}}\" class=\"left_menu__item_link\">{{CHANNEL_NAME}}</a>\n";
- const QString HTML_SERVER_SECTION_CHANNEL_SELECTED = "\
- <a href=\"{{CHANNEL_LINK}}\" class=\"left_menu__item_link__selected\">{{CHANNEL_NAME}}</a>\n";
- const QString HTML_ONLINE_POINT = "\
- <div class=\"main_middle__online_point\">\n\
- {{NICKNAME}}\n\
- </div>\n";
- const QString HTML_PAYLOAD_LIST_POINT_FOLDER = "\
- <a href=\"{{POINT_LINK}}\" class=\"main_payload__block\">\n\
- <div class=\"main_payload__block_folder\">\n\
- </div>\n\
- <div class=\"main_payload__block_text\">\n\
- {{POINT_CONTENT}}\n\
- </div>\n\
- </a>\n";
- const QString HTML_PAYLOAD_LIST_POINT_MESSAGE = "\
- <a href=\"{{POINT_LINK}}\" class=\"main_payload__block\">\n\
- <div class=\"main_payload__block_message\">\n\
- </div>\n\
- <div class=\"main_payload__block_text\">\n\
- {{POINT_CONTENT}}\n\
- </div>\n\
- </a>\n";
- const QString HTML_PAYLOAD_LIST_CHAT_MESSAGE = "\
- <div class=\"main_payload__chat\">\n\
- <div class=\"main_payload__chat_username\">\n\
- {{USERNAME}}\n\
- </div>\n\
- <div class=\"main_payload__chat_mail\">\n\
- {{MESSAGE_TEXT}}\n\
- </div>\n\
- </div>\n";
- const QString HTML_PAYLOAD_ERROR = "\
- <div class=\"main_payload__error\">\n\
- <span style=\"color: red; text-align: center; display: block; font-size: 24px;\">{{ERROR_TITLE}}</span><br>\n\
- {{ERROR_TEXT}}\n\
- </div>";
- private slots:
- void acceptor();
- void reader();
- public slots:
- void ircBotFirstInfo(QString server, QStringList channels); // needed for permanent offline servers
- void ircClientAction(QString server, QString channel, QStringList users);
- void ircServerOnline(QString server, quint8 status /*0 or 1*/);
- void ircBotNic(QString server, QString nickname);
- };
- #endif // HTTPSERVER_H
|