summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--protocols/VKontakte/res/resource.rc36
-rw-r--r--protocols/VKontakte/src/misc.cpp26
-rw-r--r--protocols/VKontakte/src/resource.h1
-rw-r--r--protocols/VKontakte/src/stdafx.h1
-rw-r--r--protocols/VKontakte/src/version.h2
-rw-r--r--protocols/VKontakte/src/vk_messages.cpp3
-rw-r--r--protocols/VKontakte/src/vk_options.cpp16
-rw-r--r--protocols/VKontakte/src/vk_pollserver.cpp8
-rw-r--r--protocols/VKontakte/src/vk_proto.cpp3
-rw-r--r--protocols/VKontakte/src/vk_proto.h5
-rw-r--r--protocols/VKontakte/src/vk_thread.cpp4
11 files changed, 82 insertions, 23 deletions
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 <http://www.gnu.org/licenses/>.
#include <m_messagestate.h>
#include <m_popup.h>
#include <m_folders.h>
+#include <m_metacontacts.h>
#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 <stdver.h>
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<CVkProto>
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)