Skip to content

Commit

Permalink
Discord Rich Presence Integration (Thanks to @Megamouse for fixing th…
Browse files Browse the repository at this point in the history
…e windows build)
  • Loading branch information
hcorion committed Apr 7, 2018
1 parent c77b310 commit a05beb6
Show file tree
Hide file tree
Showing 9 changed files with 295 additions and 133 deletions.
26 changes: 26 additions & 0 deletions 3rdparty/discord-rpc/include/discord_register.h
@@ -0,0 +1,26 @@
#pragma once

#if defined(DISCORD_DYNAMIC_LIB)
# if defined(_WIN32)
# if defined(DISCORD_BUILDING_SDK)
# define DISCORD_EXPORT __declspec(dllexport)
# else
# define DISCORD_EXPORT __declspec(dllimport)
# endif
# else
# define DISCORD_EXPORT __attribute__((visibility("default")))
# endif
#else
# define DISCORD_EXPORT
#endif

#ifdef __cplusplus
extern "C" {
#endif

DISCORD_EXPORT void Discord_Register(const char* applicationId, const char* command);
DISCORD_EXPORT void Discord_RegisterSteamGame(const char* applicationId, const char* steamId);

#ifdef __cplusplus
}
#endif
87 changes: 87 additions & 0 deletions 3rdparty/discord-rpc/include/discord_rpc.h
@@ -0,0 +1,87 @@
#pragma once
#include <stdint.h>

// clang-format off

#if defined(DISCORD_DYNAMIC_LIB)
# if defined(_WIN32)
# if defined(DISCORD_BUILDING_SDK)
# define DISCORD_EXPORT __declspec(dllexport)
# else
# define DISCORD_EXPORT __declspec(dllimport)
# endif
# else
# define DISCORD_EXPORT __attribute__((visibility("default")))
# endif
#else
# define DISCORD_EXPORT
#endif

// clang-format on

#ifdef __cplusplus
extern "C" {
#endif

typedef struct DiscordRichPresence {
const char* state; /* max 128 bytes */
const char* details; /* max 128 bytes */
int64_t startTimestamp;
int64_t endTimestamp;
const char* largeImageKey; /* max 32 bytes */
const char* largeImageText; /* max 128 bytes */
const char* smallImageKey; /* max 32 bytes */
const char* smallImageText; /* max 128 bytes */
const char* partyId; /* max 128 bytes */
int partySize;
int partyMax;
const char* matchSecret; /* max 128 bytes */
const char* joinSecret; /* max 128 bytes */
const char* spectateSecret; /* max 128 bytes */
int8_t instance;
} DiscordRichPresence;

typedef struct DiscordJoinRequest {
const char* userId;
const char* username;
const char* discriminator;
const char* avatar;
} DiscordJoinRequest;

typedef struct DiscordEventHandlers {
void (*ready)(void);
void (*disconnected)(int errorCode, const char* message);
void (*errored)(int errorCode, const char* message);
void (*joinGame)(const char* joinSecret);
void (*spectateGame)(const char* spectateSecret);
void (*joinRequest)(const DiscordJoinRequest* request);
} DiscordEventHandlers;

#define DISCORD_REPLY_NO 0
#define DISCORD_REPLY_YES 1
#define DISCORD_REPLY_IGNORE 2

DISCORD_EXPORT void Discord_Initialize(const char* applicationId,
DiscordEventHandlers* handlers,
int autoRegister,
const char* optionalSteamId);
DISCORD_EXPORT void Discord_Shutdown(void);

/* checks for incoming messages, dispatches callbacks */
DISCORD_EXPORT void Discord_RunCallbacks(void);

/* If you disable the lib starting its own io thread, you'll need to call this from your own */
#ifdef DISCORD_DISABLE_IO_THREAD
DISCORD_EXPORT void Discord_UpdateConnection(void);
#endif

DISCORD_EXPORT void Discord_UpdatePresence(const DiscordRichPresence* presence);
DISCORD_EXPORT void Discord_ClearPresence(void);

DISCORD_EXPORT void Discord_Respond(const char* userid, /* DISCORD_REPLY_ */ int reply);

DISCORD_EXPORT void Discord_UpdateHandlers(DiscordEventHandlers* handlers);

#ifdef __cplusplus
} /* extern "C" */
#endif
Binary file added 3rdparty/discord-rpc/lib/discord-rpc.lib
Binary file not shown.
Binary file added 3rdparty/discord-rpc/lib/libdiscord-rpc-linux.a
Binary file not shown.
Binary file added 3rdparty/discord-rpc/lib/libdiscord-rpc-mac.a
Binary file not shown.
14 changes: 14 additions & 0 deletions rpcs3/CMakeLists.txt
Expand Up @@ -84,10 +84,15 @@ include(ConfigureCompiler)
if(WIN32)
add_definitions(-DUNICODE)
add_definitions(-D_WIN32_WINNT=0x0601)
add_definitions(-DWITH_DISCORD_RPC)
set(RES_FILES "rpcs3.rc")
else()
add_definitions(-DGL_GLEXT_PROTOTYPES)
add_definitions(-DGLX_GLXEXT_PROTOTYPES)
if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux" OR APPLE)
# We don't want Discord Rich Presence on the BSDs and other OSes
add_definitions(-DWITH_DISCORD_RPC)
endif()
endif()

if(USE_NATIVE_INSTRUCTIONS)
Expand Down Expand Up @@ -294,6 +299,7 @@ ${LLVM_INCLUDE_DIRS}
"${RPCS3_SRC_DIR}/../3rdparty/stblib"
"${RPCS3_SRC_DIR}/../3rdparty/cereal/include"
"${RPCS3_SRC_DIR}/../3rdparty/Optional"
"${RPCS3_SRC_DIR}/../3rdparty/discord-rpc/include"
)

if(WIN32)
Expand Down Expand Up @@ -410,6 +416,8 @@ if(WIN32)
target_link_libraries(rpcs3 dxgi.lib d2d1.lib dwrite.lib)
endif()
target_link_libraries(rpcs3 avformat.lib avcodec.lib avutil.lib swscale.lib png16_static ${OPENAL_LIBRARY} ${ADDITIONAL_LIBS})
# Link Discord Rich Presence
target_link_libraries(rpcs3 "${RPCS3_SRC_DIR}/../3rdparty/discord-rpc/lib/discord-rpc.lib")
else()
target_link_libraries(rpcs3 ${OPENAL_LIBRARY} ${OPENGL_LIBRARIES})
if(APPLE)
Expand All @@ -434,6 +442,12 @@ else()
else()
target_link_libraries(rpcs3 png16_static)
endif()
# Link Discord Rich Presence, but only on Linux
if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
target_link_libraries(rpcs3 "${RPCS3_SRC_DIR}/../3rdparty/discord-rpc/lib/libdiscord-rpc-linux.a")
elseif(APPLE)
target_link_libraries(rpcs3 "${RPCS3_SRC_DIR}/../3rdparty/discord-rpc/lib/libdiscord-rpc-mac.a")
endif()
endif()

# For some reason GCC 7 requires manually linking with -latomic
Expand Down

0 comments on commit a05beb6

Please sign in to comment.