diff --git a/src/connection_unix.cpp b/src/connection_unix.cpp index 6fe359e..85dace3 100644 --- a/src/connection_unix.cpp +++ b/src/connection_unix.cpp @@ -118,5 +118,8 @@ bool BaseConnection::Read(void* data, size_t length) } Close(); } + else if (res == 0) { + Close(); + } return res == (int)length; } diff --git a/src/discord_rpc.cpp b/src/discord_rpc.cpp index 2e44c93..0392453 100644 --- a/src/discord_rpc.cpp +++ b/src/discord_rpc.cpp @@ -54,6 +54,7 @@ static std::atomic_bool WasJustDisconnected{false}; static std::atomic_bool GotErrorMessage{false}; static std::atomic_bool WasJoinGame{false}; static std::atomic_bool WasSpectateGame{false}; +static std::atomic_bool UpdatePresence{false}; static char JoinGameSecret[256]; static char SpectateGameSecret[256]; static int LastErrorCode{0}; @@ -214,17 +215,17 @@ static void Discord_UpdateConnection(void) } // writes - if (QueuedPresence.length) { + if (UpdatePresence.exchange(false) && QueuedPresence.length) { QueuedMessage local; { std::lock_guard guard(PresenceMutex); local.Copy(QueuedPresence); - QueuedPresence.length = 0; } if (!Connection->Write(local.buffer, local.length)) { // if we fail to send, requeue std::lock_guard guard(PresenceMutex); QueuedPresence.Copy(local); + UpdatePresence.exchange(true); } } @@ -310,6 +311,10 @@ extern "C" DISCORD_EXPORT void Discord_Initialize(const char* applicationId, Connection = RpcConnection::Create(applicationId); Connection->onConnect = [](JsonDocument& readyMessage) { Discord_UpdateHandlers(&QueuedHandlers); + if (QueuedPresence.length > 0) { + UpdatePresence.exchange(true); + SignalIOActivity(); + } auto data = GetObjMember(&readyMessage, "data"); auto user = GetObjMember(data, "user"); auto userId = GetStrMember(user, "id"); @@ -335,10 +340,6 @@ extern "C" DISCORD_EXPORT void Discord_Initialize(const char* applicationId, Connection->onDisconnect = [](int err, const char* message) { LastDisconnectErrorCode = err; StringCopy(LastDisconnectErrorMessage, message); - { - std::lock_guard guard(HandlerMutex); - Handlers = {}; - } WasJustDisconnected.exchange(true); UpdateReconnectTime(); }; @@ -354,6 +355,8 @@ extern "C" DISCORD_EXPORT void Discord_Shutdown(void) Connection->onConnect = nullptr; Connection->onDisconnect = nullptr; Handlers = {}; + QueuedPresence.length = 0; + UpdatePresence.exchange(false); if (IoThread != nullptr) { IoThread->Stop(); delete IoThread; @@ -369,6 +372,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); + UpdatePresence.exchange(true); } SignalIOActivity(); }