From 2f1ab0e9f068ad2ebfe3f483725aac5bc79f7383 Mon Sep 17 00:00:00 2001 From: Sergey Bolhovskoy Date: Tue, 30 Sep 2014 10:41:38 +0000 Subject: VKontakte: basic MirVer support fix copy-paste bug git-svn-id: http://svn.miranda-ng.org/main/trunk@10648 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- protocols/VKontakte/src/misc.cpp | 49 +++++++++++++++++++++++++++++++++++ protocols/VKontakte/src/vk_proto.h | 2 ++ protocols/VKontakte/src/vk_thread.cpp | 34 +++++++++++++++++++----- 3 files changed, 78 insertions(+), 7 deletions(-) (limited to 'protocols') diff --git a/protocols/VKontakte/src/misc.cpp b/protocols/VKontakte/src/misc.cpp index 845706004f..4c7244265c 100644 --- a/protocols/VKontakte/src/misc.cpp +++ b/protocols/VKontakte/src/misc.cpp @@ -408,4 +408,53 @@ MCONTACT CVkProto::MContactFromDbEvent(HANDLE hDbEvent) MCONTACT hContact = DbGetAuthEventContact(&dbei); db_unset(hContact, m_szModuleName, "ReqAuth"); return hContact; +} + +void CVkProto::SetMirVer(MCONTACT hContact, int platform) +{ + if (hContact == NULL || hContact == -1) + return; + if (platform == -1){ + db_unset(hContact, m_szModuleName, "MirVer"); + return; + } + + CMString MirVer, OldMirVer; + OldMirVer = db_get_sa(hContact, m_szModuleName, "MirVer"); + if (platform == VK_APP_ID) + MirVer = "Miranda NG VKontakte"; + else + switch (platform){ + case 1: + MirVer = "VKontakte Mobile"; + break; + case 2: + MirVer = "VKontakte iPhone"; + break; + case 3: + MirVer = "VKontakte iPad"; + break; + case 4: + MirVer = "VKontakte Android"; + break; + case 5: + MirVer = "VKontakte WPhone"; + break; + case 6: + MirVer = "VKontakte Windows"; + break; // Official app for Windows 8.X + case 7: + MirVer = "VKontakte WEB"; + break; + default: + MirVer = "VKontakte UnknownApp"; + } + + if (OldMirVer != MirVer) + if (OldMirVer.IsEmpty() + || (OldMirVer == "VKontakte UnknownApp") + || (platform == 7) + || (platform == 1) + || (platform == VK_APP_ID)) + setTString(hContact, "MirVer", MirVer.GetBuffer()); } \ No newline at end of file diff --git a/protocols/VKontakte/src/vk_proto.h b/protocols/VKontakte/src/vk_proto.h index ba5db0edc7..d5352338dc 100644 --- a/protocols/VKontakte/src/vk_proto.h +++ b/protocols/VKontakte/src/vk_proto.h @@ -275,6 +275,8 @@ struct CVkProto : public PROTO __forceinline LPCTSTR getGroup() const { return m_defaultGroup; } __forceinline void setGroup(LPCTSTR grp) { m_defaultGroup = mir_tstrdup(grp); } + void SetMirVer(MCONTACT hContact, int platform); + static UINT_PTR m_timer; private: diff --git a/protocols/VKontakte/src/vk_thread.cpp b/protocols/VKontakte/src/vk_thread.cpp index aa563a843b..86d12c6547 100644 --- a/protocols/VKontakte/src/vk_thread.cpp +++ b/protocols/VKontakte/src/vk_thread.cpp @@ -279,7 +279,7 @@ MCONTACT CVkProto::SetContactInfo(JSONNODE* pItem, bool flag) setByte(hContact, "Gender", sex == 2 ? 'M' : 'F'); tszValue = json_as_string(json_get(pItem, "bdate")); - if (!tszNick.IsEmpty()) { + if (!tszValue.IsEmpty()) { int d, m, y, iReadCount; iReadCount = _stscanf(tszValue.GetBuffer(), L"%d.%d.%d", &d, &m, &y); if (iReadCount> 1) { @@ -291,7 +291,7 @@ MCONTACT CVkProto::SetContactInfo(JSONNODE* pItem, bool flag) } tszValue = json_as_string(json_get(pItem, "photo_100")); - if (!tszNick.IsEmpty()){ + if (!tszValue.IsEmpty()){ SetAvatarUrl(hContact, tszValue.GetBuffer()); ReloadAvatarInfo(hContact); } @@ -300,14 +300,31 @@ MCONTACT CVkProto::SetContactInfo(JSONNODE* pItem, bool flag) if (getWord(hContact, "Status", 0) != iNewStatus) setWord(hContact, "Status", iNewStatus); + if (iNewStatus == ID_STATUS_ONLINE){ + int online_app = _ttoi(json_as_string(json_get(pItem, "online_app"))); + int online_mobile = json_as_int(json_get(pItem, "online_mobile")); + if (online_mobile == 1){ + if (online_app == VK_APP_ID) + SetMirVer(hContact, VK_APP_ID); // Miranda NG + if (online_app == 0) + SetMirVer(hContact, 1); // m.vk.com + else + SetMirVer(hContact, 0); // other mobile app + } + else + SetMirVer(hContact, 7); // vk.com + } + else + SetMirVer(hContact, -1); // unset MinVer + if ((iValue = json_as_int(json_get(pItem, "timezone"))) != 0) setByte(hContact, "Timezone", iValue * -2); tszValue = json_as_string(json_get(pItem, "mobile_phone")); - if (!tszNick.IsEmpty()) + if (!tszValue.IsEmpty()) setTString(hContact, "Cellular", tszValue.GetBuffer()); tszValue = json_as_string(json_get(pItem, "home_phone")); - if (!tszNick.IsEmpty()) + if (!tszValue.IsEmpty()) setTString(hContact, "Phone", tszValue.GetBuffer()); tszValue = json_as_string(json_get(pItem, "status")); @@ -321,11 +338,12 @@ MCONTACT CVkProto::SetContactInfo(JSONNODE* pItem, bool flag) } tszValue = json_as_string(json_get(pItem, "about")); - if (!tszNick.IsEmpty()) + + if (!tszValue.IsEmpty()) setTString(hContact, "About", tszValue.GetBuffer()); tszValue = json_as_string(json_get(pItem, "domain")); - if (!tszNick.IsEmpty()) + if (!tszValue.IsEmpty()) setTString(hContact, "domain", tszValue.GetBuffer()); return hContact; @@ -1026,7 +1044,7 @@ void CVkProto::PollUpdates(JSONNODE *pUpdates) debugLogA("CVkProto::PollUpdates"); CMStringA mids; - int msgid, uid, flags; + int msgid, uid, flags, platform; MCONTACT hContact; JSONNODE *pChild; @@ -1050,6 +1068,8 @@ void CVkProto::PollUpdates(JSONNODE *pUpdates) uid = -json_as_int(json_at(pChild, 1)); if ((hContact = FindUser(uid)) != NULL) setWord(hContact, "Status", ID_STATUS_ONLINE); + platform = json_as_int(json_at(pChild, 2)); + SetMirVer(hContact, platform); break; case VKPOLL_USR_OFFLINE: -- cgit v1.2.3