summaryrefslogtreecommitdiffstats
path: root/src/crsm.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/crsm.cpp')
-rw-r--r--src/crsm.cpp186
1 files changed, 179 insertions, 7 deletions
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 <Wertname> von der Konfiguration an.", "<Wertname>");
addCommand("config set", &CRSM::setConfigValue, Management, UserType::Max, "Setzt einen Konfigurationswert.", "<Konfigurationszeile>", "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 <Packversion> für das <Pack> hinzu.", "<Packversion> = <Pack>");
+ addCommand("packs versions delete", &CRSM::packsVersionsDelete, Management, UserType::Max, "Löscht eine <Packversion>.", "<Packversion>");
+ addCommand("packs versions default", &CRSM::packsVersionsDefault, Management, UserType::Max, "Fragt die Packversion ab, die standardmäßig für das <Pack> verwendet wird, oder setzt sie, wenn <Packversion> angegeben wird.", "<Pack> [= <Packversion>]");
+ 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 <Szenario> die <Packversion>.", "<Szenario> <Packversion>");
+ addCommand("packs scenarios delete", &CRSM::packsScenariosDelete, Management, UserType::Max, "Löscht für das <Szenario> die <Packversion>.", "<Szenario> <Packversion>");
+ 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<QString, QStringList> 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)
{