diff options
| author | Pierre Bourdon <delroth@gmail.com> | 2018-08-19 13:43:33 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-08-19 13:43:33 +0200 |
| commit | 0fdb6f4267dd34fc15d49d1aeaffd6734851936d (patch) | |
| tree | 37518dc1ce49c07c1bae954dddaf2c0d70cd8ffd /Source/Core/DolphinQt/NetPlay/NetPlayDialog.cpp | |
| parent | 0ed0e513d2865a4ebbbf8fd41cc1c7d793cb255b (diff) | |
| parent | 158c0d54b1b4f332ab8fca897a8396bde5686e74 (diff) | |
Merge pull request #7249 from yourWaifu/discord-rpc-join
Add Discord Join Net Play functionally
Diffstat (limited to 'Source/Core/DolphinQt/NetPlay/NetPlayDialog.cpp')
| -rw-r--r-- | Source/Core/DolphinQt/NetPlay/NetPlayDialog.cpp | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/Source/Core/DolphinQt/NetPlay/NetPlayDialog.cpp b/Source/Core/DolphinQt/NetPlay/NetPlayDialog.cpp index e5af25d6cf..a6775180de 100644 --- a/Source/Core/DolphinQt/NetPlay/NetPlayDialog.cpp +++ b/Source/Core/DolphinQt/NetPlay/NetPlayDialog.cpp @@ -29,10 +29,12 @@ #include "Common/CommonPaths.h" #include "Common/Config/Config.h" +#include "Common/HttpRequest.h" #include "Common/TraversalClient.h" #include "Core/Config/GraphicsSettings.h" #include "Core/Config/MainSettings.h" +#include "Core/Config/NetplaySettings.h" #include "Core/Config/SYSCONFSettings.h" #include "Core/ConfigLoaders/GameConfigLoader.h" #include "Core/ConfigManager.h" @@ -49,6 +51,7 @@ #include "DolphinQt/Resources.h" #include "DolphinQt/Settings.h" +#include "UICommon/DiscordPresence.h" #include "UICommon/GameFile.h" #include "VideoCommon/VideoConfig.h" @@ -418,6 +421,7 @@ void NetPlayDialog::show(std::string nickname, bool use_traversal) m_nickname = nickname; m_use_traversal = use_traversal; m_buffer_size = 0; + m_old_player_count = 0; m_room_box->clear(); m_chat_edit->clear(); @@ -458,6 +462,59 @@ void NetPlayDialog::show(std::string nickname, bool use_traversal) UpdateGUI(); } +void NetPlayDialog::UpdateDiscordPresence() +{ +#ifdef USE_DISCORD_PRESENCE + // both m_current_game and m_player_count need to be set for the status to be displayed correctly + if (m_player_count == 0 || m_current_game.empty()) + return; + + const auto use_default = [this]() { + Discord::UpdateDiscordPresence(m_player_count, Discord::SecretType::Empty, "", m_current_game); + }; + + if (Core::IsRunning()) + return use_default(); + + if (IsHosting()) + { + if (g_TraversalClient) + { + const auto host_id = g_TraversalClient->GetHostID(); + if (host_id[0] == '\0') + return use_default(); + + Discord::UpdateDiscordPresence(m_player_count, Discord::SecretType::RoomID, + std::string(host_id.begin(), host_id.end()), m_current_game); + } + else + { + if (m_external_ip_address.empty()) + { + Common::HttpRequest request; + // ENet does not support IPv6, so IPv4 has to be used + request.UseIPv4(); + Common::HttpRequest::Response response = + request.Get("https://ip.dolphin-emu.org/", {{"X-Is-Dolphin", "1"}}); + + if (!response.has_value()) + return use_default(); + m_external_ip_address = std::string(response->begin(), response->end()); + } + const int port = Settings::Instance().GetNetPlayServer()->GetPort(); + + Discord::UpdateDiscordPresence( + m_player_count, Discord::SecretType::IPAddress, + Discord::CreateSecretFromIPAddress(m_external_ip_address, port), m_current_game); + } + } + else + { + use_default(); + } +#endif +} + void NetPlayDialog::UpdateGUI() { auto client = Settings::Instance().GetNetPlayClient(); @@ -565,6 +622,12 @@ void NetPlayDialog::UpdateGUI() m_hostcode_action_button->setText(tr("Copy")); m_hostcode_action_button->setEnabled(true); } + + if (m_old_player_count != m_player_count) + { + UpdateDiscordPresence(); + m_old_player_count = m_player_count; + } } // NetPlayUI methods @@ -632,6 +695,7 @@ void NetPlayDialog::OnMsgChangeGame(const std::string& title) QueueOnObject(this, [this, qtitle, title] { m_game_button->setText(qtitle); m_current_game = title; + UpdateDiscordPresence(); }); DisplayMessage(tr("Game changed to \"%1\"").arg(qtitle), "magenta"); } @@ -669,11 +733,13 @@ void NetPlayDialog::OnMsgStartGame() auto client = Settings::Instance().GetNetPlayClient(); if (client) client->StartGame(FindGame(m_current_game)); + UpdateDiscordPresence(); }); } void NetPlayDialog::OnMsgStopGame() { + QueueOnObject(this, [this] { UpdateDiscordPresence(); }); } void NetPlayDialog::OnPadBufferChanged(u32 buffer) @@ -727,6 +793,18 @@ void NetPlayDialog::OnTraversalError(TraversalClient::FailureReason error) }); } +void NetPlayDialog::OnTraversalStateChanged(TraversalClient::State state) +{ + switch (state) + { + case TraversalClient::State::Connected: + case TraversalClient::State::Failure: + UpdateDiscordPresence(); + default: + break; + } +} + void NetPlayDialog::OnSaveDataSyncFailure() { QueueOnObject(this, [this] { SetOptionsEnabled(true); }); |
