diff --git a/include/discord_rpc.h b/include/discord_rpc.h index 72e5a4f..78797c8 100644 --- a/include/discord_rpc.h +++ b/include/discord_rpc.h @@ -49,7 +49,7 @@ typedef struct DiscordJoinRequest { } DiscordJoinRequest; typedef struct DiscordEventHandlers { - void (*ready)(void); + void (*ready)(const DiscordJoinRequest* request); void (*disconnected)(int errorCode, const char* message); void (*errored)(int errorCode, const char* message); void (*joinGame)(const char* joinSecret); diff --git a/src/discord_rpc.cpp b/src/discord_rpc.cpp index 635bba7..f16b910 100644 --- a/src/discord_rpc.cpp +++ b/src/discord_rpc.cpp @@ -64,6 +64,7 @@ static std::mutex HandlerMutex; static QueuedMessage QueuedPresence{}; static MsgQueue SendQueue; static MsgQueue JoinAskQueue; +static JoinRequest connectedUser; // We want to auto connect, and retry on failure, but not as fast as possible. This does expoential // backoff from 0.5 seconds to 1 minute @@ -207,6 +208,27 @@ static void Discord_UpdateConnection(void) JoinAskQueue.CommitAdd(); } } + + else if (strcmp(evtName, "READY") == 0) { + auto user = GetObjMember(data, "user"); + auto userId = GetStrMember(user, "id"); + auto username = GetStrMember(user, "username"); + auto avatar = GetStrMember(user, "avatar"); + if (userId && username) { + StringCopy(connectedUser.userId, userId); + StringCopy(connectedUser.username, username); + auto discriminator = GetStrMember(user, "discriminator"); + if (discriminator) { + StringCopy(connectedUser.discriminator, discriminator); + } + if (avatar) { + StringCopy(connectedUser.avatar, avatar); + } + else { + connectedUser.avatar[0] = 0; + } + } + } } } @@ -327,7 +349,7 @@ extern "C" DISCORD_EXPORT void Discord_UpdatePresence(const DiscordRichPresence* { std::lock_guard guard(PresenceMutex); QueuedPresence.length = JsonWriteRichPresenceObj( - QueuedPresence.buffer, sizeof(QueuedPresence.buffer), Nonce++, Pid, presence); + QueuedPresence.buffer, sizeof(QueuedPresence.buffer), Nonce++, Pid, presence); } SignalIOActivity(); } @@ -376,7 +398,11 @@ extern "C" DISCORD_EXPORT void Discord_RunCallbacks(void) if (WasJustConnected.exchange(false)) { std::lock_guard guard(HandlerMutex); if (Handlers.ready) { - Handlers.ready(); + DiscordJoinRequest djr{connectedUser.userId, + connectedUser.username, + connectedUser.discriminator, + connectedUser.avatar}; + Handlers.ready(&djr); } } @@ -430,14 +456,13 @@ extern "C" DISCORD_EXPORT void Discord_RunCallbacks(void) extern "C" DISCORD_EXPORT void Discord_UpdateHandlers(DiscordEventHandlers* newHandlers) { if (newHandlers) { - -#define HANDLE_EVENT_REGISTRATION(handler_name, event) \ - if (!Handlers.handler_name && newHandlers->handler_name) { \ - RegisterForEvent(event); \ - } \ - else if (Handlers.handler_name && !newHandlers->handler_name) { \ - DeregisterForEvent(event); \ - } +#define HANDLE_EVENT_REGISTRATION(handler_name, event) \ + if (!Handlers.handler_name && newHandlers->handler_name) { \ + RegisterForEvent(event); \ + } \ + else if (Handlers.handler_name && !newHandlers->handler_name) { \ + DeregisterForEvent(event); \ + } std::lock_guard guard(HandlerMutex); HANDLE_EVENT_REGISTRATION(joinGame, "ACTIVITY_JOIN") @@ -448,8 +473,7 @@ extern "C" DISCORD_EXPORT void Discord_UpdateHandlers(DiscordEventHandlers* newH Handlers = *newHandlers; } - else - { + else { std::lock_guard guard(HandlerMutex); Handlers = {}; }