diff options
| author | Markus Mittendrein <git@maxmitti.tk> | 2015-10-27 12:42:19 +0100 |
|---|---|---|
| committer | Markus Mittendrein <git@maxmitti.tk> | 2015-10-27 12:42:19 +0100 |
| commit | 4e30841039bb7c3efe5558e40cba8375baad30f7 (patch) | |
| tree | 40850a3816e537a60e1037eff29f54245cae23fc /src/crsm.cpp | |
| parent | b5f799707482bee75bcf1f32c9aa509c96b6d1a7 (diff) | |
| download | manager-4e30841039bb7c3efe5558e40cba8375baad30f7.tar.gz manager-4e30841039bb7c3efe5558e40cba8375baad30f7.zip | |
Begin adding basic stats
Diffstat (limited to 'src/crsm.cpp')
| -rw-r--r-- | src/crsm.cpp | 122 |
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); } } |
