// // AccountServicesScriptingInterface.h // interface/src/scripting // // Created by Thijs Wenker on 9/10/14. // Copyright 2014 High Fidelity, Inc. // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // #ifndef hifi_AccountServicesScriptingInterface_h #define hifi_AccountServicesScriptingInterface_h #include #include #include #include #include #include #include #include class DownloadInfoResult { public: DownloadInfoResult(); QList downloading; // List of percentages float pending; }; Q_DECLARE_METATYPE(DownloadInfoResult) QScriptValue DownloadInfoResultToScriptValue(QScriptEngine* engine, const DownloadInfoResult& result); void DownloadInfoResultFromScriptValue(const QScriptValue& object, DownloadInfoResult& result); class AccountServicesScriptingInterface : public QObject { Q_OBJECT /**jsdoc * The AccountServices API provides functions that give information on user connectivity, visibility, and * asset download progress. * * @hifi-interface * @hifi-client-entity * @hifi-avatar * * @namespace AccountServices * * @property {string} username - The user name of the user logged in. If there is no user logged in, it is * "Unknown user". Read-only. * @property {boolean} loggedIn - true if the user is logged in, otherwise false. * Read-only. * @property {string} findableBy - The user's visibility to other users: *
    *
  • "none" — user appears offline.
  • *
  • "friends" — user is visible only to friends.
  • *
  • "connections" — user is visible to friends and connections.
  • *
  • "all" — user is visible to everyone.
  • *
