diff options
author | ElzorFox <elzorfox@ya.ru> | 2020-06-17 17:54:09 +0500 |
---|---|---|
committer | ElzorFox <elzorfox@ya.ru> | 2020-06-17 17:54:09 +0500 |
commit | 8a0b58acdb668cb469bcce87052d20b42f0ead7c (patch) | |
tree | 8f05ccbbd3e01266f2adfff22f61c0c74ca4f791 /protocols/VKontakte | |
parent | 8f35d58ce9fa00dc940b616d5ac7ea1e5421612f (diff) |
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
Diffstat (limited to 'protocols/VKontakte')
-rw-r--r-- | protocols/VKontakte/src/misc.cpp | 148 | ||||
-rw-r--r-- | protocols/VKontakte/src/version.h | 2 | ||||
-rw-r--r-- | protocols/VKontakte/src/vk.h | 2 | ||||
-rw-r--r-- | protocols/VKontakte/src/vk_files.cpp | 22 | ||||
-rw-r--r-- | protocols/VKontakte/src/vk_history.cpp | 20 | ||||
-rw-r--r-- | protocols/VKontakte/src/vk_messages.cpp | 39 | ||||
-rw-r--r-- | protocols/VKontakte/src/vk_proto.cpp | 6 | ||||
-rw-r--r-- | protocols/VKontakte/src/vk_proto.h | 1 | ||||
-rw-r--r-- | protocols/VKontakte/src/vk_struct.h | 10 | ||||
-rw-r--r-- | protocols/VKontakte/src/vkjs.js | 17 |
10 files changed, 217 insertions, 50 deletions
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 <http://www.gnu.org/licenses/>. #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<CVkUserInfo>& 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 <stdver.h>
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 <http://www.gnu.org/licenses/>. #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<CVkUserInfo>& 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}; |