summaryrefslogtreecommitdiffstats
path: root/src/crsm.hpp
diff options
context:
space:
mode:
authorMarkus Mittendrein <git@maxmitti.tk>2015-09-09 19:00:56 +0200
committerMarkus Mittendrein <git@maxmitti.tk>2015-09-09 19:02:23 +0200
commit8a6d4b06f2291c363f3dea17837ed20893852453 (patch)
treec091375499e35eaa1810586454e0834c06e6c9b2 /src/crsm.hpp
parentf554a27046f203e56a07baaf214d90834942e3f5 (diff)
downloadmanager-8a6d4b06f2291c363f3dea17837ed20893852453.tar.gz
manager-8a6d4b06f2291c363f3dea17837ed20893852453.zip
Cleanup repo with some directories
Diffstat (limited to 'src/crsm.hpp')
-rw-r--r--src/crsm.hpp227
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);
+};
+