More nice touches to DiscordRPC

This commit is contained in:
SimoneN64
2024-08-27 22:31:55 +02:00
parent 86bfeec8bd
commit 5f7a2fa65f
7 changed files with 83 additions and 46 deletions

View File

@@ -5,42 +5,72 @@
#include <string>
namespace Util {
enum State {
Idling,
Playing,
MovieReplay,
Paused,
};
struct RPC {
enum State {
Idling,
Playing,
MovieReplay,
Paused,
};
FORCE_INLINE void UpdateRPC(State state, const std::string &game = "", const std::string &movieName = "") {
DiscordRichPresence presence{};
std::string textState, textDetails;
switch (state) {
case Idling:
textDetails = "Idling";
break;
case Playing:
textDetails = "In-game";
textState = "Playing \"" + game + "\"";
break;
case MovieReplay:
textDetails = "In-game";
textState = "Replaying movie \"" + movieName + "\" in \"" + game + "\"";
break;
case Paused:
textDetails = "In-game";
textState = "Playing \"" + game + "\" (Paused)";
break;
RPC() {
Discord_Initialize("1049669178124148806", &handlers, 1, nullptr);
startTimestamp = time(nullptr);
}
presence.details = textDetails.c_str();
presence.state = textState.c_str();
presence.startTimestamp = time(nullptr);
presence.largeImageText = "Kaizen";
presence.largeImageKey = "logo";
Discord_UpdatePresence(&presence);
}
static RPC &GetInstance() {
static RPC instance;
return instance;
}
FORCE_INLINE void ClearRPC() { Discord_ClearPresence(); }
[[nodiscard]] FORCE_INLINE const State &GetState() const { return currentState; }
FORCE_INLINE void Update(State state, const std::string &game = "", const std::string &movieName = "") {
DiscordRichPresence presence{};
std::string textState, textDetails;
currentState = state == Paused ? currentState : state;
switch (state) {
case Idling:
textDetails = "Idling";
break;
case Playing:
textDetails = "In-game";
textState = "Playing \"" + game + "\"";
break;
case MovieReplay:
textDetails = "In-game";
textState = "Replaying movie \"" + movieName + "\" in \"" + game + "\"";
break;
case Paused:
switch (currentState) {
case Playing:
textDetails = "In-game";
textState = "Playing \"" + game + "\"";
break;
case MovieReplay:
textDetails = "In-game";
textState = "Replaying movie \"" + movieName + "\" in \"" + game + "\"";
break;
default:;
}
textState += " (Paused)";
break;
}
presence.details = textDetails.c_str();
presence.state = textState.c_str();
presence.startTimestamp = startTimestamp;
presence.largeImageText = "Kaizen";
presence.largeImageKey = "logo";
Discord_UpdatePresence(&presence);
}
FORCE_INLINE void Clear() { Discord_ClearPresence(); }
private:
DiscordEventHandlers handlers{};
s64 startTimestamp{};
State currentState;
};
} // namespace Util