ircabot/httpserver.h

142 lines
5.2 KiB
C++

#ifndef HTTPSERVER_H
#define HTTPSERVER_H
#include <QObject>
#include <QTcpServer>
#include <map>
const QString HTTP_ACTUAL_ETAG {"2021-12-24"}; // 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_onlineUsers; // server, {channel, users}
std::map<QString, std::map<QString, QString>> m_channelsTopic; // server, {channel, topic}
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 = "&#9989;";
const QString HTML_SERVER_OFFLINE_MARKER = "&#10060;";
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; 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 ircUsersOnline(QString server, QString channel, QStringList users);
void ircChannelTopic(QString server, QString channel, QString topic);
void ircServerOnline(QString server, quint8 status /*0 or 1*/);
void ircBotNick(QString server, QString nickname);
};
#endif // HTTPSERVER_H