From 0271889b2e4ffe2a6e841d87f42f215397dd5a6c Mon Sep 17 00:00:00 2001 From: Chris Marsh Date: Thu, 3 Aug 2017 10:47:27 -0700 Subject: [PATCH] Allow for disconnect/reconnect. --- examples/send-presence/send-presence.c | 35 +++++++++++++++++++------- src/discord-rpc.cpp | 8 ++++++ src/rpc_connection.cpp | 1 + 3 files changed, 35 insertions(+), 9 deletions(-) diff --git a/examples/send-presence/send-presence.c b/examples/send-presence/send-presence.c index d49728d..9fa3a70 100644 --- a/examples/send-presence/send-presence.c +++ b/examples/send-presence/send-presence.c @@ -75,6 +75,18 @@ static int prompt(char* line, size_t size) return res; } +static void discordInit() +{ + DiscordEventHandlers handlers; + memset(&handlers, 0, sizeof(handlers)); + handlers.ready = handleDiscordReady; + handlers.disconnected = handleDiscordDisconnected; + handlers.errored = handleDiscordError; + handlers.joinGame = handleDiscordJoin; + handlers.spectateGame = handleDiscordSpectate; + Discord_Initialize(APPLICATION_ID, &handlers, 1); +} + static void gameLoop() { char line[512]; @@ -88,6 +100,19 @@ static void gameLoop() if (line[0] == 'q') { break; } + + if (line[0] == 't') { + printf("Shutting off Discord.\n"); + Discord_Shutdown(); + continue; + } + + if (line[0] == 'y') { + printf("Reinit Discord.\n"); + discordInit(); + continue; + } + if (time(NULL) & 1) { printf("I don't understand that.\n"); } @@ -113,15 +138,7 @@ static void gameLoop() int main(int argc, char* argv[]) { - DiscordEventHandlers handlers; - memset(&handlers, 0, sizeof(handlers)); - handlers.ready = handleDiscordReady; - handlers.disconnected = handleDiscordDisconnected; - handlers.errored = handleDiscordError; - handlers.joinGame = handleDiscordJoin; - handlers.spectateGame = handleDiscordSpectate; - - Discord_Initialize(APPLICATION_ID, &handlers, 1); + discordInit(); gameLoop(); diff --git a/src/discord-rpc.cpp b/src/discord-rpc.cpp index ed1c975..2ad7442 100644 --- a/src/discord-rpc.cpp +++ b/src/discord-rpc.cpp @@ -223,6 +223,10 @@ extern "C" void Discord_Initialize(const char* applicationId, Handlers = {}; } + if (Connection) { + return; + } + Connection = RpcConnection::Create(applicationId); Connection->onConnect = []() { WasJustConnected.exchange(true); @@ -244,12 +248,16 @@ extern "C" void Discord_Initialize(const char* applicationId, }; #ifndef DISCORD_DISABLE_IO_THREAD + KeepRunning.store(true); IoThread = std::thread(DiscordRpcIo); #endif } extern "C" void Discord_Shutdown() { + if (!Connection) { + return; + } Connection->onConnect = nullptr; Connection->onDisconnect = nullptr; Handlers = {}; diff --git a/src/rpc_connection.cpp b/src/rpc_connection.cpp index 46d8da3..e1e9328 100644 --- a/src/rpc_connection.cpp +++ b/src/rpc_connection.cpp @@ -17,6 +17,7 @@ static RpcConnection Instance; { c->Close(); BaseConnection::Destroy(c->connection); + c = nullptr; } void RpcConnection::Open()