// SPDX-License-Identifier: LGPL-3.0-or-later
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
* Copyright (C) 2013 - 2024, nymea GmbH
* Copyright (C) 2024 - 2025, chargebyte austria GmbH
*
* This file is part of libnymea-app.
*
* libnymea-app is free software: you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* libnymea-app is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with libnymea-app. If not, see .
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#include "scriptmanager.h"
#include "types/script.h"
#include "types/scripts.h"
#include "logging.h"
NYMEA_LOGGING_CATEGORY(dcScriptManager, "Scripts")
#include
ScriptManager::ScriptManager(JsonRpcClient *jsonClient, QObject *parent):
QObject(parent),
m_client(jsonClient)
{
m_scripts = new Scripts(this);
m_client->registerNotificationHandler(this, "Scripts", "onNotificationReceived");
}
void ScriptManager::init()
{
m_scripts->clear();
m_client->sendCommand("Scripts.GetScripts", QVariantMap(), this, "onScriptsFetched");
m_fetchingData = true;
emit fetchingDataChanged();
}
bool ScriptManager::fetchingData() const
{
return m_fetchingData;
}
Scripts *ScriptManager::scripts() const
{
return m_scripts;
}
int ScriptManager::addScript(const QString &name, const QString &content)
{
QVariantMap params;
params.insert("name", name);
params.insert("content", content);
return m_client->sendCommand("Scripts.AddScript", params, this, "onScriptAdded");
}
int ScriptManager::renameScript(const QUuid &id, const QString &name)
{
QVariantMap params;
params.insert("id", id);
params.insert("name", name);
return m_client->sendCommand("Scripts.EditScript", params, this, "onScriptRenamed");
}
int ScriptManager::editScript(const QUuid &id, const QString &content)
{
QVariantMap params;
params.insert("id", id);
params.insert("content", content);
return m_client->sendCommand("Scripts.EditScript", params, this, "onScriptEdited");
}
int ScriptManager::removeScript(const QUuid &id)
{
QVariantMap params;
params.insert("id", id);
return m_client->sendCommand("Scripts.RemoveScript", params, this, "onScriptRemoved");
}
int ScriptManager::fetchScript(const QUuid &id)
{
QVariantMap params;
params.insert("id", id);
return m_client->sendCommand("Scripts.GetScriptContent", params, this, "onScriptFetched");
}
void ScriptManager::onScriptsFetched(int /*commandId*/, const QVariantMap ¶ms)
{
qCDebug(dcScriptManager()) << "Scripts fetched";
foreach (const QVariant &variant, params.value("scripts").toList()) {
QUuid id = variant.toMap().value("id").toUuid();
Script *script = new Script(id);
script->setName(variant.toMap().value("name").toString());
m_scripts->addScript(script);
}
m_fetchingData = false;
emit fetchingDataChanged();
}
void ScriptManager::onScriptFetched(int commandId, const QVariantMap ¶ms)
{
QMetaEnum metaEnum = QMetaEnum::fromType();
ScriptError status = static_cast(metaEnum.keyToValue(params.value("scriptError").toByteArray()));
emit fetchScriptReply(commandId,
status,
params.value("content").toString());
}
void ScriptManager::onScriptAdded(int commandId, const QVariantMap ¶ms)
{
QMetaEnum metaEnum = QMetaEnum::fromType();
ScriptError status = static_cast(metaEnum.keyToValue(params.value("scriptError").toByteArray()));
emit addScriptReply(commandId,
status,
params.value("script").toMap().value("id").toUuid(),
params.value("errors").toStringList());
}
void ScriptManager::onScriptEdited(int commandId, const QVariantMap ¶ms)
{
QMetaEnum metaEnum = QMetaEnum::fromType();
ScriptError status = static_cast(metaEnum.keyToValue(params.value("scriptError").toByteArray()));
emit editScriptReply(commandId,
status,
params.value("errors").toStringList());
}
void ScriptManager::onScriptRenamed(int commandId, const QVariantMap ¶ms)
{
QMetaEnum metaEnum = QMetaEnum::fromType();
ScriptError status = static_cast(metaEnum.keyToValue(params.value("scriptError").toByteArray()));
emit renameScriptReply(commandId, status);
}
void ScriptManager::onScriptRemoved(int commandId, const QVariantMap ¶ms)
{
QMetaEnum metaEnum = QMetaEnum::fromType();
ScriptError status = static_cast(metaEnum.keyToValue(params.value("scriptError").toByteArray()));
emit removeScriptReply(commandId, status);
}
void ScriptManager::onNotificationReceived(const QVariantMap ¶ms)
{
qCDebug(dcScriptManager()) << "noticication" << params.value("notification").toString();
if (params.value("notification").toString() == "Scripts.ScriptLogMessage") {
emit scriptMessage(params.value("params").toMap().value("scriptId").toUuid(),
params.value("params").toMap().value("type").toString(),
params.value("params").toMap().value("message").toString());
}
else if (params.value("notification").toString() == "Scripts.ScriptAdded") {
QVariantMap scriptMap = params.value("params").toMap().value("script").toMap();
Script *script = new Script(scriptMap.value("id").toUuid());
script->setName(scriptMap.value("name").toString());
m_scripts->addScript(script);
}
else if (params.value("notification").toString() == "Scripts.ScriptRemoved") {
QUuid id = params.value("params").toMap().value("id").toUuid();
m_scripts->removeScript(id);
}
else if (params.value("notification").toString() == "Scripts.ScriptChanged") {
QUuid id = params.value("params").toMap().value("scriptId").toUuid();
QString name = params.value("params").toMap().value("name").toString();
m_scripts->getScript(id)->setName(name);
}
else {
qCWarning(dcScriptManager()) << "Unhandled notification" << params.value("notification").toString();
}
}