Browse Source

[qt] fix Discord RPC by using httplib

Commit `a079a93645a7219ada1bef84f476eb8269614f5b` inexplicably replaced
the httplib implementation of discord_impl.cpp with an inferior
Qt::Network version. This causes a lot of issues especially w.r.t CA
certs which are handled differently with bundled OpenSSL. Thus, this
just adds back the httplib implementation and makes discord RPC work
again.

Signed-off-by: crueter <crueter@eden-emu.dev>
pull/2825/head
crueter 2 months ago
parent
commit
8c7e28efb6
No known key found for this signature in database GPG Key ID: 425ACD2D4830EBC6
  1. 19
      CMakeLists.txt
  2. 4
      src/frontend_common/update_checker.cpp
  3. 6
      src/qt_common/CMakeLists.txt
  4. 40
      src/qt_common/discord/discord_impl.cpp

19
CMakeLists.txt

@ -687,12 +687,17 @@ function(set_yuzu_qt_components)
if (ENABLE_QT_TRANSLATION) if (ENABLE_QT_TRANSLATION)
list(APPEND YUZU_QT_COMPONENTS2 LinguistTools) list(APPEND YUZU_QT_COMPONENTS2 LinguistTools)
endif() endif()
if (USE_DISCORD_PRESENCE)
list(APPEND YUZU_QT_COMPONENTS2 Network)
endif()
set(YUZU_QT_COMPONENTS ${YUZU_QT_COMPONENTS2} PARENT_SCOPE) set(YUZU_QT_COMPONENTS ${YUZU_QT_COMPONENTS2} PARENT_SCOPE)
endfunction(set_yuzu_qt_components) endfunction(set_yuzu_qt_components)
if(ENABLE_QT)
set_yuzu_qt_components()
find_package(Qt6 REQUIRED COMPONENTS ${YUZU_QT_COMPONENTS})
set(QT_MAJOR_VERSION 6)
# Qt6 sets cxx_std_17 and we need to undo that
set_target_properties(Qt6::Platform PROPERTIES INTERFACE_COMPILE_FEATURES "")
endif()
if (UNIX AND NOT APPLE AND NOT ANDROID) if (UNIX AND NOT APPLE AND NOT ANDROID)
find_package(PkgConfig REQUIRED) find_package(PkgConfig REQUIRED)
pkg_check_modules(LIBVA libva) pkg_check_modules(LIBVA libva)
@ -708,14 +713,6 @@ if (NOT (YUZU_USE_BUNDLED_FFMPEG OR YUZU_USE_EXTERNAL_FFMPEG))
set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_URLS "https://github.com/FFmpeg/FFmpeg") set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_URLS "https://github.com/FFmpeg/FFmpeg")
endif() endif()
if(ENABLE_QT)
set_yuzu_qt_components()
find_package(Qt6 REQUIRED COMPONENTS ${YUZU_QT_COMPONENTS})
set(QT_MAJOR_VERSION 6)
# Qt6 sets cxx_std_17 and we need to undo that
set_target_properties(Qt6::Platform PROPERTIES INTERFACE_COMPILE_FEATURES "")
endif()
if (WIN32 AND YUZU_CRASH_DUMPS) if (WIN32 AND YUZU_CRASH_DUMPS)
set(BREAKPAD_VER "breakpad-c89f9dd") set(BREAKPAD_VER "breakpad-c89f9dd")
download_bundled_external("breakpad/" ${BREAKPAD_VER} "breakpad-win" BREAKPAD_PREFIX "c89f9dd") download_bundled_external("breakpad/" ${BREAKPAD_VER} "breakpad-win" BREAKPAD_PREFIX "c89f9dd")

4
src/frontend_common/update_checker.cpp

@ -10,10 +10,6 @@
#include "common/scm_rev.h" #include "common/scm_rev.h"
#include <fmt/format.h> #include <fmt/format.h>
#ifndef CPPHTTPLIB_OPENSSL_SUPPORT
#define CPPHTTPLIB_OPENSSL_SUPPORT
#endif
#include <httplib.h> #include <httplib.h>
#ifdef YUZU_BUNDLED_OPENSSL #ifdef YUZU_BUNDLED_OPENSSL

