From 6e2c04c2c7ea221afb58e71f6e99f2d0ed1c7781 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Sun, 25 Apr 2021 20:22:00 +0300 Subject: suddenly: major crutch to handle WhatsApp groupchats history --- protocols/WhatsAppWeb/src/chats.cpp | 16 ++++++++++++++++ protocols/WhatsAppWeb/src/proto.h | 10 +++++++++- protocols/WhatsAppWeb/src/server.cpp | 29 +++++++++++++++++++++-------- src/mir_app/src/chat_manager.cpp | 16 ++++++++-------- 4 files changed, 54 insertions(+), 17 deletions(-) diff --git a/protocols/WhatsAppWeb/src/chats.cpp b/protocols/WhatsAppWeb/src/chats.cpp index f674dc3f5c..402fc019ee 100644 --- a/protocols/WhatsAppWeb/src/chats.cpp +++ b/protocols/WhatsAppWeb/src/chats.cpp @@ -68,6 +68,22 @@ void WhatsAppProto::OnGetChatInfo(const JSONNode &root, void *param) Chat_Event(&gce); } + if (pChatUser->arHistory.getCount()) { + for (auto &it : pChatUser->arHistory) { + CMStringW jid(it->jid), text(Utf2T(it->text)); + + GCEVENT gce = { m_szModuleName, 0, GC_EVENT_MESSAGE }; + gce.pszID.w = pChatUser->si->ptszID; + gce.dwFlags = GCEF_ADDTOLOG; + gce.pszUID.w = jid; + gce.pszText.w = text; + gce.time = it->timestamp; + gce.bIsMe = (it->jid == m_szJid); + Chat_Event(&gce); + } + pChatUser->arHistory.destroy(); + } + CMStringW wszSubject(root["subject"].as_mstring()); if (!wszSubject.IsEmpty()) { time_t iSubjectTime(root["subjectTime"].as_int()); diff --git a/protocols/WhatsAppWeb/src/proto.h b/protocols/WhatsAppWeb/src/proto.h index 878d664c54..0437d4ed36 100644 --- a/protocols/WhatsAppWeb/src/proto.h +++ b/protocols/WhatsAppWeb/src/proto.h @@ -71,11 +71,18 @@ struct WARequest void *pUserInfo; }; +struct WAHistoryMessage +{ + CMStringA jid, text; + DWORD timestamp; +}; + struct WAUser { WAUser(MCONTACT _1, const char *_2) : hContact(_1), - szId(mir_strdup(_2)) + szId(mir_strdup(_2)), + arHistory(1) { } @@ -90,6 +97,7 @@ struct WAUser bool bInited = false; SESSION_INFO *si = 0; DWORD m_time1 = 0, m_time2 = 0; + OBJLIST arHistory; }; struct WAOwnMessage diff --git a/protocols/WhatsAppWeb/src/server.cpp b/protocols/WhatsAppWeb/src/server.cpp index c771d72220..ff6b0c2740 100644 --- a/protocols/WhatsAppWeb/src/server.cpp +++ b/protocols/WhatsAppWeb/src/server.cpp @@ -577,14 +577,27 @@ void WhatsAppProto::ProcessAdd(const CMStringA &type, const WANode *root) CMStringA szText(szMsgText); szText.Replace("%", "%%"); - GCEVENT gce = { m_szModuleName, 0, GC_EVENT_MESSAGE }; - gce.pszID.a = jid; - gce.dwFlags = GCEF_ADDTOLOG | GCEF_UTF8; - gce.pszUID.a = payLoad.participant().c_str(); - gce.pszText.a = szText; - gce.time = dwTimestamp; - gce.bIsMe = true; - Chat_Event(&gce); + CMStringA szUserJid(payLoad.participant().c_str()); + if (!szUserJid.Replace("@s.whatsapp.net", "@c.us")) + szUserJid.Replace("@g.whatsapp.net", "@g.us"); + + if (pUser->bInited) { + GCEVENT gce = { m_szModuleName, 0, GC_EVENT_MESSAGE }; + gce.pszID.a = jid; + gce.dwFlags = GCEF_ADDTOLOG | GCEF_UTF8; + gce.pszUID.a = szUserJid; + gce.pszText.a = szText; + gce.time = dwTimestamp; + gce.bIsMe = (jid == m_szJid); + Chat_Event(&gce); + } + else { + auto *pMsg = new WAHistoryMessage; + pMsg->jid = jid; + pMsg->text = szText; + pMsg->timestamp = dwTimestamp; + pUser->arHistory.insert(pMsg); + } } else { PROTORECVEVENT pre = { 0 }; diff --git a/src/mir_app/src/chat_manager.cpp b/src/mir_app/src/chat_manager.cpp index b7f7001ae0..0a89030837 100644 --- a/src/mir_app/src/chat_manager.cpp +++ b/src/mir_app/src/chat_manager.cpp @@ -713,15 +713,15 @@ USERINFO* UM_AddUser(SESSION_INFO *si, const wchar_t *pszUID, const wchar_t *psz return nullptr; auto *pUser = UM_FindUser(si, pszUID); - if (pUser) - return pUser; - - pUser = new USERINFO(); - pUser->pszUID = mir_wstrdup(pszUID); - pUser->pszNick = mir_wstrdup(pszNick); + if (pUser == nullptr) { + pUser = new USERINFO(); + si->getKeyList().insert(pUser); + si->getUserList().insert(pUser); + } + + replaceStrW(pUser->pszUID, pszUID); + replaceStrW(pUser->pszNick, pszNick); pUser->Status = wStatus; - si->getKeyList().insert(pUser); - si->getUserList().insert(pUser); return pUser; } -- cgit v1.2.3