diff options
Diffstat (limited to 'src/crsm.hpp')
| -rw-r--r-- | src/crsm.hpp | 227 |
1 files changed, 227 insertions, 0 deletions
diff --git a/src/crsm.hpp b/src/crsm.hpp new file mode 100644 index 0000000..d96cc7b --- /dev/null +++ b/src/crsm.hpp @@ -0,0 +1,227 @@ +#pragma once + +#include <QObject> +#include <QProcess> +#include <QTextStream> +#include <QSocketNotifier> +#include <QCoreApplication> +#include <QTextCodec> +#include <QMap> +#include <QFile> +#include <QDir> +#include <QDebug> +#include <QDirIterator> +#include <Irc> +#include <IrcConnection> +#include <IrcCommand> +#include <QSignalMapper> +#include <QTcpServer> +#include <QTcpSocket> + +#include "CmdFunctionRef.hpp" +#include "ProcessManager.hpp" + +#define CONFIG_FILE_NAME "CrServerManager.conf" +#define CUR_SCEN_FILE_NAME "curscen.txt" +#define LAST_SCEN_FILE_NAME "lastscen.txt" +#define SCOREBOARD_FILE_NAME settings["ClonkDirectory"] + "scoreboard.html" + +#define IRC_CHECK_CALLBACK(name) void name(const ClientInfo& requester, int status, const ClientInfo& subject) +#define IRC_CHECK_CALLBACK_IMPL(name) void CRSM::name(const ClientInfo& requester, int status, const ClientInfo& subject) { (void)requester; (void)status; (void)subject; + +#ifdef Q_OS_LINUX64 +#define C4GROUP_EXECUTABLE "c4group64" +#else +#define C4GROUP_EXECUTABLE "c4group" +#endif + +class CRSM; +typedef void (CRSM::*IrcCheckCallback)(const ClientInfo&, int, const ClientInfo&); + +class ScenarioSettings { +public: + QString name; + bool league = false; + bool randomLeague = false; + ClientInfo wishClient; + + ScenarioSettings(const QString& name, bool league = false) : name(name), league(league) {} + ScenarioSettings(const QString& name, const ClientInfo& client, bool league = false) : name(name), league(league), wishClient(client) {} +}; + +class CRSM : public QObject +{ +private: + enum IrcModOperations { + ModCheck, + ModInfo, + SkipScen, + ClearUserList, + SkipCurrentScen, + Autohost, + NoAutohost, + ModHelp, + Kill, + IO, + CheckOnly, + NewAlias, + AliasWishes, + IngameChat + }; + + enum RespondType { + Normal, + Notice, + Private, + PrivateNotice + }; + + Q_OBJECT +public: + explicit CRSM(QObject *parent = 0); + ~CRSM(); + void start(); + bool isOk(); + +signals: + +private slots: + void readServerOutput(); + void readInput(); + void nextScen(); + void printAdditionalHelp(); + void readLog(); + void scenarioFinished(); + void ircMessageReceived(IrcMessage* message); + void greet(QString pcName); + + void newManagementConnection(); + void newManagementData(); + void managementConnectionDisconnected(); + + void updateNextAutoScens(); + +private: + QList<ScenarioSettings> userlist; + QList<ScenarioSettings> autolist; + QList<ScenarioSettings> nextAutoScens; + QStringList args; + QStringList ircModChecks; + QStringList ircMods; + QMap<QString, QList<QPair<ClientInfo, IrcCheckCallback>>> ircStatusFifos; + QMap<QString, QList<QPair<CmdFunctionRef, QString>>> ircModFifos; + QMap<QString, QList<QPair<IrcModOperations, QString>>> ircModFifosOld; + QString aliasWishEditor = ""; + QString currentAliasWish = ""; + int current; + QTextStream *qout; + QTextStream *qin; + bool finish; + QMap<QString, QString> settings; + QMap<QString, QString> session; + QMap<QString, ClientInfo> clients; + QMap<QString, QStringList> lists; + QMap<QString, QMap<QString, QString>> maps; + IrcConnection *connection = 0; + bool autoHost = true; + QSignalMapper greetMapper; + ClientInfo sessionAdmin; + ClientInfo ircAdmin; + QMap<ClientInfo, QDateTime> leaveAdmins; + QFile *logfile; + QTextStream logstream; + QTextCodec *codec; + QStringList ircModIOList; + QString writtenToServer; + QMap<QString, CmdFunctionRef> cmds; + ProcessManager* processManager; + QTcpServer managementServer; + QMap<QTcpSocket*, ManagementConnection> managementConnections; + + bool ok = false; + + void startScen(const ScenarioSettings& scen, QStringList); + void readConfig(); + void readScenarios(); + void listC4Folders(); + void cleanUp(); + QString scenPath(QString scenName); + QString listScenarios(QString commandArgs); + QString printQueue(); + void ircCheckModCmd(const QString &nick, CmdFunctionRef func, QString arg = ""); + QString skipScen(); + bool skipCurrent(); + void writeToServer(const QString& message); + void writeConfig(); + QString addAliasWish(const QString& param); + void informModsAboutAliasWish(); + void editAliasWishes(); + void editAliasWishes(const QString &message); + void stopAliasWishEditing(); + QString ircActivateIngameChat(bool activated = true); + QStringList listC4Folder(const QString &path); + + void addCommand(const QString& name, CmdFunction func, int interfaces = Clonk | IRC, UserType userType = User, const QString& shortDescription = "", const QString &argList = "", const QString &longDescription = ""); + bool cmdExists(const QString& name, ClientInterface interface); + bool cmd(const QString& name, const QString& args, const ClientInfo& client); + void rightsFailMessage(const ClientInfo& info, UserType minUserType); + UserType clientUserType(const ClientInfo& client); + + void setupCmds(); + + void respond(const ClientInfo& client, const QString& message, const RespondType type = Normal); + void ircCheckUserStatus(const ClientInfo& requester, const ClientInfo& subject, IrcCheckCallback callback); + void setIngameAdmin(const ClientInfo &client, const QString& newAdmin); + + QFile outputBuffer; + void out(const QString& text); + void replayOutputBuffer(QTcpSocket *socket, bool clear = true); + + bool scenAllowed(const ScenarioSettings& scen, const ClientInfo& client, UserType userType); + + void kick(const QString& pcName, const QString& reason = ""); + + void prepareAndConnectIrc(); + + ClientInfo& getClientInfo(const QString& pcName, int cuid, const QString& user); + + CMD_FUNCTION(help); + CMD_FUNCTION(passToClonk); + CMD_FUNCTION(admin); + CMD_FUNCTION(host); + CMD_FUNCTION(list); + CMD_FUNCTION(queue); + CMD_FUNCTION(aliaswish); + CMD_FUNCTION(ircchat); + CMD_FUNCTION(autohost); + CMD_FUNCTION(skip); + CMD_FUNCTION(next); + CMD_FUNCTION(kill); + CMD_FUNCTION(clear); + CMD_FUNCTION(aliaswishes); + CMD_FUNCTION(newalias); + CMD_FUNCTION(modinfo); + CMD_FUNCTION(io); + CMD_FUNCTION(pcNamePassToClonk); + CMD_FUNCTION(ingameadmin); + CMD_FUNCTION(ircadmin); + CMD_FUNCTION(noadmin); + CMD_FUNCTION(clientlist); + CMD_FUNCTION(set); + + CMD_FUNCTION(join); + CMD_FUNCTION(leave); + + CMD_FUNCTION(exit); + CMD_FUNCTION(exitDetach); + CMD_FUNCTION(exitUpdate); + CMD_FUNCTION(exitAfter); + CMD_FUNCTION(reload); + CMD_FUNCTION(saveConfig); + + CMD_FUNCTION(reconnectIrc); + + IRC_CHECK_CALLBACK(ircSetAdmin); + IRC_CHECK_CALLBACK(ircModCmd); +}; + |
