diff options
Diffstat (limited to 'protocols')
-rw-r--r-- | protocols/WhatsAppWeb/src/chats.cpp | 66 | ||||
-rw-r--r-- | protocols/WhatsAppWeb/src/proto.h | 2 |
2 files changed, 67 insertions, 1 deletions
diff --git a/protocols/WhatsAppWeb/src/chats.cpp b/protocols/WhatsAppWeb/src/chats.cpp index e5d4fa89a4..f674dc3f5c 100644 --- a/protocols/WhatsAppWeb/src/chats.cpp +++ b/protocols/WhatsAppWeb/src/chats.cpp @@ -9,11 +9,75 @@ Copyright © 2019 George Hazan void WhatsAppProto::InitChat(WAUser *pUser, const WANode *pRoot) { - CMStringW wszId(Utf2T(pRoot->getAttr("jid"))), wszNick(Utf2T(pRoot->getAttr("name"))); + CMStringA jid = pRoot->getAttr("jid"); + CMStringW wszId(Utf2T(jid.c_str())), wszNick(Utf2T(pRoot->getAttr("name"))); setWString(pUser->hContact, "Nick", wszNick); pUser->si = Chat_NewSession(GCW_CHATROOM, m_szModuleName, wszId, wszNick); + + Chat_AddGroup(pUser->si, TranslateT("Owner")); + Chat_AddGroup(pUser->si, TranslateT("SuperAdmin")); + Chat_AddGroup(pUser->si, TranslateT("Admin")); + Chat_AddGroup(pUser->si, TranslateT("Participant")); + Chat_Control(m_szModuleName, wszId, m_bHideGroupchats ? WINDOW_HIDDEN : SESSION_INITDONE); Chat_Control(m_szModuleName, wszId, SESSION_ONLINE); + + if (!pUser->bInited) { + CMStringA query(FORMAT, "[\"query\",\"GroupMetadata\",\"%s\"]", jid.c_str()); + WSSend(query, &WhatsAppProto::OnGetChatInfo, pUser); + } +} + +void WhatsAppProto::OnGetChatInfo(const JSONNode &root, void *param) +{ + auto *pChatUser = (WAUser *)param; + pChatUser->bInited = true; + + CMStringW wszOwner(root["owner"].as_mstring()), wszNick; + + for (auto &it : root["participants"]) { + CMStringW jid(it["id"].as_mstring()); + CMStringA szJid(jid); + + GCEVENT gce = { m_szModuleName, 0, GC_EVENT_JOIN }; + gce.pszID.w = pChatUser->si->ptszID; + gce.pszUID.w = jid; + gce.bIsMe = (szJid == m_szJid); + + if (jid == wszOwner) + gce.pszStatus.w = L"Owner"; + else if (it["isSuperAdmin"].as_bool()) + gce.pszStatus.w = L"SuperAdmin"; + else if (it["isAdmin"].as_bool()) + gce.pszStatus.w = L"Admin"; + else + gce.pszStatus.w = L"Participant"; + + if (gce.bIsMe) + wszNick = getMStringW(DBKEY_NICK); + else if (auto *pUser = FindUser(szJid)) + wszNick = Clist_GetContactDisplayName(pUser->hContact); + else { + int iPos = jid.Find('@'); + wszNick = (iPos != -1) ? jid.Left(iPos - 1) : jid; + } + + gce.pszNick.w = wszNick; + Chat_Event(&gce); + } + + CMStringW wszSubject(root["subject"].as_mstring()); + if (!wszSubject.IsEmpty()) { + time_t iSubjectTime(root["subjectTime"].as_int()); + CMStringW wszSubjectSet(root["subjectOwner"].as_mstring()); + + GCEVENT gce = { m_szModuleName, 0, GC_EVENT_TOPIC }; + gce.pszID.w = pChatUser->si->ptszID; + gce.pszUID.w = wszSubjectSet; + gce.pszText.w = wszSubject; + gce.time = iSubjectTime; + Chat_Event(&gce); + } } diff --git a/protocols/WhatsAppWeb/src/proto.h b/protocols/WhatsAppWeb/src/proto.h index f3e574b804..878d664c54 100644 --- a/protocols/WhatsAppWeb/src/proto.h +++ b/protocols/WhatsAppWeb/src/proto.h @@ -87,6 +87,7 @@ struct WAUser MCONTACT hContact; DWORD dwModifyTag; char *szId; + bool bInited = false; SESSION_INFO *si = 0; DWORD m_time1 = 0, m_time2 = 0; }; @@ -183,6 +184,7 @@ class WhatsAppProto : public PROTO<WhatsAppProto> /// Request handlers /////////////////////////////////////////////////////////////////// void OnGetAvatarInfo(const JSONNode &node, void*); + void OnGetChatInfo(const JSONNode &node, void*); void OnRestoreSession1(const JSONNode &node, void*); void OnRestoreSession2(const JSONNode &node, void*); void OnSendMessage(const JSONNode &node, void*); |