mirror of https://notabug.org/acetone/ircabot.git
142 lines
5.2 KiB
C++
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 = "✅";
|
|
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; 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
|