From 5f310e19fd9b3ab199682fda1e4874e1fc2cc158 Mon Sep 17 00:00:00 2001 From: Sergey Bolhovskoy Date: Fri, 5 Aug 2016 08:37:43 +0000 Subject: =?UTF-8?q?VKontakte:=20fix(=3F=3F=3F)=20=E2=80=98validation=20req?= =?UTF-8?q?uired=E2=80=99=20error=20add=20support=20vk-groups=20contacts?= =?UTF-8?q?=20fix=20(=3F=3F=3F)=20rare=20error=20with=20WorkerThread=20on?= =?UTF-8?q?=20connection=20lost=20version=20bump?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://svn.miranda-ng.org/main/trunk@17159 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- protocols/VKontakte/src/vk_thread.cpp | 138 ++++++++++++++++++++++++++++++---- 1 file changed, 122 insertions(+), 16 deletions(-) (limited to 'protocols/VKontakte/src/vk_thread.cpp') diff --git a/protocols/VKontakte/src/vk_thread.cpp b/protocols/VKontakte/src/vk_thread.cpp index d2022cb2df..fafc9be71b 100644 --- a/protocols/VKontakte/src/vk_thread.cpp +++ b/protocols/VKontakte/src/vk_thread.cpp @@ -461,12 +461,39 @@ void CVkProto::RetrieveUserInfo(LONG userID) if (userID == VK_FEED_USER || !IsOnline()) return; + if (userID < 0) { + RetrieveGroupInfo(userID); + return; + } + CMStringW code(FORMAT, L"var userIDs=\"%i\";var res=API.users.get({\"user_ids\":userIDs,\"fields\":\"%s\",\"name_case\":\"nom\"});return{\"freeoffline\":0,\"norepeat\":1,\"usercount\":res.length,\"users\":res};", userID, CMStringW(fieldsName)); Push(new AsyncHttpRequest(this, REQUEST_POST, "/method/execute.json", true, &CVkProto::OnReceiveUserInfo) << WCHAR_PARAM("code", code)); } +void CVkProto::RetrieveGroupInfo(LONG groupID) +{ + debugLogA("CVkProto::RetrieveGroupInfo (%d)", groupID); + if (groupID >= VK_INVALID_USER || !IsOnline()) + return; + + Push(new AsyncHttpRequest(this, REQUEST_GET, "/method/groups.getById.json", true, &CVkProto::OnReceiveGroupInfo) + << CHAR_PARAM("fields", "description") + << INT_PARAM("group_id", -1*groupID)); +} + +void CVkProto::RetrieveGroupInfo(CMStringA& groupIDs) +{ + debugLogA("CVkProto::RetrieveGroupInfo (%s)", groupIDs); + if (groupIDs.IsEmpty() || !IsOnline()) + return; + + Push(new AsyncHttpRequest(this, REQUEST_GET, "/method/groups.getById.json", true, &CVkProto::OnReceiveGroupInfo) + << CHAR_PARAM("fields", "description,status") + << CHAR_PARAM("group_ids", groupIDs)); +} + void CVkProto::RetrieveUsersInfo(bool bFreeOffline, bool bRepeat) { debugLogA("CVkProto::RetrieveUsersInfo"); @@ -476,8 +503,8 @@ void CVkProto::RetrieveUsersInfo(bool bFreeOffline, bool bRepeat) CMStringW userIDs, code; int i = 0; for (MCONTACT hContact = db_find_first(m_szModuleName); hContact; hContact = db_find_next(hContact, m_szModuleName)) { - LONG userID = getDword(hContact, "ID", -1); - if (userID == -1 || userID == VK_FEED_USER) + LONG userID = getDword(hContact, "ID", VK_INVALID_USER); + if (userID == VK_INVALID_USER || userID == VK_FEED_USER || userID < 0) continue; if (!userIDs.IsEmpty()) userIDs.AppendChar(','); @@ -534,7 +561,7 @@ void CVkProto::OnReceiveUserInfo(NETLIBHTTPREQUEST *reply, AsyncHttpRequest *pRe LIST arContacts(10, PtrKeySortT); for (hContact = db_find_first(m_szModuleName); hContact; hContact = db_find_next(hContact, m_szModuleName)) - if (!isChatRoom(hContact)) + if (!isChatRoom(hContact) && !IsGroupUser(hContact)) arContacts.insert((HANDLE)hContact); for (auto it = jnUsers.begin(); it != jnUsers.end(); ++it) { @@ -546,7 +573,7 @@ void CVkProto::OnReceiveUserInfo(NETLIBHTTPREQUEST *reply, AsyncHttpRequest *pRe if (jnResponse["freeoffline"].as_bool()) for (int i = 0; i < arContacts.getCount(); i++) { hContact = (UINT_PTR)arContacts[i]; - LONG userID = getDword(hContact, "ID", -1); + LONG userID = getDword(hContact, "ID", VK_INVALID_USER); if (userID == m_myUserId || userID == VK_FEED_USER) continue; @@ -587,6 +614,84 @@ void CVkProto::OnReceiveUserInfo(NETLIBHTTPREQUEST *reply, AsyncHttpRequest *pRe } } +void CVkProto::OnReceiveGroupInfo(NETLIBHTTPREQUEST *reply, AsyncHttpRequest *pReq) +{ + debugLogA("CVkProto::OnReceiveUserInfo %d", reply->resultCode); + + if (reply->resultCode != 200 || !IsOnline()) + return; + + JSONNode jnRoot; + const JSONNode &jnResponse = CheckJsonResponse(pReq, reply, jnRoot); + if (!jnResponse) + return; + + for (auto it = jnResponse.begin(); it != jnResponse.end(); ++it) { + const JSONNode &jnItem = (*it); + + int iGroupId = (-1)*jnItem["id"].as_int(); + MCONTACT hContact = FindUser(iGroupId, true); + + if (!hContact) + continue; + + CMStringW wszValue; + + wszValue = jnItem["name"].as_mstring(); + if (!wszValue.IsEmpty()) + setWString(hContact, "Nick", wszValue); + + if (getWord(hContact, "Status", ID_STATUS_OFFLINE) != ID_STATUS_ONLINE) + setWord(hContact, "Status", ID_STATUS_ONLINE); + + setByte(hContact, "IsGroup", 1); + + bool bIsMember = jnItem["is_member"].as_bool(); + setByte(hContact, "Auth", !bIsMember); + setByte(hContact, "friend", bIsMember); + + wszValue = jnItem["screen_name"].as_mstring(); + if (!wszValue.IsEmpty()) { + setWString(hContact, "domain", wszValue); + wszValue = L"https://vk.com/" + wszValue; + setWString(hContact, "Homepage", wszValue); + } + + wszValue = jnItem["description"].as_mstring(); + if (!wszValue.IsEmpty()) + setWString(hContact, "About", wszValue); + + wszValue = jnItem["photo_100"].as_mstring(); + if (!wszValue.IsEmpty()) { + SetAvatarUrl(hContact, wszValue); + ReloadAvatarInfo(hContact); + } + + wszValue = jnItem["status"].as_mstring(); + CMStringW wszOldStatus(ptrW(db_get_wsa(hContact, hContact ? "CList" : m_szModuleName, "StatusMsg"))); + if (wszValue != wszOldStatus) + db_set_ws(hContact, hContact ? "CList" : m_szModuleName, "StatusMsg", wszValue); + + CMStringW wszOldListeningTo(ptrW(db_get_wsa(hContact, m_szModuleName, "ListeningTo"))); + const JSONNode &jnAudio = jnItem["status_audio"]; + if (jnAudio) { + CMStringW wszListeningTo(FORMAT, L"%s - %s", jnAudio["artist"].as_mstring(), jnAudio["title"].as_mstring()); + if (wszListeningTo != wszOldListeningTo) { + setWString(hContact, "ListeningTo", wszListeningTo); + setWString(hContact, "AudioUrl", jnAudio["url"].as_mstring()); + } + } + else if (wszValue[0] == wchar_t(9835) && wszValue.GetLength() > 2) { + setWString(hContact, "ListeningTo", &(wszValue.GetBuffer())[2]); + db_unset(hContact, m_szModuleName, "AudioUrl"); + } + else { + db_unset(hContact, m_szModuleName, "ListeningTo"); + db_unset(hContact, m_szModuleName, "AudioUrl"); + } + } +} + void CVkProto::RetrieveFriends(bool bCleanNonFriendContacts) { debugLogA("CVkProto::RetrieveFriends"); @@ -615,7 +720,7 @@ void CVkProto::OnReceiveFriends(NETLIBHTTPREQUEST *reply, AsyncHttpRequest *pReq LIST arContacts(10, PtrKeySortT); for (MCONTACT hContact = db_find_first(m_szModuleName); hContact; hContact = db_find_next(hContact, m_szModuleName)) { - if (!isChatRoom(hContact)) + if (!isChatRoom(hContact) && !IsGroupUser(hContact)) setByte(hContact, "Auth", 1); db_unset(hContact, m_szModuleName, "ReqAuth"); SetMirVer(hContact, -1); @@ -639,8 +744,9 @@ void CVkProto::OnReceiveFriends(NETLIBHTTPREQUEST *reply, AsyncHttpRequest *pReq if (bCleanContacts) for (int i = 0; i < arContacts.getCount(); i++) { MCONTACT hContact = (UINT_PTR)arContacts[i]; - LONG userID = getDword(hContact, "ID", -1); - if (userID == m_myUserId || userID == VK_FEED_USER) + LONG userID = getDword(hContact, "ID", VK_INVALID_USER); + bool bIsFriendGroup = IsGroupUser(hContact) && getBool(hContact, "friend"); + if (userID == m_myUserId || userID == VK_FEED_USER || bIsFriendGroup) continue; CallService(MS_DB_CONTACT_DELETE, (WPARAM)hContact); } @@ -653,8 +759,8 @@ void CVkProto::OnReceiveFriends(NETLIBHTTPREQUEST *reply, AsyncHttpRequest *pReq INT_PTR __cdecl CVkProto::SvcAddAsFriend(WPARAM hContact, LPARAM) { debugLogA("CVkProto::SvcAddAsFriend"); - LONG userID = getDword(hContact, "ID", -1); - if (!IsOnline() || userID == -1 || userID == VK_FEED_USER) + LONG userID = getDword(hContact, "ID", VK_INVALID_USER); + if (!IsOnline() || userID == VK_INVALID_USER || userID == VK_FEED_USER) return 1; ProtoChainSend(hContact, PSS_AUTHREQUEST, 0, (LPARAM)TranslateT("Please authorize me to add you to my friend list.")); return 0; @@ -674,8 +780,8 @@ INT_PTR CVkProto::SvcWipeNonFriendContacts(WPARAM, LPARAM) INT_PTR __cdecl CVkProto::SvcDeleteFriend(WPARAM hContact, LPARAM flag) { debugLogA("CVkProto::SvcDeleteFriend"); - LONG userID = getDword(hContact, "ID", -1); - if (!IsOnline() || userID == -1 || userID == VK_FEED_USER) + LONG userID = getDword(hContact, "ID", VK_INVALID_USER); + if (!IsOnline() || userID == VK_INVALID_USER || userID == VK_FEED_USER) return 1; ptrW pwszNick(db_get_wsa(hContact, m_szModuleName, "Nick")); @@ -734,8 +840,8 @@ void CVkProto::OnReceiveDeleteFriend(NETLIBHTTPREQUEST *reply, AsyncHttpRequest INT_PTR __cdecl CVkProto::SvcBanUser(WPARAM hContact, LPARAM) { debugLogA("CVkProto::SvcBanUser"); - LONG userID = getDword(hContact, "ID", -1); - if (!IsOnline() || userID == -1 || userID == VK_FEED_USER) + LONG userID = getDword(hContact, "ID", VK_INVALID_USER); + if (!IsOnline() || userID == VK_INVALID_USER || userID == VK_FEED_USER) return 1; CMStringA code(FORMAT, "var userID=\"%d\";API.account.banUser({\"user_id\":userID});", userID); @@ -792,8 +898,8 @@ INT_PTR __cdecl CVkProto::SvcBanUser(WPARAM hContact, LPARAM) INT_PTR __cdecl CVkProto::SvcReportAbuse(WPARAM hContact, LPARAM) { debugLogA("CVkProto::SvcReportAbuse"); - LONG userID = getDword(hContact, "ID", -1); - if (!IsOnline() || userID == -1 || userID == VK_FEED_USER) + LONG userID = getDword(hContact, "ID", VK_INVALID_USER); + if (!IsOnline() || userID == VK_INVALID_USER || userID == VK_FEED_USER) return 1; CMStringW wszNick(ptrW(db_get_wsa(hContact, m_szModuleName, "Nick"))), @@ -829,7 +935,7 @@ INT_PTR __cdecl CVkProto::SvcVisitProfile(WPARAM hContact, LPARAM) return 0; } - LONG userID = getDword(hContact, "ID", -1); + LONG userID = getDword(hContact, "ID", VK_INVALID_USER); ptrW wszDomain(db_get_wsa(hContact, m_szModuleName, "domain")); CMStringW wszUrl("https://vk.com/"); -- cgit v1.2.3