diff options
| author | George Hazan <ghazan@miranda.im> | 2023-02-09 18:21:23 +0300 |
|---|---|---|
| committer | George Hazan <ghazan@miranda.im> | 2023-02-09 18:22:12 +0300 |
| commit | 5ef0585dbd3bfbc09093bc8f24f41e4ae2349c59 (patch) | |
| tree | b76db3dc8173189591d65cc9a1a4e181331ca8f8 /src/mir_app | |
| parent | 6ef65121fed3c38c467238a08bf96bf98a23d7d8 (diff) | |
SRMM: better support for group chats in database
Diffstat (limited to 'src/mir_app')
| -rw-r--r-- | src/mir_app/mir_app.vcxproj | 3 | ||||
| -rw-r--r-- | src/mir_app/mir_app.vcxproj.filters | 3 | ||||
| -rw-r--r-- | src/mir_app/src/chat.h | 1 | ||||
| -rw-r--r-- | src/mir_app/src/chat_manager.cpp | 10 | ||||
| -rw-r--r-- | src/mir_app/src/chat_svc.cpp | 33 | ||||
| -rw-r--r-- | src/mir_app/src/mir_app.def | 1 | ||||
| -rw-r--r-- | src/mir_app/src/mir_app64.def | 1 | ||||
| -rw-r--r-- | src/mir_app/src/proto_interface.cpp | 4 | ||||
| -rw-r--r-- | src/mir_app/src/srmm_base.cpp | 40 | ||||
| -rw-r--r-- | src/mir_app/src/srmm_util.cpp | 2 |
10 files changed, 84 insertions, 14 deletions
diff --git a/src/mir_app/mir_app.vcxproj b/src/mir_app/mir_app.vcxproj index f1be852b29..f2cc3c4900 100644 --- a/src/mir_app/mir_app.vcxproj +++ b/src/mir_app/mir_app.vcxproj @@ -215,7 +215,4 @@ <None Include="src\mir_app.def" />
<None Include="src\mir_app64.def" />
</ItemGroup>
- <ItemGroup>
- <Text Include="..\docs\contributors.txt" />
- </ItemGroup>
</Project>
\ No newline at end of file diff --git a/src/mir_app/mir_app.vcxproj.filters b/src/mir_app/mir_app.vcxproj.filters index b32a67a380..d7960c2ea2 100644 --- a/src/mir_app/mir_app.vcxproj.filters +++ b/src/mir_app/mir_app.vcxproj.filters @@ -508,7 +508,4 @@ <UniqueIdentifier>{2f5b2fe9-25c8-4029-8a52-f34a11f984a7}</UniqueIdentifier>
</Filter>
</ItemGroup>
- <ItemGroup>
- <Text Include="..\docs\contributors.txt" />
- </ItemGroup>
</Project>
\ No newline at end of file diff --git a/src/mir_app/src/chat.h b/src/mir_app/src/chat.h index b8580e1b51..a128e612be 100644 --- a/src/mir_app/src/chat.h +++ b/src/mir_app/src/chat.h @@ -80,6 +80,7 @@ BOOL SM_SetStatus(const char *pszModule, SESSION_INFO *si, int wStatus) BOOL SM_TakeStatus(SESSION_INFO *si, const wchar_t *pszUID, const wchar_t *pszStatus);
BOOL SM_UserTyping(GCEVENT* gce);
+SESSION_INFO* SM_FindSessionByContact(MCONTACT hContact);
SESSION_INFO* SM_FindSessionByIndex(const char *pszModule, int iItem);
STATUSINFO* TM_AddStatus(STATUSINFO **ppStatusList, const wchar_t *pszStatus, int *iCount);
diff --git a/src/mir_app/src/chat_manager.cpp b/src/mir_app/src/chat_manager.cpp index 014c092322..61eb35d9ff 100644 --- a/src/mir_app/src/chat_manager.cpp +++ b/src/mir_app/src/chat_manager.cpp @@ -453,6 +453,16 @@ static int SM_GetCount(const char *pszModule) return count;
}
+SESSION_INFO* SM_FindSessionByContact(MCONTACT hContact)
+{
+ mir_cslock lck(csChat);
+ for (auto &si : g_arSessions)
+ if (si->hContact == hContact)
+ return si;
+
+ return nullptr;
+}
+
SESSION_INFO* SM_FindSessionByIndex(const char *pszModule, int iItem)
{
int count = 0;
diff --git a/src/mir_app/src/chat_svc.cpp b/src/mir_app/src/chat_svc.cpp index 7dd1c64498..a1bf16f53c 100644 --- a/src/mir_app/src/chat_svc.cpp +++ b/src/mir_app/src/chat_svc.cpp @@ -517,11 +517,9 @@ static BOOL HandleChatEvent(GCEVENT &gce, int bManyFix) return 0;
if (si && (si->bInitDone || gce.iType == GC_EVENT_TOPIC || (gce.iType == GC_EVENT_JOIN && gce.bIsMe))) {
- if (gce.pszNick.w == nullptr && gce.pszUID.w != nullptr) {
- USERINFO *ui = g_chatApi.UM_FindUser(si, gce.pszUID.w);
- if (ui != nullptr)
+ if (gce.pszNick.w == nullptr && gce.pszUID.w != nullptr)
+ if (USERINFO *ui = g_chatApi.UM_FindUser(si, gce.pszUID.w))
gce.pszNick.w = ui->pszNick;
- }
int isOk = SM_AddEvent(si, &gce, bIsHighlighted);
if (si->pDlg) {
@@ -776,6 +774,32 @@ static INT_PTR LeaveChat(WPARAM hContact, LPARAM) return 0;
}
+static int OnEventAdded(WPARAM hContact, LPARAM hDbEvent)
+{
+ if (Contact::IsGroupChat(hContact)) {
+ if (auto *si = SM_FindSessionByContact(hContact)) {
+ DB::EventInfo dbei;
+ dbei.cbBlob = -1;
+ if (!db_event_get(hDbEvent, &dbei)) {
+ auto *szProto = Proto_GetBaseAccountName(si->hContact);
+ if (si && !mir_strcmp(szProto, dbei.szModule) && dbei.eventType == EVENTTYPE_MESSAGE && dbei.szUserId) {
+ CMStringA szText((char *)dbei.pBlob);
+ szText.Replace("%", "%%");
+
+ GCEVENT gce = { si, GC_EVENT_MESSAGE };
+ gce.dwFlags = GCEF_ADDTOLOG | GCEF_UTF8;
+ gce.pszUID.a = dbei.szUserId;
+ gce.pszText.a = szText;
+ gce.time = dbei.timestamp;
+ Chat_Event(&gce);
+ }
+ }
+ }
+ }
+
+ return 0;
+}
+
static int OnContactDeleted(WPARAM hContact, LPARAM)
{
char *szProto = Proto_GetBaseAccountName(hContact);
@@ -914,6 +938,7 @@ int LoadChatModule(void) {
HookEvent(ME_SYSTEM_MODULESLOADED, ModulesLoaded);
HookEvent(ME_SYSTEM_PRESHUTDOWN, PreShutdown);
+ HookEvent(ME_DB_EVENT_ADDED, OnEventAdded);
HookEvent(ME_DB_CONTACT_DELETED, OnContactDeleted);
HookEvent(ME_SKIN_ICONSCHANGED, IconsChanged);
HookEvent(ME_FONT_RELOAD, FontsChanged);
diff --git a/src/mir_app/src/mir_app.def b/src/mir_app/src/mir_app.def index 8150a19b26..81f0512e7f 100644 --- a/src/mir_app/src/mir_app.def +++ b/src/mir_app/src/mir_app.def @@ -817,3 +817,4 @@ Srmm_CreateHotkey @886 NONAME ?Chat_Terminate@@YGHPAUSESSION_INFO@@_N@Z @932 NONAME
?Chat_Terminate@@YGHPBD_N@Z @933 NONAME
?Chat_Control@@YGHPBDH@Z @934 NONAME
+?UpdateChatLog@CSrmmBaseDialog@@IAEXXZ @935 NONAME
diff --git a/src/mir_app/src/mir_app64.def b/src/mir_app/src/mir_app64.def index 520d097e19..901fc10164 100644 --- a/src/mir_app/src/mir_app64.def +++ b/src/mir_app/src/mir_app64.def @@ -817,3 +817,4 @@ Srmm_CreateHotkey @886 NONAME ?Chat_Terminate@@YAHPEAUSESSION_INFO@@_N@Z @932 NONAME
?Chat_Terminate@@YAHPEBD_N@Z @933 NONAME
?Chat_Control@@YAHPEBDH@Z @934 NONAME
+?UpdateChatLog@CSrmmBaseDialog@@IEAAXXZ @935 NONAME
diff --git a/src/mir_app/src/proto_interface.cpp b/src/mir_app/src/proto_interface.cpp index 09cf67f845..801442d8fa 100644 --- a/src/mir_app/src/proto_interface.cpp +++ b/src/mir_app/src/proto_interface.cpp @@ -195,9 +195,6 @@ MEVENT PROTO_INTERFACE::RecvMsg(MCONTACT hContact, PROTORECVEVENT *pre) if (pre->szMessage == nullptr)
return 0;
- ptrA pszTemp;
- mir_ptr<uint8_t> pszBlob;
-
DBEVENTINFO dbei = {};
dbei.flags = DBEF_UTF;
dbei.szModule = Proto_GetBaseAccountName(hContact);
@@ -205,6 +202,7 @@ MEVENT PROTO_INTERFACE::RecvMsg(MCONTACT hContact, PROTORECVEVENT *pre) dbei.eventType = EVENTTYPE_MESSAGE;
dbei.cbBlob = (uint32_t)mir_strlen(pre->szMessage) + 1;
dbei.pBlob = (uint8_t*)pre->szMessage;
+ dbei.szUserId = pre->szUserId;
if (pre->flags & PREF_CREATEREAD)
dbei.flags |= DBEF_READ;
diff --git a/src/mir_app/src/srmm_base.cpp b/src/mir_app/src/srmm_base.cpp index fd1d564a8a..1a83d7aa86 100644 --- a/src/mir_app/src/srmm_base.cpp +++ b/src/mir_app/src/srmm_base.cpp @@ -636,6 +636,46 @@ void CSrmmBaseDialog::RedrawLog() else ClearLog();
}
+void CSrmmBaseDialog::UpdateChatLog()
+{
+ if (!m_si->pMI->bDatabase)
+ return;
+
+ GetFirstEvent();
+
+ SESSION_INFO *tmp = g_chatApi.SM_CreateSession();
+
+ auto *szProto = Proto_GetBaseAccountName(m_hContact);
+ for (MEVENT hDbEvent = m_hDbEventFirst; hDbEvent; hDbEvent = db_event_next(m_hContact, hDbEvent)) {
+ DB::EventInfo dbei;
+ dbei.cbBlob = -1;
+ if (!db_event_get(hDbEvent, &dbei)) {
+ if (!mir_strcmp(szProto, dbei.szModule) && dbei.eventType == EVENTTYPE_MESSAGE && dbei.szUserId) {
+ auto *pUser = g_chatApi.UM_FindUser(m_si, Utf2T(dbei.szUserId));
+ if (pUser == nullptr)
+ continue;
+
+ Utf2T wszUserId(dbei.szUserId);
+ CMStringW wszText(Utf2T((char*)dbei.pBlob));
+ wszText.Replace(L"%", L"%%");
+
+ GCEVENT gce = { m_si, GC_EVENT_MESSAGE };
+ gce.dwFlags = GCEF_ADDTOLOG;
+ gce.pszUserInfo.w = wszUserId;
+ gce.pszText.w = wszText;
+ gce.time = dbei.timestamp;
+ if (USERINFO *ui = g_chatApi.UM_FindUser(m_si, wszUserId))
+ gce.pszNick.w = ui->pszNick;
+ SM_AddEvent(tmp, &gce, false);
+ }
+ }
+ }
+
+ m_pLog->LogEvents(tmp->pLogEnd, false);
+ g_chatApi.LM_RemoveAll(&tmp->pLog, &tmp->pLogEnd);
+ delete tmp;
+}
+
/////////////////////////////////////////////////////////////////////////////////////////
void CSrmmBaseDialog::onClick_Color(CCtrlButton *pButton)
diff --git a/src/mir_app/src/srmm_util.cpp b/src/mir_app/src/srmm_util.cpp index 2ca887a54a..080ff4ae5d 100644 --- a/src/mir_app/src/srmm_util.cpp +++ b/src/mir_app/src/srmm_util.cpp @@ -28,7 +28,7 @@ const char *g_pszHotkeySection; /////////////////////////////////////////////////////////////////////////////////////////
-MIR_APP_DLL(DWORD) CALLBACK Srmm_LogStreamCallback(DWORD_PTR dwCookie, LPBYTE pbBuff, LONG cb, LONG * pcb)
+MIR_APP_DLL(DWORD) CALLBACK Srmm_LogStreamCallback(DWORD_PTR dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
{
LOGSTREAMDATA *lstrdat = (LOGSTREAMDATA*)dwCookie;
if (lstrdat) {
|
