summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--protocols/VKontakte/res/resource.rc1
-rw-r--r--protocols/VKontakte/src/misc.cpp13
-rw-r--r--protocols/VKontakte/src/resource.h5
-rw-r--r--protocols/VKontakte/src/version.h2
-rw-r--r--protocols/VKontakte/src/vk_feed.cpp23
-rw-r--r--protocols/VKontakte/src/vk_options.cpp4
-rw-r--r--protocols/VKontakte/src/vk_options.h1
-rw-r--r--protocols/VKontakte/src/vk_proto.h3
-rw-r--r--protocols/VKontakte/src/vk_struct.cpp2
-rw-r--r--protocols/VKontakte/src/vk_struct.h12
-rw-r--r--protocols/VKontakte/src/vk_thread.cpp3
11 files changed, 57 insertions, 12 deletions
diff --git a/protocols/VKontakte/res/resource.rc b/protocols/VKontakte/res/resource.rc
index 3001e246fa..7d5d902c4b 100644
--- a/protocols/VKontakte/res/resource.rc
+++ b/protocols/VKontakte/res/resource.rc
@@ -231,6 +231,7 @@ BEGIN
CONTROL "Invites",IDC_N_INVITES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,217,129,10
CONTROL "Reposts",IDC_N_REPOSTS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,154,195,129,10
CONTROL "Mentions in comments",IDC_N_MENTIONS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,154,206,129,10
+ CONTROL "Accepted friend requests",IDC_N_FRIENDACCEPTED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,154,217,129,10
END
IDD_ACCMGRUI DIALOGEX 0, 0, 186, 68
diff --git a/protocols/VKontakte/src/misc.cpp b/protocols/VKontakte/src/misc.cpp
index a075efef8f..b2d05a04e1 100644
--- a/protocols/VKontakte/src/misc.cpp
+++ b/protocols/VKontakte/src/misc.cpp
@@ -496,21 +496,22 @@ void CVkProto::ApplyCookies(AsyncHttpRequest *pReq)
void __cdecl CVkProto::DBAddAuthRequestThread(void *p)
{
- MCONTACT hContact = (UINT_PTR)p;
- if (hContact == NULL || hContact == INVALID_CONTACT_ID || !IsOnline())
+ CVkDBAddAuthRequestThreadParam *param = (CVkDBAddAuthRequestThreadParam *)p;
+ if (param->hContact == NULL || param->hContact == INVALID_CONTACT_ID || !IsOnline())
return;
- for (int i = 0; i < MAX_RETRIES && IsEmpty(ptrT(db_get_tsa(hContact, m_szModuleName, "Nick"))); i++) {
+ for (int i = 0; i < MAX_RETRIES && IsEmpty(ptrT(db_get_tsa(param->hContact, m_szModuleName, "Nick"))); i++) {
Sleep(1500);
if (!IsOnline())
return;
}
- DBAddAuthRequest(hContact);
+ DBAddAuthRequest(param->hContact, param->bAdded);
+ delete param;
}
-void CVkProto::DBAddAuthRequest(const MCONTACT hContact)
+void CVkProto::DBAddAuthRequest(const MCONTACT hContact, bool added)
{
debugLogA("CVkProto::DBAddAuthRequest");
@@ -524,7 +525,7 @@ void CVkProto::DBAddAuthRequest(const MCONTACT hContact)
dbei.szModule = m_szModuleName;
dbei.timestamp = (DWORD)time(NULL);
dbei.flags = DBEF_UTF;
- dbei.eventType = EVENTTYPE_AUTHREQUEST;
+ dbei.eventType = added ? EVENTTYPE_ADDED: EVENTTYPE_AUTHREQUEST;
dbei.cbBlob = (DWORD)(sizeof(DWORD) * 2 + mir_strlen(szNick) + mir_strlen(szFirstName) + mir_strlen(szLastName) + 5);
PBYTE pCurBlob = dbei.pBlob = (PBYTE)mir_alloc(dbei.cbBlob);
diff --git a/protocols/VKontakte/src/resource.h b/protocols/VKontakte/src/resource.h
index b5c9ec2042..e5db19f100 100644
--- a/protocols/VKontakte/src/resource.h
+++ b/protocols/VKontakte/src/resource.h
@@ -1,6 +1,6 @@
//{{NO_DEPENDENCIES}}
// Включаемый файл, созданный в Microsoft Visual C++.
-// Используется D:\svn\protocols\VKontakte\res\resource.rc
+// Используется d:\svn\protocols\VKontakte\res\resource.rc
//
#define IDOPENBROWSER 3
#define IDD_ACCMGRUI 101
@@ -123,6 +123,7 @@
#define IDC_SHOW_MENU6 1107
#define IDC_COMBO_MARKASREAD 1108
#define IDC_COMBO_SYNCHISTORY 1109
+#define IDC_N_FRIENDACCEPTED 1110
// Next default values for new objects
//
@@ -131,7 +132,7 @@
#define _APS_NO_MFC 1
#define _APS_NEXT_RESOURCE_VALUE 123
#define _APS_NEXT_COMMAND_VALUE 40001
-#define _APS_NEXT_CONTROL_VALUE 1110
+#define _APS_NEXT_CONTROL_VALUE 1111
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
diff --git a/protocols/VKontakte/src/version.h b/protocols/VKontakte/src/version.h
index 4709f99e49..e5c54ccf68 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 0
+#define __BUILD_NUM 1
#include <stdver.h>
diff --git a/protocols/VKontakte/src/vk_feed.cpp b/protocols/VKontakte/src/vk_feed.cpp
index 4aac6e56ac..c889c12705 100644
--- a/protocols/VKontakte/src/vk_feed.cpp
+++ b/protocols/VKontakte/src/vk_feed.cpp
@@ -466,6 +466,11 @@ CVKNewsItem* CVkProto::GetVkNotificationsItem(const JSONNode &jnItem, OBJLIST<CV
const JSONNode &jnFeedback = jnItem["feedback"];
const JSONNode &jnParent = jnItem["parent"];
+ if (m_vkOptions.bNotificationFilterAcceptedFriends && tszType == _T("friend_accepted") && jnFeedback && vkFeedbackType == VKObjType::vkUsers) {
+ OnFriendAccepted(jnFeedback);
+ return NULL;
+ }
+
if (!jnFeedback || !jnParent)
return NULL;
@@ -503,6 +508,24 @@ CVKNewsItem* CVkProto::GetVkNotificationsItem(const JSONNode &jnItem, OBJLIST<CV
return NULL;
}
+void CVkProto::OnFriendAccepted(const JSONNode & jnFeedback)
+{
+ const JSONNode &jnUsers = jnFeedback["items"];
+
+ for (auto it = jnUsers.begin(); it != jnUsers.end(); ++it) {
+ const JSONNode &jnUserItem = (*it);
+ if (!jnUserItem["from_id"])
+ continue;
+
+ LONG iUserId = jnUserItem["from_id"].as_int();
+ MCONTACT hContact = FindUser(iUserId, true);
+
+ RetrieveUserInfo(iUserId);
+ CVkDBAddAuthRequestThreadParam *param = new CVkDBAddAuthRequestThreadParam(hContact, true);
+ ForkThread(&CVkProto::DBAddAuthRequestThread, (void *)param);
+ }
+}
+
CVKNewsItem* CVkProto::GetVkGroupInvates(const JSONNode &jnItem, OBJLIST<CVkUserInfo> &vkUsers)
{
debugLogA("CVkProto::GetVkGroupInvates");
diff --git a/protocols/VKontakte/src/vk_options.cpp b/protocols/VKontakte/src/vk_options.cpp
index f0ea304234..096599c20a 100644
--- a/protocols/VKontakte/src/vk_options.cpp
+++ b/protocols/VKontakte/src/vk_options.cpp
@@ -314,7 +314,8 @@ CVkOptionFeedsForm::CVkOptionFeedsForm(CVkProto *proto):
m_cbNotificationFilterLikes(this, IDC_N_LIKES),
m_cbNotificationFilterReposts(this, IDC_N_REPOSTS),
m_cbNotificationFilterMentions(this, IDC_N_MENTIONS),
- m_cbNotificationFilterInvites(this, IDC_N_INVITES)
+ m_cbNotificationFilterInvites(this, IDC_N_INVITES),
+ m_cbNotificationFilterAcceptedFriends(this, IDC_N_FRIENDACCEPTED)
{
CreateLink(m_cbNewsEnabled, m_proto->m_vkOptions.bNewsEnabled);
CreateLink(m_edtNewsInterval, m_proto->m_vkOptions.iNewsInterval);
@@ -338,6 +339,7 @@ CVkOptionFeedsForm::CVkOptionFeedsForm(CVkProto *proto):
CreateLink(m_cbNotificationFilterReposts, m_proto->m_vkOptions.bNotificationFilterReposts);
CreateLink(m_cbNotificationFilterMentions, m_proto->m_vkOptions.bNotificationFilterMentions);
CreateLink(m_cbNotificationFilterInvites, m_proto->m_vkOptions.bNotificationFilterInvites);
+ CreateLink(m_cbNotificationFilterAcceptedFriends, m_proto->m_vkOptions.bNotificationFilterAcceptedFriends);
m_cbNewsEnabled.OnChange = Callback(this, &CVkOptionFeedsForm::On_cbNewsEnabledChange);
m_cbNotificationsEnabled.OnChange = Callback(this, &CVkOptionFeedsForm::On_cbNotificationsEnabledChange);
diff --git a/protocols/VKontakte/src/vk_options.h b/protocols/VKontakte/src/vk_options.h
index 3bb05c6efd..52bb746b0c 100644
--- a/protocols/VKontakte/src/vk_options.h
+++ b/protocols/VKontakte/src/vk_options.h
@@ -133,6 +133,7 @@ class CVkOptionFeedsForm : public CVkDlgBase
CCtrlCheck m_cbNotificationFilterReposts;
CCtrlCheck m_cbNotificationFilterMentions;
CCtrlCheck m_cbNotificationFilterInvites;
+ CCtrlCheck m_cbNotificationFilterAcceptedFriends;
public:
CVkOptionFeedsForm(CVkProto *proto);
diff --git a/protocols/VKontakte/src/vk_proto.h b/protocols/VKontakte/src/vk_proto.h
index 0ad602b9c5..f9af337d48 100644
--- a/protocols/VKontakte/src/vk_proto.h
+++ b/protocols/VKontakte/src/vk_proto.h
@@ -267,6 +267,7 @@ private:
CVKNewsItem* GetVkNewsItem(const JSONNode &jnItem, OBJLIST<CVkUserInfo> &vkUsers, bool isRepost = false);
CVKNewsItem* GetVkGroupInvates(const JSONNode &jnItem, OBJLIST<CVkUserInfo> &vkUsers);
CVKNewsItem* GetVkNotificationsItem(const JSONNode &jnItem, OBJLIST<CVkUserInfo> &vkUsers);
+ void OnFriendAccepted(const JSONNode &jnFeedback);
CMString GetVkFeedback(const JSONNode &jnFeedback, VKObjType vkFeedbackType, OBJLIST<CVkUserInfo> &vkUsers, CVkUserInfo *vkUser);
CVKNewsItem* GetVkParent(const JSONNode &jnParent, VKObjType vkParentType, LPCTSTR ptszReplyText = NULL, LPCTSTR ptszReplyLink = NULL);
void RetrieveUnreadNews(time_t tLastNewsTime);
@@ -329,7 +330,7 @@ private:
void GrabCookies(NETLIBHTTPREQUEST *nhr);
void ApplyCookies(AsyncHttpRequest*);
void __cdecl DBAddAuthRequestThread(void *p);
- void DBAddAuthRequest(const MCONTACT hContact);
+ void DBAddAuthRequest(const MCONTACT hContact, bool bAdded = false);
MCONTACT MContactFromDbEvent(MEVENT hDbEvent);
void SetMirVer(MCONTACT hContact, int platform);
void __cdecl ContactTypingThread(void *p);
diff --git a/protocols/VKontakte/src/vk_struct.cpp b/protocols/VKontakte/src/vk_struct.cpp
index 8abcc68bb9..f5f4493a48 100644
--- a/protocols/VKontakte/src/vk_struct.cpp
+++ b/protocols/VKontakte/src/vk_struct.cpp
@@ -202,6 +202,8 @@ CVKOptions::CVKOptions(PROTO_INTERFACE *proto) :
bNotificationFilterReposts(proto, "NotificationFilterReposts", true),
bNotificationFilterMentions(proto, "NotificationFilterMentions", true),
bNotificationFilterInvites(proto, "NotificationFilterInvites", true),
+ bNotificationFilterAcceptedFriends(proto, "NotificationFilterAcceptedFriends", true),
+
bUseNonStandardNotifications(proto, "UseNonStandardNotifications", false),
bUseNonStandardUrlEncode(proto, "UseNonStandardUrlEncode", true),
bShortenLinksForAudio(proto, "ShortenLinksForAudio", true),
diff --git a/protocols/VKontakte/src/vk_struct.h b/protocols/VKontakte/src/vk_struct.h
index 2f2116da87..d8ef6f4104 100644
--- a/protocols/VKontakte/src/vk_struct.h
+++ b/protocols/VKontakte/src/vk_struct.h
@@ -118,6 +118,17 @@ struct CVkSendMsgParam : public MZeroedObject
CVkFileUploadParam *pFUP;
};
+struct CVkDBAddAuthRequestThreadParam : public MZeroedObject
+{
+ CVkDBAddAuthRequestThreadParam(MCONTACT _hContact, bool _bAdded) :
+ hContact(_hContact),
+ bAdded(_bAdded)
+ {}
+
+ MCONTACT hContact;
+ bool bAdded;
+};
+
struct CVkChatMessage : public MZeroedObject
{
CVkChatMessage(int _id) :
@@ -316,6 +327,7 @@ struct CVKOptions {
CMOption<BYTE> bNotificationFilterReposts;
CMOption<BYTE> bNotificationFilterMentions;
CMOption<BYTE> bNotificationFilterInvites;
+ CMOption<BYTE> bNotificationFilterAcceptedFriends;
CMOption<BYTE> bUseNonStandardNotifications;
CMOption<BYTE> bUseNonStandardUrlEncode;
CMOption<BYTE> bShortenLinksForAudio;
diff --git a/protocols/VKontakte/src/vk_thread.cpp b/protocols/VKontakte/src/vk_thread.cpp
index 2430e21a15..14a21a619e 100644
--- a/protocols/VKontakte/src/vk_thread.cpp
+++ b/protocols/VKontakte/src/vk_thread.cpp
@@ -581,7 +581,8 @@ void CVkProto::OnReceiveUserInfo(NETLIBHTTPREQUEST *reply, AsyncHttpRequest *pRe
if (!getBool(hContact, "ReqAuth")) {
RetrieveUserInfo(userid);
setByte(hContact, "ReqAuth", 1);
- ForkThread(&CVkProto::DBAddAuthRequestThread, (void *)hContact);
+ CVkDBAddAuthRequestThreadParam *param = new CVkDBAddAuthRequestThreadParam(hContact, false);
+ ForkThread(&CVkProto::DBAddAuthRequestThread, (void *)param);
}
}
}