6
src/qt_common/CMakeLists.txt

@ -36,7 +36,11 @@ if (USE_DISCORD_PRESENCE)
discord/discord_impl.cpp discord/discord_impl.cpp
discord/discord_impl.h discord/discord_impl.h
) )
target_link_libraries(qt_common PUBLIC DiscordRPC::discord-rpc Qt6::Network)
target_link_libraries(qt_common PUBLIC DiscordRPC::discord-rpc httplib::httplib)
if (YUZU_USE_BUNDLED_OPENSSL)
target_link_libraries(qt_common PUBLIC OpenSSL::SSL)
target_compile_definitions(qt_common PRIVATE CPPHTTPLIB_OPENSSL_SUPPORT)
endif()
target_compile_definitions(qt_common PUBLIC USE_DISCORD_PRESENCE) target_compile_definitions(qt_common PUBLIC USE_DISCORD_PRESENCE)
endif() endif()

40
src/qt_common/discord/discord_impl.cpp

@ -8,17 +8,23 @@
#include <string> #include <string>
#include <QEventLoop> #include <QEventLoop>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <boost/algorithm/string/replace.hpp>
#include <httplib.h>
#include <discord_rpc.h> #include <discord_rpc.h>
#include <fmt/format.h> #include <fmt/format.h>
#include <qdebug.h>
#include "common/common_types.h" #include "common/common_types.h"
#include "common/string_util.h" #include "common/string_util.h"
#include "core/core.h" #include "core/core.h"
#include "core/loader/loader.h" #include "core/loader/loader.h"
#include "qt_common/discord/discord_impl.h"
#include "discord_impl.h"
#ifdef YUZU_BUNDLED_OPENSSL
#include <openssl/cert.h>
#endif
namespace DiscordRPC { namespace DiscordRPC {
@ -44,6 +50,7 @@ std::string DiscordImpl::GetGameString(const std::string& title) {
// Replace spaces with dashes // Replace spaces with dashes
std::replace(icon_name.begin(), icon_name.end(), ' ', '-'); std::replace(icon_name.begin(), icon_name.end(), ' ', '-');
boost::replace_all(icon_name, "é", "e");
// Remove non-alphanumeric characters but keep dashes // Remove non-alphanumeric characters but keep dashes
std::erase_if(icon_name, [](char c) { return !std::isalnum(c) && c != '-'; }); std::erase_if(icon_name, [](char c) { return !std::isalnum(c) && c != '-'; });
@ -81,6 +88,8 @@ void DiscordImpl::UpdateGameStatus(bool use_default) {
presence.details = "Currently in game"; presence.details = "Currently in game";
presence.startTimestamp = start_time; presence.startTimestamp = start_time;
Discord_UpdatePresence(&presence); Discord_UpdatePresence(&presence);
qDebug() << "game status updated";
} }
void DiscordImpl::Update() { void DiscordImpl::Update() {
@ -97,15 +106,22 @@ void DiscordImpl::Update() {
"https://raw.githubusercontent.com/eden-emulator/boxart/refs/heads/master/img/{}.png", "https://raw.githubusercontent.com/eden-emulator/boxart/refs/heads/master/img/{}.png",
icon_name); icon_name);
QNetworkAccessManager manager;
QNetworkRequest request;
request.setUrl(QUrl(QString::fromStdString(game_url)));
request.setTransferTimeout(3000);
QNetworkReply* reply = manager.head(request);
QEventLoop request_event_loop;
reply->connect(reply, &QNetworkReply::finished, &request_event_loop, &QEventLoop::quit);
request_event_loop.exec();
UpdateGameStatus(reply->error());
httplib::SSLClient client(game_url);
client.set_connection_timeout(3);
client.set_read_timeout(3);
client.set_follow_location(true);
#ifdef YUZU_BUNDLED_OPENSSL
client.load_ca_cert_store(kCert, sizeof(kCert));
#endif
httplib::Request request{
.method = "HEAD",
.path = game_url,
};
auto res = client.send(request);
UpdateGameStatus(res && res->status == 200);
return; return;
} }

Loading…
Cancel
Save