From 8a0b58acdb668cb469bcce87052d20b42f0ead7c Mon Sep 17 00:00:00 2001 From: ElzorFox Date: Wed, 17 Jun 2020 17:54:09 +0500 Subject: VKontakte: small VK API upgrade (5.76 => 5.78) add support audio_message and graffiti attachments types (read only) version bump + prepare for upgrade VK API version to 5.110 - part 4 --- protocols/VKontakte/src/misc.cpp | 148 +++++++++++++++++++++++++++----- protocols/VKontakte/src/version.h | 2 +- protocols/VKontakte/src/vk.h | 2 +- protocols/VKontakte/src/vk_files.cpp | 22 ++++- protocols/VKontakte/src/vk_history.cpp | 20 ++--- protocols/VKontakte/src/vk_messages.cpp | 39 +++++++-- protocols/VKontakte/src/vk_proto.cpp | 6 ++ protocols/VKontakte/src/vk_proto.h | 1 + protocols/VKontakte/src/vk_struct.h | 10 +++ protocols/VKontakte/src/vkjs.js | 17 ++-- 10 files changed, 217 insertions(+), 50 deletions(-) (limited to 'protocols/VKontakte') diff --git a/protocols/VKontakte/src/misc.cpp b/protocols/VKontakte/src/misc.cpp index c3ff2f4f8e..d0c19ccf1d 100644 --- a/protocols/VKontakte/src/misc.cpp +++ b/protocols/VKontakte/src/misc.cpp @@ -17,10 +17,7 @@ along with this program. If not, see . #include "stdafx.h" -static const char *szImageTypes[] = { "photo_2560", "photo_1280", "photo_807", "photo_604", "photo_256", "photo_130", "photo_128", "photo_75", "photo_64", "preview" }; - static const char *szGiftTypes[] = { "thumb_256", "thumb_96", "thumb_48" }; - static const char *szVKUrls[] = { "http://vk.com/", "https://vk.com/", "http://new.vk.com/", "https://new.vk.com/", "http://m.vk.com/", "https://m.vk.com/" }; static const char *szAttachmentMasks[] = { "wall%d_%d", "video%d_%d", "photo%d_%d", "audio%d_%d", "doc%d_%d", "market%d_%d" }; static const char *szVKLinkParam[] = { "?z=", "?w=", "&z=", "&w=" }; @@ -968,13 +965,21 @@ CMStringW CVkProto::GetVkPhotoItem(const JSONNode &jnPhoto, BBCSupport iBBC) if (!jnPhoto) return wszRes; - CMStringW wszLink, wszPreviewLink; - for (auto &it : szImageTypes) { - const JSONNode &n = jnPhoto[it]; - if (n) { - wszLink = n.as_mstring(); - break; - } + CVKImageSizeItem vkSizes[6]; + CMStringW wszPriorSize = L"smxyzw", wszPreviewLink; + int iMaxSize = 0; + + for (auto& it : jnPhoto["sizes"]) { + int iIndex = wszPriorSize.Find(it["type"].as_mstring()); + if (iIndex < 0) + continue; + + if (iIndex > iMaxSize) + iMaxSize = iIndex; + + vkSizes[iIndex].wszUrl = it["url"].as_mstring(); + vkSizes[iIndex].iSizeH = it["height"].as_int(); + vkSizes[iIndex].iSizeW = it["width"].as_int(); } switch (m_vkOptions.iIMGBBCSupport) { @@ -982,20 +987,27 @@ CMStringW CVkProto::GetVkPhotoItem(const JSONNode &jnPhoto, BBCSupport iBBC) wszPreviewLink = L""; break; case imgFullSize: - wszPreviewLink = wszLink; + wszPreviewLink = vkSizes[iMaxSize].wszUrl; break; case imgPreview130: + wszPreviewLink = vkSizes[wszPriorSize.Find(L"m")].wszUrl; + break; case imgPreview604: - wszPreviewLink = jnPhoto[m_vkOptions.iIMGBBCSupport == imgPreview130 ? "photo_130" : "photo_604"].as_mstring(); + wszPreviewLink = vkSizes[wszPriorSize.Find(L"x")].wszUrl.IsEmpty() ? vkSizes[wszPriorSize.Find(L"m")].wszUrl : vkSizes[wszPriorSize.Find(L"x")].wszUrl; break; } - int iWidth = jnPhoto["width"].as_int(); - int iHeight = jnPhoto["height"].as_int(); - - wszRes.AppendFormat(L"%s (%dx%d)", SetBBCString(TranslateT("Photo"), iBBC, vkbbcUrl, wszLink).c_str(), iWidth, iHeight); + wszRes.AppendFormat(L"%s (%dx%d)", + SetBBCString(TranslateT("Photo"), iBBC, vkbbcUrl, vkSizes[iMaxSize].wszUrl).c_str(), + vkSizes[iMaxSize].iSizeW, + vkSizes[iMaxSize].iSizeH + ); if (m_vkOptions.iIMGBBCSupport && iBBC != bbcNo) - wszRes.AppendFormat(L"\n\t%s", SetBBCString(!wszPreviewLink.IsEmpty() ? wszPreviewLink : (!wszLink.IsEmpty() ? wszLink : L""), bbcBasic, vkbbcImg).c_str()); + wszRes.AppendFormat(L"\n\t%s", + SetBBCString((!wszPreviewLink.IsEmpty() ? wszPreviewLink : (!vkSizes[iMaxSize].wszUrl.IsEmpty() ? vkSizes[iMaxSize].wszUrl : L"")), + bbcBasic, + vkbbcImg).c_str() + ); CMStringW wszText(jnPhoto["text"].as_mstring()); if (!wszText.IsEmpty()) wszRes += L"\n" + wszText; @@ -1114,6 +1126,30 @@ CMStringW CVkProto::GetAttachmentDescr(const JSONNode &jnAttachments, BBCSupport SetBBCString(TranslateT("Audio"), iBBC, vkbbcB).c_str(), SetBBCString(wszAudio, iBBC, vkbbcUrl, wszUrl).c_str()); } + else if (wszType == L"audio_message") { + const JSONNode& jnAudioMessage = jnAttach["audio_message"]; + if (!jnAudioMessage) + continue; + + CMStringW wszUrl(jnAudioMessage["link_mp3"].as_mstring()); + CMStringW wszTranscriptText(jnAudioMessage["transcript"].as_mstring()); + + res.AppendFormat(L"%s", SetBBCString(TranslateT("Audio message"), iBBC, vkbbcUrl, wszUrl).c_str()); + if(!wszTranscriptText.IsEmpty()) + res.AppendFormat(L"\n%s: %s", SetBBCString(TranslateT("Transcription"), iBBC, vkbbcB).c_str(), wszTranscriptText.c_str()); + } + else if (wszType == L"graffiti") { + const JSONNode& jnGraffiti = jnAttach["graffiti"]; + if (!jnGraffiti) + continue; + + CMStringW wszUrl(jnGraffiti["url"].as_mstring()); + + res.AppendFormat(L"%s\n\t%s", + SetBBCString(TranslateT("Graffiti"), iBBC, vkbbcUrl, wszUrl).c_str(), + SetBBCString(wszUrl, bbcBasic, vkbbcImg).c_str() + ); + } else if (wszType == L"video") { const JSONNode &jnVideo = jnAttach["video"]; if (!jnVideo) @@ -1299,6 +1335,66 @@ CMStringW CVkProto::GetAttachmentDescr(const JSONNode &jnAttachments, BBCSupport return res; } +CMStringW CVkProto::GetFwdMessage(const JSONNode& jnMsg, const JSONNode& jnFUsers, OBJLIST& vkUsers, BBCSupport iBBC) +{ + UINT uid = jnMsg["from_id"].as_int(); + CMStringW wszBody(jnMsg["text"].as_mstring()); + + CVkUserInfo* vkUser = vkUsers.find((CVkUserInfo*)&uid); + CMStringW wszNick, wszUrl; + + if (vkUser) { + wszNick = vkUser->m_wszUserNick; + wszUrl = vkUser->m_wszLink; + } + else { + MCONTACT hContact = FindUser(uid); + if (hContact || uid == m_msgId) + wszNick = ptrW(db_get_wsa(hContact, m_szModuleName, "Nick")); + else + wszNick = TranslateT("(Unknown contact)"); + wszUrl = UserProfileUrl(uid); + } + + time_t datetime = (time_t)jnMsg["date"].as_int(); + wchar_t ttime[64]; + _locale_t locale = _create_locale(LC_ALL, ""); + _wcsftime_l(ttime, _countof(ttime), L"%x %X", localtime(&datetime), locale); + _free_locale(locale); + + const JSONNode& jnFwdMessages = jnMsg["fwd_messages"]; + if (jnFwdMessages && !jnFwdMessages.empty()) { + CMStringW wszFwdMessages = GetFwdMessages(jnFwdMessages, jnFUsers, iBBC == bbcNo ? iBBC : m_vkOptions.BBCForAttachments()); + if (!wszBody.IsEmpty()) + wszFwdMessages = L"\n" + wszFwdMessages; + wszBody += wszFwdMessages; + } + + const JSONNode& jnAttachments = jnMsg["attachments"]; + if (jnAttachments && !jnAttachments.empty()) { + CMStringW wszAttachmentDescr = GetAttachmentDescr(jnAttachments, iBBC == bbcNo ? iBBC : m_vkOptions.BBCForAttachments()); + if (wszAttachmentDescr != L"== FilterAudioMessages ==") { + if (!wszBody.IsEmpty()) + wszAttachmentDescr = L"\n" + wszAttachmentDescr; + + wszBody += wszAttachmentDescr; + } + } + + wszBody.Replace(L"\n", L"\n\t"); + wchar_t tcSplit = m_vkOptions.bSplitFormatFwdMsg ? '\n' : ' '; + CMStringW wszMes(FORMAT, L"%s %s%c%s %s:\n\n%s\n", + SetBBCString(TranslateT("Message from"), iBBC, vkbbcB).c_str(), + SetBBCString(wszNick, iBBC, vkbbcUrl, wszUrl).c_str(), + tcSplit, + SetBBCString(TranslateT("at"), iBBC, vkbbcB).c_str(), + ttime, + SetBBCString(wszBody, iBBC, vkbbcCode).c_str()); + + return wszMes; + +} + CMStringW CVkProto::GetFwdMessages(const JSONNode &jnMessages, const JSONNode &jnFUsers, BBCSupport iBBC) { CMStringW res; @@ -1323,13 +1419,20 @@ CMStringW CVkProto::GetFwdMessages(const JSONNode &jnMessages, const JSONNode &j vkUsers.insert(vkUser); } - - for (auto &jnMsg : jnMessages) { #if (VK_NEW_API == 1) - UINT uid = jnMsg["from_id"].as_int(); + if (jnMessages.type() == JSON_ARRAY) + for (auto& jnMsg : jnMessages.as_array()) { + if (!res.IsEmpty()) + res.AppendChar('\n'); + res += GetFwdMessage(jnMsg, jnFUsers, vkUsers, iBBC); + } + else + res = GetFwdMessage(jnMessages, jnFUsers, vkUsers, iBBC); + #else + for (auto &jnMsg : jnMessages.as_array()) { UINT uid = jnMsg["user_id"].as_int(); -#endif + CMStringW wszBody(jnMsg["body"].as_mstring()); CVkUserInfo *vkUser = vkUsers.find((CVkUserInfo *)&uid); CMStringW wszNick, wszUrl; @@ -1352,8 +1455,6 @@ CMStringW CVkProto::GetFwdMessages(const JSONNode &jnMessages, const JSONNode &j _wcsftime_l(ttime, _countof(ttime), L"%x %X", localtime(&datetime), locale); _free_locale(locale); - CMStringW wszBody(jnMsg["body"].as_mstring()); - const JSONNode &jnFwdMessages = jnMsg["fwd_messages"]; if (jnFwdMessages) { CMStringW wszFwdMessages = GetFwdMessages(jnFwdMessages, jnFUsers, iBBC == bbcNo ? iBBC : m_vkOptions.BBCForAttachments()); @@ -1387,6 +1488,7 @@ CMStringW CVkProto::GetFwdMessages(const JSONNode &jnMessages, const JSONNode &j res.AppendChar('\n'); res += wszMes; } +#endif res.AppendChar('\n'); vkUsers.destroy(); diff --git a/protocols/VKontakte/src/version.h b/protocols/VKontakte/src/version.h index 2c30792b23..eee10724fa 100644 --- a/protocols/VKontakte/src/version.h +++ b/protocols/VKontakte/src/version.h @@ -1,7 +1,7 @@ #define __MAJOR_VERSION 0 #define __MINOR_VERSION 1 #define __RELEASE_NUM 10 -#define __BUILD_NUM 0 +#define __BUILD_NUM 1 #include diff --git a/protocols/VKontakte/src/vk.h b/protocols/VKontakte/src/vk.h index 2ab0052a98..527021c145 100644 --- a/protocols/VKontakte/src/vk.h +++ b/protocols/VKontakte/src/vk.h @@ -93,7 +93,7 @@ along with this program. If not, see . #define VK_NEW_API 0 #if (VK_NEW_API == 0) - #define VK_API_VER "5.76" + #define VK_API_VER "5.78" #else #define VK_API_VER "5.110" #endif diff --git a/protocols/VKontakte/src/vk_files.cpp b/protocols/VKontakte/src/vk_files.cpp index 59c2e75c6e..6730e4657a 100644 --- a/protocols/VKontakte/src/vk_files.cpp +++ b/protocols/VKontakte/src/vk_files.cpp @@ -321,12 +321,31 @@ void CVkProto::OnReciveUploadFile(NETLIBHTTPREQUEST *reply, AsyncHttpRequest *pR return; } +#if (VK_NEW_API == 1) + int id, owner_id; + if (fup->GetType() == CVkFileUploadParam::typeDoc) { + CMStringA wszType(jnResponse["type"].as_mstring()); + const JSONNode& jnDoc = jnResponse[wszType]; + id = jnDoc["id"].as_int(); + owner_id = jnDoc["owner_id"].as_int(); + } + else { + id = fup->GetType() == CVkFileUploadParam::typeAudio ? jnResponse["id"].as_int() : (*jnResponse.begin())["id"].as_int(); + owner_id = fup->GetType() == CVkFileUploadParam::typeAudio ? jnResponse["owner_id"].as_int() : (*jnResponse.begin())["owner_id"].as_int(); + } + + if ((id == 0) || (owner_id == 0)) { + SendFileFiled(fup, VKERR_INVALID_PARAMETERS); + return; + } +#else int id = fup->GetType() == CVkFileUploadParam::typeAudio ? jnResponse["id"].as_int() : (*jnResponse.begin())["id"].as_int(); int owner_id = fup->GetType() == CVkFileUploadParam::typeAudio ? jnResponse["owner_id"].as_int() : (*jnResponse.begin())["owner_id"].as_int(); if ((id == 0) || (owner_id == 0)) { SendFileFiled(fup, VKERR_INVALID_PARAMETERS); return; } +#endif CMStringW Attachment; @@ -377,10 +396,11 @@ void CVkProto::OnReciveUploadFile(NETLIBHTTPREQUEST *reply, AsyncHttpRequest *pR pMsgReq = new AsyncHttpRequest(this, REQUEST_POST, "/method/messages.send.json", true, &CVkProto::OnSendMessage, AsyncHttpRequest::rpHigh); pMsgReq << INT_PARAM("user_id", userID); pMsgReq->pUserInfo = new CVkSendMsgParam(fup->hContact, fup); - } + ULONG uMsgId = ::InterlockedIncrement(&m_msgId); pMsgReq << WCHAR_PARAM("message", fup->Desc) << WCHAR_PARAM("attachment", Attachment); + pMsgReq << INT_PARAM("random_id", ((LONG)time(0)) * 100 + uMsgId % 100); pMsgReq->AddHeader("Content-Type", "application/x-www-form-urlencoded"); Push(pMsgReq); diff --git a/protocols/VKontakte/src/vk_history.cpp b/protocols/VKontakte/src/vk_history.cpp index 0fdf83b477..f5aebd9b01 100644 --- a/protocols/VKontakte/src/vk_history.cpp +++ b/protocols/VKontakte/src/vk_history.cpp @@ -233,13 +233,7 @@ void CVkProto::OnReceiveHistoryMessages(NETLIBHTTPREQUEST *reply, AsyncHttpReque for (auto it = jnMsgs.rbegin(); it != jnMsgs.rend(); ++it) { const JSONNode &jnMsg = (*it); - -#if (VK_NEW_API == 1) - int mid = jnMsg["conversation_message_id"].as_int(); -#else int mid = jnMsg["id"].as_int(); -#endif - if (iLastMsgId < mid) iLastMsgId = mid; @@ -250,9 +244,7 @@ void CVkProto::OnReceiveHistoryMessages(NETLIBHTTPREQUEST *reply, AsyncHttpReque int uid = jnMsg["peer_id"].as_int(); int iReadMsg = getDword(param->hContact, "in_read", 0); - int isRead = (uid <= iReadMsg); - - + int isRead = (mid <= iReadMsg); #else CMStringW wszBody(jnMsg["body"].as_mstring()); int uid = jnMsg["user_id"].as_int(); @@ -271,6 +263,14 @@ void CVkProto::OnReceiveHistoryMessages(NETLIBHTTPREQUEST *reply, AsyncHttpReque wszBody += wszFwdMessages; } + const JSONNode& jnReplyMessages = jnMsg["reply_message"]; + if (jnReplyMessages && !jnReplyMessages.empty()) { + CMStringW wszReplyMessages = GetFwdMessages(jnReplyMessages, jnFUsers, m_vkOptions.BBCForAttachments()); + if (!wszBody.IsEmpty()) + wszReplyMessages = L"\n" + wszReplyMessages; + wszBody += wszReplyMessages; + } + const JSONNode &jnAttachments = jnMsg["attachments"]; if (jnAttachments && !jnAttachments.empty()) { CMStringW wszAttachmentDescr = GetAttachmentDescr(jnAttachments, m_vkOptions.BBCForAttachments()); @@ -285,7 +285,7 @@ void CVkProto::OnReceiveHistoryMessages(NETLIBHTTPREQUEST *reply, AsyncHttpReque wszBody += wszAttachmentDescr; } - if (m_vkOptions.bAddMessageLinkToMesWAtt && ((jnAttachments && !jnAttachments.empty()) || (jnFwdMessages && !jnFwdMessages.empty()))) + if (m_vkOptions.bAddMessageLinkToMesWAtt && ((jnAttachments && !jnAttachments.empty()) || (jnFwdMessages && !jnFwdMessages.empty()) || (jnReplyMessages && !jnReplyMessages.empty()))) wszBody += SetBBCString(TranslateT("Message link"), m_vkOptions.BBCForAttachments(), vkbbcUrl, CMStringW(FORMAT, L"https://vk.com/im?sel=%d&msgid=%d", uid, mid)); diff --git a/protocols/VKontakte/src/vk_messages.cpp b/protocols/VKontakte/src/vk_messages.cpp index 167be76ee7..9c5f93d4cd 100644 --- a/protocols/VKontakte/src/vk_messages.cpp +++ b/protocols/VKontakte/src/vk_messages.cpp @@ -232,18 +232,34 @@ void CVkProto::OnReceiveMessages(NETLIBHTTPREQUEST *reply, AsyncHttpRequest *pRe debugLogA("CVkProto::OnReceiveMessages numMessages = %d", numMessages); #if (VK_NEW_API == 1) + if (jnResponse["conv"]) { + const JSONNode& jnConversation = jnResponse["conv"]["items"]; + for (auto& jnItem : jnConversation) { + const JSONNode& jnPeer = jnItem["peer"]; + if (!jnPeer) + break; + + CMStringW wszPeerType(jnPeer["type"].as_mstring()); + + if (wszPeerType == L"user" || wszPeerType == L"group") { + int iUserId = jnPeer["id"].as_int(); + MCONTACT hContact = FindUser(iUserId, true); + setDword(hContact, "in_read", jnItem["in_read"].as_int()); + setDword(hContact, "out_read", jnItem["out_read"].as_int()); + } + } + } + for (auto& jnMsg : jnMsgs) { if (!jnMsg) { debugLogA("CVkProto::OnReceiveMessages pMsg == nullptr"); break; } - UINT mid = jnMsg["id"].as_int(); CMStringW wszBody(jnMsg["text"].as_mstring()); UINT datetime = jnMsg["date"].as_int(); int isOut = jnMsg["out"].as_int(); - int isRead = jnMsg["read_state"].as_int(); int uid = jnMsg["peer_id"].as_int(); MCONTACT hContact = 0; @@ -285,8 +301,15 @@ void CVkProto::OnReceiveMessages(NETLIBHTTPREQUEST *reply, AsyncHttpRequest *pRe wszBody += wszFwdMessages; } - CMStringW wszBodyNoAttachments = wszBody; + const JSONNode& jnReplyMessages = jnMsg["reply_message"]; + if (jnReplyMessages && !jnReplyMessages.empty()) { + CMStringW wszReplyMessages = GetFwdMessages(jnReplyMessages, jnFUsers, m_vkOptions.BBCForAttachments()); + if (!wszBody.IsEmpty()) + wszReplyMessages = L"\n" + wszReplyMessages; + wszBody += wszReplyMessages; + } + CMStringW wszBodyNoAttachments = wszBody; CMStringW wszAttachmentDescr; const JSONNode& jnAttachments = jnMsg["attachments"]; @@ -304,10 +327,13 @@ void CVkProto::OnReceiveMessages(NETLIBHTTPREQUEST *reply, AsyncHttpRequest *pRe wszBody += wszAttachmentDescr; } - if (m_vkOptions.bAddMessageLinkToMesWAtt && ((jnAttachments && !jnAttachments.empty()) || (jnFwdMessages && !jnFwdMessages.empty()))) + if (m_vkOptions.bAddMessageLinkToMesWAtt && ((jnAttachments && !jnAttachments.empty()) || (jnFwdMessages && !jnFwdMessages.empty()) || (jnReplyMessages && !jnReplyMessages.empty()))) wszBody += SetBBCString(TranslateT("Message link"), m_vkOptions.BBCForAttachments(), vkbbcUrl, CMStringW(FORMAT, L"https://vk.com/im?sel=%d&msgid=%d", uid, mid)); + int iReadMsg = getDword(hContact, "in_read", 0); + int isRead = (mid <= iReadMsg); + time_t update_time = (time_t)jnMsg["update_time"].as_int(); bool bEdited = (update_time != 0); @@ -600,15 +626,13 @@ void CVkProto::OnReceiveDlgs(NETLIBHTTPREQUEST *reply, AsyncHttpRequest *pReq) setDword(hContact, "in_read", jnConversation["in_read"].as_int()); setDword(hContact, "out_read", jnConversation["out_read"].as_int()); -/* if (g_bMessageState) { bool bIsOut = jnLastMessage["out"].as_bool(); - bool bIsRead = jnLastMessage["read_state"].as_bool(); + bool bIsRead = (jnLastMessage["id"].as_int() <= jnConversation["in_read"].as_int()); if (bIsRead && bIsOut) CallService(MS_MESSAGESTATE_UPDATE, hContact, MRD_TYPE_DELIVERED); } -*/ } if (wszPeerType == L"chat") { @@ -708,7 +732,6 @@ void CVkProto::OnReceiveDlgs(NETLIBHTTPREQUEST *reply, AsyncHttpRequest *pReq) MarkMessagesRead(hContact); } } - #endif lufUsers.destroy(); RetrieveUsersInfo(); diff --git a/protocols/VKontakte/src/vk_proto.cpp b/protocols/VKontakte/src/vk_proto.cpp index 117ba57aed..f748b371b2 100644 --- a/protocols/VKontakte/src/vk_proto.cpp +++ b/protocols/VKontakte/src/vk_proto.cpp @@ -665,8 +665,14 @@ void CVkProto::OnContactDeleted(MCONTACT hContact) return; CMStringA code(FORMAT, "var userID=\"%d\";", userID); + +#if (VK_NEW_API == 1) + if (param->bDeleteDialog) + code += "API.messages.deleteConversation({\"user_id\":userID,count:10000});"; +#else if (param->bDeleteDialog) code += "API.messages.deleteDialog({\"user_id\":userID,count:10000});"; +#endif if (param->bDeleteFromFriendlist) code += "API.friends.delete({\"user_id\":userID});"; diff --git a/protocols/VKontakte/src/vk_proto.h b/protocols/VKontakte/src/vk_proto.h index ca60dfdf5d..e04bbf73c2 100644 --- a/protocols/VKontakte/src/vk_proto.h +++ b/protocols/VKontakte/src/vk_proto.h @@ -360,6 +360,7 @@ private: CMStringW SetBBCString(LPCWSTR wszString, BBCSupport iBBC, VKBBCType bbcType, LPCWSTR wszAddString = nullptr); CMStringW& ClearFormatNick(CMStringW& wszText); CMStringW GetAttachmentDescr(const JSONNode &jnAttachments, BBCSupport iBBC = bbcNo); + CMStringW GetFwdMessage(const JSONNode& jnMsg, const JSONNode& jnFUsers, OBJLIST& vkUsers, BBCSupport iBBC); CMStringW GetFwdMessages(const JSONNode &jnMessages, const JSONNode &jnFUsers, BBCSupport iBBC = bbcNo); void SetInvisible(MCONTACT hContact); CMStringW RemoveBBC(CMStringW& wszSrc); diff --git a/protocols/VKontakte/src/vk_struct.h b/protocols/VKontakte/src/vk_struct.h index 5050994cda..e17a18ec9a 100644 --- a/protocols/VKontakte/src/vk_struct.h +++ b/protocols/VKontakte/src/vk_struct.h @@ -334,6 +334,16 @@ struct CVKDeactivateEvent { enum VKContactType : BYTE { vkContactNormal, vkContactSelf, vkContactMUCUser }; enum VKMesType : BYTE { vkALL, vkIN, vkOUT }; +struct CVKImageSizeItem { + CMStringW wszUrl; + int iSizeH, iSizeW; + + CVKImageSizeItem() : + iSizeH(0), + iSizeW(0) + {} +}; + /////////////////////////////////////////////////////////////////////////////////////////////// enum vkJSONNodeType { vkJSONTypeProfile = 0, vkJSONTypeGroup, vkJSONTypeConversation }; diff --git a/protocols/VKontakte/src/vkjs.js b/protocols/VKontakte/src/vkjs.js index 603fd7f692..30372a5865 100644 --- a/protocols/VKontakte/src/vkjs.js +++ b/protocols/VKontakte/src/vkjs.js @@ -175,6 +175,7 @@ return { "Msgs": Msgs, "fwd_users": FUsers }; var Msgs = API.messages.getById({ "message_ids": Args.mids }); var FMsgs = Msgs.items@.fwd_messages; +var ConvIds = Msgs.items@.peer_id; var Idx = 0; var Uids = []; while (Idx < FMsgs.length) { @@ -187,7 +188,8 @@ while (Idx < FMsgs.length) { Idx = Idx + 1; }; var FUsers = API.users.get({ "user_ids": Uids, "name_case": "gen" }); -return { "Msgs": Msgs, "fwd_users": FUsers }; +var Conv = API.messages.getConversationsById({"peer_ids": ConvIds}); +return { "Msgs": Msgs, "fwd_users": FUsers, "conv":Conv }; // Stored procedure name: RetrieveMessagesConversationByIds = End // Stored procedure name: RetrieveUnreadMessages = Begin @@ -352,16 +354,19 @@ while (Idx < FMsgs.length) { var CFMsgs = parseInt(FMsgs[Idx].length); while (Jdx < CFMsgs) { if (FMsgs[Idx][Jdx].from_id>0) { - Uids.unshift(FMsgs[Idx][Jdx].from_id); - } else { - GUids.unshift(-1*FMsgs[Idx][Jdx].from_id); - }; + Uids.unshift(FMsgs[Idx][Jdx].from_id); + } else { + GUids.unshift(-1*FMsgs[Idx][Jdx].from_id); + }; Jdx = Jdx + 1; }; Idx = Idx + 1; }; var FUsers = API.users.get({ "user_ids": Uids, "name_case": "gen" }); -var GUsers = API.groups.getById({ "group_ids": GUids }); +var GUsers = []; +if(GUids.length>0){ + GUsers = API.groups.getById({ "group_ids": GUids }); +}; var MsgUsers = API.users.get({ "user_ids": ChatMsg.items@.from_id, "fields":"id,first_name,last_name"}); return { "info": Info, "users": ChatUsers, "msgs": ChatMsg, "fwd_users": FUsers + GUsers, "msgs_users": MsgUsers}; -- cgit v1.2.3