summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarkus Mittendrein <git@maxmitti.tk>2015-10-08 14:04:04 +0200
committerMarkus Mittendrein <git@maxmitti.tk>2015-10-08 14:04:04 +0200
commitdbd4d15144c727f967911d41d798758bfb9bad03 (patch)
tree7b3245f2ea9265f98dae5a16ff5b6dd268c8e0d8
parentc59e14b83f8b88f01ec23dcc4e6265cbfb84f733 (diff)
downloadmanager-dbd4d15144c727f967911d41d798758bfb9bad03.tar.gz
manager-dbd4d15144c727f967911d41d798758bfb9bad03.zip
Add config get and config set commands and a -= config syntax to remove
elements from a list or map (by key)
-rw-r--r--src/CRSMConfig.cpp122
-rw-r--r--src/CRSMConfig.hpp13
-rw-r--r--src/crsm.cpp137
-rw-r--r--src/crsm.hpp5
4 files changed, 188 insertions, 89 deletions
diff --git a/src/CRSMConfig.cpp b/src/CRSMConfig.cpp
index 54b0e8f..5ec0f9b 100644
--- a/src/CRSMConfig.cpp
+++ b/src/CRSMConfig.cpp
@@ -13,6 +13,44 @@ void CRSMConfigBase::setConfigValue(const QString &name, const QString &value)
configValue.setValue(value);
}
+QString CRSMConfigBase::getConfigValueLine(const QString &name)
+{
+ if(configValues.contains(name))
+ {
+ CRSMConfigValueBase& value = *configValues[name];
+ switch(value.type())
+ {
+ case CRSMConfigValueType::Map:
+ {
+ QString ret;
+ const QMap<QString, QString>& values = (dynamic_cast<CRSMConfigValueMap*>(&value))->getValues();
+ foreach(const QString& mapKey, values.keys())
+ {
+ ret += name + "[" + mapKey + "]" + " = " + values.value(mapKey) + "\n";
+ }
+ return ret;
+ break;
+ }
+ case CRSMConfigValueType::List:
+ {
+ QString ret;
+ foreach(const QString& val, (dynamic_cast<CRSMConfigValueList*>(&value))->getValues())
+ {
+ ret += name + " += " + val + "\n";
+ }
+ return ret;
+ break;
+ }
+ default:
+ return name + " = " + value.value() + "\n";
+ }
+ }
+ else
+ {
+ throw CRSMConfigException("Unknown config value \"" + name.toStdString() + "\"");
+ }
+}
+
void CRSMConfigBase::addConfigListEntry(const QString &name, const QString &value)
{
CRSMConfigValueBase& configValue = getConfigValue(name);
@@ -23,6 +61,23 @@ void CRSMConfigBase::addConfigListEntry(const QString &name, const QString &valu
((CRSMConfigValueList*)&configValue)->append(value);
}
+void CRSMConfigBase::removeConfigMapListEntry(const QString &name, const QString &value)
+{
+ CRSMConfigValueBase& configValue = getConfigValue(name);
+ if(configValue.type() == CRSMConfigValueType::List)
+ {
+ ((CRSMConfigValueList*)&configValue)->remove(value);
+ }
+ else if(configValue.type() == CRSMConfigValueType::Map)
+ {
+ ((CRSMConfigValueMap*)&configValue)->remove(value);
+ }
+ else
+ {
+ throw CRSMConfigException("Cannot remove a list entry from a value which is neither a list nor a map \"" + name.toStdString() + "\"");
+ }
+}
+
void CRSMConfigBase::setConfigMapValue(const QString &name, const QString &key, const QString &value)
{
CRSMConfigValueBase& configValue = getConfigValue(name);
@@ -70,27 +125,13 @@ QString CRSMConfigBase::read(const QString &fileName, bool writeDefault)
}
else if(config.open(QIODevice::ReadOnly | QIODevice::Text))
{
- static QRegExp valueExp(R"(^([^=]+)=(.*)$)");
- static QRegExp listExp(R"(^([^=]+)\+=(.*)$)");
- static QRegExp mapExp(R"(^([^\[]+)\[([^\]]+)\]\s*=\s*(.*)$)");
QString line;
for(size_t lineNr = 1; !config.atEnd(); ++lineNr)
{
try
{
line = config.readLine().trimmed();
- if(listExp.exactMatch(line))
- {
- addConfigListEntry(listExp.cap(1).trimmed(), listExp.cap(2).trimmed());
- }
- else if(mapExp.exactMatch(line))
- {
- setConfigMapValue(mapExp.cap(1).trimmed(), mapExp.cap(2).trimmed(), mapExp.cap(3).trimmed());
- }
- else if(valueExp.exactMatch(line))
- {
- setConfigValue(valueExp.cap(1).trimmed(), valueExp.cap(2).trimmed());
- }
+ setConfigLine(line);
}
catch(CRSMConfigException e)
{
@@ -113,27 +154,7 @@ bool CRSMConfigBase::write(const QString &fileName)
{
foreach(const QString& key, configValues.keys())
{
- CRSMConfigValueBase& value = *configValues[key];
- switch(value.type())
- {
- case CRSMConfigValueType::Map:
- {
- const QMap<QString, QString> values = (dynamic_cast<CRSMConfigValueMap*>(&value))->getValues();
- foreach(const QString& mapKey, values.keys())
- {
- config.write(QString(key + "[" + mapKey + "]" + " = " + values.value(mapKey) + "\n").toUtf8());
- }
- break;
- }
- case CRSMConfigValueType::List:
- foreach(const QString& val, (dynamic_cast<CRSMConfigValueList*>(&value))->getValues())
- {
- config.write(QString(key + " += " + val + "\n").toUtf8());
- }
- break;
- default:
- config.write(QString(key + " = " + value.value() + "\n").toUtf8());
- }
+ config.write(getConfigValueLine(key).toUtf8());
}
return true;
@@ -144,6 +165,35 @@ bool CRSMConfigBase::write(const QString &fileName)
}
}
+void CRSMConfigBase::setConfigLine(const QString &line)
+{
+ static QRegExp valueExp(R"(^([^=]+)=(.*)$)");
+ static QRegExp listExp(R"(^([^=]+)\+=(.*)$)");
+ static QRegExp listMapRemoveExp(R"(^([^=]+)\-=(.*)$)");
+ static QRegExp mapExp(R"(^([^\[]+)\[([^\]]+)\]\s*=\s*(.*)$)");
+
+ if(listExp.exactMatch(line))
+ {
+ addConfigListEntry(listExp.cap(1).trimmed(), listExp.cap(2).trimmed());
+ }
+ else if(listMapRemoveExp.exactMatch(line))
+ {
+ removeConfigMapListEntry(listMapRemoveExp.cap(1).trimmed(), listMapRemoveExp.cap(2).trimmed());
+ }
+ else if(mapExp.exactMatch(line))
+ {
+ setConfigMapValue(mapExp.cap(1).trimmed(), mapExp.cap(2).trimmed(), mapExp.cap(3).trimmed());
+ }
+ else if(valueExp.exactMatch(line))
+ {
+ setConfigValue(valueExp.cap(1).trimmed(), valueExp.cap(2).trimmed());
+ }
+ else
+ {
+ throw CRSMConfigException("Syntax error: unkown syntax");
+ }
+}
+
void CRSMConfig::clear()
{
auto configVals = configValues;
diff --git a/src/CRSMConfig.hpp b/src/CRSMConfig.hpp
index b25b809..788b7e8 100644
--- a/src/CRSMConfig.hpp
+++ b/src/CRSMConfig.hpp
@@ -142,12 +142,14 @@ public:
class CRSMConfigValueList : public CRSMConfigValueBase {
public:
virtual void append(const QString& entry) = 0;
+ virtual void remove(const QString& entry) = 0;
virtual QStringList getValues() = 0;
};
class CRSMConfigValueMap : public CRSMConfigValueBase {
public:
virtual void setKeyValue(const QString& key, const QString& value) = 0;
+ virtual void remove(const QString& key) = 0;
virtual QMap<QString, QString> getValues() = 0;
};
@@ -172,6 +174,8 @@ public:
}
}
+ virtual void remove(const QString &entry) { config.removeAll(CRSMConfigValueBase::getValue<Type>(entry)); }
+
virtual QStringList getValues()
{
QStringList ret;
@@ -213,6 +217,11 @@ public:
return ret;
}
+
+ virtual void remove(const QString &key)
+ {
+ config.remove(CRSMConfigValueBase::getValue<KeyType>(key));
+ }
};
template<typename Type>
@@ -250,12 +259,16 @@ public:
explicit CRSMConfigBase(QMap<QString, CRSMConfigValueBase*> configValues) : configValues(configValues) {}
void setConfigValue(const QString& name, const QString& value);
+ QString getConfigValueLine(const QString& name);
void addConfigListEntry(const QString& name, const QString& value);
+ void removeConfigMapListEntry(const QString &name, const QString &value);
void setConfigMapValue(const QString& name, const QString& key, const QString& value);
QString read(const QString& fileName, bool writeDefault = true);
bool write(const QString& fileName);
+ void setConfigLine(const QString& line);
+
protected:
void addConfigValue(QString name, CRSMConfigValueBase *value);
CRSMConfigValueBase& getConfigValue(const QString &name);
diff --git a/src/crsm.cpp b/src/crsm.cpp
index fa069e0..34feba2 100644
--- a/src/crsm.cpp
+++ b/src/crsm.cpp
@@ -688,59 +688,7 @@ void CRSM::readConfig()
{
Config.clear();
out(Config.read(CONFIG_FILE_NAME));
- args.clear();
- args << "/config:" + Config.Clonk.Server.Config;
- args << Config.Clonk.Server.Arguments.split(" ");
- Config.Auto.Volatile.Clonk.Directory = QFileInfo(Config.Clonk.Server.Executable).absoluteDir().absolutePath() + QDir::separator();
-
- Config.CRSM.ListFolder = QDir(Config.CRSM.ListFolder).absolutePath() + QDir::separator();
-
- if(!QDir(Config.CRSM.ListFolder).exists())
- {
- if(!QDir().mkpath(Config.CRSM.ListFolder))
- {
- out("ERROR: Could not create the CRSM.ListFolder: " + Config.CRSM.ListFolder + "\n");
- ok = false;
- exit();
- }
- }
-
- QFile clonkConfig(Config.Clonk.Server.Config);
- if(!clonkConfig.exists())
- {
- out("WARNING: Clonk's config file is not existing!");
- }
- else
- {
- clonkConfig.open(QFile::ReadOnly);
- static QRegExp nickExp(R"_(^\s*Nick="(.*)"\s*$)_");
- static QRegExp pcNameExp(R"_(^\s*LocalName="(.*)"\s*$)_");
- foreach(const QString &line, QString(clonkConfig.readAll().trimmed()).split("\n"))
- {
- if(!Config.Auto.Volatile.Clonk.ServerNick.isEmpty() && !Config.Auto.Volatile.Clonk.ServerPCName.isEmpty()) break;
- if(nickExp.exactMatch(line.trimmed()))
- {
- Config.Auto.Volatile.Clonk.ServerNick = nickExp.cap(1);
- continue;
- }
- else if(pcNameExp.exactMatch(line.trimmed()))
- {
- Config.Auto.Volatile.Clonk.ServerPCName = pcNameExp.cap(1);
- continue;
- }
- }
- }
- if((ushort)Config.CRSM.ManagementPort == 0)
- {
- Config.CRSM.ManagementPort = 9372;
- }
- if(!QFile(Config.Clonk.Server.Executable).exists())
- {
- out("ERROR: The Clonk.Server.Executable doesn't exist: \"" + Config.Clonk.Server.Executable + "\"\n");
- ok = false;
- exit();
- }
- setupCmds();
+ applyConfig();
return;
}
@@ -1435,6 +1383,8 @@ void CRSM::setupCmds()
addCommandGroup("config", Management, UserType::Max, "Die config-Befehlsgruppe bietet diverse Befehle zum Verwalten der Konfiguration.");
addCommand("config reload", &CRSM::reload, Management, UserType::Max, "Liest die Konfigurationsdatei neu ein.");
addCommand("config save", &CRSM::saveConfig, Management, UserType::Max, "Speichert die aktuelle Konfiguration in die Konfigurationsdatei.");
+ 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.");
addCommand("relist", &CRSM::relist, Management, UserType::Max, "Durchsucht veränderte Rundenordner erneut.");
}
@@ -1640,6 +1590,63 @@ void CRSM::exit()
scenarioFinished();
}
+void CRSM::applyConfig()
+{
+ args.clear();
+ args << "/config:" + Config.Clonk.Server.Config;
+ args << Config.Clonk.Server.Arguments.split(" ");
+ Config.Auto.Volatile.Clonk.Directory = QFileInfo(Config.Clonk.Server.Executable).absoluteDir().absolutePath() + QDir::separator();
+
+ Config.CRSM.ListFolder = QDir(Config.CRSM.ListFolder).absolutePath() + QDir::separator();
+
+ if(!QDir(Config.CRSM.ListFolder).exists())
+ {
+ if(!QDir().mkpath(Config.CRSM.ListFolder))
+ {
+ out("ERROR: Could not create the CRSM.ListFolder: " + Config.CRSM.ListFolder + "\n");
+ ok = false;
+ exit();
+ }
+ }
+
+ QFile clonkConfig(Config.Clonk.Server.Config);
+ if(!clonkConfig.exists())
+ {
+ out("WARNING: Clonk's config file is not existing!");
+ }
+ else
+ {
+ clonkConfig.open(QFile::ReadOnly);
+ static QRegExp nickExp(R"_(^\s*Nick="(.*)"\s*$)_");
+ static QRegExp pcNameExp(R"_(^\s*LocalName="(.*)"\s*$)_");
+ foreach(const QString &line, QString(clonkConfig.readAll().trimmed()).split("\n"))
+ {
+ if(!Config.Auto.Volatile.Clonk.ServerNick.isEmpty() && !Config.Auto.Volatile.Clonk.ServerPCName.isEmpty()) break;
+ if(nickExp.exactMatch(line.trimmed()))
+ {
+ Config.Auto.Volatile.Clonk.ServerNick = nickExp.cap(1);
+ continue;
+ }
+ else if(pcNameExp.exactMatch(line.trimmed()))
+ {
+ Config.Auto.Volatile.Clonk.ServerPCName = pcNameExp.cap(1);
+ continue;
+ }
+ }
+ }
+ if((ushort)Config.CRSM.ManagementPort == 0)
+ {
+ Config.CRSM.ManagementPort = 9372;
+ }
+ if(!QFile(Config.Clonk.Server.Executable).exists())
+ {
+ out("ERROR: The Clonk.Server.Executable doesn't exist: \"" + Config.Clonk.Server.Executable + "\"\n");
+ ok = false;
+ exit();
+ }
+ setupCmds();
+}
+
CMD_FUNCTION_IMPL(help)
bool longHelp = (args == "long");
if(args.isEmpty() || longHelp)
@@ -2185,6 +2192,30 @@ CMD_FUNCTION_IMPL(relist)
readScenarios();
}
+CMD_FUNCTION_IMPL(getConfigValue)
+ try
+ {
+ respond(client, Config.getConfigValueLine(args));
+ }
+ catch(CRSMConfigException)
+ {
+ respond(client, "Es existiert kein Wert mit dem Namen \"" + args + "\"\n");
+ }
+}
+
+CMD_FUNCTION_IMPL(setConfigValue)
+ try
+ {
+ Config.setConfigLine(args);
+ applyConfig();
+ respond(client, "Wert wurde erfolgreich übernommen.\n");
+ }
+ catch(CRSMConfigException e)
+ {
+ respond(client, QString("Fehler beim Setzen: ") + e.what() + "\n");
+ }
+}
+
IRC_CHECK_CALLBACK_IMPL(ircSetAdmin)
if(status <= 0)
{
diff --git a/src/crsm.hpp b/src/crsm.hpp
index 139446c..2059a5a 100644
--- a/src/crsm.hpp
+++ b/src/crsm.hpp
@@ -231,6 +231,8 @@ private:
void exit();
+ void applyConfig();
+
CMD_FUNCTION(help);
CMD_FUNCTION(passToClonk);
CMD_FUNCTION(passToClonkOnOff);
@@ -274,6 +276,9 @@ private:
CMD_FUNCTION(relist);
+ CMD_FUNCTION(getConfigValue);
+ CMD_FUNCTION(setConfigValue);
+
IRC_CHECK_CALLBACK(ircSetAdmin);
IRC_CHECK_CALLBACK(ircModCmd);
};