From 7ec2f98cf2a081e8073ca5d682c34d82d90e3997 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 29 Jul 2016 13:34:10 -0700 Subject: [PATCH] Join lobby on startup --- interface/src/Application.cpp | 8 +++ .../src/steamworks-wrapper/SteamClient.cpp | 54 +++++++++++-------- .../src/steamworks-wrapper/SteamClient.h | 1 + 3 files changed, 42 insertions(+), 21 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index a1016d90fb..00a092f8c7 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3224,6 +3224,14 @@ void Application::init() { addressLookupString = arguments().value(urlIndex + 1); } + // when +connect_lobby in command line, join steam lobby + const QString STEAM_LOBBY_COMMAND_LINE_KEY = "+connect_lobby"; + int lobbyIndex = arguments().indexOf(STEAM_LOBBY_COMMAND_LINE_KEY); + if (lobbyIndex != -1) { + QString lobbyId = arguments().value(lobbyIndex + 1); + SteamClient::joinLobby(lobbyId); + } + Setting::Handle firstRun { Settings::firstRun, true }; if (addressLookupString.isEmpty() && firstRun.get()) { qDebug() << "First run and no URL passed... attempting to go to Home or Entry..."; diff --git a/libraries/steamworks-wrapper/src/steamworks-wrapper/SteamClient.cpp b/libraries/steamworks-wrapper/src/steamworks-wrapper/SteamClient.cpp index c28be7f344..3efeba956a 100644 --- a/libraries/steamworks-wrapper/src/steamworks-wrapper/SteamClient.cpp +++ b/libraries/steamworks-wrapper/src/steamworks-wrapper/SteamClient.cpp @@ -165,9 +165,7 @@ SteamCallbackManager::SteamCallbackManager() : { } -void SteamCallbackManager::onGameRichPresenceJoinRequested(GameRichPresenceJoinRequested_t* pCallback) { - auto url = QString::fromLocal8Bit(pCallback->m_rgchConnect); - +void parseUrlAndGo(QString url) { if (url.startsWith(CONNECT_PREFIX) && url.endsWith(CONNECT_SUFFIX)) { url.remove(0, CONNECT_PREFIX.size()); url.remove(-CONNECT_SUFFIX.size(), CONNECT_SUFFIX.size()); @@ -176,40 +174,50 @@ void SteamCallbackManager::onGameRichPresenceJoinRequested(GameRichPresenceJoinR qDebug() << "Joining Steam Friend 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); + auto event = new QDropEvent(QPointF(0, 0), Qt::MoveAction, mimeData, Qt::LeftButton, Qt::NoModifier); QCoreApplication::postEvent(qApp, event); } +void SteamCallbackManager::onGameRichPresenceJoinRequested(GameRichPresenceJoinRequested_t* pCallback) { + auto url = QString::fromLocal8Bit(pCallback->m_rgchConnect); + + parseUrlAndGo(url); +} + + + void SteamCallbackManager::onLobbyCreated(LobbyCreated_t* pCallback) { qDebug() << pCallback->m_eResult << pCallback->m_ulSteamIDLobby; if (pCallback->m_eResult == k_EResultOK) { qDebug() << "Inviting steam friends"; - SteamMatchmaking()->SetLobbyData(pCallback->m_ulSteamIDLobby, "connect", - SteamFriends()->GetFriendRichPresence(SteamUser()->GetSteamID(), "connect")); - SteamMatchmaking()->SetLobbyMemberData(pCallback->m_ulSteamIDLobby, - "Creator", "true"); + auto url = SteamFriends()->GetFriendRichPresence(SteamUser()->GetSteamID(), "connect"); + SteamMatchmaking()->SetLobbyData(pCallback->m_ulSteamIDLobby, "connect", url); + SteamMatchmaking()->SetLobbyMemberData(pCallback->m_ulSteamIDLobby, "creator", "true"); SteamFriends()->ActivateGameOverlayInviteDialog(pCallback->m_ulSteamIDLobby); } } void SteamCallbackManager::onGameLobbyJoinRequested(GameLobbyJoinRequested_t* pCallback) { - qDebug() << "onGameLobbyJoinRequested"; + qDebug() << "Joining Steam lobby"; SteamMatchmaking()->JoinLobby(pCallback->m_steamIDLobby); } void SteamCallbackManager::onLobbyEnter(LobbyEnter_t* pCallback) { - qDebug() << "onLobbyEnter"; - auto creator = SteamMatchmaking()->GetLobbyMemberData(pCallback->m_ulSteamIDLobby, SteamUser()->GetSteamID(), "creator"); - if (strcmp(creator, "true") == 0) { - qDebug() << "Created lobby"; - SteamMatchmaking()->LeaveLobby(pCallback->m_ulSteamIDLobby); - } else if (pCallback->m_EChatRoomEnterResponse == k_EChatRoomEnterResponseSuccess) { - qDebug() << "Success"; - auto connectValue = SteamMatchmaking()->GetLobbyData(pCallback->m_ulSteamIDLobby, "connect"); - qDebug() << connectValue; + if (pCallback->m_EChatRoomEnterResponse != k_EChatRoomEnterResponseSuccess) { + qWarning() << "An error occured while joing the Steam lobby:" << pCallback->m_EChatRoomEnterResponse; + return; } + + auto creator = SteamMatchmaking()->GetLobbyMemberData(pCallback->m_ulSteamIDLobby, + SteamUser()->GetSteamID(), "creator"); + if (strcmp(creator, "true") != 0) { + auto url = SteamMatchmaking()->GetLobbyData(pCallback->m_ulSteamIDLobby, "connect"); + parseUrlAndGo(url); + } + + SteamMatchmaking()->LeaveLobby(pCallback->m_ulSteamIDLobby); } @@ -218,9 +226,6 @@ static SteamCallbackManager steamCallbackManager; bool SteamClient::isRunning() { - if (!initialized) { - init(); - } return initialized; } @@ -292,3 +297,10 @@ void SteamClient::openInviteOverlay() { static const int MAX_LOBBY_SIZE = 20; SteamMatchmaking()->CreateLobby(k_ELobbyTypePrivate, MAX_LOBBY_SIZE); } + + +void SteamClient::joinLobby(QString lobbyIdStr) { + qDebug() << "Trying to join Steam lobby:" << lobbyIdStr; + CSteamID lobbyId(lobbyIdStr.toULongLong()); + SteamMatchmaking()->JoinLobby(lobbyId); +} \ No newline at end of file diff --git a/libraries/steamworks-wrapper/src/steamworks-wrapper/SteamClient.h b/libraries/steamworks-wrapper/src/steamworks-wrapper/SteamClient.h index 7c958c4b39..5bf0d4db56 100644 --- a/libraries/steamworks-wrapper/src/steamworks-wrapper/SteamClient.h +++ b/libraries/steamworks-wrapper/src/steamworks-wrapper/SteamClient.h @@ -35,6 +35,7 @@ public: static void requestTicket(TicketRequestCallback callback); static void updateLocation(QString status, QUrl locationUrl); static void openInviteOverlay(); + static void joinLobby(QString lobbyId); };