From 39b98fcfdac9dade090060e6a4f1a9a1892511e5 Mon Sep 17 00:00:00 2001 From: delledev Date: Mon, 30 Sep 2024 14:30:55 +0300 Subject: [PATCH] fix discord rpc --- CMakeLists.txt | 9 ++++++++- CMakeSettings.json | 2 +- externals/CMakeLists.txt | 3 ++- externals/discord-rpc | 1 + src/common/discord.cpp | 33 +++++++++++++++++++++++---------- src/common/discord.h | 3 ++- src/emulator.cpp | 6 ++++++ src/main.cpp | 2 +- src/qt_gui/main.cpp | 6 ++++++ src/sdl_window.cpp | 5 ++++- 10 files changed, 54 insertions(+), 16 deletions(-) create mode 160000 externals/discord-rpc diff --git a/CMakeLists.txt b/CMakeLists.txt index c9ea15918..c2866ef26 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -361,6 +361,8 @@ set(COMMON src/common/logging/backend.cpp src/common/debug.h src/common/decoder.cpp src/common/decoder.h + src/common/discord.h + src/common/discord.cpp src/common/elf_info.h src/common/endian.h src/common/enum.h @@ -838,4 +840,9 @@ if (UNIX AND NOT APPLE) find_package(OpenSSL REQUIRED) target_link_libraries(shadps4 PRIVATE ${OPENSSL_LIBRARIES}) endif() -endif() \ No newline at end of file +endif() + +#Discord Lib +add_subdirectory(externals/discord-rpc) +target_link_libraries(shadps4 PRIVATE discord-rpc) +include_directories(externals/discord-rpc/include) diff --git a/CMakeSettings.json b/CMakeSettings.json index bb522fcfc..fda0f3c2a 100644 --- a/CMakeSettings.json +++ b/CMakeSettings.json @@ -6,7 +6,7 @@ "configurationType": "Release", "buildRoot": "${projectDir}\\Build\\${name}", "installRoot": "${projectDir}\\Install\\${name}", - "cmakeCommandArgs": "", + "cmakeCommandArgs": "-DENABLE_QT_GUI=ON -DCMAKE_PREFIX_PATH=C:\\Qt\\6.7.3\\msvc2019_64", "buildCommandArgs": "", "ctestCommandArgs": "", "inheritEnvironments": [ "clang_cl_x64_x64" ], diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt index 5410f37eb..75234a040 100644 --- a/externals/CMakeLists.txt +++ b/externals/CMakeLists.txt @@ -182,4 +182,5 @@ add_subdirectory(tracy) # pugixml if (NOT TARGET pugixml::pugixml) add_subdirectory(pugixml) -endif() \ No newline at end of file +endif() + diff --git a/externals/discord-rpc b/externals/discord-rpc new file mode 160000 index 000000000..963aa9f3e --- /dev/null +++ b/externals/discord-rpc @@ -0,0 +1 @@ +Subproject commit 963aa9f3e5ce81a4682c6ca3d136cddda614db33 diff --git a/src/common/discord.cpp b/src/common/discord.cpp index cce799a32..5233cdefe 100644 --- a/src/common/discord.cpp +++ b/src/common/discord.cpp @@ -4,30 +4,43 @@ #include #include #include "common/discord.h" - +#include "logging/log.h" +#include "common/debug.h" namespace Discord { void RPC::init() { DiscordEventHandlers handlers{}; - Discord_Initialize("1139939140494971051", &handlers, 1, nullptr); - + std::string discordAppId = "1290207945476280360"; + Discord_Initialize(discordAppId.c_str(), &handlers, 1, nullptr); + LOG_INFO(Loader, "Discord RPC Initalized with App Id: {}", discordAppId); startTimestamp = time(nullptr); enabled = true; } -void RPC::update(Discord::RPCStatus status, const std::string& game) { +void RPC::updatePlaying(const std::string& game, const std::string& game_id) { DiscordRichPresence rpc{}; - if (status == Discord::RPCStatus::Playing) { - rpc.details = "Playing a game"; - rpc.state = game.c_str(); - } else { - rpc.details = "Idle"; - } + rpc.details = "Playing a game"; + rpc.state = game.c_str(); + std::string largeImageUrl = + "https://store.playstation.com/store/api/chihiro/00_09_000/titlecontainer/US/en/999/" + + game_id + "_00/image"; + rpc.largeImageKey = largeImageUrl.c_str(); + rpc.largeImageText = game.c_str(); + rpc.startTimestamp = startTimestamp; + LOG_INFO(Loader, "Found game. Name: {}, Id: {}", game.c_str(), game_id.c_str()); + + Discord_UpdatePresence(&rpc); +} + +void RPC::updateIdle() { + + DiscordRichPresence rpc{}; rpc.largeImageKey = "shadps4"; rpc.largeImageText = "ShadPS4 is a PS4 emulator"; rpc.startTimestamp = startTimestamp; + rpc.details = "Idle"; Discord_UpdatePresence(&rpc); } diff --git a/src/common/discord.h b/src/common/discord.h index 54aa6c17c..914a80db6 100644 --- a/src/common/discord.h +++ b/src/common/discord.h @@ -20,7 +20,8 @@ class RPC { public: void init(); - void update(RPCStatus status, const std::string& title); + void updatePlaying(const std::string& title, const std::string& game_id); + void updateIdle(); void stop(); }; diff --git a/src/emulator.cpp b/src/emulator.cpp index b27c73867..7beea266d 100644 --- a/src/emulator.cpp +++ b/src/emulator.cpp @@ -34,6 +34,7 @@ #include "core/memory.h" #include "emulator.h" #include "video_core/renderdoc.h" +#include "common/discord.h" Frontend::WindowSDL* g_window = nullptr; @@ -210,6 +211,11 @@ void Emulator::Run(const std::filesystem::path& file) { } } + //Discord RPC + Discord::RPC rpc; + /*rpc.init();*/ + rpc.updatePlaying(game_info.title, id); + // start execution std::jthread mainthread = std::jthread([this](std::stop_token stop_token) { linker->Execute(); }); diff --git a/src/main.cpp b/src/main.cpp index de1d92326..8af0e1b4e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -34,6 +34,6 @@ int main(int argc, char* argv[]) { Core::Emulator emulator; emulator.Run(argv[1]); - + return 0; } diff --git a/src/qt_gui/main.cpp b/src/qt_gui/main.cpp index 8c565a19b..4e44b771f 100644 --- a/src/qt_gui/main.cpp +++ b/src/qt_gui/main.cpp @@ -7,6 +7,7 @@ #include "emulator.h" #include "game_install_dialog.h" #include "main_window.h" +#include "common/discord.h" #ifdef _WIN32 #include @@ -55,6 +56,11 @@ int main(int argc, char* argv[]) { emulator.Run(argv[1]); } + //Initialize Discord RPC + Discord::RPC rpc; + rpc.init(); + rpc.updateIdle(); + // Run the Qt application return a.exec(); } diff --git a/src/sdl_window.cpp b/src/sdl_window.cpp index bd2cc39d2..dd7403ed9 100644 --- a/src/sdl_window.cpp +++ b/src/sdl_window.cpp @@ -13,6 +13,7 @@ #include "input/controller.h" #include "sdl_window.h" #include "video_core/renderdoc.h" +#include "common/discord.h" #ifdef __APPLE__ #include @@ -73,7 +74,7 @@ WindowSDL::WindowSDL(s32 width_, s32 height_, Input::GameController* controller_ } WindowSDL::~WindowSDL() = default; - +Discord::RPC rpc; void WindowSDL::waitEvent() { // Called on main thread SDL_Event event; @@ -112,6 +113,8 @@ void WindowSDL::waitEvent() { onGamepadEvent(&event); break; case SDL_EVENT_QUIT: + rpc.init(); + rpc.updateIdle(); is_open = false; break; default: