diff options
| author | bunnei <bunneidev@gmail.com> | 2023-02-04 18:37:21 -0800 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-02-04 18:37:21 -0800 | 
| commit | a64fc3ee77f26dc488f51e2348ef5b63ae4e8299 (patch) | |
| tree | e52c9de046400482abe5f96537a4f2896fe08081 | |
| parent | f5ed51bdf3bb1de3dc2432c8ef3086a441ad37f6 (diff) | |
| parent | 923c17f1ae36ab7ed4666230282b303d70734f2e (diff) | |
Merge pull request #9720 from SoRadGaming/discordPresenceUpdate
Game Image with Discord RPC
| -rw-r--r-- | src/yuzu/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | src/yuzu/discord_impl.cpp | 67 | 
2 files changed, 61 insertions, 8 deletions
| diff --git a/src/yuzu/CMakeLists.txt b/src/yuzu/CMakeLists.txt index dfc675cc8..06d982d9b 100644 --- a/src/yuzu/CMakeLists.txt +++ b/src/yuzu/CMakeLists.txt @@ -353,7 +353,7 @@ if (USE_DISCORD_PRESENCE)          discord_impl.cpp          discord_impl.h      ) -    target_link_libraries(yuzu PRIVATE DiscordRPC::discord-rpc) +    target_link_libraries(yuzu PRIVATE DiscordRPC::discord-rpc httplib::httplib)      target_compile_definitions(yuzu PRIVATE -DUSE_DISCORD_PRESENCE)  endif() diff --git a/src/yuzu/discord_impl.cpp b/src/yuzu/discord_impl.cpp index c351e9b83..de0c307d4 100644 --- a/src/yuzu/discord_impl.cpp +++ b/src/yuzu/discord_impl.cpp @@ -4,7 +4,10 @@  #include <chrono>  #include <string>  #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"  #include "core/loader/loader.h"  #include "yuzu/discord_impl.h" @@ -14,7 +17,6 @@ namespace DiscordRPC {  DiscordImpl::DiscordImpl(Core::System& system_) : system{system_} {      DiscordEventHandlers handlers{}; -      // The number is the client ID for yuzu, it's used for images and the      // application name      Discord_Initialize("712465656758665259", &handlers, 1, nullptr); @@ -29,23 +31,74 @@ void DiscordImpl::Pause() {      Discord_ClearPresence();  } +static std::string GetGameString(const std::string& title) { +    // Convert to lowercase +    std::string icon_name = Common::ToLower(title); + +    // Replace spaces with dashes +    std::replace(icon_name.begin(), icon_name.end(), ' ', '-'); + +    // Remove non-alphanumeric characters but keep dashes +    std::erase_if(icon_name, [](char c) { return !std::isalnum(c) && c != '-'; }); + +    // Remove dashes from the start and end of the string +    icon_name.erase(icon_name.begin(), std::find_if(icon_name.begin(), icon_name.end(), +                                                    [](int ch) { return ch != '-'; })); +    icon_name.erase( +        std::find_if(icon_name.rbegin(), icon_name.rend(), [](int ch) { return ch != '-'; }).base(), +        icon_name.end()); + +    // Remove double dashes +    icon_name.erase(std::unique(icon_name.begin(), icon_name.end(), +                                [](char a, char b) { return a == '-' && b == '-'; }), +                    icon_name.end()); + +    return icon_name; +} +  void DiscordImpl::Update() {      s64 start_time = std::chrono::duration_cast<std::chrono::seconds>(                           std::chrono::system_clock::now().time_since_epoch())                           .count(); +    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; -    if (system.IsPoweredOn()) { -        system.GetAppLoader().ReadTitle(title); -    } +      DiscordRichPresence presence{}; -    presence.largeImageKey = "yuzu_logo"; -    presence.largeImageText = "yuzu is an emulator for the Nintendo Switch"; +      if (system.IsPoweredOn()) { +        system.GetAppLoader().ReadTitle(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); + +        if (auto res = cli.Head(fmt::format("/images/game/boxart/{}.png", icon_name).c_str())) { +            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.details = "Not in game"; +        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);  } | 
