From a13950752bd12e01e7780186ad266b9ac0bd8f95 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 27 Jul 2016 13:32:31 -0700 Subject: [PATCH] Update steam location with discoverability --- interface/src/DiscoverabilityManager.cpp | 15 ++-- .../src/steamworks-wrapper/SteamClient.cpp | 69 ++++++++++++------- .../src/steamworks-wrapper/SteamClient.h | 3 + 3 files changed, 55 insertions(+), 32 deletions(-) diff --git a/interface/src/DiscoverabilityManager.cpp b/interface/src/DiscoverabilityManager.cpp index 4051bd8a1e..3b7d544394 100644 --- a/interface/src/DiscoverabilityManager.cpp +++ b/interface/src/DiscoverabilityManager.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include @@ -36,11 +37,11 @@ const QString SESSION_ID_KEY = "session_id"; void DiscoverabilityManager::updateLocation() { auto accountManager = DependencyManager::get(); - - if (_mode.get() != Discoverability::None && accountManager->isLoggedIn()) { - auto addressManager = DependencyManager::get(); - DomainHandler& domainHandler = DependencyManager::get()->getDomainHandler(); + auto addressManager = DependencyManager::get(); + auto& domainHandler = DependencyManager::get()->getDomainHandler(); + + if (_mode.get() != Discoverability::None && accountManager->isLoggedIn()) { // construct a QJsonObject given the user's current address information QJsonObject rootObject; @@ -48,8 +49,6 @@ void DiscoverabilityManager::updateLocation() { QString pathString = addressManager->currentPath(); - const QString LOCATION_KEY_IN_ROOT = "location"; - const QString PATH_KEY_IN_LOCATION = "path"; locationObject.insert(PATH_KEY_IN_LOCATION, pathString); @@ -90,6 +89,7 @@ void DiscoverabilityManager::updateLocation() { // we have a changed location, send it now _lastLocationObject = locationObject; + const QString LOCATION_KEY_IN_ROOT = "location"; rootObject.insert(LOCATION_KEY_IN_ROOT, locationObject); apiPath = API_USER_LOCATION_PATH; @@ -109,6 +109,9 @@ void DiscoverabilityManager::updateLocation() { accountManager->sendRequest(API_USER_HEARTBEAT_PATH, AccountManagerAuth::Optional, QNetworkAccessManager::PutOperation, callbackParameters); } + + // Update Steam + SteamClient::updateLocation(domainHandler.getHostname(), addressManager->currentAddress()); } void DiscoverabilityManager::handleHeartbeatResponse(QNetworkReply& requestReply) { diff --git a/libraries/steamworks-wrapper/src/steamworks-wrapper/SteamClient.cpp b/libraries/steamworks-wrapper/src/steamworks-wrapper/SteamClient.cpp index de95269d1a..f775efe2f6 100644 --- a/libraries/steamworks-wrapper/src/steamworks-wrapper/SteamClient.cpp +++ b/libraries/steamworks-wrapper/src/steamworks-wrapper/SteamClient.cpp @@ -13,7 +13,12 @@ #include +#include #include +#include +#include +#include +#include #if defined(__GNUC__) && !defined(__clang__) #pragma GCC diagnostic push @@ -41,9 +46,6 @@ public: STEAM_CALLBACK(SteamTicketRequests, onGetAuthSessionTicketResponse, GetAuthSessionTicketResponse_t, _getAuthSessionTicketResponse); - STEAM_CALLBACK(SteamTicketRequests, onGameRichPresenceJoinRequested, - GameRichPresenceJoinRequested_t, _gameRichPresenceJoinRequestedResponse); - private: struct PendingTicket { HAuthTicket authTicket; @@ -55,8 +57,7 @@ private: }; SteamTicketRequests::SteamTicketRequests() : - _getAuthSessionTicketResponse(this, &SteamTicketRequests::onGetAuthSessionTicketResponse), - _gameRichPresenceJoinRequestedResponse(this, &SteamTicketRequests::onGameRichPresenceJoinRequested) + _getAuthSessionTicketResponse(this, &SteamTicketRequests::onGetAuthSessionTicketResponse) { } @@ -130,24 +131,37 @@ void SteamTicketRequests::onGetAuthSessionTicketResponse(GetAuthSessionTicketRes } } -#include -#include -#include -#include -#include -const QString PREFIX = "--url \""; -const QString SUFFIX = "\""; +const QString CONNECT_PREFIX = "--url \""; +const QString CONNECT_SUFFIX = "\""; -void SteamTicketRequests::onGameRichPresenceJoinRequested(GameRichPresenceJoinRequested_t* pCallback) { +class SteamCallbackManager { +public: + SteamCallbackManager(); + + STEAM_CALLBACK(SteamCallbackManager, onGameRichPresenceJoinRequested, + GameRichPresenceJoinRequested_t, _gameRichPresenceJoinRequestedResponse); + + SteamTicketRequests& getTicketRequests() { return _steamTicketRequests; } + +private: + SteamTicketRequests _steamTicketRequests; +}; + +SteamCallbackManager::SteamCallbackManager() : +_gameRichPresenceJoinRequestedResponse(this, &SteamCallbackManager::onGameRichPresenceJoinRequested) +{ +} + +void SteamCallbackManager::onGameRichPresenceJoinRequested(GameRichPresenceJoinRequested_t* pCallback) { auto url = QString::fromLocal8Bit(pCallback->m_rgchConnect); - if (url.startsWith(PREFIX) && url.endsWith(SUFFIX)) { - url.remove(0, PREFIX.size()); - url.remove(-SUFFIX.size(), SUFFIX.size()); + if (url.startsWith(CONNECT_PREFIX) && url.endsWith(CONNECT_SUFFIX)) { + url.remove(0, CONNECT_PREFIX.size()); + url.remove(-CONNECT_SUFFIX.size(), CONNECT_SUFFIX.size()); } - qDebug() << "Joining:" << url; + qDebug() << "Joining Steam Friends at:" << url; auto mimeData = new QMimeData(); mimeData->setUrls(QList() << QUrl(url)); auto event = new QDropEvent(QPointF(0,0), Qt::MoveAction, mimeData, Qt::LeftButton, Qt::NoModifier); @@ -156,9 +170,8 @@ void SteamTicketRequests::onGameRichPresenceJoinRequested(GameRichPresenceJoinRe } - static std::atomic_bool initialized { false }; -static SteamTicketRequests steamTicketRequests; +static SteamCallbackManager steamCallbackManager; bool SteamClient::isRunning() { @@ -171,11 +184,6 @@ bool SteamClient::isRunning() { bool SteamClient::init() { if (SteamAPI_IsSteamRunning() && !initialized) { initialized = SteamAPI_Init(); - - if (initialized) { - SteamFriends()->SetRichPresence("status", "Localhost"); - SteamFriends()->SetRichPresence("connect", "--url \"hifi://10.0.0.185:40117/10,10,10\""); - } } return initialized; } @@ -185,7 +193,7 @@ void SteamClient::shutdown() { SteamAPI_Shutdown(); } - steamTicketRequests.stopAll(); + steamCallbackManager.getTicketRequests().stopAll(); } void SteamClient::runCallbacks() { @@ -218,7 +226,16 @@ void SteamClient::requestTicket(TicketRequestCallback callback) { return; } - steamTicketRequests.startRequest(callback); + steamCallbackManager.getTicketRequests().startRequest(callback); } +void SteamClient::updateLocation(QString status, QUrl locationUrl) { + if (!initialized) { + return; + } + auto connectStr = locationUrl.isEmpty() ? "" : CONNECT_PREFIX + locationUrl.toString() + CONNECT_SUFFIX; + + SteamFriends()->SetRichPresence("status", status.toLocal8Bit().data()); + SteamFriends()->SetRichPresence("connect", connectStr.toLocal8Bit().data()); +} diff --git a/libraries/steamworks-wrapper/src/steamworks-wrapper/SteamClient.h b/libraries/steamworks-wrapper/src/steamworks-wrapper/SteamClient.h index f7ca775829..9ce127f3cb 100644 --- a/libraries/steamworks-wrapper/src/steamworks-wrapper/SteamClient.h +++ b/libraries/steamworks-wrapper/src/steamworks-wrapper/SteamClient.h @@ -20,6 +20,8 @@ using Ticket = QByteArray; using TicketRequestCallback = std::function; +class QUrl; + class SteamClient { public: static bool isRunning(); @@ -30,6 +32,7 @@ public: static void runCallbacks(); static void requestTicket(TicketRequestCallback callback); + static void updateLocation(QString status, QUrl locationUrl); };