summaryrefslogtreecommitdiff
path: root/protocols
diff options
context:
space:
mode:
Diffstat (limited to 'protocols')
-rw-r--r--protocols/WhatsAppWeb/src/chats.cpp66
-rw-r--r--protocols/WhatsAppWeb/src/proto.h2
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*);