diff --git a/src/config.cpp b/src/config.cpp
index c109ee3..3c62e20 100644
--- a/src/config.cpp
+++ b/src/config.cpp
@@ -22,6 +22,7 @@ along with this program. If not, see .
#include "logger.h"
#include
+#include
#include
#include
#include
@@ -38,6 +39,7 @@ constexpr const char CFG_WEBUI_PORT[] = "port";
constexpr const char CFG_WEBUI_THREADS[] = "threads";
constexpr const char CFG_NETWORKS[] = "networks";
+constexpr const char CFG_NETWORK_IRCABOT_ADMIN[] = "ircabotAdmin";
constexpr const char CFG_NETWORK_NETWORKNAME[] = "networkName";
constexpr const char CFG_NETWORK_NICKNAME[] = "nickname";
constexpr const char CFG_NETWORK_PASSWORD[] = "password";
@@ -104,12 +106,12 @@ bool Config::initFromJson(const QJsonObject &config, QString* errorString)
QJsonObject webUi = config.value(CFG_WEBUI).toObject();
m_webUiAddress = webUi.value(CFG_WEBUI_ADDRESS).toString("127.0.0.1");
m_webUiPort = webUi.value(CFG_WEBUI_PORT) .toInt(7666);
- m_webUiThreads = webUi.value(CFG_WEBUI_THREADS).toInt(-1); // if <1, then system number
+ m_webUiThreads = webUi.value(CFG_WEBUI_THREADS).toInt(0); // if <1, then system number
QJsonArray jnetworks = config.value(CFG_NETWORKS).toArray();
if (jnetworks.isEmpty())
{
- if (errorString) *errorString = "Networks array is undefined";
+ if (errorString) *errorString = "Networks is undefined";
return false;
}
@@ -122,12 +124,13 @@ bool Config::initFromJson(const QJsonObject &config, QString* errorString)
Network network;
+ network.ircabotAdmin = jnetobj.value(CFG_NETWORK_IRCABOT_ADMIN) .toString();
network.networkName = jnetobj.value(CFG_NETWORK_NETWORKNAME) .toString("Unnamed-" + QString::number(unnamedNetworkCounter++));
network.nickname = jnetobj.value(CFG_NETWORK_NICKNAME) .toString(info::NAME);
network.password = jnetobj.value(CFG_NETWORK_PASSWORD) .toString();
network.identifyFormat = jnetobj.value(CFG_NETWORK_IDENTIFY_FMT) .toString("PRIVMSG NickServ identify $nickname $password"); // from libircclient/network.cpp
network.ident = jnetobj.value(CFG_NETWORK_IDENT) .toString(QString(info::NAME) + " " + QString(info::VERSION));
- network.host = jnetobj.value(CFG_NETWORK_HOST) .toString();
+ network.host = jnetobj.value(CFG_NETWORK_HOST) .toString();
network.realName = jnetobj.value(CFG_NETWORK_REAL_NAME) .toString(info::SOURCE_CODE);
network.autoReconnect = jnetobj.value(CFG_NETWORK_AUTORECONNECT) .toBool(true);
network.voiceGate = jnetobj.value(CFG_NETWORK_VOICEGATE) .toBool(true);
@@ -135,12 +138,6 @@ bool Config::initFromJson(const QJsonObject &config, QString* errorString)
network.port = jnetobj.value(CFG_NETWORK_PORT) .toInt(network.ssl ? 6697 : 6667);
QJsonArray jchannels = jnetobj.value(CFG_NETWORK_CHANNELS).toArray();
- if (jchannels.isEmpty())
- {
- if (errorString) *errorString = "No channels defined for " + network.networkName;
-
- return false;
- }
for (const auto& jchan: jchannels)
{
QString channel = jchan.toString();
@@ -154,7 +151,12 @@ bool Config::initFromJson(const QJsonObject &config, QString* errorString)
}
if (network.channels.isEmpty())
{
- if (errorString) *errorString = "No valid channels defined for " + network.networkName;
+ qWarning().noquote() << "No channels defined for network " + network.networkName;
+ }
+
+ if (network.host.isEmpty())
+ {
+ if (errorString) *errorString = "Host undefined for network " + network.networkName;
return false;
}
@@ -164,3 +166,75 @@ bool Config::initFromJson(const QJsonObject &config, QString* errorString)
return true;
}
+
+bool Config::updateConfigWithCurrentData(QString *errorString)
+{
+ QFile file( configurationFilePath() );
+ if (not file.open(QIODevice::WriteOnly))
+ {
+ if (errorString) *errorString = "Can't open file";
+
+ return false;
+ }
+
+ QJsonObject config;
+ config.insert(CFG_LOG_LEVEL, logger::levelString(logger::level));
+ config.insert(CFG_LOG_FILE, logFilePath());
+ config.insert(CFG_LOG_FILE_DATE_FORMAT, logFileDateFormat());
+ config.insert(CFG_WORKING_DIRECTORY, workingDirectory());
+
+ QJsonObject webui;
+ webui.insert(CFG_WEBUI_ADDRESS, webUiAddress());
+ webui.insert(CFG_WEBUI_PORT, static_cast(webUiPort()));
+ webui.insert(CFG_WEBUI_THREADS, webUiThreads());
+
+ config.insert(CFG_WEBUI, webui);
+
+ QListIterator networksIter(m_networks);
+ QJsonArray networks;
+ while (networksIter.hasNext())
+ {
+ auto network = networksIter.next();
+
+ QJsonObject jnet;
+ jnet.insert(CFG_NETWORK_IRCABOT_ADMIN, network.ircabotAdmin);
+ jnet.insert(CFG_NETWORK_NETWORKNAME, network.networkName);
+ jnet.insert(CFG_NETWORK_NICKNAME, network.nickname);
+ jnet.insert(CFG_NETWORK_PASSWORD, network.password);
+ jnet.insert(CFG_NETWORK_IDENTIFY_FMT, network.identifyFormat);
+ jnet.insert(CFG_NETWORK_HOST, network.host);
+ jnet.insert(CFG_NETWORK_PORT, static_cast(network.port));
+ jnet.insert(CFG_NETWORK_SSL, network.ssl);
+ jnet.insert(CFG_NETWORK_IDENT, network.ident);
+ jnet.insert(CFG_NETWORK_REAL_NAME, network.realName);
+ jnet.insert(CFG_NETWORK_AUTORECONNECT, network.autoReconnect);
+ jnet.insert(CFG_NETWORK_VOICEGATE, network.voiceGate);
+
+ QJsonArray jchannels;
+ QStringListIterator chanIter(network.channels);
+ while (chanIter.hasNext())
+ {
+ jchannels.push_back(chanIter.next());
+ }
+ jnet.insert(CFG_NETWORK_CHANNELS, jchannels);
+ networks.push_back(jnet);
+ }
+ config.insert(CFG_NETWORKS, networks);
+
+ QJsonObject generated;
+ generated.insert("name", info::NAME);
+ generated.insert("verion", info::VERSION);
+ generated.insert("date", QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"));
+ config.insert("generated", generated);
+
+ QByteArray bytes = QJsonDocument(config).toJson(QJsonDocument::JsonFormat::Indented);
+ auto written = file.write(bytes);
+ file.close();
+ if (written != bytes.size())
+ {
+ if (errorString) *errorString = "Writing failed: written " + QString::number(written) + " of " + QString::number(bytes.size()) + " bytes";
+
+ return false;
+ }
+ return true;
+}
diff --git a/src/config.h b/src/config.h
index 8d8e223..6e491a2 100644
--- a/src/config.h
+++ b/src/config.h
@@ -35,6 +35,7 @@ public:
struct Network
{
// default values defined in initFromJson()
+ QString ircabotAdmin;
QString networkName;
QString host;
quint16 port;
@@ -52,6 +53,7 @@ public:
static void setConfigurationFilePath(const QString& path) { m_configurationFilePath = path; }
static bool initFromFile(QString* errorString = nullptr);
static bool initFromJson(const QJsonObject& config, QString* errorString = nullptr);
+ static bool updateConfigWithCurrentData(QString* errorString = nullptr);
static const QString& configurationFilePath() { return m_configurationFilePath; }
static const QString& logFilePath() { return m_logFilePath; }