From 5a5a0265a25e063ae560adbf83042e01d0ce1941 Mon Sep 17 00:00:00 2001 From: Sergey Bolhovskoy Date: Tue, 22 Sep 2015 09:30:48 +0000 Subject: VKontakte: hidden option for full load clist support for sync message read status from server version bump git-svn-id: http://svn.miranda-ng.org/main/trunk@15421 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- protocols/VKontakte/res/resource.rc | 36 ++++++++++++++++--------------- protocols/VKontakte/src/misc.cpp | 26 ++++++++++++++++++++++ protocols/VKontakte/src/resource.h | 1 + protocols/VKontakte/src/stdafx.h | 1 + protocols/VKontakte/src/version.h | 2 +- protocols/VKontakte/src/vk_messages.cpp | 3 ++- protocols/VKontakte/src/vk_options.cpp | 16 +++++++++++++- protocols/VKontakte/src/vk_pollserver.cpp | 8 +++++++ protocols/VKontakte/src/vk_proto.cpp | 3 +++ protocols/VKontakte/src/vk_proto.h | 5 ++++- protocols/VKontakte/src/vk_thread.cpp | 4 ++-- 11 files changed, 82 insertions(+), 23 deletions(-) (limited to 'protocols') diff --git a/protocols/VKontakte/res/resource.rc b/protocols/VKontakte/res/resource.rc index 89a5c6bbf5..c779ad6bc6 100644 --- a/protocols/VKontakte/res/resource.rc +++ b/protocols/VKontakte/res/resource.rc @@ -209,29 +209,31 @@ STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD EXSTYLE WS_EX_CONTROLPARENT FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN - GROUPBOX "Advanced",IDC_STATIC,4,8,293,75 + GROUPBOX "Advanced",IDC_STATIC,4,8,293,83 CONTROL "Hide chats on startup",IDC_HIDECHATS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,19,278,10 + CONTROL "Sync read message status from server",IDC_SYNC_MSG_STATUS, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,30,268,10 CONTROL "Always notify as unread for all incoming message",IDC_MESASUREAD, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,30,278,10 - CONTROL "Force invisible status upon user activity",IDC_FORCE_ONLINE_ON_ACT, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,41,278,10 - LTEXT "Invisible interval timeout (min):",IDC_STATIC,16,56,184,8 - EDITTEXT IDC_ED_INT_INVIS,204,52,40,14,ES_RIGHT | ES_AUTOHSCROLL | ES_NUMBER - CONTROL "",IDC_SPIN_INT_INVIS,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,244,52,14,14 + CONTROL "Force invisible status upon user activity",IDC_FORCE_ONLINE_ON_ACT, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,52,278,10 + LTEXT "Invisible interval timeout (min):",IDC_STATIC,16,67,184,8 + EDITTEXT IDC_ED_INT_INVIS,204,63,40,14,ES_RIGHT | ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_SPIN_INT_INVIS,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,244,63,14,14 CONTROL "Use non-standard urlEncode for sent messages (less traffic)",IDC_USENOSTDURLENCODE, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,67,278,10 - GROUPBOX "When I ban user...",IDC_STATIC,4,84,293,33 - CONTROL "Report abuse",IDC_REPORT_ABUSE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,94,129,10 - CONTROL "Clear server history",IDC_CLEAR_SERVER_HISTORY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,105,129,10 + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,78,278,10 + GROUPBOX "When I ban user...",IDC_STATIC,4,92,293,33 + CONTROL "Report abuse",IDC_REPORT_ABUSE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,102,129,10 + CONTROL "Clear server history",IDC_CLEAR_SERVER_HISTORY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,113,129,10 CONTROL "Remove from friend list",IDC_REMOVE_FROM_FRENDLIST, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,148,94,141,10 - CONTROL "Remove from contact list",IDC_REMOVE_FROM_CLIST,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,148,105,141,10 - GROUPBOX "Broadcast music...",IDC_STATIC_SEND_MUSIC_METOD,4,120,293,58,WS_GROUP - CONTROL "off",IDC_SEND_MUSIC_NONE,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,12,131,278,10 + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,148,102,141,10 + CONTROL "Remove from contact list",IDC_REMOVE_FROM_CLIST,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,148,113,141,10 + GROUPBOX "Broadcast music...",IDC_STATIC_SEND_MUSIC_METOD,4,128,293,58,WS_GROUP + CONTROL "off",IDC_SEND_MUSIC_NONE,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,12,139,278,10 CONTROL "as regular status for unknown music and audio status otherwise",IDC_SEND_MUSIC_BROADCAST_AND_STATUS, - "Button",BS_AUTORADIOBUTTON | WS_TABSTOP,12,142,278,10 - CONTROL "as audio status only",IDC_SEND_MUSIC_BROADCAST,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,12,153,278,10 - CONTROL "as regular status only",IDC_SEND_MUSIC_STATUS,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,12,164,278,10 + "Button",BS_AUTORADIOBUTTON | WS_TABSTOP,12,150,278,10 + CONTROL "as audio status only",IDC_SEND_MUSIC_BROADCAST,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,12,161,278,10 + CONTROL "as regular status only",IDC_SEND_MUSIC_STATUS,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,12,172,278,10 END IDD_OPT_MAIN DIALOGEX 0, 0, 304, 213 diff --git a/protocols/VKontakte/src/misc.cpp b/protocols/VKontakte/src/misc.cpp index b83bb0d396..06e0bccac2 100644 --- a/protocols/VKontakte/src/misc.cpp +++ b/protocols/VKontakte/src/misc.cpp @@ -655,6 +655,32 @@ void CVkProto::SetSrmmReadStatus(MCONTACT hContact) CallService(MS_MSG_SETSTATUSTEXT, (WPARAM)hContact, (LPARAM)&st); } +void CVkProto::MarkDialogAsRead(MCONTACT hContact) +{ + debugLogA("CVkProto::MarkDialogAsRead"); + if (!IsOnline()) + return; + + LONG userID = getDword(hContact, "ID", -1); + if (userID == -1 || userID == VK_FEED_USER) + return; + + MEVENT hDBEvent; + while ((hDBEvent = db_event_firstUnread(hContact)) != NULL) { + db_event_markRead(hContact, hDBEvent); + int res = CallService(MS_CLIST_REMOVEEVENT, hContact, hDBEvent); + debugLogA("CVkProto::MarkDialogAsRead [1] result = %d, hDbEvent = %d", res, (int)hDBEvent); + } + + hContact = db_mc_tryMeta(hContact); + CLISTEVENT *cle = NULL; + while ((cle = (CLISTEVENT*)CallService(MS_CLIST_GETEVENT, hContact, 0)) != NULL) { + db_event_markRead(hContact, cle->hDbEvent); + int res = CallService(MS_CLIST_REMOVEEVENT, hContact, cle->hDbEvent); + debugLogA("CVkProto::MarkDialogAsRead [2] result = %d, hDbEvent = %d", res, (int)(cle->hDbEvent)); + } +} + char* CVkProto::GetStickerId(const char* Msg, int &stickerid) { stickerid = 0; diff --git a/protocols/VKontakte/src/resource.h b/protocols/VKontakte/src/resource.h index cf4bbc365a..b02e3d1e88 100644 --- a/protocols/VKontakte/src/resource.h +++ b/protocols/VKontakte/src/resource.h @@ -40,6 +40,7 @@ #define IDC_CONTACT 1015 #define IDC_AUTOCLEAN 1020 #define IDC_MESASUREAD 1025 +#define IDC_SYNC_MSG_STATUS 1026 #define IDC_USE_LOCAL_TIME 1029 #define IDC_REPORT_ABUSE 1030 #define IDC_CLEAR_SERVER_HISTORY 1031 diff --git a/protocols/VKontakte/src/stdafx.h b/protocols/VKontakte/src/stdafx.h index b70f946812..2387f51043 100644 --- a/protocols/VKontakte/src/stdafx.h +++ b/protocols/VKontakte/src/stdafx.h @@ -61,6 +61,7 @@ along with this program. If not, see . #include #include #include +#include #include "win2k.h" diff --git a/protocols/VKontakte/src/version.h b/protocols/VKontakte/src/version.h index e9fb9515a4..74a6f915af 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 1 -#define __BUILD_NUM 15 +#define __BUILD_NUM 16 #include diff --git a/protocols/VKontakte/src/vk_messages.cpp b/protocols/VKontakte/src/vk_messages.cpp index 3e22601291..ae096560d0 100644 --- a/protocols/VKontakte/src/vk_messages.cpp +++ b/protocols/VKontakte/src/vk_messages.cpp @@ -278,7 +278,8 @@ void CVkProto::OnReceiveMessages(NETLIBHTTPREQUEST *reply, AsyncHttpRequest *pRe } PROTORECVEVENT recv = { 0 }; - if (isRead && !m_bMesAsUnread) + bool bUseServerReadFlag = m_bSyncReadMessageStatusFromServer ? true : !m_bMesAsUnread; + if (isRead && bUseServerReadFlag) recv.flags |= PREF_CREATEREAD; if (isOut) recv.flags |= PREF_SENT; diff --git a/protocols/VKontakte/src/vk_options.cpp b/protocols/VKontakte/src/vk_options.cpp index fbeb36b70e..bcb35b11cf 100644 --- a/protocols/VKontakte/src/vk_options.cpp +++ b/protocols/VKontakte/src/vk_options.cpp @@ -243,7 +243,11 @@ INT_PTR CALLBACK CVkProto::OptionsAdvProc(HWND hwndDlg, UINT uMsg, WPARAM wParam SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, (LPARAM)IcoLib_GetIconByHandle(ppro->m_hProtoIcon)); CheckDlgButton(hwndDlg, IDC_HIDECHATS, ppro->m_bHideChats ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_SYNC_MSG_STATUS, ppro->m_bSyncReadMessageStatusFromServer ? BST_CHECKED : BST_UNCHECKED); + + EnableWindow(GetDlgItem(hwndDlg, IDC_MESASUREAD), IsDlgButtonChecked(hwndDlg, IDC_SYNC_MSG_STATUS) == BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_MESASUREAD, ppro->m_bMesAsUnread ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_FORCE_ONLINE_ON_ACT, ppro->m_bUserForceOnlineOnActivity ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_USENOSTDURLENCODE, ppro->m_bUseNonStandardUrlEncode ? BST_CHECKED : BST_UNCHECKED); @@ -268,6 +272,13 @@ INT_PTR CALLBACK CVkProto::OptionsAdvProc(HWND hwndDlg, UINT uMsg, WPARAM wParam if ((HWND)lParam == GetFocus() && (HIWORD(wParam) == EN_CHANGE)) SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); break; + + case IDC_SYNC_MSG_STATUS: + if (HIWORD(wParam) == BN_CLICKED && (HWND)lParam == GetFocus()) { + EnableWindow(GetDlgItem(hwndDlg, IDC_MESASUREAD), IsDlgButtonChecked(hwndDlg, IDC_SYNC_MSG_STATUS) == BST_UNCHECKED); + SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + } + break; case IDC_HIDECHATS: case IDC_MESASUREAD: @@ -295,9 +306,12 @@ INT_PTR CALLBACK CVkProto::OptionsAdvProc(HWND hwndDlg, UINT uMsg, WPARAM wParam ppro->m_bHideChats = IsDlgButtonChecked(hwndDlg, IDC_HIDECHATS) == BST_CHECKED; ppro->setByte("HideChats", ppro->m_bHideChats); + ppro->m_bSyncReadMessageStatusFromServer = IsDlgButtonChecked(hwndDlg, IDC_SYNC_MSG_STATUS) == BST_CHECKED; + ppro->setByte("SyncReadMessageStatusFromServer", ppro->m_bSyncReadMessageStatusFromServer); + ppro->m_bMesAsUnread = IsDlgButtonChecked(hwndDlg, IDC_MESASUREAD) == BST_CHECKED; ppro->setByte("MesAsUnread", ppro->m_bMesAsUnread); - + ppro->m_bUserForceOnlineOnActivity = IsDlgButtonChecked(hwndDlg, IDC_FORCE_ONLINE_ON_ACT) == BST_CHECKED; ppro->setByte("UserForceOnlineOnActivity", ppro->m_bUserForceOnlineOnActivity); diff --git a/protocols/VKontakte/src/vk_pollserver.cpp b/protocols/VKontakte/src/vk_pollserver.cpp index fa0617f874..84058a9dcf 100644 --- a/protocols/VKontakte/src/vk_pollserver.cpp +++ b/protocols/VKontakte/src/vk_pollserver.cpp @@ -95,6 +95,8 @@ void CVkProto::PollUpdates(const JSONNode &jnUpdates) SetSrmmReadStatus(hContact); if (m_bUserForceOnlineOnActivity) SetInvisible(hContact); + if (m_bSyncReadMessageStatusFromServer) + MarkDialogAsRead(hContact); } break; @@ -126,6 +128,12 @@ void CVkProto::PollUpdates(const JSONNode &jnUpdates) SetInvisible(hContact); } break; + case VKPOLL_READ_ALL_IN: + uid = jnChild[1].as_int(); + hContact = FindUser(uid); + if (hContact != NULL && m_bSyncReadMessageStatusFromServer) + MarkDialogAsRead(hContact); + break; case VKPOLL_USR_ONLINE: uid = -jnChild[1].as_int(); diff --git a/protocols/VKontakte/src/vk_proto.cpp b/protocols/VKontakte/src/vk_proto.cpp index c0ea47c99c..f0f2de1357 100644 --- a/protocols/VKontakte/src/vk_proto.cpp +++ b/protocols/VKontakte/src/vk_proto.cpp @@ -121,6 +121,9 @@ CVkProto::CVkProto(const char *szModuleName, const TCHAR *ptszUserName) : m_bShortenLinksForAudio = getBool("ShortenLinksForAudio", true); m_bSplitFormatFwdMsg = getBool("SplitFormatFwdMsg", true); + + m_bSyncReadMessageStatusFromServer = getBool("SyncReadMessageStatusFromServer", false); + m_bLoadFullCList = getBool("LoadFullCList", false); m_bSetBroadcast = false; m_bNeedSendOnline = false; diff --git a/protocols/VKontakte/src/vk_proto.h b/protocols/VKontakte/src/vk_proto.h index 8d3750dddd..58d509bc4d 100644 --- a/protocols/VKontakte/src/vk_proto.h +++ b/protocols/VKontakte/src/vk_proto.h @@ -198,6 +198,7 @@ struct CVkProto : public PROTO void __cdecl ContactTypingThread(void *p); void SetSrmmReadStatus(MCONTACT hContact); + void MarkDialogAsRead(MCONTACT hContact); char* GetStickerId(const char* Msg, int& stickerid); @@ -387,7 +388,9 @@ private: m_bUseNonStandardUrlEncode, m_bSetBroadcast, m_bShortenLinksForAudio, - m_bSplitFormatFwdMsg; + m_bSplitFormatFwdMsg, + m_bSyncReadMessageStatusFromServer, + m_bLoadFullCList; int m_iNewsInterval, m_iNotificationsInterval, diff --git a/protocols/VKontakte/src/vk_thread.cpp b/protocols/VKontakte/src/vk_thread.cpp index 1817ddc68a..c48a330ef6 100644 --- a/protocols/VKontakte/src/vk_thread.cpp +++ b/protocols/VKontakte/src/vk_thread.cpp @@ -408,13 +408,13 @@ void CVkProto::RetrieveUsersInfo(bool flag) if (m_bNeedSendOnline) codeformat += _T("API.account.setOnline();"); - if (flag) + if (flag && !m_bLoadFullCList) codeformat += CMString("var US=API.users.get({\"user_ids\":userIDs,\"fields\":\"%s\",\"name_case\":\"nom\"});" "var res=[];var index=US.length;while(index>0){index=index-1;if(US[index].online!=0){res.unshift(US[index]);};};" "return{\"freeoffline\":1,\"users\":res,\"requests\":API.friends.getRequests({\"extended\":0,\"need_mutual\":0,\"out\":0})};"); else codeformat += CMString("var res=API.users.get({\"user_ids\":userIDs,\"fields\":\"%s\",\"name_case\":\"nom\"});" - "return{\"freeoffline\":0,\"users\":res};"); + "return{\"freeoffline\":0,\"users\":res,\"requests\":API.friends.getRequests({\"extended\":0,\"need_mutual\":0,\"out\":0})};"); code.AppendFormat(codeformat, userIDs, CMString(flag ? "online,status" : fieldsName)); Push(new AsyncHttpRequest(this, REQUEST_POST, "/method/execute.json", true, &CVkProto::OnReceiveUserInfo) -- cgit v1.2.3