From 64027b336ff53aa7309832da45cdf43ed12fb9e4 Mon Sep 17 00:00:00 2001 From: Mason Sciotti Date: Mon, 16 Apr 2018 10:25:44 -0700 Subject: [PATCH] Adding user object to READY event (#159) * Pass the READY event data down in onConnect * Changes made for UE4 and Unity wrappers * Changing object name from joinRequest to DiscordUser --- .../Assets/DiscordController.cs | 10 +-- examples/button-clicker/Assets/DiscordRpc.cs | 6 +- examples/send-presence/send-presence.c | 19 +++--- .../unrealstatus/Content/ShowTheUILevel.umap | Bin 803361 -> 806708 bytes .../Private/DiscordRpcBlueprint.cpp | 43 ++++++++----- .../DiscordRpc/Public/DiscordRpcBlueprint.h | 6 +- include/discord_rpc.h | 8 +-- src/discord_rpc.cpp | 57 ++++++++++++------ src/rpc_connection.cpp | 2 +- src/rpc_connection.h | 2 +- 10 files changed, 97 insertions(+), 56 deletions(-) diff --git a/examples/button-clicker/Assets/DiscordController.cs b/examples/button-clicker/Assets/DiscordController.cs index 3294767..182d31d 100644 --- a/examples/button-clicker/Assets/DiscordController.cs +++ b/examples/button-clicker/Assets/DiscordController.cs @@ -7,7 +7,7 @@ public class DiscordJoinEvent : UnityEngine.Events.UnityEvent { } public class DiscordSpectateEvent : UnityEngine.Events.UnityEvent { } [System.Serializable] -public class DiscordJoinRequestEvent : UnityEngine.Events.UnityEvent { } +public class DiscordJoinRequestEvent : UnityEngine.Events.UnityEvent { } public class DiscordController : MonoBehaviour { @@ -16,7 +16,7 @@ public class DiscordController : MonoBehaviour public string optionalSteamId; public int callbackCalls; public int clickCounter; - public DiscordRpc.JoinRequest joinRequest; + public DiscordRpc.DiscordUser joinRequest; public UnityEngine.Events.UnityEvent onConnect; public UnityEngine.Events.UnityEvent onDisconnect; public UnityEngine.Events.UnityEvent hasResponded; @@ -50,10 +50,10 @@ public class DiscordController : MonoBehaviour hasResponded.Invoke(); } - public void ReadyCallback() + public void ReadyCallback(ref DiscordRpc.DiscordUser connectedUser) { ++callbackCalls; - Debug.Log("Discord: ready"); + Debug.Log(string.Format("Discord: connected to {0}#{1}: {2}", connectedUser.username, connectedUser.discriminator, connectedUser.userId)); onConnect.Invoke(); } @@ -84,7 +84,7 @@ public class DiscordController : MonoBehaviour onSpectate.Invoke(secret); } - public void RequestCallback(ref DiscordRpc.JoinRequest request) + public void RequestCallback(ref DiscordRpc.DiscordUser request) { ++callbackCalls; Debug.Log(string.Format("Discord: join request {0}#{1}: {2}", request.username, request.discriminator, request.userId)); diff --git a/examples/button-clicker/Assets/DiscordRpc.cs b/examples/button-clicker/Assets/DiscordRpc.cs index b3f6ffd..dec1ade 100644 --- a/examples/button-clicker/Assets/DiscordRpc.cs +++ b/examples/button-clicker/Assets/DiscordRpc.cs @@ -6,7 +6,7 @@ using System.Text; public class DiscordRpc { [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - public delegate void ReadyCallback(); + public delegate void ReadyCallback(ref DiscordUser connectedUser); [UnmanagedFunctionPointer(CallingConvention.Cdecl)] public delegate void DisconnectedCallback(int errorCode, string message); @@ -21,7 +21,7 @@ public class DiscordRpc public delegate void SpectateCallback(string secret); [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - public delegate void RequestCallback(ref JoinRequest request); + public delegate void RequestCallback(ref DiscordUser request); public struct EventHandlers { @@ -54,7 +54,7 @@ public class DiscordRpc } [Serializable] - public struct JoinRequest + public struct DiscordUser { public string userId; public string username; diff --git a/examples/send-presence/send-presence.c b/examples/send-presence/send-presence.c index e4356e9..5449cf8 100644 --- a/examples/send-presence/send-presence.c +++ b/examples/send-presence/send-presence.c @@ -52,14 +52,18 @@ static void updateDiscordPresence() discordPresence.spectateSecret = "look"; discordPresence.instance = 0; Discord_UpdatePresence(&discordPresence); - } else { + } + else { Discord_ClearPresence(); } } -static void handleDiscordReady(void) +static void handleDiscordReady(const DiscordUser* connectedUser) { - printf("\nDiscord: ready\n"); + printf("\nDiscord: connected to user %s#%s - %s\n", + connectedUser->username, + connectedUser->discriminator, + connectedUser->userId); } static void handleDiscordDisconnected(int errcode, const char* message) @@ -82,13 +86,13 @@ static void handleDiscordSpectate(const char* secret) printf("\nDiscord: spectate (%s)\n", secret); } -static void handleDiscordJoinRequest(const DiscordJoinRequest* request) +static void handleDiscordJoinRequest(const DiscordUser* request) { int response = -1; char yn[4]; - printf("\nDiscord: join request from %s - %s - %s\n", + printf("\nDiscord: join request from %s#%s - %s\n", request->username, - request->avatar, + request->discriminator, request->userId); do { printf("Accept? (y/n)"); @@ -152,7 +156,8 @@ static void gameLoop() if (SendPresence) { printf("Clearing presence information.\n"); SendPresence = 0; - } else { + } + else { printf("Restoring presence information.\n"); SendPresence = 1; } diff --git a/examples/unrealstatus/Content/ShowTheUILevel.umap b/examples/unrealstatus/Content/ShowTheUILevel.umap index 8da46512b4b02a9cdbdca673b11bbc7a519522a3..bc0e5b7c48b63147cfe9504cc3781c0afdb048f6 100644 GIT binary patch delta 76192 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 delta 78547 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 diff --git a/examples/unrealstatus/Plugins/discordrpc/Source/DiscordRpc/Private/DiscordRpcBlueprint.cpp b/examples/unrealstatus/Plugins/discordrpc/Source/DiscordRpc/Private/DiscordRpcBlueprint.cpp index db0f096..95388df 100644 --- a/examples/unrealstatus/Plugins/discordrpc/Source/DiscordRpc/Private/DiscordRpcBlueprint.cpp +++ b/examples/unrealstatus/Plugins/discordrpc/Source/DiscordRpc/Private/DiscordRpcBlueprint.cpp @@ -6,12 +6,22 @@ DEFINE_LOG_CATEGORY(Discord) static UDiscordRpc* self = nullptr; -static void ReadyHandler() +static void ReadyHandler(const DiscordUser* connectedUser) { - UE_LOG(Discord, Log, TEXT("Discord connected")); + FDiscordUserData ud; + ud.userId = ANSI_TO_TCHAR(connectedUser->userId); + ud.username = ANSI_TO_TCHAR(connectedUser->username); + ud.discriminator = ANSI_TO_TCHAR(connectedUser->discriminator); + ud.avatar = ANSI_TO_TCHAR(connectedUser->avatar); + UE_LOG(Discord, + Log, + TEXT("Discord connected to %s - %s#%s"), + *ud.userId, + *ud.username, + *ud.discriminator); if (self) { self->IsConnected = true; - self->OnConnected.Broadcast(); + self->OnConnected.Broadcast(ud); } } @@ -52,22 +62,27 @@ static void SpectateGameHandler(const char* spectateSecret) } } -static void JoinRequestHandler(const DiscordJoinRequest* request) +static void JoinRequestHandler(const DiscordUser* request) { - FDiscordJoinRequestData jr; - jr.userId = ANSI_TO_TCHAR(request->userId); - jr.username = ANSI_TO_TCHAR(request->username); - jr.discriminator = ANSI_TO_TCHAR(request->discriminator); - jr.avatar = ANSI_TO_TCHAR(request->avatar); - UE_LOG(Discord, Log, TEXT("Discord join request from %s - %s#%s"), *jr.userId, *jr.username, *jr.discriminator); + FDiscordUserData ud; + ud.userId = ANSI_TO_TCHAR(request->userId); + ud.username = ANSI_TO_TCHAR(request->username); + ud.discriminator = ANSI_TO_TCHAR(request->discriminator); + ud.avatar = ANSI_TO_TCHAR(request->avatar); + UE_LOG(Discord, + Log, + TEXT("Discord join request from %s - %s#%s"), + *ud.userId, + *ud.username, + *ud.discriminator); if (self) { - self->OnJoinRequest.Broadcast(jr); + self->OnJoinRequest.Broadcast(ud); } } void UDiscordRpc::Initialize(const FString& applicationId, - bool autoRegister, - const FString& optionalSteamId) + bool autoRegister, + const FString& optionalSteamId) { self = this; IsConnected = false; @@ -87,7 +102,7 @@ void UDiscordRpc::Initialize(const FString& applicationId, auto appId = StringCast(*applicationId); auto steamId = StringCast(*optionalSteamId); Discord_Initialize( - (const char*)appId.Get(), &handlers, autoRegister, (const char*)steamId.Get()); + (const char*)appId.Get(), &handlers, autoRegister, (const char*)steamId.Get()); } void UDiscordRpc::Shutdown() diff --git a/examples/unrealstatus/Plugins/discordrpc/Source/DiscordRpc/Public/DiscordRpcBlueprint.h b/examples/unrealstatus/Plugins/discordrpc/Source/DiscordRpc/Public/DiscordRpcBlueprint.h index 9e71302..2d65211 100644 --- a/examples/unrealstatus/Plugins/discordrpc/Source/DiscordRpc/Public/DiscordRpcBlueprint.h +++ b/examples/unrealstatus/Plugins/discordrpc/Source/DiscordRpc/Public/DiscordRpcBlueprint.h @@ -11,7 +11,7 @@ * Ask to join callback data */ USTRUCT(BlueprintType) -struct FDiscordJoinRequestData { +struct FDiscordUserData { GENERATED_USTRUCT_BODY() UPROPERTY(BlueprintReadOnly) @@ -27,12 +27,12 @@ struct FDiscordJoinRequestData { DECLARE_LOG_CATEGORY_EXTERN(Discord, Log, All); -DECLARE_DYNAMIC_MULTICAST_DELEGATE(FDiscordConnected); +DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FDiscordConnected, const FDiscordUserData&, joinRequest); DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FDiscordDisconnected, int, errorCode, const FString&, errorMessage); DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FDiscordErrored, int, errorCode, const FString&, errorMessage); DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FDiscordJoin, const FString&, joinSecret); DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FDiscordSpectate, const FString&, spectateSecret); -DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FDiscordJoinRequest, const FDiscordJoinRequestData&, joinRequest); +DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FDiscordJoinRequest, const FDiscordUserData&, joinRequest); // clang-format on diff --git a/include/discord_rpc.h b/include/discord_rpc.h index 72e5a4f..3e1441e 100644 --- a/include/discord_rpc.h +++ b/include/discord_rpc.h @@ -41,20 +41,20 @@ typedef struct DiscordRichPresence { int8_t instance; } DiscordRichPresence; -typedef struct DiscordJoinRequest { +typedef struct DiscordUser { const char* userId; const char* username; const char* discriminator; const char* avatar; -} DiscordJoinRequest; +} DiscordUser; typedef struct DiscordEventHandlers { - void (*ready)(void); + void (*ready)(const DiscordUser* request); 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); + void (*joinRequest)(const DiscordUser* request); } DiscordEventHandlers; #define DISCORD_REPLY_NO 0 diff --git a/src/discord_rpc.cpp b/src/discord_rpc.cpp index 3dd3a74..63ad405 100644 --- a/src/discord_rpc.cpp +++ b/src/discord_rpc.cpp @@ -32,7 +32,7 @@ struct QueuedMessage { } }; -struct JoinRequest { +struct User { // snowflake (64bit int), turned into a ascii decimal string, at most 20 chars +1 null // terminator = 21 char userId[32]; @@ -64,7 +64,8 @@ static std::mutex PresenceMutex; static std::mutex HandlerMutex; static QueuedMessage QueuedPresence{}; static MsgQueue SendQueue; -static MsgQueue JoinAskQueue; +static MsgQueue JoinAskQueue; +static User 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 @@ -292,7 +293,6 @@ extern "C" DISCORD_EXPORT void Discord_Initialize(const char* applicationId, } Handlers = {}; - } if (Connection) { @@ -300,8 +300,27 @@ extern "C" DISCORD_EXPORT void Discord_Initialize(const char* applicationId, } Connection = RpcConnection::Create(applicationId); - Connection->onConnect = []() { + Connection->onConnect = [](JsonDocument& readyMessage) { Discord_UpdateHandlers(&QueuedHandlers); + auto data = GetObjMember(&readyMessage, "data"); + 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; + } + } WasJustConnected.exchange(true); ReconnectTimeMs.reset(); }; @@ -336,7 +355,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(); } @@ -385,7 +404,11 @@ extern "C" DISCORD_EXPORT void Discord_RunCallbacks(void) if (WasJustConnected.exchange(false)) { std::lock_guard guard(HandlerMutex); if (Handlers.ready) { - Handlers.ready(); + DiscordUser du{connectedUser.userId, + connectedUser.username, + connectedUser.discriminator, + connectedUser.avatar}; + Handlers.ready(&du); } } @@ -420,8 +443,8 @@ extern "C" DISCORD_EXPORT void Discord_RunCallbacks(void) { std::lock_guard guard(HandlerMutex); if (Handlers.joinRequest) { - DiscordJoinRequest djr{req->userId, req->username, req->discriminator, req->avatar}; - Handlers.joinRequest(&djr); + DiscordUser du{req->userId, req->username, req->discriminator, req->avatar}; + Handlers.joinRequest(&du); } } JoinAskQueue.CommitSend(); @@ -439,14 +462,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") @@ -457,8 +479,7 @@ extern "C" DISCORD_EXPORT void Discord_UpdateHandlers(DiscordEventHandlers* newH Handlers = *newHandlers; } - else - { + else { std::lock_guard guard(HandlerMutex); Handlers = {}; } diff --git a/src/rpc_connection.cpp b/src/rpc_connection.cpp index b492de9..bf9e4cc 100644 --- a/src/rpc_connection.cpp +++ b/src/rpc_connection.cpp @@ -42,7 +42,7 @@ void RpcConnection::Open() if (cmd && evt && !strcmp(cmd, "DISPATCH") && !strcmp(evt, "READY")) { state = State::Connected; if (onConnect) { - onConnect(); + onConnect(message); } } } diff --git a/src/rpc_connection.h b/src/rpc_connection.h index d3c30d6..bbdd05c 100644 --- a/src/rpc_connection.h +++ b/src/rpc_connection.h @@ -40,7 +40,7 @@ struct RpcConnection { BaseConnection* connection{nullptr}; State state{State::Disconnected}; - void (*onConnect)(){nullptr}; + void (*onConnect)(JsonDocument& message){nullptr}; void (*onDisconnect)(int errorCode, const char* message){nullptr}; char appId[64]{}; int lastErrorCode{0};