Overte C++ Documentation
ScriptManager.h
1 //
2 // ScriptManager.h
3 // libraries/script-engine/src
4 //
5 // Created by Brad Hefta-Gaub on 12/14/13.
6 // Copyright 2013 High Fidelity, Inc.
7 // Copyright 2020 Vircadia contributors.
8 // Copyright 2022-2023 Overte e.V.
9 //
10 // Distributed under the Apache License, Version 2.0.
11 // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
12 // SPDX-License-Identifier: Apache-2.0
13 //
14 
15 #ifndef hifi_ScriptManager_h
16 #define hifi_ScriptManager_h
17 
18 #include <atomic>
19 #include <chrono>
20 #include <functional>
21 #include <memory>
22 #include <unordered_map>
23 #include <mutex>
24 
25 #include <QtCore/QFuture>
26 #include <QtCore/QHash>
27 #include <QtCore/QObject>
28 #include <QtCore/QReadWriteLock>
29 #include <QtCore/QSet>
30 #include <QtCore/QSharedPointer>
31 #include <QtCore/QString>
32 #include <QtCore/QTimer>
33 #include <QtCore/QUrl>
34 #include <QtCore/QVariant>
35 
36 #include "EntityItemID.h"
37 #include "EntitiesScriptEngineProvider.h"
38 #include "EntityScriptUtils.h"
39 #include <ExternalResource.h>
40 #include <SettingHandle.h>
41 
42 #include "AssetScriptingInterface.h"
43 #include "ConsoleScriptingInterface.h"
44 #include "Mat4.h"
45 #include "PointerEvent.h"
46 #include "Quat.h"
47 #include "ScriptUUID.h"
48 #include "ScriptValue.h"
49 #include "ScriptException.h"
50 #include "Vec3.h"
51 
52 static const QString NO_SCRIPT("");
53 
54 static const int SCRIPT_FPS = 60;
55 static const int DEFAULT_MAX_ENTITY_PPS = 9000;
56 static const int DEFAULT_ENTITY_PPS_PER_SCRIPT = 900;
57 
58 class ScriptEngine;
59 class ScriptEngines;
60 class ScriptManager;
61 class ScriptManagerScriptingInterface;
62 
63 using ScriptEnginePointer = std::shared_ptr<ScriptEngine>;
64 using ScriptManagerPointer = std::shared_ptr<ScriptManager>;
65 using ScriptManagerScriptingInterfacePointer = std::shared_ptr<ScriptManagerScriptingInterface>;
66 using ScriptValueList = QList<ScriptValue>;
67 
68 Q_DECLARE_METATYPE(ScriptManagerPointer)
69 
70 const int QTREGISTER_QTimerStar = qRegisterMetaType<QTimer*>();
71 
72 
77 class CallbackData {
78 public:
83  ScriptValue function;
84 
90 
96 };
97 
98 
105 public:
106  EntityItemID entityID;
107  QString entityScript;
108  //bool forceRedownload;
109 };
110 
121 
126  QString scriptOrURL;
127 
132  QString contents;
133 
138  bool isURL;
139 
144  bool success;
145 
150  QString status;
151 };
152 
153 typedef std::unordered_map<EntityItemID, EntityScriptContentAvailable> EntityScriptContentAvailableMap;
154 
155 typedef QList<CallbackData> CallbackList;
156 typedef QHash<QString, CallbackList> RegisteredEventHandlers;
157 
158 
164 public:
165 
170  EntityScriptStatus status { EntityScriptStatus::PENDING };
171 
178  QString errorInfo { "" };
179 
180 
185  QString scriptText { "" };
186 
192 
198  int64_t lastModified { 0 };
199 
206  QUrl definingSandboxURL { QUrl("about:EntityScript") };
207 };
208 
209 // declare a static script initializers
210 #define STATIC_SCRIPT_TYPES_INITIALIZER(init) \
211  static ScriptManager::StaticTypesInitializerNode static_script_types_initializer_(init);
212 
213 #define STATIC_SCRIPT_INITIALIZER(init) \
214  static ScriptManager::StaticInitializerNode static_script_initializer_(init);
215 
216 
217 
218 
281 class ScriptManager : public QObject, public EntitiesScriptEngineProvider, public std::enable_shared_from_this<ScriptManager> {
282  Q_OBJECT
283  Q_PROPERTY(QString context READ getContext)
284  Q_PROPERTY(QString type READ getTypeAsString)
285  Q_PROPERTY(QString fileName MEMBER _fileNameString CONSTANT)
286 public:
287  static const QString SCRIPT_EXCEPTION_FORMAT;
288  static const QString SCRIPT_BACKTRACE_SEP;
289 
294  enum Context {
301 
307 
313 
319 
332  };
333 
338  enum Type {
344 
350 
357 
363 
369 
380  };
381  Q_ENUM(Type);
382 
383  static int processLevelMaxRetries;
384  ScriptManager(Context context, const QString& scriptContents = NO_SCRIPT, const QString& fileNameString = QString("about:ScriptEngine"));
385  ~ScriptManager();
386 
387  // static initialization support
388  typedef void (*ScriptManagerInitializer)(ScriptManager*);
389  class StaticInitializerNode {
390  public:
391  ScriptManagerInitializer init;
392  StaticInitializerNode* prev;
393  inline StaticInitializerNode(ScriptManagerInitializer&& pInit) : init(std::move(pInit)),prev(nullptr) { registerNewStaticInitializer(this); }
394  };
395  static void registerNewStaticInitializer(StaticInitializerNode* dest);
396 
397  class StaticTypesInitializerNode {
398  public:
399  ScriptManagerInitializer init;
400  StaticTypesInitializerNode* prev;
401  inline StaticTypesInitializerNode(ScriptManagerInitializer&& pInit) : init(std::move(pInit)),prev(nullptr) { registerNewStaticTypesInitializer(this); }
402  };
403  static void registerNewStaticTypesInitializer(StaticTypesInitializerNode* dest);
404 
416  void runInThread();
417 
423  void run();
424 
425 
431  QString getFilename() const;
432 
438  QString getAbsoluteFilename() const;
439 
445  inline ScriptEnginePointer engine() { return _engine; }
446 
447  QList<EntityItemID> getListOfEntityScriptIDs();
448 
459  bool isStopped() const;
460 
461 
469 
476  Q_INVOKABLE void stop(bool marshal = false);
477 
479 
489  void waitTillDoneRunning(bool shutdown = false);
490 
499 
514  void loadURL(const QUrl& scriptURL, bool reload);
515 
524  bool hasValidScriptSuffix(const QString& scriptFileName);
525 
526 
534 
541  Q_INVOKABLE QString getContext() const;
542 
548  Q_INVOKABLE bool isClientScript() const { return _context == CLIENT_SCRIPT; }
549 
555  Q_INVOKABLE bool isDebugMode() const;
556 
562  Q_INVOKABLE bool isEntityClientScript() const { return _context == ENTITY_CLIENT_SCRIPT; }
563 
564 
570  Q_INVOKABLE bool isEntityServerScript() const { return _context == ENTITY_SERVER_SCRIPT; }
571 
577  Q_INVOKABLE bool isAgentScript() const { return _context == AGENT_SCRIPT; }
578 
585  Q_INVOKABLE void registerValue(const QString& valueName, ScriptValue value);
586 
588  // NOTE - these are intended to be public interfaces available to scripts
589 
597  Q_INVOKABLE QString formatException(const ScriptValue& exception, bool includeExtendedDetails);
598 
599 
600 
610  Q_INVOKABLE void addEventHandler(const EntityItemID& entityID, const QString& eventName, const ScriptValue& handler);
611 
619  Q_INVOKABLE void removeEventHandler(const EntityItemID& entityID, const QString& eventName, const ScriptValue& handler);
620 
621 
632  Q_INVOKABLE void load(const QString& loadfile);
633 
645  Q_INVOKABLE void include(const QStringList& includeFiles, const ScriptValue& callback = ScriptValue());
646 
658  Q_INVOKABLE void include(const QString& includeFile, const ScriptValue& callback = ScriptValue());
659 
661 
662 
663 
665 
666 
672 
681  Q_INVOKABLE ScriptValue require(const QString& moduleId);
682 
689  Q_INVOKABLE void resetModuleCache(bool deleteScriptCache = false);
690 
698 
709  bool registerModuleWithParent(const ScriptValue& module, const ScriptValue& parent);
710 
720  ScriptValue newModule(const QString& modulePath, const ScriptValue& parent = ScriptValue());
721 
736  QVariantMap fetchModuleSource(const QString& modulePath, const bool forceDownload = false);
737 
745  ScriptValue instantiateModule(const ScriptValue& module, const QString& sourceCode);
746 
756  ScriptValue evaluate(const QString& program, const QString& fileName = QString());
757 
767  Q_INVOKABLE QTimer* setInterval(const ScriptValue& function, int intervalMS);
768 
769 
779  Q_INVOKABLE QTimer* setTimeout(const ScriptValue& function, int timeoutMS);
780 
786  Q_INVOKABLE void clearInterval(QTimer* timer) { stopTimer(timer); }
787 
795  Q_INVOKABLE void clearInterval(QVariantMap timer) { ; }
796 
802  Q_INVOKABLE void clearTimeout(QTimer* timer) { stopTimer(timer); }
803 
811  Q_INVOKABLE void clearTimeout(QVariantMap timer) { ; }
812 
813 
819  Q_INVOKABLE void print(const QString& message);
820 
827  Q_INVOKABLE QUrl resolvePath(const QString& path) const;
828 
834  Q_INVOKABLE QUrl resourcesPath() const;
835 
841  Q_INVOKABLE void beginProfileRange(const QString& label) const;
842 
848  Q_INVOKABLE void endProfileRange(const QString& label) const;
849 
850 
852 
854  // Entity Script Related methods
855 
856 
863 
870  Q_INVOKABLE bool isEntityScriptRunning(const EntityItemID& entityID) {
871  QReadLocker locker { &_entityScriptsLock };
872  auto it = _entityScripts.constFind(entityID);
873  return it != _entityScripts.constEnd() && it->status == EntityScriptStatus::RUNNING;
874  }
875 
882  QVariant cloneEntityScriptDetails(const EntityItemID& entityID);
883 
884 
893  QFuture<QVariant> getLocalEntityScriptDetails(const EntityItemID& entityID) override;
894 
895 
900  Q_INVOKABLE void requestGarbageCollection();
901 
907  Q_INVOKABLE void logBacktrace(const QString &title);
908 
916  Q_INVOKABLE void loadEntityScript(const EntityItemID& entityID, const QString& entityScript, bool forceRedownload);
917 
924  Q_INVOKABLE void unloadEntityScript(const EntityItemID& entityID, bool shouldRemoveFromMap = false); // will call unload method
925 
926 
932  Q_INVOKABLE void unloadAllEntityScripts(bool blockingCall = false);
933 
942  Q_INVOKABLE void callEntityScriptMethod(const EntityItemID& entityID, const QString& methodName,
943  const QStringList& params = QStringList(),
944  const QUuid& remoteCallerID = QUuid()) override;
945 
953  Q_INVOKABLE void callEntityScriptMethod(const EntityItemID& entityID, const QString& methodName, const PointerEvent& event);
954 
955 
964  Q_INVOKABLE void callEntityScriptMethod(const EntityItemID& entityID, const QString& methodName, const EntityItemID& otherID, const Collision& collision);
965 
966 
972  void setType(Type type) { _type = type; };
973 
979  Type getType() { return _type; };
980 
986  QString getTypeAsString() const;
987 
995  bool isFinished() const { return _isFinished; } // used by Application and ScriptWidget
996 
1003  bool isRunning() const { return _isRunning; } // used by ScriptWidget
1004 
1005  // this is used by code in ScriptEngines.cpp during the "reload all" operation
1012  bool isStopping() const { return _isStopping; }
1013 
1021 
1022 
1024 
1025 
1027 
1036  void setUserLoaded(bool isUserLoaded) { _isUserLoaded = isUserLoaded; }
1037 
1047  bool isUserLoaded() const { return _isUserLoaded; }
1048 
1056  void setQuitWhenFinished(const bool quitWhenFinished) { _quitWhenFinished = quitWhenFinished; }
1057 
1066  bool isQuitWhenFinished() const { return _quitWhenFinished; }
1067 
1076  void setEmitScriptUpdatesFunction(std::function<bool()> func) { _emitScriptUpdates = func; }
1077 
1087  void scriptErrorMessage(const QString& message, const QString& fileName, int lineNumber);
1088 
1098  void scriptWarningMessage(const QString& message, const QString& fileName, int lineNumber);
1099 
1109  void scriptInfoMessage(const QString& message, const QString& fileName, int lineNumber);
1110 
1122  void scriptPrintedMessage(const QString& message, const QString& fileName, int lineNumber);
1123 
1130  void clearDebugLogWindow();
1131 
1137  int getNumRunningEntityScripts() const;
1138 
1147  bool getEntityScriptDetails(const EntityItemID& entityID, EntityScriptDetails &details) const;
1148 
1156  bool hasEntityScriptDetails(const EntityItemID& entityID) const;
1157 
1168  void setScriptEngines(QSharedPointer<ScriptEngines>& scriptEngines) { _scriptEngines = scriptEngines; }
1169 
1170 
1180  void forwardHandlerCall(const EntityItemID& entityID, const QString& eventName, const ScriptValueList& eventHanderArgs);
1181 
1187  void removeAllEventHandlers(const EntityItemID& entityID);
1188 
1189 
1197  ScriptValue getReturnValue() const { return _returnValue; }
1198 
1199 
1207  Q_INVOKABLE QString getExternalPath(ExternalResource::Bucket bucket, const QString& path);
1208 
1209 
1215  std::shared_ptr<ScriptException> getUncaughtException() const;
1216 
1224  bool getAbortOnUncaughtException() const { return _abortOnUncaughtException; }
1225 
1232  void setAbortOnUncaughtException(bool value) { _abortOnUncaughtException = value; }
1233 
1240  bool isDoneRunning() { return _isDoneRunning; };
1241 
1242 public slots:
1243 
1252  void updateMemoryCost(const qint64 &deltaSize);
1253 
1254 signals:
1255 
1256 
1262 
1268  void scriptLoaded(const QString& scriptFilename);
1269 
1270 
1276  void errorLoadingScript(const QString& scriptFilename);
1277 
1278 
1284  void update(float deltaTime);
1285 
1286 
1287 
1293 
1294 
1295 
1301  void finished(const QString& fileNameString, ScriptManagerPointer);
1302 
1309  void printedMessage(const QString& message, const QString& scriptName);
1310 
1311 
1318  void errorMessage(const QString& message, const QString& scriptName);
1319 
1320 
1321 
1328  void warningMessage(const QString& message, const QString& scriptName);
1329 
1330 
1337  void infoMessage(const QString& message, const QString& scriptName);
1338 
1348  void printedEntityMessage(const QString& message, const QString& fileName, int lineNumber, const EntityItemID& entityID, bool isServerScript);
1349 
1350 
1360  void errorEntityMessage(const QString& message, const QString& fileName, int lineNumber, const EntityItemID& entityID, bool isServerScript);
1361 
1362 
1363 
1373  void warningEntityMessage(const QString& message, const QString& fileName, int lineNumber, const EntityItemID& entityID, bool isServerScript);
1374 
1375 
1385  void infoEntityMessage(const QString& message, const QString& fileName, int lineNumber, const EntityItemID& entityID, bool isServerScript);
1386 
1387 
1393 
1394 
1400 
1401 
1408  void loadScript(const QString& scriptName, bool isUserLoaded);
1409 
1410 
1417  void reloadScript(const QString& scriptName, bool isUserLoaded);
1418 
1423  void doneRunning();
1424 
1431 
1438 
1439 
1445  void unhandledException(std::shared_ptr<ScriptException> exception);
1446 
1448 
1456 
1465 
1466 protected:
1467  // Is called by the constructor, bceause all types need to be registered before method discovery with ScriptObjectV8Proxy::investigate()
1468  void initMetaTypes();
1469 
1475  void init();
1476 
1484  Q_INVOKABLE void executeOnScriptThread(std::function<void()> function, const Qt::ConnectionType& type = Qt::QueuedConnection );
1485 
1497  Q_INVOKABLE QString _requireResolve(const QString& moduleId, const QString& relativeTo = QString());
1498 
1508  QString logException(const ScriptValue& exception);
1509  void timerFired();
1510  void stopAllTimers();
1511  void stopAllTimersForEntityScript(const EntityItemID& entityID);
1512  void refreshFileScript(const EntityItemID& entityID);
1513 
1523  void updateEntityScriptStatus(const EntityItemID& entityID, const EntityScriptStatus& status, const QString& errorInfo = QString());
1524 
1525 
1532  void setEntityScriptDetails(const EntityItemID& entityID, const EntityScriptDetails& details);
1533 
1541  void setParentURL(const QString& parentURL) { _parentURL = parentURL; }
1542 
1551  QTimer* setupTimerWithInterval(const ScriptValue& function, int intervalMS, bool isSingleShot);
1552 
1558  void stopTimer(QTimer* timer);
1559 
1560  QHash<EntityItemID, RegisteredEventHandlers> _registeredHandlers;
1561 
1562 
1573  Q_INVOKABLE void entityScriptContentAvailable(const EntityItemID& entityID, const QString& scriptOrURL, const QString& contents, bool isURL, bool success, const QString& status);
1574 
1575  EntityItemID currentEntityIdentifier; // Contains the defining entity script entity id during execution, if any. Empty for interface script execution.
1576  QUrl currentSandboxURL; // The toplevel url string for the entity script that loaded the code being executed, else empty.
1577 
1588  void doWithEnvironment(const EntityItemID& entityID, const QUrl& sandboxURL, std::function<void()> operation);
1589 
1610  void callWithEnvironment(const EntityItemID& entityID, const QUrl& sandboxURL, const ScriptValue& function, const ScriptValue& thisObject, const ScriptValueList& args);
1611 
1612  Context _context;
1613  Type _type;
1614  ScriptEnginePointer _engine;
1615  QString _scriptContents;
1616  QString _parentURL;
1617  std::atomic<bool> _isFinished { false };
1618  std::atomic<bool> _isRunning { false };
1619  std::atomic<bool> _isStopping { false };
1620  std::atomic<bool> _isDoneRunning { false };
1621  bool _areMetaTypesInitialized { false };
1622  bool _isInitialized { false };
1623  QHash<QTimer*, CallbackData> _timerFunctionMap;
1624  QSet<QUrl> _includedURLs;
1625  mutable QReadWriteLock _entityScriptsLock { QReadWriteLock::Recursive };
1626  QHash<EntityItemID, EntityScriptDetails> _entityScripts;
1627  EntityScriptContentAvailableMap _contentAvailableQueue;
1628  ScriptValue _returnValue;
1629 
1630  bool _isThreaded { false };
1631  qint64 _lastUpdate;
1632 
1633  QString _fileNameString;
1634  Quat _quatLibrary;
1635  Vec3 _vec3Library;
1636  Mat4 _mat4Library;
1637  ScriptUUID _uuidLibrary;
1638  ConsoleScriptingInterface _consoleScriptingInterface;
1639  std::atomic<bool> _isUserLoaded { false };
1640  bool _isReloading { false };
1641 
1642  std::atomic<bool> _quitWhenFinished;
1643 
1644  AssetScriptingInterface* _assetScriptingInterface;
1645 
1646  std::function<bool()> _emitScriptUpdates{ []() { return true; } };
1647 
1648  std::recursive_mutex _lock;
1649 
1650  std::chrono::microseconds _totalTimerExecution { 0 };
1651 
1652  static const QString _SETTINGS_ENABLE_EXTENDED_EXCEPTIONS;
1653 
1654  Setting::Handle<bool> _enableExtendedJSExceptions { _SETTINGS_ENABLE_EXTENDED_EXCEPTIONS, true };
1655 
1656  QWeakPointer<ScriptEngines> _scriptEngines;
1657 
1658 
1659 
1660  // For debugging performance issues
1661  int _timerCallCounter{ 0 };
1662  double _totalTimeInTimerEvents_s{ 0.0 };
1663 
1664  ScriptManagerScriptingInterfacePointer _scriptingInterface;
1665 
1666  bool _abortOnUncaughtException{ false };
1667 
1668  friend ScriptManagerPointer newScriptManager(Context context, const QString& scriptContents, const QString& fileNameString);
1669  friend class ScriptManagerScriptingInterface;
1670 
1671 };
1672 
1681 ScriptManagerPointer newScriptManager(ScriptManager::Context context,
1682  const QString& scriptContents,
1683  const QString& fileNameString);
1684 
1696 ScriptManagerPointer scriptManagerFactory(ScriptManager::Context context,
1697  const QString& scriptContents,
1698  const QString& fileNameString);
1699 
1700 #endif // hifi_ScriptManager_h
Callback data for addEventHandler.
Definition: ScriptManager.h:77
QUrl definingSandboxURL
Sandbox URL for the script.
Definition: ScriptManager.h:95
EntityItemID definingEntityIdentifier
Entity ID.
Definition: ScriptManager.h:89
DeferredLoadEntity.
Definition: ScriptManager.h:104
Abstract ID for editing model items. Used in EntityItem JS API.
Definition: EntityItemID.h:28
Details about an entity script.
Definition: ScriptManager.h:163
QUrl definingSandboxURL
URL under which the script is allowed to have access.
Definition: ScriptManager.h:206
int64_t lastModified
Last modified time of the underlying script file.
Definition: ScriptManager.h:198
ScriptValue scriptObject
The return value of the script.
Definition: ScriptManager.h:191
QString errorInfo
Error information.
Definition: ScriptManager.h:178
QString scriptText
The source code of the script.
Definition: ScriptManager.h:185
EntityScriptStatus status
Current status.
Definition: ScriptManager.h:170
Provides the Mat4 scripting interface.
Definition: Mat4.h:44
Represents a 2D or 3D pointer to the scripting engine. Exposed as PointerEvent
Definition: PointerEvent.h:30
Provides the Quat scripting interface.
Definition: Quat.h:61
Provides an engine-independent interface for a scripting engine.
Definition: ScriptEngine.h:93
Provides the ScriptDiscoveryService scripting interface.
Definition: ScriptEngines.h:59
Manages a single scripting engine.
Definition: ScriptManager.h:281
Type
Type of the script.
Definition: ScriptManager.h:338
@ NETWORKLESS_TEST
Test system script.
Definition: ScriptManager.h:379
@ AVATAR
Avatar script.
Definition: ScriptManager.h:368
@ AGENT
Agent script.
Definition: ScriptManager.h:362
@ ENTITY_SERVER
Entity server Receives the update event.
Definition: ScriptManager.h:356
@ CLIENT
Client.
Definition: ScriptManager.h:343
@ ENTITY_CLIENT
Entity client Receives the update event.
Definition: ScriptManager.h:349
Q_INVOKABLE void executeOnScriptThread(std::function< void()> function, const Qt::ConnectionType &type=Qt::QueuedConnection)
executeOnScriptThread
Definition: ScriptManager.cpp:427
void doWithEnvironment(const EntityItemID &entityID, const QUrl &sandboxURL, std::function< void()> operation)
Execute operation in the appropriate context for (the possibly empty) entityID. Even if entityID is s...
Definition: ScriptManager.cpp:2543
void setUserLoaded(bool isUserLoaded)
Set whether this script was user-loaded.
Definition: ScriptManager.h:1036
void disconnectNonEssentialSignals()
Disconnect all signals, except essential ones.
Definition: ScriptManager.cpp:386
Q_INVOKABLE bool isEntityScriptRunning(const EntityItemID &entityID)
Checks whether an entity has an entity script running.
Definition: ScriptManager.h:870
void setScriptEngines(QSharedPointer< ScriptEngines > &scriptEngines)
Set a shared pointer to the ScriptEngines class.
Definition: ScriptManager.h:1168
Q_INVOKABLE void clearTimeout(QTimer *timer)
Stops a timeout timer.
Definition: ScriptManager.h:802
Q_INVOKABLE void registerValue(const QString &valueName, ScriptValue value)
Registers a global object by name.
Definition: ScriptManager.cpp:832
Q_INVOKABLE void loadEntityScript(const EntityItemID &entityID, const QString &entityScript, bool forceRedownload)
Load an entity script.
Definition: ScriptManager.cpp:1994
Q_INVOKABLE void removeEventHandler(const EntityItemID &entityID, const QString &eventName, const ScriptValue &handler)
Removes a function from the list of functions called when an entity event occurs on a particular enti...
Definition: ScriptManager.cpp:837
Q_INVOKABLE QTimer * setInterval(const ScriptValue &function, int intervalMS)
Calls a function repeatedly, at a set interval.
Definition: ScriptManager.cpp:1233
Q_INVOKABLE void requestGarbageCollection()
Manually runs the JavaScript garbage collector which reclaims memory by disposing of objects that are...
Definition: ScriptManager.cpp:2757
Q_INVOKABLE void print(const QString &message)
Prints a message to the program log.
Definition: ScriptManager.cpp:1323
void scriptLoaded(const QString &scriptFilename)
Script.scriptLoaded.
Q_INVOKABLE void endProfileRange(const QString &label) const
Finishes timing a section of code in order to send usage data about it to Overte. Shouldn't be used o...
Definition: ScriptManager.cpp:1332
Q_INVOKABLE QUrl resourcesPath() const
Gets the path to the resources directory for QML files.
Definition: ScriptManager.cpp:1319
Q_INVOKABLE void stop(bool marshal=false)
Stops and unloads the current script.
Definition: ScriptManager.cpp:1148
void setEntityScriptDetails(const EntityItemID &entityID, const EntityScriptDetails &details)
Set the details for an entity script.
Definition: ScriptManager.cpp:1915
void attachDefaultEventHandlers()
Triggered once before the first call to Script.addEventHandler happens on this ScriptManager connecti...
bool isDoneRunning()
Returns true after script finished running and doneRunning signal was called.
Definition: ScriptManager.h:1240
void scriptPrintedMessage(const QString &message, const QString &fileName, int lineNumber)
Logs a script printed message and emits an printedMessage event.
Definition: ScriptManager.cpp:611
void entityScriptPreloadFinished(const EntityItemID &entityID)
Emitted when an entity script has finished running preload.
void clearDebugLogWindow()
Clears the debug log window.
Definition: ScriptManager.cpp:619
std::shared_ptr< ScriptException > getUncaughtException() const
Get the uncaught exception from the underlying script engine.
Definition: ScriptManager.cpp:237
void updateMemoryCost(const qint64 &deltaSize)
Script.updateMemoryCost.
Definition: ScriptManager.cpp:1162
void clearDebugWindow()
Script.clearDebugWindow.
void forwardHandlerCall(const EntityItemID &entityID, const QString &eventName, const ScriptValueList &eventHanderArgs)
Call all the registered event handlers on an entity for the specified name.
Definition: ScriptManager.cpp:1879
Q_INVOKABLE void load(const QString &loadfile)
Starts running another script in Interface, if it isn't already running. The script is not automatica...
Definition: ScriptManager.cpp:1846
Type getType()
Returns the script type.
Definition: ScriptManager.h:979
void scriptErrorMessage(const QString &message, const QString &fileName, int lineNumber)
Logs a script error message and emits an errorMessage event.
Definition: ScriptManager.cpp:587
QVariant cloneEntityScriptDetails(const EntityItemID &entityID)
Clone the details of an entity script.
Definition: ScriptManager.cpp:1933
bool hasValidScriptSuffix(const QString &scriptFileName)
Determines whether a script filename has the right suffix.
Definition: ScriptManager.cpp:549
void entityScriptDetailsUpdated()
Emitted when an entity script is added or removed, or when the status of an entity script is updated ...
void setAbortOnUncaughtException(bool value)
Whether to abort on an uncaught exception.
Definition: ScriptManager.h:1232
void errorEntityMessage(const QString &message, const QString &fileName, int lineNumber, const EntityItemID &entityID, bool isServerScript)
Triggered when a client side entity script generates an error.
void loadScript(const QString &scriptName, bool isUserLoaded)
Script.loadScript.
bool isStopping() const
Whether this ScriptManager is stopping. Once this is true, it stays true.
Definition: ScriptManager.h:1012
QString logException(const ScriptValue &exception)
Log an exception.
Definition: ScriptManager.cpp:226
Q_INVOKABLE bool isAgentScript() const
Checks whether the script is running as an assignment client script.
Definition: ScriptManager.h:577
Q_INVOKABLE void addEventHandler(const EntityItemID &entityID, const QString &eventName, const ScriptValue &handler)
Adds a function to the list of functions called when a particular event occurs on a particular entity...
Definition: ScriptManager.cpp:883
QTimer * setupTimerWithInterval(const ScriptValue &function, int intervalMS, bool isSingleShot)
Creates a timer with the specified interval.
Definition: ScriptManager.cpp:1209
void updateEntityScriptStatus(const EntityItemID &entityID, const EntityScriptStatus &status, const QString &errorInfo=QString())
Updates the status of an entity script.
Definition: ScriptManager.cpp:1923
void printedEntityMessage(const QString &message, const QString &fileName, int lineNumber, const EntityItemID &entityID, bool isServerScript)
Triggered when a client side entity script prints a message to the program log.
Q_INVOKABLE void entityScriptContentAvailable(const EntityItemID &entityID, const QString &scriptOrURL, const QString &contents, bool isURL, bool success, const QString &status)
Script.entityScriptContentAvailable.
Definition: ScriptManager.cpp:2068
Q_INVOKABLE ScriptValue require(const QString &moduleId)
Provides access to methods or objects provided in an external JavaScript or JSON file.
Definition: ScriptManager.cpp:1583
ScriptValue instantiateModule(const ScriptValue &module, const QString &sourceCode)
Evaluate a pending module object using the fetched source code.
Definition: ScriptManager.cpp:1558
ScriptEnginePointer engine()
Underlying scripting engine.
Definition: ScriptManager.h:445
void errorMessage(const QString &message, const QString &scriptName)
Triggered when the script generates an error.
void printedMessage(const QString &message, const QString &scriptName)
Triggered when the script prints a message to the program log.
void callWithEnvironment(const EntityItemID &entityID, const QUrl &sandboxURL, const ScriptValue &function, const ScriptValue &thisObject, const ScriptValueList &args)
Execute operation in the appropriate context for (the possibly empty) entityID.
Definition: ScriptManager.cpp:2561
QFuture< QVariant > getLocalEntityScriptDetails(const EntityItemID &entityID) override
Get the details of a local entity script.
Definition: ScriptManager.cpp:1975
Q_INVOKABLE QUrl resolvePath(const QString &path) const
Resolves a relative path to an absolute path. The relative path is relative to the script's location.
Definition: ScriptManager.cpp:1275
bool getAbortOnUncaughtException() const
Whether this engine will abort on an uncaught exception.
Definition: ScriptManager.h:1224
bool hasEntityScriptDetails(const EntityItemID &entityID) const
Whether there are script details for a given entity ID.
Definition: ScriptManager.cpp:1989
void infoEntityMessage(const QString &message, const QString &fileName, int lineNumber, const EntityItemID &entityID, bool isServerScript)
Triggered when a client side entity script generates an information message.
Q_INVOKABLE void clearInterval(QTimer *timer)
Stops an interval timer.
Definition: ScriptManager.h:786
Q_INVOKABLE void include(const QStringList &includeFiles, const ScriptValue &callback=ScriptValue())
Includes JavaScript from other files in the current script.
Definition: ScriptManager.cpp:1689
void scriptWarningMessage(const QString &message, const QString &fileName, int lineNumber)
Logs a script warning message and emits an warningMessage event.
Definition: ScriptManager.cpp:595
Q_INVOKABLE QString _requireResolve(const QString &moduleId, const QString &relativeTo=QString())
Script._requireResolve.
Definition: ScriptManager.cpp:1337
void removeAllEventHandlers(const EntityItemID &entityID)
Remove all event handlers for the specified entityID (i.e. the entity is being removed)
Definition: ScriptManager.cpp:868
QString getFilename() const
Get the filename of the running script, without the path.
Definition: ScriptManager.cpp:536
void infoMessage(const QString &message, const QString &scriptName)
Triggered when the script generates an information message.
Q_INVOKABLE void unloadAllEntityScripts(bool blockingCall=false)
Unload all entity scripts.
Definition: ScriptManager.cpp:2474
int getNumRunningEntityScripts() const
Get the number of running entity scripts.
Definition: ScriptManager.cpp:1904
Q_INVOKABLE void resetModuleCache(bool deleteScriptCache=false)
Resets the module cache.
Definition: ScriptManager.cpp:690
QString getAbsoluteFilename() const
Get the filename of the running script, with absolute path.
Definition: ScriptManager.cpp:545
ScriptValue evaluate(const QString &program, const QString &fileName=QString())
Evaluate a program in the underlying scripting engine.
Definition: ScriptManager.cpp:2753
bool isQuitWhenFinished() const
Whether to quit when finished.
Definition: ScriptManager.h:1066
void warningEntityMessage(const QString &message, const QString &fileName, int lineNumber, const EntityItemID &entityID, bool isServerScript)
Triggered when a client side entity script generates a warning.
Q_INVOKABLE void beginProfileRange(const QString &label) const
Starts timing a section of code in order to send usage data about it to Overte. Shouldn't be used out...
Definition: ScriptManager.cpp:1328
Q_INVOKABLE bool isEntityClientScript() const
Checks whether the script is running as a client entity script.
Definition: ScriptManager.h:562
Q_INVOKABLE void unloadEntityScript(const EntityItemID &entityID, bool shouldRemoveFromMap=false)
Unload an entity script.
Definition: ScriptManager.cpp:2420
void errorLoadingScript(const QString &scriptFilename)
Script.errorLoadingScript.
void setEmitScriptUpdatesFunction(std::function< bool()> func)
Set a function that determines whether to emit update events.
Definition: ScriptManager.h:1076
void removeFromScriptEngines()
Removes shared pointer to script engine from the list of all script engines.
Definition: ScriptManager.cpp:531
Q_INVOKABLE QString getContext() const
Gets the context that the script is running in: Interface/avatar, client entity, server entity,...
Definition: ScriptManager.cpp:353
Q_INVOKABLE bool isDebugMode() const
Checks whether the application was compiled as a debug build.
Definition: ScriptManager.cpp:371
bool registerModuleWithParent(const ScriptValue &module, const ScriptValue &parent)
Replaces or adds "module" to "parent.children[]" array.
Definition: ScriptManager.cpp:1448
void run()
Run the script in the caller's thread, exit when Script.stop() is called.
Definition: ScriptManager.cpp:921
Q_INVOKABLE void logBacktrace(const QString &title)
Prints out current backtrace to the log.
Definition: ScriptManager.cpp:2761
void runInThread()
Run the script in a dedicated thread.
Definition: ScriptManager.cpp:396
bool isFinished() const
Whether the script has finished running.
Definition: ScriptManager.h:995
void doneRunning()
Triggered when the script has stopped.
Q_INVOKABLE QTimer * setTimeout(const ScriptValue &function, int timeoutMS)
Calls a function once, after a delay.
Definition: ScriptManager.cpp:1249
Q_INVOKABLE QString getExternalPath(ExternalResource::Bucket bucket, const QString &path)
Gets the URL for an asset in an external resource bucket.
Definition: ScriptManager.cpp:2717
Q_INVOKABLE void clearTimeout(QVariantMap timer)
Stops a timeout timer Overloaded version is needed in case the timer has expired.
Definition: ScriptManager.h:811
ScriptValue getReturnValue() const
Return value of the script that finished running.
Definition: ScriptManager.h:1197
void scriptEnding()
Triggered when the script is stopping.
bool isRunning() const
Whether the script is running.
Definition: ScriptManager.h:1003
bool isUserLoaded() const
Whether the script was user-loaded.
Definition: ScriptManager.h:1047
void stopTimer(QTimer *timer)
Stops a timer.
Definition: ScriptManager.cpp:1265
void unhandledException(std::shared_ptr< ScriptException > exception)
Triggered when a script generates an unhandled exception.
void setQuitWhenFinished(const bool quitWhenFinished)
Set whether to quit when finished.
Definition: ScriptManager.h:1056
void releaseEntityPacketSenderMessages(bool wait)
Triggered repeatedly in the scripting loop to ensure entity edit messages get processed properly conn...
void init()
Initializes the underlying scripting engine.
Definition: ScriptManager.cpp:732
void finished(const QString &fileNameString, ScriptManagerPointer)
Script.finished.
void loadURL(const QUrl &scriptURL, bool reload)
Load a script from a given URL.
Definition: ScriptManager.cpp:555
void reloadScript(const QString &scriptName, bool isUserLoaded)
Script.reloadScript.
Context
Context of the script.
Definition: ScriptManager.h:294
@ ENTITY_CLIENT_SCRIPT
Entity client script.
Definition: ScriptManager.h:306
@ ENTITY_SERVER_SCRIPT
Entity server script.
Definition: ScriptManager.h:312
@ NETWORKLESS_TEST_SCRIPT
Network-less test system context. This is used for the QTest self-tests, and minimizes the API that i...
Definition: ScriptManager.h:331
@ CLIENT_SCRIPT
Client script. Allowed to access local HTML files on UI created from C++ calls.
Definition: ScriptManager.h:300
@ AGENT_SCRIPT
Agent script.
Definition: ScriptManager.h:318
friend ScriptManagerPointer newScriptManager(Context context, const QString &scriptContents, const QString &fileNameString)
Creates a new ScriptManager.
Definition: ScriptManager.cpp:251
void update(float deltaTime)
Triggered frequently at a system-determined interval.
Q_INVOKABLE QString formatException(const ScriptValue &exception, bool includeExtendedDetails)
Format an exception and return it as a string.
Definition: ScriptManager.cpp:2721
void setParentURL(const QString &parentURL)
Set the parent URL, used to resolve relative paths.
Definition: ScriptManager.h:1541
ScriptValue currentModule()
The current parent module from the running JS script.
Definition: ScriptManager.cpp:1427
Q_INVOKABLE void callEntityScriptMethod(const EntityItemID &entityID, const QString &methodName, const QStringList &params=QStringList(), const QUuid &remoteCallerID=QUuid()) override
Call a method on an entity script.
Definition: ScriptManager.cpp:2568
void setType(Type type)
Set the script type.
Definition: ScriptManager.h:972
Q_INVOKABLE bool isEntityServerScript() const
Checks whether the script is running as a server entity script.
Definition: ScriptManager.h:570
void runningStateChanged()
Triggered when the running state of the script changes, e.g., from running to stopping.
QString getTypeAsString() const
Returns the type of the script as a string.
Definition: ScriptManager.cpp:348
bool isStopped() const
Whether the ScriptManager is stopped and unable to run scripts.
Definition: ScriptManager.cpp:912
void warningMessage(const QString &message, const QString &scriptName)
Triggered when the script generates a warning.
void waitTillDoneRunning(bool shutdown=false)
Stop any evaluating scripts and wait for the scripting thread to finish.
Definition: ScriptManager.cpp:436
bool getEntityScriptDetails(const EntityItemID &entityID, EntityScriptDetails &details) const
Retrieves the details about an entity script.
Definition: ScriptManager.cpp:1979
QVariantMap fetchModuleSource(const QString &modulePath, const bool forceDownload=false)
Synchronously fetch a module's source code.
Definition: ScriptManager.cpp:1500
Q_INVOKABLE bool isClientScript() const
Checks whether the script is running as an Interface or avatar script.
Definition: ScriptManager.h:548
ScriptValue newModule(const QString &modulePath, const ScriptValue &parent=ScriptValue())
creates a new JS "module" Object with default metadata properties
Definition: ScriptManager.cpp:1470
void scriptInfoMessage(const QString &message, const QString &fileName, int lineNumber)
Logs a script info message and emits an infoMessage event.
Definition: ScriptManager.cpp:603
Q_INVOKABLE void clearInterval(QVariantMap timer)
Stops an interval timer.
Definition: ScriptManager.h:795
Provides the Uuid scripting interface.
Definition: ScriptUUID.h:42
[ScriptInterface] Provides an engine-independent interface for QScriptValue
Definition: ScriptValue.h:40
Provides the Vec3 scripting interface.
Definition: Vec3.h:80
Entity with available script contents.
Definition: ScriptManager.h:115
bool isURL
Whether scriptOrURL contains an URL.
Definition: ScriptManager.h:138
EntityItemID entityID
Entity ID.
Definition: ScriptManager.h:120
QString status
Status as text.
Definition: ScriptManager.h:150
QString scriptOrURL
URL to the script, or the actual script if embedded in the URL field.
Definition: ScriptManager.h:126
QString contents
Contents of the script.
Definition: ScriptManager.h:132
bool success
Whether the request has been successful.
Definition: ScriptManager.h:144