From a93165ff101c6cdfab9ef9b8b85a0436ebc0d7de Mon Sep 17 00:00:00 2001 From: Sergey Bolhovskoy Date: Mon, 16 Feb 2015 06:43:40 +0000 Subject: =?UTF-8?q?VKontakte:=20=E2=80=98force=20online=E2=80=99=20change?= =?UTF-8?q?=20to=20=E2=80=98force=20invisible=E2=80=99=20add=20=E2=80=98In?= =?UTF-8?q?visible=20interval=20timeout=E2=80=99=20options=20fix=20for=20r?= =?UTF-8?q?e-set=20status=20message=20when=20change=20status=20invisible?= =?UTF-8?q?=20<=3D>=20offline=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@12139 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- protocols/VKontakte/src/misc.cpp | 11 +++++++++++ protocols/VKontakte/src/resource.h | 4 +++- protocols/VKontakte/src/version.h | 2 +- protocols/VKontakte/src/vk_options.cpp | 15 +++++++++++++++ protocols/VKontakte/src/vk_proto.cpp | 1 + protocols/VKontakte/src/vk_proto.h | 5 ++++- protocols/VKontakte/src/vk_thread.cpp | 25 +++++++++++++++++-------- 7 files changed, 52 insertions(+), 11 deletions(-) (limited to 'protocols/VKontakte/src') diff --git a/protocols/VKontakte/src/misc.cpp b/protocols/VKontakte/src/misc.cpp index f29488d1a2..71c109a042 100644 --- a/protocols/VKontakte/src/misc.cpp +++ b/protocols/VKontakte/src/misc.cpp @@ -1136,4 +1136,15 @@ CMString CVkProto::GetFwdMessages(JSONNODE *pMessages, BBCSupport iBBC) } return res; +} + +///////////////////////////////////////////////////////////////////////////////////////// + +void CVkProto::SetInvisible(MCONTACT hContact) +{ + if (getWord(hContact, "Status", ID_STATUS_OFFLINE) == ID_STATUS_OFFLINE) { + setWord(hContact, "Status", ID_STATUS_INVISIBLE); + SetMirVer(hContact, 1); + } + setDword(hContact, "InvisibleTS", time(NULL)); } \ No newline at end of file diff --git a/protocols/VKontakte/src/resource.h b/protocols/VKontakte/src/resource.h index bba391dc78..3d12fda3a5 100644 --- a/protocols/VKontakte/src/resource.h +++ b/protocols/VKontakte/src/resource.h @@ -94,6 +94,8 @@ #define IDC_ATTBBC_ADV 1086 #define IDC_BBC_ATT_NEWS 1087 #define IDC_USENOSTDURLENCODE 1088 +#define IDC_ED_INT_INVIS 1089 +#define IDC_SPIN_INT_INVIS 1090 // Next default values for new objects // @@ -102,7 +104,7 @@ #define _APS_NO_MFC 1 #define _APS_NEXT_RESOURCE_VALUE 119 #define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1089 +#define _APS_NEXT_CONTROL_VALUE 1091 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif diff --git a/protocols/VKontakte/src/version.h b/protocols/VKontakte/src/version.h index 297890e4f4..12403c908a 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 0 -#define __BUILD_NUM 46 +#define __BUILD_NUM 47 #include diff --git a/protocols/VKontakte/src/vk_options.cpp b/protocols/VKontakte/src/vk_options.cpp index 7ec03871e3..9ab932541a 100644 --- a/protocols/VKontakte/src/vk_options.cpp +++ b/protocols/VKontakte/src/vk_options.cpp @@ -257,10 +257,18 @@ INT_PTR CALLBACK CVkProto::OptionsAdvProc(HWND hwndDlg, UINT uMsg, WPARAM wParam CheckDlgButton(hwndDlg, IDC_SEND_MUSIC_STATUS, (ppro->m_iMusicSendMetod == sendStatusOnly) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_SEND_MUSIC_BROADCAST_AND_STATUS, (ppro->m_iMusicSendMetod == sendBroadcastAndStatus) ? BST_CHECKED : BST_UNCHECKED); + SendDlgItemMessage(hwndDlg, IDC_SPIN_INT_INVIS, UDM_SETRANGE, 0, MAKELONG(60, 0)); + SendDlgItemMessage(hwndDlg, IDC_SPIN_INT_INVIS, UDM_SETPOS, 0, ppro->m_iInvisibleInterval); + return TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { + case IDC_ED_INT_INVIS: + if ((HWND)lParam == GetFocus() && (HIWORD(wParam) == EN_CHANGE)) + SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + break; + case IDC_HIDECHATS: case IDC_MESASUREAD: case IDC_FORCE_ONLINE_ON_ACT: @@ -280,6 +288,9 @@ INT_PTR CALLBACK CVkProto::OptionsAdvProc(HWND hwndDlg, UINT uMsg, WPARAM wParam break; case WM_NOTIFY: + if (((LPNMHDR)lParam)->code == UDN_DELTAPOS) + SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + if (((LPNMHDR)lParam)->code == PSN_APPLY) { ppro->m_bHideChats = IsDlgButtonChecked(hwndDlg, IDC_HIDECHATS) == BST_CHECKED; ppro->setByte("HideChats", ppro->m_bHideChats); @@ -317,6 +328,10 @@ INT_PTR CALLBACK CVkProto::OptionsAdvProc(HWND hwndDlg, UINT uMsg, WPARAM wParam CMStringA szListeningTo(ppro->m_szModuleName); szListeningTo += "Enabled"; db_set_b(NULL, "ListeningTo", szListeningTo.GetBuffer(), ppro->m_iMusicSendMetod == 0 ? 0 : 1); + + TCHAR buffer[5] = { 0 }; + GetDlgItemText(hwndDlg, IDC_ED_INT_INVIS, buffer, SIZEOF(buffer)); + ppro->setDword("InvisibleInterval", ppro->m_iInvisibleInterval = _ttoi(buffer)); } break; diff --git a/protocols/VKontakte/src/vk_proto.cpp b/protocols/VKontakte/src/vk_proto.cpp index 633056f5b0..eb156680b4 100644 --- a/protocols/VKontakte/src/vk_proto.cpp +++ b/protocols/VKontakte/src/vk_proto.cpp @@ -108,6 +108,7 @@ CVkProto::CVkProto(const char *szModuleName, const TCHAR *ptszUserName) : m_bNotificationFilterMentions = getBool("NotificationFilterMentions", true); m_bUseNonStandardUrlEncode = getBool("UseNonStandardUrlEncode", true); + m_iInvisibleInterval = getDword("InvisibleInterval", 10); m_bSetBroadcast = false; // Set all contacts offline -- in case we crashed diff --git a/protocols/VKontakte/src/vk_proto.h b/protocols/VKontakte/src/vk_proto.h index e70d399565..8bd95bdc02 100644 --- a/protocols/VKontakte/src/vk_proto.h +++ b/protocols/VKontakte/src/vk_proto.h @@ -423,6 +423,8 @@ struct CVkProto : public PROTO CMString GetAttachmentDescr(JSONNODE*, BBCSupport iBBC = bbcNo); CMString GetFwdMessages(JSONNODE *pMessages, BBCSupport iBBC = bbcNo); + void SetInvisible(MCONTACT hContact); + //==================================================================================== void RetrieveStatusMsg(const CMString &StatusMsg); @@ -592,7 +594,8 @@ private: int m_iNewsInterval, m_iNotificationsInterval, m_iNewsAutoClearHistoryInterval, - m_iMaxLoadNewsPhoto; + m_iMaxLoadNewsPhoto, + m_iInvisibleInterval; enum MarkMsgReadOn { markOnRead, markOnReceive, markOnReply, markOnTyping }; MarkMsgReadOn m_iMarkMessageReadOn; diff --git a/protocols/VKontakte/src/vk_thread.cpp b/protocols/VKontakte/src/vk_thread.cpp index 034cecd7e3..a0aadbfbdd 100644 --- a/protocols/VKontakte/src/vk_thread.cpp +++ b/protocols/VKontakte/src/vk_thread.cpp @@ -114,8 +114,10 @@ void CVkProto::SetServerStatus(int iNewStatus) ptrT ptszListeningToMsg(db_get_tsa(NULL, m_szModuleName, "ListeningTo")); if (iNewStatus == ID_STATUS_OFFLINE) { - if (!IsEmpty(ptszListeningToMsg) && m_bSetBroadcast) + if (!IsEmpty(ptszListeningToMsg) && m_bSetBroadcast) { RetrieveStatusMsg(oldStatusMsg); + m_bSetBroadcast = false; + } m_iStatus = ID_STATUS_OFFLINE; if (iOldStatus != ID_STATUS_OFFLINE && iOldStatus != ID_STATUS_INVISIBLE) Push(new AsyncHttpRequest(this, REQUEST_GET, "/method/account.setOffline.json", true, &CVkProto::OnReceiveSmth) @@ -127,8 +129,10 @@ void CVkProto::SetServerStatus(int iNewStatus) << VER_API); } else { - if (!IsEmpty(ptszListeningToMsg) && m_bSetBroadcast) + if (!IsEmpty(ptszListeningToMsg) && m_bSetBroadcast) { RetrieveStatusMsg(oldStatusMsg); + m_bSetBroadcast = false; + } m_iStatus = ID_STATUS_INVISIBLE; if (iOldStatus == ID_STATUS_ONLINE) Push(new AsyncHttpRequest(this, REQUEST_GET, "/method/account.setOffline.json", true, &CVkProto::OnReceiveSmth) @@ -467,9 +471,14 @@ void CVkProto::OnReceiveUserInfo(NETLIBHTTPREQUEST *reply, AsyncHttpRequest *pRe LONG userID = getDword(hContact, "ID", -1); if (userID == m_myUserId || userID == VK_FEED_USER) continue; - if (getWord(hContact, "Status", ID_STATUS_OFFLINE) != ID_STATUS_OFFLINE) + + int iContactStatus = getWord(hContact, "Status", ID_STATUS_OFFLINE); + + if ((iContactStatus == ID_STATUS_ONLINE) + || (iContactStatus == ID_STATUS_INVISIBLE && time(NULL) - getDword(hContact, "InvisibleTS", 0) >= m_iInvisibleInterval * 60)) { setWord(hContact, "Status", ID_STATUS_OFFLINE); - SetMirVer(hContact, -1); + SetMirVer(hContact, -1); + } db_unset(hContact, m_szModuleName, "ListeningTo"); } arContacts.destroy(); @@ -695,7 +704,7 @@ void CVkProto::OnReceiveMessages(NETLIBHTTPREQUEST *reply, AsyncHttpRequest *pRe if (isOut) recv.flags |= PREF_SENT; else if (m_bUserForceOnlineOnActivity) - setWord(hContact, "Status", ID_STATUS_ONLINE); + SetInvisible(hContact); recv.timestamp = m_bUseLocalTime ? time(NULL) : datetime; recv.tszMessage = ptszBody; @@ -843,7 +852,7 @@ void CVkProto::PollUpdates(JSONNODE *pUpdates) SetSrmmReadStatus(hContact); } if (m_bUserForceOnlineOnActivity) - setWord(hContact, "Status", ID_STATUS_ONLINE); + SetInvisible(hContact); } break; @@ -868,7 +877,7 @@ void CVkProto::PollUpdates(JSONNODE *pUpdates) setDword(hContact, "LastMsgReadTime", time(NULL)); SetSrmmReadStatus(hContact); if (m_bUserForceOnlineOnActivity) - setWord(hContact, "Status", ID_STATUS_ONLINE); + SetInvisible(hContact); } break; @@ -892,7 +901,7 @@ void CVkProto::PollUpdates(JSONNODE *pUpdates) if (hContact != NULL) { ForkThread(&CVkProto::ContactTypingThread, (void *)hContact); if (m_bUserForceOnlineOnActivity) - setWord(hContact, "Status", ID_STATUS_ONLINE); + SetInvisible(hContact); } break; -- cgit v1.2.3