From 705649686832a6e12d7eea59e20528a7e61abe14 Mon Sep 17 00:00:00 2001 From: ElzorFox Date: Mon, 23 Jan 2017 13:42:53 +0500 Subject: =?UTF-8?q?VKontakte:=20rename=20option=20=E2=80=98Automatically?= =?UTF-8?q?=20wipe=20local=20contacts=20missing=20in=20your=20friend=20lis?= =?UTF-8?q?t=E2=80=99=20->=E2=80=99=20Load=20only=20friends=20to=20local?= =?UTF-8?q?=20contact=20list=E2=80=99=20rework=20loading=20clist=20logic?= =?UTF-8?q?=20(now=20if=20option=20=20=E2=80=98=20Load=20only=20friends=20?= =?UTF-8?q?to=20local=20contact=20list=E2=80=99=20is=20true,=20non-friends?= =?UTF-8?q?=20contact=20are=20not=20created=20on=20loading=20dialogs=20and?= =?UTF-8?q?=20are=20not=20cleaned=20automatically=20on=20loading=20friendl?= =?UTF-8?q?ist)=20version=20bump?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- protocols/VKontakte/res/resource.rc | 2 +- protocols/VKontakte/src/resource.h | 2 +- protocols/VKontakte/src/version.h | 2 +- protocols/VKontakte/src/vk_messages.cpp | 42 ++++++++++++++++++++++++++++++--- protocols/VKontakte/src/vk_options.cpp | 4 ++-- protocols/VKontakte/src/vk_options.h | 2 +- protocols/VKontakte/src/vk_struct.cpp | 10 +++++++- protocols/VKontakte/src/vk_struct.h | 13 ++++++++-- protocols/VKontakte/src/vk_thread.cpp | 4 ++-- 9 files changed, 67 insertions(+), 14 deletions(-) (limited to 'protocols') diff --git a/protocols/VKontakte/res/resource.rc b/protocols/VKontakte/res/resource.rc index 8e39824aaa..5badf44389 100644 --- a/protocols/VKontakte/res/resource.rc +++ b/protocols/VKontakte/res/resource.rc @@ -305,7 +305,7 @@ BEGIN CONTROL "Server-side delivery confirmation",IDC_DELIVERY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,157,278,10 CONTROL "Use local time for received messages",IDC_USE_LOCAL_TIME, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,137,278,10 - CONTROL "Automatically wipe local contacts missing in your friend list",IDC_AUTOCLEAN, + CONTROL "Load only friends to local contact list",IDC_LOADONLYFRIENDS, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,147,278,10 RTEXT "Mark message as read:",IDC_STATIC,12,101,150,12,SS_CENTERIMAGE COMBOBOX IDC_COMBO_MARKASREAD,167,101,121,30,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP diff --git a/protocols/VKontakte/src/resource.h b/protocols/VKontakte/src/resource.h index 0fa7af88fc..edfaff5ac3 100644 --- a/protocols/VKontakte/src/resource.h +++ b/protocols/VKontakte/src/resource.h @@ -41,7 +41,7 @@ #define IDC_CLIST 1013 #define IDC_HIDECHATS 1014 #define IDC_CONTACT 1015 -#define IDC_AUTOCLEAN 1020 +#define IDC_LOADONLYFRIENDS 1020 #define IDC_MESASUREAD 1025 #define IDC_SYNC_MSG_STATUS 1026 #define IDC_USE_LOCAL_TIME 1029 diff --git a/protocols/VKontakte/src/version.h b/protocols/VKontakte/src/version.h index 7348f04c1f..6c45de27ca 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 2 -#define __BUILD_NUM 10 +#define __BUILD_NUM 11 #include diff --git a/protocols/VKontakte/src/vk_messages.cpp b/protocols/VKontakte/src/vk_messages.cpp index 84b8075d3f..a627fbaf93 100644 --- a/protocols/VKontakte/src/vk_messages.cpp +++ b/protocols/VKontakte/src/vk_messages.cpp @@ -210,8 +210,11 @@ void CVkProto::RetrieveUnreadMessages() debugLogA("CVkProto::RetrieveUnreadMessages"); if (!IsOnline()) return; - Push(new AsyncHttpRequest(this, REQUEST_GET, "/method/messages.getDialogs.json", true, &CVkProto::OnReceiveDlgs) - << INT_PARAM ("count", 200)); + + Push(new AsyncHttpRequest(this, REQUEST_GET, "/method/execute.json", true, &CVkProto::OnReceiveDlgs, AsyncHttpRequest::rpHigh) + << CHAR_PARAM("code", "var dlg=API.messages.getDialogs({\"count\":200});" + "var users=API.friends.areFriends({\"user_ids\":dlg.items@.message@.user_id});" + "return{\"dialogs\":dlg, \"users\":users};")); } void CVkProto::OnReceiveMessages(NETLIBHTTPREQUEST *reply, AsyncHttpRequest *pReq) @@ -343,10 +346,30 @@ void CVkProto::OnReceiveDlgs(NETLIBHTTPREQUEST *reply, AsyncHttpRequest *pReq) if (!jnResponse) return; - const JSONNode &jnDlgs = jnResponse["items"]; + const JSONNode &jnDialogs = jnResponse["dialogs"]; + if (!jnDialogs) + return; + + const JSONNode &jnDlgs = jnDialogs["items"]; if (!jnDlgs) return; + OBJLIST lufUsers(20, NumericKeySortT); + const JSONNode &jnUsers = jnResponse["users"]; + if (jnUsers) { + for (auto it = jnUsers.begin(); it != jnUsers.end(); ++it) { + int iUserId = (*it)["user_id"].as_int(); + int iStatus = (*it)["friend_status"].as_int(); + + CVKUsersAreFriend* ufUser = lufUsers.find((CVKUsersAreFriend*)&iUserId); + if (ufUser) + continue; + + ufUser = new CVKUsersAreFriend(iUserId, iStatus); + lufUsers.insert(ufUser); + } + } + CMStringA szGroupIds; for (auto it = jnDlgs.begin(); it != jnDlgs.end(); ++it) { @@ -364,7 +387,18 @@ void CVkProto::OnReceiveDlgs(NETLIBHTTPREQUEST *reply, AsyncHttpRequest *pReq) if (!chatid) { uid = jnDlg["user_id"].as_int(); + + CVKUsersAreFriend* ufUser = lufUsers.find((CVKUsersAreFriend*)&uid); + int iFriendStatus = ufUser ? ufUser->iStatus : 0; + debugLogA("CVkProto::OnReceiveDlgs UserId = %d, FriendStatus = %d, numUnread = %d", uid, iFriendStatus, numUnread); + + // iFriendStatus == 3 - user is friend + // uid > 0 - user is not group and etc. + if (m_vkOptions.bLoadOnlyFriends && uid > 0 && numUnread == 0 && iFriendStatus != 3) + continue; + hContact = FindUser(uid, true); + debugLogA("CVkProto::OnReceiveDlgs add UserId = %d", uid); if (IsGroupUser(hContact)) szGroupIds.AppendFormat(szGroupIds.IsEmpty() ? "%d" : ",%d", -1 * uid); @@ -406,6 +440,8 @@ void CVkProto::OnReceiveDlgs(NETLIBHTTPREQUEST *reply, AsyncHttpRequest *pReq) MarkMessagesRead(hContact); } } + + lufUsers.destroy(); RetrieveUsersInfo(); RetrieveGroupInfo(szGroupIds); } \ No newline at end of file diff --git a/protocols/VKontakte/src/vk_options.cpp b/protocols/VKontakte/src/vk_options.cpp index 161fd266cb..15cec12e55 100644 --- a/protocols/VKontakte/src/vk_options.cpp +++ b/protocols/VKontakte/src/vk_options.cpp @@ -146,7 +146,7 @@ CVkOptionAccountForm::CVkOptionAccountForm(CVkProto *proto): m_cbxVKLang(this, IDC_COMBO_LANGUAGE), m_cbDelivery(this, IDC_DELIVERY), m_cbUseLocalTime(this, IDC_USE_LOCAL_TIME), - m_cbAutoClean(this, IDC_AUTOCLEAN), + m_cbLoadOnlyFriends(this, IDC_LOADONLYFRIENDS), m_cbxMarkAsRead(this, IDC_COMBO_MARKASREAD), m_cbxSyncHistory(this, IDC_COMBO_SYNCHISTORY) { @@ -154,7 +154,7 @@ CVkOptionAccountForm::CVkOptionAccountForm(CVkProto *proto): CreateLink(m_edtGroupName, m_proto->m_vkOptions.pwszDefaultGroup); CreateLink(m_cbDelivery, m_proto->m_vkOptions.bServerDelivery); CreateLink(m_cbUseLocalTime, m_proto->m_vkOptions.bUseLocalTime); - CreateLink(m_cbAutoClean, m_proto->m_vkOptions.bAutoClean); + CreateLink(m_cbLoadOnlyFriends, m_proto->m_vkOptions.bLoadOnlyFriends); } void CVkOptionAccountForm::OnInitDialog() diff --git a/protocols/VKontakte/src/vk_options.h b/protocols/VKontakte/src/vk_options.h index 4b6ff217be..9758d95ddf 100644 --- a/protocols/VKontakte/src/vk_options.h +++ b/protocols/VKontakte/src/vk_options.h @@ -50,7 +50,7 @@ class CVkOptionAccountForm : public CVkDlgBase CCtrlCombo m_cbxVKLang; CCtrlCheck m_cbDelivery; CCtrlCheck m_cbUseLocalTime; - CCtrlCheck m_cbAutoClean; + CCtrlCheck m_cbLoadOnlyFriends; CCtrlCombo m_cbxSyncHistory; CCtrlCombo m_cbxMarkAsRead; diff --git a/protocols/VKontakte/src/vk_struct.cpp b/protocols/VKontakte/src/vk_struct.cpp index ec7531c212..67eec095fa 100644 --- a/protocols/VKontakte/src/vk_struct.cpp +++ b/protocols/VKontakte/src/vk_struct.cpp @@ -167,7 +167,7 @@ CVkChatUser* CVkChatInfo::GetUserById(int user_id) ///////////////////////////////////////////////////////////////////////////////////////// CVKOptions::CVKOptions(PROTO_INTERFACE *proto) : - bAutoClean(proto, "AutoClean", false), + bLoadOnlyFriends(proto, "LoadOnlyFriends", false), bServerDelivery(proto, "BsDirect", true), bHideChats(proto, "HideChats", true), bMesAsUnread(proto, "MesAsUnread", false), @@ -239,4 +239,12 @@ CVKOptions::CVKOptions(PROTO_INTERFACE *proto) : pwszVKLang(proto, "VKLang", NULL) { + // Note: Delete this code after next stable build + int iAutoClean = db_get_b(NULL, proto->m_szModuleName, "AutoClean", -1); + if (iAutoClean != -1) { + bLoadOnlyFriends = (BYTE) iAutoClean; + db_set_b(NULL, proto->m_szModuleName, "LoadOnlyFriends", bLoadOnlyFriends); + db_unset(NULL, proto->m_szModuleName, "AutoClean"); + } + // Note } diff --git a/protocols/VKontakte/src/vk_struct.h b/protocols/VKontakte/src/vk_struct.h index 9e04c20d98..45ddd37fcf 100644 --- a/protocols/VKontakte/src/vk_struct.h +++ b/protocols/VKontakte/src/vk_struct.h @@ -287,7 +287,7 @@ struct CVkCookie }; struct CVKOptions { - CMOption bAutoClean; + CMOption bLoadOnlyFriends; CMOption bServerDelivery; CMOption bHideChats; CMOption bMesAsUnread; @@ -363,8 +363,17 @@ struct CVKOptions { }; - struct CVKDeactivateEvent { wchar_t *wszType; char *szDescription; +}; + +struct CVKUsersAreFriend { + CVKUsersAreFriend(int _iUserId, int _iStatus) : + iUserId(_iUserId), + iStatus(_iStatus) + {} + + int iUserId; + int iStatus; }; \ No newline at end of file diff --git a/protocols/VKontakte/src/vk_thread.cpp b/protocols/VKontakte/src/vk_thread.cpp index e47ca75430..9bec13a8f6 100644 --- a/protocols/VKontakte/src/vk_thread.cpp +++ b/protocols/VKontakte/src/vk_thread.cpp @@ -659,7 +659,7 @@ void CVkProto::OnReceiveGroupInfo(NETLIBHTTPREQUEST *reply, AsyncHttpRequest *pR int iGroupId = (-1)*jnItem["id"].as_int(); bool bIsMember = jnItem["is_member"].as_bool(); - if (!bIsMember && m_vkOptions.bAutoClean) + if (!bIsMember && m_vkOptions.bLoadOnlyFriends) continue; MCONTACT hContact = FindUser(iGroupId, true); @@ -740,7 +740,7 @@ void CVkProto::OnReceiveFriends(NETLIBHTTPREQUEST *reply, AsyncHttpRequest *pReq return; CVkSendMsgParam *param = (CVkSendMsgParam *)pReq->pUserInfo; - bool bCleanContacts = m_vkOptions.bAutoClean || (param->iMsgID != 0); + bool bCleanContacts = (param->iMsgID != 0); delete param; LIST arContacts(10, PtrKeySortT); -- cgit v1.2.3