diff options
author | George Hazan <ghazan@miranda.im> | 2023-02-09 18:22:05 +0300 |
---|---|---|
committer | George Hazan <ghazan@miranda.im> | 2023-02-09 18:22:12 +0300 |
commit | b7718450b0856447bb7098f73d674fbd54c16e2d (patch) | |
tree | 4863436fb5574f501b92b465ae598dc0d18ec9a3 | |
parent | 5ef0585dbd3bfbc09093bc8f24f41e4ae2349c59 (diff) |
database support for new protocols
-rw-r--r-- | protocols/Discord/src/dispatch.cpp | 52 | ||||
-rw-r--r-- | protocols/Discord/src/guilds.cpp | 3 | ||||
-rw-r--r-- | protocols/Discord/src/proto.cpp | 2 | ||||
-rw-r--r-- | protocols/Discord/src/proto.h | 2 | ||||
-rw-r--r-- | protocols/Discord/src/server.cpp | 85 | ||||
-rw-r--r-- | protocols/Discord/src/utils.cpp | 2 | ||||
-rw-r--r-- | protocols/Telegram/Telegram.vcxproj | 1 | ||||
-rw-r--r-- | protocols/Telegram/Telegram.vcxproj.filters | 3 | ||||
-rw-r--r-- | protocols/Telegram/src/server.cpp | 9 | ||||
-rw-r--r-- | protocols/Telegram/src/utils.cpp | 17 | ||||
-rw-r--r-- | protocols/Telegram/src/utils.h | 2 | ||||
-rw-r--r-- | protocols/WhatsApp/src/appsync.cpp | 15 | ||||
-rw-r--r-- | protocols/WhatsApp/src/message.cpp | 12 |
13 files changed, 89 insertions, 116 deletions
diff --git a/protocols/Discord/src/dispatch.cpp b/protocols/Discord/src/dispatch.cpp index 2c749eb8b9..10c39e8241 100644 --- a/protocols/Discord/src/dispatch.cpp +++ b/protocols/Discord/src/dispatch.cpp @@ -361,8 +361,8 @@ void CDiscordProto::OnCommandMessageUpdate(const JSONNode &pRoot) void CDiscordProto::OnCommandMessage(const JSONNode &pRoot, bool bIsNew)
{
CMStringW wszMessageId = pRoot["id"].as_mstring();
- CMStringW wszUserId = pRoot["author"]["id"].as_mstring();
- SnowFlake userId = _wtoi64(wszUserId);
+ CMStringA szUserId = pRoot["author"]["id"].as_mstring();
+ SnowFlake userId = _atoi64(szUserId);
SnowFlake msgId = _wtoi64(wszMessageId);
// try to find a sender by his channel
@@ -408,44 +408,24 @@ void CDiscordProto::OnCommandMessage(const JSONNode &pRoot, bool bIsNew) if (!edited.isnull())
wszText.AppendFormat(L" (%s %s)", TranslateT("edited at"), edited.as_mstring().c_str());
- if (pUser->bIsPrivate && !pUser->bIsGroup) {
- // if a message has myself as an author, add some flags
- PROTORECVEVENT recv = {};
- if (bOurMessage)
- recv.flags = PREF_CREATEREAD | PREF_SENT;
+ // if a message has myself as an author, add some flags
+ PROTORECVEVENT recv = {};
+ if (bOurMessage)
+ recv.flags = PREF_CREATEREAD | PREF_SENT;
- debugLogA("store a message from private user %lld, channel id %lld", pUser->id, pUser->channelId);
- ptrA buf(mir_utf8encodeW(wszText));
+ debugLogA("store a message from private user %lld, channel id %lld", pUser->id, pUser->channelId);
+ ptrA buf(mir_utf8encodeW(wszText));
- recv.timestamp = (uint32_t)StringToDate(pRoot["timestamp"].as_mstring());
- recv.szMessage = buf;
- recv.szMsgId = szMsgId;
- ProtoChainRecvMsg(pUser->hContact, &recv);
- }
- else {
- debugLogA("store a message into the group channel id %lld", channelId);
-
- SESSION_INFO *si = g_chatApi.SM_FindSession(pUser->wszUsername, m_szModuleName);
- if (si == nullptr) {
- debugLogA("message to unknown channel %lld ignored", channelId);
- return;
- }
-
- ProcessChatUser(pUser, wszUserId, pRoot);
+ recv.timestamp = (uint32_t)StringToDate(pRoot["timestamp"].as_mstring());
+ recv.szMessage = buf;
+ recv.szMsgId = szMsgId;
- ParseSpecialChars(si, wszText);
- wszText.Replace(L"%", L"%%");
-
- GCEVENT gce = { pUser->si, GC_EVENT_MESSAGE };
- gce.dwFlags = GCEF_ADDTOLOG;
- gce.pszUID.w = wszUserId;
- gce.pszText.w = wszText;
- gce.time = (uint32_t)StringToDate(pRoot["timestamp"].as_mstring());
- gce.bIsMe = bOurMessage;
- Chat_Event(&gce);
-
- debugLogW(L"New channel %s message from %s: %s", si->ptszID, gce.pszUID.w, gce.pszText.w);
+ if (!pUser->bIsPrivate || pUser->bIsGroup) {
+ recv.szUserId = szUserId;
+ ProcessChatUser(pUser, userId, pRoot);
}
+
+ ProtoChainRecvMsg(pUser->hContact, &recv);
}
pUser->lastMsgId = msgId;
diff --git a/protocols/Discord/src/guilds.cpp b/protocols/Discord/src/guilds.cpp index 6095b0a234..d4b8999a13 100644 --- a/protocols/Discord/src/guilds.cpp +++ b/protocols/Discord/src/guilds.cpp @@ -318,10 +318,9 @@ CDiscordGuildMember* CDiscordProto::ProcessGuildUser(CDiscordGuild *pGuild, cons /////////////////////////////////////////////////////////////////////////////////////////
-void CDiscordProto::ProcessChatUser(CDiscordUser *pChat, const CMStringW &wszUserId, const JSONNode &pRoot)
+void CDiscordProto::ProcessChatUser(CDiscordUser *pChat, SnowFlake userId, const JSONNode &pRoot)
{
// input data control
- SnowFlake userId = _wtoi64(wszUserId);
CDiscordGuild *pGuild = pChat->pGuild;
if (pGuild == nullptr || userId == 0)
return;
diff --git a/protocols/Discord/src/proto.cpp b/protocols/Discord/src/proto.cpp index 470dbdf7b5..8e89312050 100644 --- a/protocols/Discord/src/proto.cpp +++ b/protocols/Discord/src/proto.cpp @@ -98,7 +98,7 @@ CDiscordProto::CDiscordProto(const char *proto_name, const wchar_t *username) : // Groupchat initialization
GCREGISTER gcr = {};
- gcr.dwFlags = GC_TYPNOTIF | GC_CHANMGR;
+ gcr.dwFlags = GC_TYPNOTIF | GC_CHANMGR | GC_DATABASE;
gcr.ptszDispName = m_tszUserName;
gcr.pszModule = m_szModuleName;
Chat_Register(&gcr);
diff --git a/protocols/Discord/src/proto.h b/protocols/Discord/src/proto.h index 683c0cbb05..04645185d2 100644 --- a/protocols/Discord/src/proto.h +++ b/protocols/Discord/src/proto.h @@ -331,7 +331,7 @@ class CDiscordProto : public PROTO<CDiscordProto> void Chat_ProcessNickMenu(GCHOOK* gch);
void CreateChat(CDiscordGuild *pGuild, CDiscordUser *pUser);
- void ProcessChatUser(CDiscordUser *pChat, const CMStringW &wszUserId, const JSONNode &pRoot);
+ void ProcessChatUser(CDiscordUser *pChat, SnowFlake userId, const JSONNode &pRoot);
void ParseSpecialChars(SESSION_INFO *si, CMStringW &str);
//////////////////////////////////////////////////////////////////////////////////////
diff --git a/protocols/Discord/src/server.cpp b/protocols/Discord/src/server.cpp index 8266e11a0b..7ac73e38bf 100644 --- a/protocols/Discord/src/server.cpp +++ b/protocols/Discord/src/server.cpp @@ -86,56 +86,49 @@ void CDiscordProto::OnReceiveHistory(NETLIBHTTPREQUEST *pReply, AsyncHttpRequest for (auto &it : arNodes) {
auto &pNode = *it;
CMStringW wszText = PrepareMessageText(pNode);
- CMStringW wszUserId = pNode["author"]["id"].as_mstring();
+ CMStringA szUserId = pNode["author"]["id"].as_mstring();
SnowFlake msgid = ::getId(pNode["id"]);
- SnowFlake authorid = _wtoi64(wszUserId);
+ SnowFlake authorid = _atoi64(szUserId);
uint32_t dwTimeStamp = StringToDate(pNode["timestamp"].as_mstring());
- if (pUser->bIsPrivate) {
- DBEVENTINFO dbei = {};
- dbei.szModule = m_szModuleName;
- dbei.flags = DBEF_UTF;
- dbei.eventType = EVENTTYPE_MESSAGE;
-
- if (authorid == m_ownId)
- dbei.flags |= DBEF_SENT;
- else
- dbei.flags &= ~DBEF_SENT;
-
- if (msgid <= pUser->lastReadId)
- dbei.flags |= DBEF_READ;
- else
- dbei.flags &= ~DBEF_READ;
-
- ptrA szBody(mir_utf8encodeW(wszText));
- dbei.timestamp = dwTimeStamp;
- dbei.pBlob = (uint8_t*)szBody.get();
- dbei.cbBlob = (uint32_t)mir_strlen(szBody);
-
- bool bSucceeded = false;
- char szMsgId[100];
- _i64toa_s(msgid, szMsgId, _countof(szMsgId), 10);
- MEVENT hDbEvent = db_event_getById(m_szModuleName, szMsgId);
- if (hDbEvent != 0)
- bSucceeded = 0 == db_event_edit(pUser->hContact, hDbEvent, &dbei);
-
- if (!bSucceeded) {
- dbei.szId = szMsgId;
- db_event_add(pUser->hContact, &dbei);
- }
+ DBEVENTINFO dbei = {};
+ dbei.szModule = m_szModuleName;
+ dbei.flags = DBEF_UTF;
+ dbei.eventType = EVENTTYPE_MESSAGE;
+ dbei.timestamp = dwTimeStamp;
+
+ if (authorid == m_ownId)
+ dbei.flags |= DBEF_SENT;
+ else
+ dbei.flags &= ~DBEF_SENT;
+
+ if (msgid <= pUser->lastReadId)
+ dbei.flags |= DBEF_READ;
+ else
+ dbei.flags &= ~DBEF_READ;
+
+ MBinBuffer buf;
+ ptrA szBody(mir_utf8encodeW(wszText));
+ buf.append(szBody, mir_strlen(szBody) + 1);
+
+ if (!pUser->bIsPrivate) {
+ buf.append(szUserId, szUserId.GetLength() + 1);
+ ProcessChatUser(pUser, _atoi64(szUserId), pNode);
}
- else {
- ProcessChatUser(pUser, wszUserId, pNode);
-
- ParseSpecialChars(si, wszText);
-
- GCEVENT gce = { si, GC_EVENT_MESSAGE };
- gce.dwFlags = GCEF_ADDTOLOG;
- gce.pszUID.w = wszUserId;
- gce.pszText.w = wszText;
- gce.time = dwTimeStamp;
- gce.bIsMe = authorid == m_ownId;
- Chat_Event(&gce);
+
+ dbei.pBlob = buf.data();
+ dbei.cbBlob = (uint32_t)buf.length();
+
+ bool bSucceeded = false;
+ char szMsgId[100];
+ _i64toa_s(msgid, szMsgId, _countof(szMsgId), 10);
+ MEVENT hDbEvent = db_event_getById(m_szModuleName, szMsgId);
+ if (hDbEvent != 0)
+ bSucceeded = 0 == db_event_edit(pUser->hContact, hDbEvent, &dbei);
+
+ if (!bSucceeded) {
+ dbei.szId = szMsgId;
+ db_event_add(pUser->hContact, &dbei);
}
if (lastId < msgid)
diff --git a/protocols/Discord/src/utils.cpp b/protocols/Discord/src/utils.cpp index b9297735e1..cc2e4fff3a 100644 --- a/protocols/Discord/src/utils.cpp +++ b/protocols/Discord/src/utils.cpp @@ -334,7 +334,7 @@ void CDiscordProto::ProcessType(CDiscordUser *pUser, const JSONNode &pRoot) CMStringA szId(FORMAT, "%lld", pUser->id);
DB::AUTH_BLOB blob(pUser->hContact, T2Utf(pUser->wszUsername), nullptr, nullptr, szId, nullptr);
- PROTORECVEVENT pre = { 0 };
+ PROTORECVEVENT pre = {};
pre.timestamp = (uint32_t)time(0);
pre.lParam = blob.size();
pre.szMessage = blob;
diff --git a/protocols/Telegram/Telegram.vcxproj b/protocols/Telegram/Telegram.vcxproj index 5bda58b10d..6261b8acdf 100644 --- a/protocols/Telegram/Telegram.vcxproj +++ b/protocols/Telegram/Telegram.vcxproj @@ -52,6 +52,7 @@ <ClInclude Include="src\proto.h" />
<ClInclude Include="src\resource.h" />
<ClInclude Include="src\stdafx.h" />
+ <ClInclude Include="src\utils.h" />
<ClInclude Include="src\version.h" />
</ItemGroup>
<ItemGroup>
diff --git a/protocols/Telegram/Telegram.vcxproj.filters b/protocols/Telegram/Telegram.vcxproj.filters index 556048fcbc..948f34d1af 100644 --- a/protocols/Telegram/Telegram.vcxproj.filters +++ b/protocols/Telegram/Telegram.vcxproj.filters @@ -48,6 +48,9 @@ <ClInclude Include="src\resource.h">
<Filter>Header Files</Filter>
</ClInclude>
+ <ClInclude Include="src\utils.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="res\version.rc">
diff --git a/protocols/Telegram/src/server.cpp b/protocols/Telegram/src/server.cpp index b411cba637..59da2a3c9f 100644 --- a/protocols/Telegram/src/server.cpp +++ b/protocols/Telegram/src/server.cpp @@ -393,18 +393,13 @@ void CTelegramProto::ProcessMessage(TD::updateNewMessage *pObj) return;
}
- if (pUser->isGroupChat) {
- debugLogA("message from group chat, ignored");
- return;
- }
-
CMStringA szText(GetMessageText(pMessage->content_.get()));
if (szText.IsEmpty()) {
debugLogA("this message was not processed, ignored");
return;
}
- char szId[100];
+ char szId[100], szUserId[100];
_i64toa(pMessage->id_, szId, 10);
PROTORECVEVENT pre = {};
@@ -413,6 +408,8 @@ void CTelegramProto::ProcessMessage(TD::updateNewMessage *pObj) pre.timestamp = pMessage->date_;
if (pMessage->is_outgoing_)
pre.flags |= PREF_SENT;
+ if (pUser->isGroupChat)
+ pre.szUserId = getSender(pMessage->sender_id_.get(), szUserId, sizeof(szUserId));
ProtoChainRecvMsg(pUser->hContact, &pre);
}
diff --git a/protocols/Telegram/src/utils.cpp b/protocols/Telegram/src/utils.cpp index d921927a60..b725ba5f90 100644 --- a/protocols/Telegram/src/utils.cpp +++ b/protocols/Telegram/src/utils.cpp @@ -17,6 +17,23 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #include "stdafx.h"
+char* getSender(const TD::MessageSender *pSender, char *pDest, size_t cbSize)
+{
+ switch (pSender->get_id()) {
+ case TD::messageSenderChat::ID:
+ _i64toa_s(((TD::messageSenderChat *)pSender)->chat_id_, pDest, cbSize, 10);
+ break;
+ case TD::messageSenderUser::ID:
+ _i64toa_s(((TD::messageSenderUser *)pSender)->user_id_, pDest, cbSize, 10);
+ break;
+ default:
+ *pDest = 0;
+ }
+ return pDest;
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+
void CTelegramProto::UpdateString(MCONTACT hContact, const char *pszSetting, const std::string &str)
{
if (str.empty())
diff --git a/protocols/Telegram/src/utils.h b/protocols/Telegram/src/utils.h index 50e96676b7..846428a086 100644 --- a/protocols/Telegram/src/utils.h +++ b/protocols/Telegram/src/utils.h @@ -1 +1,3 @@ #pragma once
+
+char *getSender(const TD::MessageSender *pSender, char *pDest, size_t cbSize);
diff --git a/protocols/WhatsApp/src/appsync.cpp b/protocols/WhatsApp/src/appsync.cpp index 3d812be370..cc9b4c03c6 100644 --- a/protocols/WhatsApp/src/appsync.cpp +++ b/protocols/WhatsApp/src/appsync.cpp @@ -281,20 +281,9 @@ void WhatsAppProto::ProcessHistorySync(const Wa__HistorySync *pSync) pre.flags = PREF_CREATEREAD;
if (key->fromme)
pre.flags |= PREF_SENT;
+ if (pUser->bIsGroupChat)
+ pre.szUserId = key->participant;
ProtoChainRecvMsg(pUser->hContact, &pre);
-
- if (pUser->bIsGroupChat) {
- if (pChat->name)
- setUString(pUser->hContact, "Nick", pChat->name);
-
- GCEVENT gce = { pUser->si, GC_EVENT_MESSAGE };
- gce.dwFlags = GCEF_UTF8;
- gce.pszUID.a = key->participant;
- gce.bIsMe = key->fromme;
- gce.pszText.a = szMessageText.GetBuffer();
- gce.time = pMessage->message->messagetimestamp;
- Chat_Event(&gce);
- }
}
}
}
diff --git a/protocols/WhatsApp/src/message.cpp b/protocols/WhatsApp/src/message.cpp index c0efdd3ea1..93420d8f33 100644 --- a/protocols/WhatsApp/src/message.cpp +++ b/protocols/WhatsApp/src/message.cpp @@ -220,17 +220,9 @@ void WhatsAppProto::ProcessMessage(WAMSG type, const Wa__WebMessageInfo &msg) pre.flags |= PREF_CREATEREAD;
if (key->fromme)
pre.flags |= PREF_SENT;
+ if (pUser->bIsGroupChat)
+ pre.szUserId = participant;
ProtoChainRecvMsg(pUser->hContact, &pre);
-
- if (pUser->bIsGroupChat) {
- GCEVENT gce = { pUser->si, GC_EVENT_MESSAGE };
- gce.dwFlags = GCEF_UTF8;
- gce.pszUID.a = participant;
- gce.bIsMe = key->fromme;
- gce.pszText.a = szMessageText.GetBuffer();
- gce.time = timestamp;
- Chat_Event(&gce);
- }
}
// translate statuses into status messages
else if (type.bOtherStatus || type.bDirectStatus || type.bPeerBroadcast || type.bOtherBroadcast) {
|