* @property {string} metaverseServerURL - The metaverse server that the user is authenticated against when logged in * — typically "https://metaverse.highfidelity.com". Read-only. */ /**jsdoc * The Account API provides functions that give information on user connectivity, visibility, and asset * download progress. * * @deprecated This API is the same as the {@link AccountServices} API and will be removed. * * @hifi-interface * @hifi-client-entity * @hifi-avatar * * @namespace Account * * @property {string} username - The user name of the user logged in. If there is no user logged in, it is * "Unknown user". Read-only. * @property {boolean} loggedIn - true if the user is logged in, otherwise false. * Read-only. * @property {string} findableBy - The user's visibility to other users: *
    *
  • "none" — user appears offline.
  • *
  • "friends" — user is visible only to friends.
  • *
  • "connections" — user is visible to friends and connections.
  • *
  • "all" — user is visible to everyone.
  • *
* @property {string} metaverseServerURL - The metaverse server that the user is authenticated against when logged in * — typically "https://metaverse.highfidelity.com". Read-only. * * @borrows AccountServices.getDownloadInfo as getDownloadInfo * @borrows AccountServices.updateDownloadInfo as updateDownloadInfo * @borrows AccountServices.isLoggedIn as isLoggedIn * @borrows AccountServices.checkAndSignalForAccessToken as checkAndSignalForAccessToken * @borrows AccountServices.logOut as logOut * * @borrows AccountServices.connected as connected * @borrows AccountServices.disconnected as disconnected * @borrows AccountServices.myUsernameChanged as myUsernameChanged * @borrows AccountServices.downloadInfoChanged as downloadInfoChanged * @borrows AccountServices.findableByChanged as findableByChanged * @borrows AccountServices.loggedInChanged as loggedInChanged */ /**jsdoc * The GlobalServices API provides functions that give information on user connectivity, visibility, and asset * download progress. * * @deprecated This API is the same as the {@link AccountServices} API and will be removed. * * @hifi-interface * @hifi-client-entity * @hifi-avatar * * @namespace GlobalServices * * @property {string} username - The user name of the user logged in. If there is no user logged in, it is * "Unknown user". Read-only. * @property {boolean} loggedIn - true if the user is logged in, otherwise false. * Read-only. * @property {string} findableBy - The user's visibility to other users: *
    *
  • "none" — user appears offline.
  • *
  • "friends" — user is visible only to friends.
  • *
  • "connections" — user is visible to friends and connections.
  • *
  • "all" — user is visible to everyone.
  • *
* @property {string} metaverseServerURL - The metaverse server that the user is authenticated against when logged in * — typically "https://metaverse.highfidelity.com". Read-only. * * @borrows AccountServices.getDownloadInfo as getDownloadInfo * @borrows AccountServices.updateDownloadInfo as updateDownloadInfo * @borrows AccountServices.isLoggedIn as isLoggedIn * @borrows AccountServices.checkAndSignalForAccessToken as checkAndSignalForAccessToken * @borrows AccountServices.logOut as logOut * * @borrows AccountServices.connected as connected * @borrows AccountServices.disconnected as disconnected * @borrows AccountServices.myUsernameChanged as myUsernameChanged * @borrows AccountServices.downloadInfoChanged as downloadInfoChanged * @borrows AccountServices.findableByChanged as findableByChanged * @borrows AccountServices.loggedInChanged as loggedInChanged */ Q_PROPERTY(QString username READ getUsername NOTIFY myUsernameChanged) Q_PROPERTY(bool loggedIn READ loggedIn NOTIFY loggedInChanged) Q_PROPERTY(QString findableBy READ getFindableBy WRITE setFindableBy NOTIFY findableByChanged) Q_PROPERTY(QUrl metaverseServerURL READ getMetaverseServerURL CONSTANT) public: static AccountServicesScriptingInterface* getInstance(); const QString getUsername() const; bool loggedIn() const { return _loggedIn; } QUrl getMetaverseServerURL() { return DependencyManager::get()->getMetaverseServerURL(); } public slots: /**jsdoc * Gets information on the download progress of assets in the domain. * @function AccountServices.getDownloadInfo * @returns {AccountServices.DownloadInfoResult} Information on the download progress of assets. */ DownloadInfoResult getDownloadInfo(); /**jsdoc * Triggers a {@link AccountServices.downloadInfoChanged|downloadInfoChanged} signal with information on the current * download progress of the assets in the domain. * @function AccountServices.updateDownloadInfo */ void updateDownloadInfo(); /**jsdoc * Checks whether the user is logged in. * @function AccountServices.isLoggedIn * @returns {boolean} true if the user is logged in, false if not. * @example Report whether you are logged in. * var isLoggedIn = AccountServices.isLoggedIn(); * print("You are logged in: " + isLoggedIn); // true or false */ bool isLoggedIn(); /**jsdoc * The function returns the login status of the user and prompts the user to log in (with a login dialog) if they're not already logged in. * @function AccountServices.checkAndSignalForAccessToken * @returns {boolean} true if the user is logged in, false if not. */ bool checkAndSignalForAccessToken(); /**jsdoc * Logs the user out. * @function AccountServices.logOut */ void logOut(); private slots: void loggedOut(); void checkDownloadInfo(); QString getFindableBy() const; void setFindableBy(const QString& discoverabilityMode); void discoverabilityModeChanged(Discoverability::Mode discoverabilityMode); void onUsernameChanged(const QString& username); signals: /**jsdoc * Not currently used. * @function AccountServices.connected * @returns {Signal} */ void connected(); /**jsdoc * Triggered when the user logs out. * @function AccountServices.disconnected * @param {string} reason - Has the value, "logout". * @returns {Signal} */ void disconnected(const QString& reason); /**jsdoc * Triggered when the username logged in with changes, i.e., when the user logs in or out. * @function AccountServices.myUsernameChanged * @param {string} username - The user name of the user logged in. If there is no user logged in, it is "". * @returns {Signal} * @example Report when your username changes. * AccountServices.myUsernameChanged.connect(function (username) { * print("Username changed: " + username); * }); */ void myUsernameChanged(const QString& username); /**jsdoc * Triggered when the download progress of the assets in the domain changes. * @function AccountServices.downloadInfoChanged * @param {AccountServices.DownloadInfoResult} downloadInfo - Information on the download progress of assets. * @returns {Signal} */ void downloadInfoChanged(DownloadInfoResult info); /**jsdoc * Triggered when the user's visibility to others changes. * @function AccountServices.findableByChanged * @param {string} findableBy - The user's visibility to other people: *
    *
  • "none" — user appears offline.
  • *
  • "friends" — user is visible only to friends.
  • *
  • "connections" — user is visible to friends and connections.
  • *
  • "all" — user is visible to everyone.
  • *
* @returns {Signal} * @example Report when your visiblity changes. * AccountServices.findableByChanged.connect(function (findableBy) { * print("Findable by changed: " + findableBy); * }); * * var originalFindableBy = AccountServices.findableBy; * Script.setTimeout(function () { * // Change visiblity. * AccountServices.findableBy = originalFindableBy === "none" ? "all" : "none"; * }, 2000); * Script.setTimeout(function () { * // Restore original visibility. * AccountServices.findableBy = originalFindableBy; * }, 4000); */ void findableByChanged(const QString& discoverabilityMode); /**jsdoc * Triggered when the login status of the user changes. * @function AccountServices.loggedInChanged * @param {boolean} loggedIn - true if the user is logged in, false if not. * @returns {Signal} * @example Report when your login status changes. * AccountServices.loggedInChanged.connect(function(loggedIn) { * print("Logged in: " + loggedIn); * }); */ void loggedInChanged(bool loggedIn); private: AccountServicesScriptingInterface(); ~AccountServicesScriptingInterface(); bool _downloading; bool _loggedIn{ false }; }; #endif // hifi_AccountServicesScriptingInterface_h