diff options
author | liamwhite <liamwhite@users.noreply.github.com> | 2023-07-26 17:04:57 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-07-26 17:04:57 +0200 |
commit | a1c355051e030d48b24044023c3fb35d2640386b (patch) | |
tree | 3648e6d1d4389d8453c31941a08843d956c241d8 | |
parent | Merge pull request #10990 from comex/ubsan (diff) | |
parent | Address feedback (diff) | |
download | yuzu-a1c355051e030d48b24044023c3fb35d2640386b.tar yuzu-a1c355051e030d48b24044023c3fb35d2640386b.tar.gz yuzu-a1c355051e030d48b24044023c3fb35d2640386b.tar.bz2 yuzu-a1c355051e030d48b24044023c3fb35d2640386b.tar.lz yuzu-a1c355051e030d48b24044023c3fb35d2640386b.tar.xz yuzu-a1c355051e030d48b24044023c3fb35d2640386b.tar.zst yuzu-a1c355051e030d48b24044023c3fb35d2640386b.zip |
-rw-r--r-- | src/yuzu/discord_impl.cpp | 82 | ||||
-rw-r--r-- | src/yuzu/discord_impl.h | 7 |
2 files changed, 53 insertions, 36 deletions
diff --git a/src/yuzu/discord_impl.cpp b/src/yuzu/discord_impl.cpp index ac2fc1bcb..57b50abd0 100644 --- a/src/yuzu/discord_impl.cpp +++ b/src/yuzu/discord_impl.cpp @@ -3,9 +3,14 @@ #include <chrono> #include <string> + +#include <QEventLoop> +#include <QNetworkAccessManager> +#include <QNetworkReply> + #include <discord_rpc.h> #include <fmt/format.h> -#include <httplib.h> + #include "common/common_types.h" #include "common/string_util.h" #include "core/core.h" @@ -31,7 +36,7 @@ void DiscordImpl::Pause() { Discord_ClearPresence(); } -static std::string GetGameString(const std::string& title) { +std::string DiscordImpl::GetGameString(const std::string& title) { // Convert to lowercase std::string icon_name = Common::ToLower(title); @@ -56,51 +61,56 @@ static std::string GetGameString(const std::string& title) { return icon_name; } -void DiscordImpl::Update() { +void DiscordImpl::UpdateGameStatus(bool use_default) { + const std::string default_text = "yuzu is an emulator for the Nintendo Switch"; + const std::string default_image = "yuzu_logo"; + const std::string url = use_default ? default_image : game_url; s64 start_time = std::chrono::duration_cast<std::chrono::seconds>( std::chrono::system_clock::now().time_since_epoch()) .count(); + DiscordRichPresence presence{}; + + presence.largeImageKey = url.c_str(); + presence.largeImageText = game_title.c_str(); + presence.smallImageKey = default_image.c_str(); + presence.smallImageText = default_text.c_str(); + presence.state = game_title.c_str(); + presence.details = "Currently in game"; + presence.startTimestamp = start_time; + Discord_UpdatePresence(&presence); +} + +void DiscordImpl::Update() { const std::string default_text = "yuzu is an emulator for the Nintendo Switch"; const std::string default_image = "yuzu_logo"; - std::string game_cover_url = "https://yuzu-emu.org"; - std::string title; - - DiscordRichPresence presence{}; if (system.IsPoweredOn()) { - system.GetAppLoader().ReadTitle(title); + system.GetAppLoader().ReadTitle(game_title); // Used to format Icon URL for yuzu website game compatibility page - std::string icon_name = GetGameString(title); - - // New Check for game cover - httplib::Client cli(game_cover_url); - cli.set_connection_timeout(std::chrono::seconds(3)); - cli.set_read_timeout(std::chrono::seconds(3)); - - if (auto res = cli.Head(fmt::format("/images/game/boxart/{}.png", icon_name))) { - if (res->status == 200) { - game_cover_url += fmt::format("/images/game/boxart/{}.png", icon_name); - } else { - game_cover_url = "yuzu_logo"; - } - } else { - game_cover_url = "yuzu_logo"; - } - - presence.largeImageKey = game_cover_url.c_str(); - presence.largeImageText = title.c_str(); - - presence.smallImageKey = default_image.c_str(); - presence.smallImageText = default_text.c_str(); - presence.state = title.c_str(); - presence.details = "Currently in game"; - } else { - presence.largeImageKey = default_image.c_str(); - presence.largeImageText = default_text.c_str(); - presence.details = "Currently not in game"; + std::string icon_name = GetGameString(game_title); + game_url = fmt::format("https://yuzu-emu.org/images/game/boxart/{}.png", 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; + QObject::connect(reply, &QNetworkReply::finished, &request_event_loop, &QEventLoop::quit); + request_event_loop.exec(); + UpdateGameStatus(reply->error()); + return; } + s64 start_time = std::chrono::duration_cast<std::chrono::seconds>( + std::chrono::system_clock::now().time_since_epoch()) + .count(); + + DiscordRichPresence presence{}; + presence.largeImageKey = default_image.c_str(); + presence.largeImageText = default_text.c_str(); + presence.details = "Currently not in game"; presence.startTimestamp = start_time; Discord_UpdatePresence(&presence); } diff --git a/src/yuzu/discord_impl.h b/src/yuzu/discord_impl.h index 84710b9c6..eb6cf9ae0 100644 --- a/src/yuzu/discord_impl.h +++ b/src/yuzu/discord_impl.h @@ -19,6 +19,13 @@ public: void Pause() override; void Update() override; +private: + std::string GetGameString(const std::string& title); + void UpdateGameStatus(bool use_default); + + std::string game_url{}; + std::string game_title{}; + Core::System& system; }; |