diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/CRSMConfig.cpp | 122 | ||||
| -rw-r--r-- | src/CRSMConfig.hpp | 13 | ||||
| -rw-r--r-- | src/crsm.cpp | 137 | ||||
| -rw-r--r-- | src/crsm.hpp | 5 |
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); }; |
