From 4f8c1e527ab9b5421f3ebb1c61ffe9a859df82e4 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Mon, 9 Jan 2017 01:03:17 +0300 Subject: - misprint in a json field name; - fix for parsing private channels; - fix for long gateway packets reading; - version bump --- protocols/Discord/src/dispatch.cpp | 20 ++++++++++---------- protocols/Discord/src/gateway.cpp | 23 +++++++++++++++++------ protocols/Discord/src/utils.cpp | 1 + protocols/Discord/src/version.h | 2 +- 4 files changed, 29 insertions(+), 17 deletions(-) (limited to 'protocols/Discord') diff --git a/protocols/Discord/src/dispatch.cpp b/protocols/Discord/src/dispatch.cpp index 0b7f96a33f..7f6365e085 100644 --- a/protocols/Discord/src/dispatch.cpp +++ b/protocols/Discord/src/dispatch.cpp @@ -148,16 +148,16 @@ void CDiscordProto::OnCommandReady(const JSONNode &pRoot) for (auto it = channels.begin(); it != channels.end(); ++it) { const JSONNode &p = *it; - const JSONNode &user = p["recipient"]; - if (!user) - continue; - - CDiscordUser *pUser = PrepareUser(user); - pUser->lastMessageId = _wtoi64(p["last_message_id"].as_mstring()); - pUser->channelId = _wtoi64(p["id"].as_mstring()); - pUser->bIsPrivate = true; - - setId(pUser->hContact, DB_KEY_CHANNELID, pUser->channelId); + const JSONNode &recipients = p["recipients"]; + for (auto it2 = recipients.begin(); it2 != recipients.end(); ++it2) { + const JSONNode &r = *it2; + CDiscordUser *pUser = PrepareUser(r); + pUser->lastMessageId = _wtoi64(r["last_message_id"].as_mstring()); + pUser->channelId = _wtoi64(p["id"].as_mstring()); + pUser->bIsPrivate = true; + + setId(pUser->hContact, DB_KEY_CHANNELID, pUser->channelId); + } } } diff --git a/protocols/Discord/src/gateway.cpp b/protocols/Discord/src/gateway.cpp index 43c923ff00..7454383878 100644 --- a/protocols/Discord/src/gateway.cpp +++ b/protocols/Discord/src/gateway.cpp @@ -206,25 +206,36 @@ void CDiscordProto::GatewayThreadWorker() // we have some additional data, not only opcode if (bufSize > headerSize) { - if (bIsFinal && dataBuf == NULL) { // it fits, no need to reallocate a buffer + if (bIsFinal && payloadSize < _countof(buf)) { // it fits, no need to reallocate a buffer bDataBufAllocated = false; dataBuf = (char*)buf + headerSize; dataBufSize = bufSize - headerSize; } else { bDataBufAllocated = true; - size_t newSize = dataBufSize + bufSize - headerSize; + size_t newSize = dataBufSize + payloadSize; + size_t currPacketSize = bufSize - headerSize; dataBuf = (char*)mir_realloc(dataBuf, newSize+1); - memcpy(dataBuf + dataBufSize, buf + headerSize, bufSize - headerSize); + memcpy(dataBuf + dataBufSize, buf + headerSize, currPacketSize); + while (currPacketSize < payloadSize) { + int result = Netlib_Recv(m_hGatewayConnection, dataBuf + dataBufSize + currPacketSize, int(payloadSize - currPacketSize), 0); + if (result == 0) { + debugLogA("Gateway connection gracefully closed"); + break; + } + if (result < 0) { + debugLogA("Gateway connection error, exiting"); + break; + } + currPacketSize += result; + } + dataBufSize = newSize; debugLogA("data buffer reallocated to %d bytes", dataBufSize); } dataBuf[dataBufSize] = 0; } - if (dataBufSize < payloadSize) - continue; - switch (opCode){ case 0: // text packet case 1: // binary packet diff --git a/protocols/Discord/src/utils.cpp b/protocols/Discord/src/utils.cpp index ae610b8d21..ac9eb85c11 100644 --- a/protocols/Discord/src/utils.cpp +++ b/protocols/Discord/src/utils.cpp @@ -168,6 +168,7 @@ CDiscordUser* CDiscordProto::PrepareUser(const JSONNode &user) MCONTACT hContact = db_add_contact(); Proto_AddToContact(hContact, m_szModuleName); + db_set_ws(hContact, "CList", "Group", m_wszDefaultGroup); setId(hContact, DB_KEY_ID, id); setWString(hContact, DB_KEY_NICK, username); setDword(hContact, DB_KEY_DISCR, iDiscriminator); diff --git a/protocols/Discord/src/version.h b/protocols/Discord/src/version.h index 4753e0f013..d7b213ad39 100644 --- a/protocols/Discord/src/version.h +++ b/protocols/Discord/src/version.h @@ -1,7 +1,7 @@ #define __MAJOR_VERSION 0 #define __MINOR_VERSION 1 #define __RELEASE_NUM 0 -#define __BUILD_NUM 1 +#define __BUILD_NUM 2 #include -- cgit v1.2.3