From fdfcc2d575e845a32ffe2dfc0b330a686e92dcc0 Mon Sep 17 00:00:00 2001 From: Markus Mittendrein Date: Tue, 27 Oct 2015 14:13:47 +0100 Subject: Add support for individual pack versions per scenario --- src/crsm.cpp | 186 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 179 insertions(+), 7 deletions(-) (limited to 'src/crsm.cpp') diff --git a/src/crsm.cpp b/src/crsm.cpp index def9231..a6262fa 100644 --- a/src/crsm.cpp +++ b/src/crsm.cpp @@ -309,8 +309,7 @@ void CRSM::scenarioFinished() { if(finish) { - writeConfig(); - Stats.write(); + writeFiles(); if(processManager != nullptr) processManager->exit(); if(connection != 0) { @@ -616,7 +615,7 @@ void CRSM::startScen(const ScenarioSettings &scen, QStringList argList) scoreboardFile.open(QFile::WriteOnly); scoreboardFile.close(); - Session.Scenario= scen; + Session.Scenario = scen; Session.IRC.UseIngameChat = Config.IRC.UseIngameChat; Session.State = CRSMSession::Lobby; ircSetIngameChannelTopic(); @@ -633,6 +632,7 @@ void CRSM::startScen(const ScenarioSettings &scen, QStringList argList) } argList << filename; processManager->setWorkingDirectory(Config.Auto.Volatile.Clonk.Directory); + out(Packs.linkScenarioPacks(filename)); processManager->start(Config.Clonk.Server.Executable, argList); } @@ -1343,6 +1343,17 @@ void CRSM::setupCmds() addCommand("config get", &CRSM::getConfigValue, Management, UserType::Max, "Gibt den aktuellen Wert von der Konfiguration an.", ""); addCommand("config set", &CRSM::setConfigValue, Management, UserType::Max, "Setzt einen Konfigurationswert.", "", "Setzt einen Konfigurationswert. Der Wert wird wie eine Zeile in der Konfigurationsdatei angegeben."); + addCommandGroup("packs", Management, UserType::Max, "Über die packs-Befehlsgruppe lassen sich mehrere Versionen eines Objektpakets für unterschiedliche Szenarien verwalten."); + addCommand("packs list", &CRSM::packsList, Management, UserType::Max, "Listet alle bekannten Packs und ihre Versionen auf."); + addCommandGroup("packs versions", Management, UserType::Max, "Über die packs versions-Befehlsgruppe werden die einzelnen bekannten Packs und vorhandenen Versionen verwaltet."); + addCommand("packs versions add", &CRSM::packsVersionsAdd, Management, UserType::Max, "Fügt eine neue für das hinzu.", " = "); + addCommand("packs versions delete", &CRSM::packsVersionsDelete, Management, UserType::Max, "Löscht eine .", ""); + addCommand("packs versions default", &CRSM::packsVersionsDefault, Management, UserType::Max, "Fragt die Packversion ab, die standardmäßig für das verwendet wird, oder setzt sie, wenn angegeben wird.", " [= ]"); + addCommandGroup("packs scenarios", Management, UserType::Max, "Über die packs scenarios-Befehlsgruppe werden die einzelnen Packversionen den Szenarien zugeteilt."); + addCommand("packs scenarios add", &CRSM::packsScenariosAdd, Management, UserType::Max, "Aktiviert für das die .", " "); + addCommand("packs scenarios delete", &CRSM::packsScenariosDelete, Management, UserType::Max, "Löscht für das die .", " "); + addCommand("packs scenarios list", &CRSM::packsScenariosList, Management, UserType::Max, "Listet alle Szenarien mit ihren Packversionen auf."); + addCommand("relist", &CRSM::relist, Management, UserType::Max, "Durchsucht veränderte Rundenordner erneut."); } @@ -1549,7 +1560,7 @@ void CRSM::exit() void CRSM::applyConfig() { - Stats.write(); + writeFiles(false, true); args.clear(); args << "/config:" + Config.Clonk.Server.Config; args << Config.Clonk.Server.Arguments.split(" "); @@ -1604,6 +1615,7 @@ void CRSM::applyConfig() } setupCmds(); out(Stats.read(Config.CRSM.StatsFile)); + out(Packs.read(Config.CRSM.PacksFile, Config.Auto.Volatile.Clonk.Directory)); } QString CRSM::scenarioFileName(QString name) @@ -1620,6 +1632,20 @@ CmdResult CRSM::callCommand(const CmdFunctionRef &func, const QString &args, con return ret; } +void CRSM::writeFiles(bool writeSession, bool writeNoConfig) +{ + if(writeSession) + { + Session.write(Config.CRSM.SessionFile); + } + Stats.write(); + Packs.write(); + if(!writeNoConfig) + { + writeConfig(); + } +} + CMD_FUNCTION_IMPL(help) bool longHelp = (args == "long"); if(args.isEmpty() || longHelp) @@ -2134,9 +2160,7 @@ CMD_FUNCTION_IMPL(exit) CMD_FUNCTION_IMPL(exitDetach) Config.Auto.ProcessManager.ReattachId = processManager->ID(); - writeConfig(); - Session.write(Config.CRSM.SessionFile); - Stats.write(); + writeFiles(true); connection->quit(Config.IRC.QuitMessage); QCoreApplication::quit(); return Success; @@ -2335,6 +2359,154 @@ CMD_FUNCTION_IMPL(getAdmin) return Success; } +CMD_FUNCTION_IMPL(packsList) + if(Packs.PackDefaultVersion.size() == 0) + { + respond(client, "Es sind noch keine speziellen Packversionen bekannt.\n"); + return Success; + } + QString response("Folgende Packs und ihre Versionen sind bekannt:\n"); + + QMap packVersions; + foreach(const QString& packVersion, Packs.PackVersions.keys()) + { + packVersions[Packs.PackVersions.value(packVersion)].append(packVersion); + } + + foreach(const QString& pack, Packs.PackDefaultVersion.keys()) + { + response.append("\t" + pack + "\t-\t" + packVersions[pack].join(", ") + "\n"); + } + + respond(client, response); + return Success; +} + +CMD_FUNCTION_IMPL(packsVersionsAdd) + const QStringList& argList = Util::splitEscaped(args, '='); + if(argList.length() != 2) + { + respond(client, "Eingabefehler! Siehe " + Config.CRSM.CommandSign + "help für mehr Informationen.\n"); + return SyntaxFail; + } + else + { + QString response = Packs.addPackVersion(argList.first().trimmed(), argList.at(1).trimmed()); + if(response.isEmpty()) + { + response = "PackVersion wurde erfolgreich eingetragen.\n"; + } + respond(client, response); + return Success; + } +} + +CMD_FUNCTION_IMPL(packsVersionsDelete) + QString pack = Packs.PackVersions[args]; + QString response = Packs.deletePackVersion(args); + if(response.isEmpty()) + { + response = "PackVersion \"" + args + "\" vom Pack \"" + pack + "\" wurde erfolgreich entfernt.\n"; + } + respond(client, response); + return Success; +} + +CMD_FUNCTION_IMPL(packsVersionsDefault) + const QStringList& argList = Util::splitEscaped(args, '='); + if(argList.length() != 2 && argList.length() != 1) + { + respond(client, "Eingabefehler! Siehe " + Config.CRSM.CommandSign + "help für mehr Informationen.\n"); + return SyntaxFail; + } + else if(argList.length() == 2) + { + QString oldDefault = Packs.PackDefaultVersion[argList.first().trimmed()]; + QString response = Packs.setDefaultPackVersion(argList.at(1).trimmed(), argList.first().trimmed()); + if(response.isEmpty()) + { + if(oldDefault.isEmpty()) + { + response = "Neues PackDefault wurde erfolgreich eingetragen.\n"; + } + else + { + response = "Altes PackDefault \"" + oldDefault + "\" wurde erfolgreich überschrieben.\n"; + } + } + respond(client, response); + return Success; + } + else + { + if(Packs.PackDefaultVersion.contains(args)) + { + respond(client, "Standardversion für \"" + args + "\" ist \"" + Packs.PackDefaultVersion.value(args) + "\".\n"); + } + else + { + respond(client, "Unbekanntes Pack: \"" + args + "\"!\n"); + } + return Success; + } +} + +CMD_FUNCTION_IMPL(packsScenariosAdd) + const QStringList& argList = Util::splitEscaped(args, ' '); + if(argList.length() != 2) + { + respond(client, "Eingabefehler! Siehe " + Config.CRSM.CommandSign + "help für mehr Informationen.\n"); + return SyntaxFail; + } + else + { + QString response = Packs.addScenarioPackVersion(argList.at(1).trimmed(), argList.first().trimmed()); + if(response.isEmpty()) + { + response = "Packversion für das Szenario wurde erfolgreich hinzugefügt.\n"; + } + respond(client, response); + return Success; + } +} + +CMD_FUNCTION_IMPL(packsScenariosDelete) + const QStringList& argList = Util::splitEscaped(args, ' '); + if(argList.length() != 2) + { + respond(client, "Eingabefehler! Siehe " + Config.CRSM.CommandSign + "help für mehr Informationen.\n"); + return SyntaxFail; + } + else + { + QString response = Packs.deleteScenarioPackVersion(argList.at(1).trimmed(), argList.first().trimmed()); + if(response.isEmpty()) + { + response = "Packversion für das Szenario wurde erfolgreich entfernt.\n"; + } + respond(client, response); + return Success; + } +} + +CMD_FUNCTION_IMPL(packsScenariosList) + if(Packs.ScenarioPacks.size() == 0) + { + respond(client, "Es sind noch keine Szenarios mit speziellen Packversionen bekannt.\n"); + return Success; + } + QString response("Folgende Szenarien mit speziellen Packversionen sind bekannt:\n"); + + foreach(const QString& scenario, Packs.ScenarioPacks.keys()) + { + response.append("\t" + scenario + "\t-\t" + Packs.ScenarioPacks.value(scenario).join(", ") + "\n"); + } + + respond(client, response); + + return Success; +} + IRC_CHECK_CALLBACK_IMPL(ircSayQuery) if(status <= 0) { -- cgit v1.2.3-54-g00ecf