From 748e5995373b435399f3228acc76dd19f488185d Mon Sep 17 00:00:00 2001 From: Michael Zanetti Date: Tue, 12 Sep 2023 13:39:07 +0200 Subject: [PATCH] Make script runtime errors appear in the script console --- libnymea-core/scriptengine/scriptaction.cpp | 8 +++++--- libnymea-core/scriptengine/scriptengine.cpp | 3 ++- libnymea-core/scriptengine/scriptengine.h | 3 ++- libnymea-core/scriptengine/scriptinterfaceaction.cpp | 7 ++++--- libnymea-core/scriptengine/scriptstate.cpp | 6 +++--- libnymea-core/scriptengine/scriptthing.cpp | 5 +++-- 6 files changed, 19 insertions(+), 13 deletions(-) diff --git a/libnymea-core/scriptengine/scriptaction.cpp b/libnymea-core/scriptengine/scriptaction.cpp index 63cf5de3..7219f3f5 100644 --- a/libnymea-core/scriptengine/scriptaction.cpp +++ b/libnymea-core/scriptengine/scriptaction.cpp @@ -38,12 +38,14 @@ #include #include +#include #include Q_DECLARE_LOGGING_CATEGORY(dcScriptEngine) namespace nymeaserver { namespace scriptengine { + ScriptAction::ScriptAction(QObject *parent) : QObject(parent) { @@ -130,7 +132,7 @@ void ScriptAction::execute(const QVariantMap ¶ms) things.append(thing); } if (things.isEmpty()) { - qCWarning(dcScriptEngine) << "No things matching by id" << m_thingId << "and interface" << m_interfaceName; + QMessageLogger(qmlEngine(this)->contextForObject(this)->baseUrl().toString().toUtf8(), 0, "", "qml").warning() << "No things matching id" << m_thingId << "or interface" << m_interfaceName; return; } @@ -142,7 +144,7 @@ void ScriptAction::execute(const QVariantMap ¶ms) actionType = thing->thingClass().actionTypes().findByName(m_actionName); } if (actionType.id().isNull()) { - qCWarning(dcScriptEngine()) << "Thing" << thing->name() << "does not have actionTypeId" << m_actionTypeId << "or actionName" << m_actionName; + QMessageLogger(qmlEngine(this)->contextForObject(this)->baseUrl().toString().toUtf8(), 0, "", "qml").warning() << "Thing" << thing->name() << "does not have actionTypeId" << m_actionTypeId << "or actionName" << m_actionName; continue; } Action action(actionType.id(), thing->id(), Action::TriggeredByScript); @@ -155,7 +157,7 @@ void ScriptAction::execute(const QVariantMap ¶ms) paramType = actionType.paramTypes().findByName(paramNameOrId); } if (paramType.id().isNull()) { - qCWarning(dcScriptEngine()) << "Invalid param id or name"; + QMessageLogger(qmlEngine(this)->contextForObject(this)->baseUrl().toString().toUtf8(), 0, "", "qml").warning() << "Invalid param id or name:" << paramNameOrId; continue; } paramList << Param(paramType.id(), params.value(paramNameOrId)); diff --git a/libnymea-core/scriptengine/scriptengine.cpp b/libnymea-core/scriptengine/scriptengine.cpp index 6401f548..791b8281 100644 --- a/libnymea-core/scriptengine/scriptengine.cpp +++ b/libnymea-core/scriptengine/scriptengine.cpp @@ -462,7 +462,7 @@ void ScriptEngine::onScriptMessage(QtMsgType type, const QMessageLogContext &con void ScriptEngine::logMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &message) { - if (strcmp(context.category, "qml") != 0) { + if (strcmp(context.category, "qml") != 0 && strcmp(context.category, "ScriptRuntime") != 0) { s_upstreamMessageHandler(type, context, message); return; } @@ -485,6 +485,7 @@ void ScriptEngine::logMessageHandler(QtMsgType type, const QMessageLogContext &c QFileInfo fi(context.file); s_upstreamMessageHandler(type, newContext, fi.fileName() + ":" + QString::number(context.line) + ": " + message); } + delete category; } void ScriptEngine::logCategoryFilter(QLoggingCategory *category) diff --git a/libnymea-core/scriptengine/scriptengine.h b/libnymea-core/scriptengine/scriptengine.h index 45950eaf..7832084c 100644 --- a/libnymea-core/scriptengine/scriptengine.h +++ b/libnymea-core/scriptengine/scriptengine.h @@ -89,6 +89,8 @@ public: EditScriptReply editScript(const QUuid &id, const QByteArray &content); ScriptError removeScript(const QUuid &id); + void onScriptMessage(QtMsgType type, const QMessageLogContext &context, const QString &message); + signals: void scriptAdded(const Script &script); void scriptRemoved(const QUuid &id); @@ -104,7 +106,6 @@ private: QString baseName(const QUuid &id); - void onScriptMessage(QtMsgType type, const QMessageLogContext &context, const QString &message); private: ThingManager *m_thingManager = nullptr; QQmlEngine *m_engine = nullptr; diff --git a/libnymea-core/scriptengine/scriptinterfaceaction.cpp b/libnymea-core/scriptengine/scriptinterfaceaction.cpp index 57961b05..43b42c8f 100644 --- a/libnymea-core/scriptengine/scriptinterfaceaction.cpp +++ b/libnymea-core/scriptengine/scriptinterfaceaction.cpp @@ -35,6 +35,7 @@ #include #include +#include #include Q_DECLARE_LOGGING_CATEGORY(dcScriptEngine) @@ -94,14 +95,14 @@ void ScriptInterfaceAction::execute(const QVariantMap ¶ms) } } if (things.isEmpty()) { - qCWarning(dcScriptEngine) << "No things matching by interface" << m_interfaceName; + QMessageLogger(qmlEngine(this)->contextForObject(this)->baseUrl().toString().toUtf8(), 0, "", "qml").warning() << "No things matching by interface" << m_interfaceName; return; } foreach (Thing *thing, things) { ActionType actionType = thing->thingClass().actionTypes().findByName(m_actionName); if (actionType.id().isNull()) { - qCWarning(dcScriptEngine()) << "Thing" << thing->name() << "does not have action" << m_actionName; + QMessageLogger(qmlEngine(this)->contextForObject(this)->baseUrl().toString().toUtf8(), 0, "", "qml").warning() << "Thing" << thing->name() << "does not have action" << m_actionName; continue; } Action action(actionType.id(), thing->id(), Action::TriggeredByScript); @@ -114,7 +115,7 @@ void ScriptInterfaceAction::execute(const QVariantMap ¶ms) paramType = actionType.paramTypes().findByName(paramNameOrId); } if (paramType.id().isNull()) { - qCWarning(dcScriptEngine()) << "Invalid param id or name"; + QMessageLogger(qmlEngine(this)->contextForObject(this)->baseUrl().toString().toUtf8(), 0, "", "qml").warning() << "Invalid param id or name"; continue; } paramList << Param(paramType.id(), params.value(paramNameOrId)); diff --git a/libnymea-core/scriptengine/scriptstate.cpp b/libnymea-core/scriptengine/scriptstate.cpp index 105b3fd6..89894354 100644 --- a/libnymea-core/scriptengine/scriptstate.cpp +++ b/libnymea-core/scriptengine/scriptstate.cpp @@ -160,19 +160,19 @@ void ScriptState::setValue(const QVariant &value) if (!m_stateTypeId.isNull()) { actionTypeId = thing->thingClass().stateTypes().findById(StateTypeId(m_stateTypeId)).id(); if (actionTypeId.isNull()) { - qCDebug(dcScriptEngine) << "Thing" << thing->name() << "does not have a state with type id" << m_stateTypeId; + QMessageLogger(qmlEngine(this)->contextForObject(this)->baseUrl().toString().toUtf8(), 0, "", "qml").warning() << "Thing" << thing->name() << "does not have a state with type id" << m_stateTypeId; } } if (actionTypeId.isNull()) { actionTypeId = thing->thingClass().stateTypes().findByName(stateName()).id(); if (actionTypeId.isNull()) { - qCDebug(dcScriptEngine) << "Thing" << thing->name() << "does not have a state named" << m_stateName; + QMessageLogger(qmlEngine(this)->contextForObject(this)->baseUrl().toString().toUtf8(), 0, "", "qml").warning() << "Thing" << thing->name() << "does not have a state named" << m_stateName; } } if (actionTypeId.isNull()) { m_valueCache = value; - qCDebug(dcScriptEngine()) << "Either stateTypeId or stateName is required to be valid."; + QMessageLogger(qmlEngine(this)->contextForObject(this)->baseUrl().toString().toUtf8(), 0, "", "qml").warning() << "Either stateTypeId or stateName is required to be valid."; return; } diff --git a/libnymea-core/scriptengine/scriptthing.cpp b/libnymea-core/scriptengine/scriptthing.cpp index 0d5edfe6..2b72fdca 100644 --- a/libnymea-core/scriptengine/scriptthing.cpp +++ b/libnymea-core/scriptengine/scriptthing.cpp @@ -33,6 +33,7 @@ #include #include #include +#include #include Q_DECLARE_LOGGING_CATEGORY(dcScriptEngine) @@ -112,7 +113,7 @@ void ScriptThing::executeAction(const QString &actionName, const QVariantMap &pa actionType = thing->thingClass().actionTypes().findById(QUuid(actionName)); } if (actionType.id().isNull()) { - qCWarning(dcScriptEngine()) << "Thing" << thing->name() << "does not have action" << actionName; + QMessageLogger(qmlEngine(this)->contextForObject(this)->baseUrl().toString().toUtf8(), 0, "", "qml").warning() << "Thing" << thing->name() << "does not have action" << actionName; return; } @@ -126,7 +127,7 @@ void ScriptThing::executeAction(const QString &actionName, const QVariantMap &pa paramType = actionType.paramTypes().findByName(paramNameOrId); } if (paramType.id().isNull()) { - qCWarning(dcScriptEngine()) << "Invalid param id or name"; + QMessageLogger(qmlEngine(this)->contextForObject(this)->baseUrl().toString().toUtf8(), 0, "", "qml").warning() << "Invalid param id or name:" << paramNameOrId; continue; } paramList << Param(paramType.id(), params.value(paramNameOrId));