summaryrefslogtreecommitdiffstats
path: root/src/crsm.cpp
diff options
context:
space:
mode:
authorMarkus Mittendrein <git@maxmitti.tk>2015-10-27 12:42:19 +0100
committerMarkus Mittendrein <git@maxmitti.tk>2015-10-27 12:42:19 +0100
commit4e30841039bb7c3efe5558e40cba8375baad30f7 (patch)
tree40850a3816e537a60e1037eff29f54245cae23fc /src/crsm.cpp
parentb5f799707482bee75bcf1f32c9aa509c96b6d1a7 (diff)
downloadmanager-4e30841039bb7c3efe5558e40cba8375baad30f7.tar.gz
manager-4e30841039bb7c3efe5558e40cba8375baad30f7.zip
Begin adding basic stats
Diffstat (limited to 'src/crsm.cpp')
-rw-r--r--src/crsm.cpp122
1 files changed, 98 insertions, 24 deletions
diff --git a/src/crsm.cpp b/src/crsm.cpp
index 36058c2..6da3fb2 100644
--- a/src/crsm.cpp
+++ b/src/crsm.cpp
@@ -229,6 +229,7 @@ void CRSM::readServerOutput()
if(startExp.exactMatch(what))
{
Session.State = CRSMSession::Running;
+ Stats.AddScenarioStart(Session.Scenario.wishClient, scenarioFileName(Session.Scenario.name));
if(!Session.League)
{
writeToServer(QString("/set maxplayer 0\n"));
@@ -615,13 +616,11 @@ void CRSM::startScen(const ScenarioSettings &scen, QStringList argList)
scoreboardFile.open(QFile::WriteOnly);
scoreboardFile.close();
- Session.ScenarioName = scen.name;
+ Session.Scenario= scen;
Session.IRC.UseIngameChat = Config.IRC.UseIngameChat;
Session.State = CRSMSession::Lobby;
ircSetIngameChannelTopic();
- filename = scen.name;
- while(Config.Hosting.Alias.contains(filename))
- filename = Config.Hosting.Alias.value(filename);
+ filename = scenarioFileName(scen.name);
if(scen.league)
{
@@ -1136,7 +1135,7 @@ void CRSM::ircSetIngameChannelTopic()
default:
break;
}
- connection->sendCommand(IrcCommand::createTopic(Config.IRC.IngameChannel, "Aktuelles Szenario: " + Session.ScenarioName + " | " + statusText + " | Ingamechat ist " + (Session.IRC.UseIngameChat ? "" : "de") + "aktviert."));
+ connection->sendCommand(IrcCommand::createTopic(Config.IRC.IngameChannel, "Aktuelles Szenario: " + Session.Scenario.name + " | " + statusText + " | Ingamechat ist " + (Session.IRC.UseIngameChat ? "" : "de") + "aktviert."));
}
}
}
@@ -1189,24 +1188,25 @@ bool CRSM::cmd(const QString &cmd, const ClientInfo &client)
CmdFunctionRef* cmdPtr;
if((cmdPtr = findCommand(cmd, client.interface)) != nullptr)
{
- const CmdFunctionRef& cmdRef = *cmdPtr;
+ CmdFunctionRef cmdRef = *cmdPtr;
QString args = cmd.mid(cmdRef.name.length()).trimmed();
switch(client.interface)
{
case Clonk:
if(clientUserType(client) >= cmdRef.userType)
{
- (this->*cmdRef.func)(cmdRef.name, args, client, clientUserType(client));
+ callCommand(cmdRef, args, client, clientUserType(client));
}
else
{
rightsFailMessage(client, cmdRef.userType);
+ Stats.AddCommandResult(client, cmdRef.name, RightsFail);
}
break;
case IRC:
if(cmdRef.userType == User || ((cmdRef.userType == Admin && (clientUserType(client) >= Admin)) || (cmdRef.userType == Moderator && clientUserType(client) >= Moderator)))
{
- (this->*cmdRef.func)(cmdRef.name, args, client, clientUserType(client));
+ callCommand(cmdRef, args, client, clientUserType(client));
}
else if(cmdRef.userType >= Admin)
{
@@ -1214,7 +1214,7 @@ bool CRSM::cmd(const QString &cmd, const ClientInfo &client)
}
break;
case Management:
- (this->*cmdRef.func)(cmdRef.name, args, client, UserType::Max);
+ callCommand(cmdRef, args, client, UserType::Max);
break;
case Auto: //just to avoid the compiler warning, there can't be a command from this interface
break;
@@ -1224,6 +1224,7 @@ bool CRSM::cmd(const QString &cmd, const ClientInfo &client)
}
else
{
+ Stats.AddCommandResult(client, cmd, UnknownCommand);
return false;
}
}
@@ -1548,6 +1549,7 @@ void CRSM::exit()
void CRSM::applyConfig()
{
+ Stats.write();
args.clear();
args << "/config:" + Config.Clonk.Server.Config;
args << Config.Clonk.Server.Arguments.split(" ");
@@ -1601,6 +1603,21 @@ void CRSM::applyConfig()
exit();
}
setupCmds();
+ out(Stats.read(Config.CRSM.StatsFile));
+}
+
+QString CRSM::scenarioFileName(QString name)
+{
+ while(Config.Hosting.Alias.contains(name))
+ name = Config.Hosting.Alias.value(name);
+ return name;
+}
+
+CmdResult CRSM::callCommand(const CmdFunctionRef &func, const QString &args, const ClientInfo &client, UserType userType)
+{
+ CmdResult ret = (this->*func.func)(func.name, args, client, userType);
+ Stats.AddCommandResult(client, func.name, ret);
+ return ret;
}
CMD_FUNCTION_IMPL(help)
@@ -1674,10 +1691,12 @@ CMD_FUNCTION_IMPL(help)
respond(client, "Der Befehl " + args + " existiert nicht.\n");
}
}
+ return Success;
}
CMD_FUNCTION_IMPL(passToClonk)
writeToServer('/' + cmd + ' ' + args + '\n');
+ return Success;
}
CMD_FUNCTION_IMPL(admin)
@@ -1689,31 +1708,31 @@ CMD_FUNCTION_IMPL(admin)
if(args == Config.Auto.Volatile.Clonk.ServerNick || args == Config.Auto.Volatile.Clonk.ServerPCName)
{
respond(client, "Der Server kann nicht als Rundenadmin eingetragen werden!\n");
- return;
+ return Success;
}
break;
case IRC:
interfaceAdminPtr = &Session.IRC.Admin;
break;
default:
- return;
+ return Success;
}
ClientInfo& interfaceAdmin = *interfaceAdminPtr;
if(args.isEmpty() && interfaceAdmin == client)
{
respond(client, "Du bist bereits Rundenadmin!\n");
- return;
+ return Success;
}
else if((!Session.IRC.Admin.empty() || !Session.Clonk.Admin.empty()) && userType < Admin && !(Session.Clonk.LeaveAdmins.contains(client) && Session.Clonk.LeaveAdmins.value(client).secsTo(QDateTime::currentDateTime()) < Config.Clonk.Chat.RegainAdminTime))
{
respond(client, Session.IRC.Admin.toString() + (!Session.IRC.Admin.nick.isEmpty() && !Session.Clonk.Admin.nick.isEmpty() ? " und " : "") + Session.Clonk.Admin.toString() + " ist bereits Rundenadmin!\n");
- return;
+ return Success;
}
else if(args.isEmpty())
{
interfaceAdmin = client;
respond(client, client.toString() + " wurde als Rundenadmin eingetragen!\n");
- return;
+ return Success;
}
else if(client.interface == Clonk)
{
@@ -1723,6 +1742,7 @@ CMD_FUNCTION_IMPL(admin)
{
ircCheckUserStatus(client, ClientInfo::ircClient(args), &CRSM::ircSetAdmin);
}
+ return Success;
}
CMD_FUNCTION_IMPL(host)
@@ -1747,6 +1767,8 @@ CMD_FUNCTION_IMPL(host)
if(scenAllowed(scen, client, userType))
{
userlist << scen;
+ Stats.AddScenarioWish(client, scenarioFileName(scen.name));
+
respond(client, "Szenario " + scen.name + (scen.league ? " mit Liga" : "") + " " + (Session.State == CRSMSession::None || (Session.Clonk.Clients.size() == 0 && !Session.UserWish) ? "wird jetzt gehostet" : "wurde der Warteschlange hinzugefügt") + ".\n");
if(userlist.length() == 1 && !Session.UserWish && !Session.Running && Session.State != CRSMSession::None && Session.Clonk.Clients.size() > 0)
respond(client, "Überrede alle Spieler zu leaven und dein Wunsch wird sofort gehostet ;-)\n");
@@ -1766,6 +1788,7 @@ CMD_FUNCTION_IMPL(host)
}
}
}
+ return Success;
}
CMD_FUNCTION_IMPL(list)
@@ -1777,18 +1800,22 @@ CMD_FUNCTION_IMPL(list)
{
respond(client, Config.IRC.ScenListMessage);
}
+ return Success;
}
CMD_FUNCTION_IMPL(queue)
respond(client, printQueue(), RespondType::PrivateNotice);
+ return Success;
}
CMD_FUNCTION_IMPL(aliaswish)
respond(client, addAliasWish(args) + "\n");
+ return Success;
}
CMD_FUNCTION_IMPL(ircchat)
respond(client, ircActivateIngameChat(args.toLower() == "on") + "\n");
+ return Success;
}
CMD_FUNCTION_IMPL(autohost)
@@ -1806,7 +1833,7 @@ CMD_FUNCTION_IMPL(autohost)
autoHost = false;
respond(client, "Automatisches Hosting deaktiviert.\n");
}
-
+ return Success;
}
CMD_FUNCTION_IMPL(skip)
@@ -1819,6 +1846,7 @@ CMD_FUNCTION_IMPL(skip)
{
respond(client, "Userliste ist leer!\n");
}
+ return Success;
}
CMD_FUNCTION_IMPL(next)
@@ -1826,11 +1854,13 @@ CMD_FUNCTION_IMPL(next)
{
respond(client, "Versuche zu überspringen...\n");
}
+ return Success;
}
CMD_FUNCTION_IMPL(kill)
processManager->kill();
respond(client, "Clonk-Server wurde gekillt.\n");
+ return Success;
}
CMD_FUNCTION_IMPL(clear)
@@ -1843,6 +1873,7 @@ CMD_FUNCTION_IMPL(clear)
{
respond(client, "Userliste ist leer!\n");
}
+ return Success;
}
CMD_FUNCTION_IMPL(aliaswishes)
@@ -1855,6 +1886,7 @@ CMD_FUNCTION_IMPL(aliaswishes)
}
else
respond(client, aliasWishEditor + " bearbeitet bereits die Aliase. Danke für die Bemühung.\n", RespondType::Private);
+ return Success;
}
CMD_FUNCTION_IMPL(newalias)
@@ -1888,8 +1920,9 @@ CMD_FUNCTION_IMPL(newalias)
}
else
{
- respond(client, "Eingabefehler! Siehe !help newalias für mehr Informationen.\n");
+ respond(client, "Eingabefehler! Siehe " + Config.CRSM.CommandSign + "help newalias für mehr Informationen.\n");
}
+ return Success;
}
CMD_FUNCTION_IMPL(modinfo)
@@ -1898,6 +1931,7 @@ CMD_FUNCTION_IMPL(modinfo)
{
respond(client, (ircMods.contains(mod) ? QString("*") : QString(" ")) + (ircModIOList.contains(mod) ? QString("+") : QString(" ")) + (ircModWatchList.contains(ClientInfo::ircClient(mod)) ? QString("-") : QString(" ")) + " " + Config.IRC.Moderators.value(mod) + "\n", RespondType::Private);
}
+ return Success;
}
CMD_FUNCTION_IMPL(io)
@@ -1905,13 +1939,14 @@ CMD_FUNCTION_IMPL(io)
ircModIOList.removeAll(client.nick);
else
ircModIOList.append(client.nick);
+ return Success;
}
CMD_FUNCTION_IMPL(passToClonkPcName)
if(args == Config.Auto.Volatile.Clonk.ServerNick || args == Config.Auto.Volatile.Clonk.ServerPCName)
{
respond(client, Config.CRSM.CommandSign + cmd + " kann nicht auf den Server angewendet werden!\n");
- return;
+ return Success;
}
ClientInfo info;
if(Session.Clonk.Clients.contains(args))
@@ -1949,12 +1984,12 @@ CMD_FUNCTION_IMPL(passToClonkPcName)
if(ambigous)
{
respond(client, "Chat-Nickname " + args + " ist nicht eindeutig. Bitte PC-Namen verwenden.\n");
- return;
+ return Success;
}
else if(notFound)
{
respond(client, args + " wurde nicht gefunden!\n");
- return;
+ return Success;
}
else
{
@@ -1964,23 +1999,27 @@ CMD_FUNCTION_IMPL(passToClonkPcName)
if(cmd == "kick" && clientUserType(info) > userType)
{
respond(client, "Moderatoren können nur von anderen Moderatoren gekickt werden.\n");
- return;
+ return RightsFail;
}
writeToServer("/" + cmd + " " + info.pcName + "\n");
+ return Success;
}
CMD_FUNCTION_IMPL(ircadmin)
ircCheckUserStatus(client, ClientInfo::ircClient(args), &CRSM::ircSetAdmin);
+ return Success;
}
CMD_FUNCTION_IMPL(ingameadmin)
setIngameAdmin(client, args);
+ return Success;
}
CMD_FUNCTION_IMPL(noadmin)
Session.IRC.Admin.clear();
Session.Clonk.Admin.clear();
respond(client, "Rundenadmin wurde freigegeben.\n");
+ return Success;
}
CMD_FUNCTION_IMPL(clientlist)
@@ -1993,6 +2032,7 @@ CMD_FUNCTION_IMPL(clientlist)
}
response = response.left(response.length() - 2);
respond(client, response + "\n");
+ return Success;
}
CMD_FUNCTION_IMPL(passToClonkNumeric)
@@ -2001,10 +2041,12 @@ CMD_FUNCTION_IMPL(passToClonkNumeric)
if(!ok)
{
respond(client, Config.CRSM.CommandSign + cmd + " kann nur mit einer Zahl verwendet werden!\n");
+ return SyntaxFail;
}
else
{
writeToServer("/" + cmd + " " + QString::number(number) + "\n");
+ return Success;
}
}
@@ -2012,10 +2054,11 @@ CMD_FUNCTION_IMPL(passToClonkNumericOrEmpty)
if(args.isEmpty())
{
writeToServer("/" + cmd + "\n");
+ return Success;
}
else
{
- passToClonkNumeric(cmd, args, client, userType);
+ return passToClonkNumeric(cmd, args, client, userType);
}
}
@@ -2023,10 +2066,12 @@ CMD_FUNCTION_IMPL(passToClonkOnOff)
if(args != "on" && args != "off")
{
respond(client, Config.CRSM.CommandSign + cmd + " kann nur mit \"on\" oder \"off\" verwendet werden.\n");
+ return SyntaxFail;
}
else
{
writeToServer("/" + cmd + " " + args + "\n");
+ return Success;
}
}
@@ -2036,16 +2081,19 @@ CMD_FUNCTION_IMPL(join)
if(argList.size() < 1 || argList.first().isEmpty())
{
respond(client, "Kein Channel angegeben!\n");
+ return SyntaxFail;
}
else if(chanExp.exactMatch(argList.first()))
{
QString chan = argList.first();
argList.removeFirst();
connection->sendCommand(IrcCommand::createJoin(chan, argList.join(' ')));
+ return Success;
}
else
{
respond(client, "\"" + argList.first() + "\" ist kein gültiger Channel-Name.\n");
+ return SyntaxFail;
}
}
@@ -2070,27 +2118,33 @@ CMD_FUNCTION_IMPL(leave)
if(chanExp.exactMatch(chan))
{
connection->sendCommand(IrcCommand::createPart(chan, reason));
+ return Success;
}
else
{
respond(client, "\"" + chan + "\" ist kein gültiger Channel-Name.\n");
+ return SyntaxFail;
}
}
CMD_FUNCTION_IMPL(exit)
exit();
+ return Success;
}
CMD_FUNCTION_IMPL(exitDetach)
Config.Auto.ProcessManager.ReattachId = processManager->ID();
writeConfig();
Session.write(Config.CRSM.SessionFile);
+ Stats.write();
+ connection->quit(Config.IRC.QuitMessage);
QCoreApplication::quit();
+ return Success;
}
CMD_FUNCTION_IMPL(exitUpdate)
writeToServer("Der Server Manager wird upgedatet. Befehle funktionieren temporär nicht.\n");
- exitDetach(cmd, args, client, userType);
+ return exitDetach(cmd, args, client, userType);
}
CMD_FUNCTION_IMPL(exitAfter)
@@ -2098,11 +2152,12 @@ CMD_FUNCTION_IMPL(exitAfter)
{
finish = true;
respond(client, "Beende nach dieser runde.\n");
+ return Success;
}
else
{
respond(client, "Es läuft gerade kein Spiel, beende sofort.\n");
- exit(cmd, args, client, userType);
+ return exit(cmd, args, client, userType);
}
}
@@ -2115,12 +2170,14 @@ CMD_FUNCTION_IMPL(reload)
readConfig();
readScenarios();
out("Configuration reloaded.\n");
+ return Success;
}
CMD_FUNCTION_IMPL(saveConfig)
out("Saving Configuration...\n");
writeConfig();
out("Configuration saved.\n");
+ return Success;
}
CMD_FUNCTION_IMPL(reconnectIrc)
@@ -2128,6 +2185,7 @@ CMD_FUNCTION_IMPL(reconnectIrc)
connection->close();
delete connection;
prepareAndConnectIrc();
+ return Success;
}
CMD_FUNCTION_IMPL(groupinfo)
@@ -2136,6 +2194,7 @@ CMD_FUNCTION_IMPL(groupinfo)
respond(client, "Unbekannter Unterbefehl: \"" + args + "\"!\n");
}
help("help", cmd, client, userType);
+ return Success;
}
CMD_FUNCTION_IMPL(grouphelp)
@@ -2147,15 +2206,18 @@ CMD_FUNCTION_IMPL(grouphelp)
{
help("help", QString(cmd).replace(cmd.indexOf("help"), 4, "") + args, client, userType);
}
+ return Success;
}
CMD_FUNCTION_IMPL(setRaw)
writeToServer("/set " + args + '\n');
+ return Success;
}
CMD_FUNCTION_IMPL(relist)
listC4Folders();
readScenarios();
+ return Success;
}
CMD_FUNCTION_IMPL(getConfigValue)
@@ -2167,6 +2229,7 @@ CMD_FUNCTION_IMPL(getConfigValue)
{
respond(client, "Es existiert kein Wert mit dem Namen \"" + args + "\"\n");
}
+ return Success;
}
CMD_FUNCTION_IMPL(setConfigValue)
@@ -2180,6 +2243,7 @@ CMD_FUNCTION_IMPL(setConfigValue)
{
respond(client, QString("Fehler beim Setzen: ") + e.what() + "\n");
}
+ return Success;
}
CMD_FUNCTION_IMPL(ircSay)
@@ -2187,6 +2251,7 @@ CMD_FUNCTION_IMPL(ircSay)
if(parts.length() < 2)
{
respond(client, "Es wird ein Empfänger und eine Nachricht benötigt.\n");
+ return SyntaxFail;
}
else
{
@@ -2203,6 +2268,7 @@ CMD_FUNCTION_IMPL(ircSay)
connection->sendCommand(IrcCommand::createMessage(target, message));
}
}
+ return Success;
}
CMD_FUNCTION_IMPL(ircWatch)
@@ -2234,7 +2300,9 @@ CMD_FUNCTION_IMPL(ircWatch)
else
{
respond(client, Config.CRSM.CommandSign + cmd + " kann nur mit \"on\" oder \"off\" verwendet werden.\n");
+ return SyntaxFail;
}
+ return Success;
}
CMD_FUNCTION_IMPL(getAdmin)
@@ -2264,6 +2332,7 @@ CMD_FUNCTION_IMPL(getAdmin)
response.append("Rundenadmin.\n");
respond(client, response);
}
+ return Success;
}
IRC_CHECK_CALLBACK_IMPL(ircSayQuery)
@@ -2300,7 +2369,7 @@ IRC_CHECK_CALLBACK_IMPL(ircModCmd)
QList<QPair<CmdFunctionRef, QString>> &fifo = ircModFifos[subject.nick];
while(fifo.size() > 0)
{
- (this->*fifo.first().first.func)(fifo.first().first.name, fifo.first().second, subject, clientUserType(subject));
+ callCommand(fifo.first().first, fifo.first().second, subject, clientUserType(subject));
fifo.removeFirst();
}
if(!Config.Auto.Hosting.AliasWishes.isEmpty())
@@ -2314,6 +2383,11 @@ IRC_CHECK_CALLBACK_IMPL(ircModCmd)
if(ircModFifos.contains(subject.nick))
{
rightsFailMessage(subject, ircModFifos[subject.nick].first().first.userType);
+ using CmdArgType = QPair<CmdFunctionRef, QString>;
+ foreach(const CmdArgType& cmd, ircModFifos[subject.nick])
+ {
+ Stats.AddCommandResult(subject, cmd.first.name, RightsFail);
+ }
ircModFifos.remove(subject.nick);
}
}