diff options
Diffstat (limited to 'protocols/WhatsApp/src/avatars.cpp')
-rw-r--r-- | protocols/WhatsApp/src/avatars.cpp | 43 |
1 files changed, 27 insertions, 16 deletions
diff --git a/protocols/WhatsApp/src/avatars.cpp b/protocols/WhatsApp/src/avatars.cpp index f7f97de7ea..d2eda4014a 100644 --- a/protocols/WhatsApp/src/avatars.cpp +++ b/protocols/WhatsApp/src/avatars.cpp @@ -7,45 +7,47 @@ Copyright © 2019-22 George Hazan #include "stdafx.h" -void WhatsAppProto::OnGetAvatarInfo(const JSONNode &root, void *pUserInfo) +void WhatsAppProto::OnIqGetAvatar(const WANode &node) { - if (!root) return; - - MCONTACT hContact = (UINT_PTR)pUserInfo; + auto *pUser = FindUser(node.getAttr("from")); + if (pUser == nullptr) + return; PROTO_AVATAR_INFORMATION ai = {}; - ai.hContact = hContact; + ai.hContact = pUser->hContact; ai.format = PA_FORMAT_JPEG; - wcsncpy_s(ai.filename, GetAvatarFileName(hContact), _TRUNCATE); + wcsncpy_s(ai.filename, GetAvatarFileName(pUser->hContact), _TRUNCATE); - DWORD dwLastChangeTime = _wtoi(root["tag"].as_mstring()); + auto *pNode = node.getChild("picture"); - CMStringA szUrl(root["eurl"].as_mstring()); + DWORD dwLastChangeTime = pNode->getAttrInt("id"); + + CMStringA szUrl(pNode->getAttr("url")); if (szUrl.IsEmpty()) { - setDword(hContact, DBKEY_AVATAR_TAG, 0); // avatar doesn't exist, don't check it later + setDword(pUser->hContact, DBKEY_AVATAR_TAG, 0); // avatar doesn't exist, don't check it later LBL_Error: - ProtoBroadcastAck(hContact, ACKTYPE_AVATAR, ACKRESULT_FAILED, HANDLE(&ai)); + ProtoBroadcastAck(pUser->hContact, ACKTYPE_AVATAR, ACKRESULT_FAILED, HANDLE(&ai)); return; } // if avatar was changed or not present at all, download it - if (dwLastChangeTime > getDword(hContact, DBKEY_AVATAR_TAG)) { + if (dwLastChangeTime > getDword(pUser->hContact, DBKEY_AVATAR_TAG)) { if (!g_plugin.SaveFile(szUrl, ai)) goto LBL_Error; // set timestamp of avatar being saved - setDword(hContact, DBKEY_AVATAR_TAG, dwLastChangeTime); + setDword(pUser->hContact, DBKEY_AVATAR_TAG, dwLastChangeTime); } - ProtoBroadcastAck(hContact, ACKTYPE_AVATAR, ACKRESULT_SUCCESS, HANDLE(&ai)); + ProtoBroadcastAck(pUser->hContact, ACKTYPE_AVATAR, ACKRESULT_SUCCESS, HANDLE(&ai)); } INT_PTR WhatsAppProto::GetAvatarInfo(WPARAM wParam, LPARAM lParam) { PROTO_AVATAR_INFORMATION *pai = (PROTO_AVATAR_INFORMATION*)lParam; - ptrA id(getStringA(pai->hContact, isChatRoom(pai->hContact) ? "ChatRoomID" : DBKEY_ID)); - if (id == NULL) + ptrA jid(getStringA(pai->hContact, isChatRoom(pai->hContact) ? "ChatRoomID" : DBKEY_ID)); + if (jid == NULL) return GAIR_NOAVATAR; CMStringW tszFileName(GetAvatarFileName(pai->hContact)); @@ -55,7 +57,7 @@ INT_PTR WhatsAppProto::GetAvatarInfo(WPARAM wParam, LPARAM lParam) DWORD dwTag = getDword(pai->hContact, DBKEY_AVATAR_TAG, -1); if (dwTag == -1 || (wParam & GAIF_FORCE) != 0) if (pai->hContact != NULL && isOnline()) { - // WSSend(CMStringA(FORMAT, "[\"query\",\"ProfilePicThumb\",\"%s\"]", id.get()), &WhatsAppProto::OnGetAvatarInfo, (void*)pai->hContact); + ServerFetchAvatar(jid); return GAIR_WAITFOR; } @@ -117,6 +119,15 @@ INT_PTR WhatsAppProto::SetMyAvatar(WPARAM, LPARAM) ///////////////////////////////////////////////////////////////////////////////////////// +void WhatsAppProto::ServerFetchAvatar(const char *jid) +{ + WANodeIq iq(IQ::GET, "w:profile:picture", jid); + *iq.addChild("picture") << CHAR_PARAM("type", "preview") << CHAR_PARAM("query", "url"); + WSSendNode(iq, &WhatsAppProto::OnIqGetAvatar); +} + +///////////////////////////////////////////////////////////////////////////////////////// + bool CMPlugin::SaveFile(const char *pszUrl, PROTO_AVATAR_INFORMATION &ai) { NETLIBHTTPREQUEST req = {}; |