From 5ef0585dbd3bfbc09093bc8f24f41e4ae2349c59 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Thu, 9 Feb 2023 18:21:23 +0300 Subject: SRMM: better support for group chats in database --- src/core/stdmsg/src/msgdialog.cpp | 13 +++++------- src/core/stdmsg/src/msgs.h | 4 +--- src/mir_app/mir_app.vcxproj | 3 --- src/mir_app/mir_app.vcxproj.filters | 3 --- src/mir_app/src/chat.h | 1 + src/mir_app/src/chat_manager.cpp | 10 ++++++++++ src/mir_app/src/chat_svc.cpp | 33 ++++++++++++++++++++++++++---- src/mir_app/src/mir_app.def | 1 + src/mir_app/src/mir_app64.def | 1 + src/mir_app/src/proto_interface.cpp | 4 +--- src/mir_app/src/srmm_base.cpp | 40 +++++++++++++++++++++++++++++++++++++ src/mir_app/src/srmm_util.cpp | 2 +- 12 files changed, 90 insertions(+), 25 deletions(-) (limited to 'src') diff --git a/src/core/stdmsg/src/msgdialog.cpp b/src/core/stdmsg/src/msgdialog.cpp index 67401eea28..84ba0e1ca1 100644 --- a/src/core/stdmsg/src/msgdialog.cpp +++ b/src/core/stdmsg/src/msgdialog.cpp @@ -139,17 +139,13 @@ bool CMsgDialog::OnInitDialog() UpdateOptions(); UpdateStatusBar(); UpdateTitle(); - - if (m_si->pMI->bDatabase) { - FindFirstEvent(); - RemakeLog(); - } + UpdateChatLog(); } else { m_nickList.Hide(); m_splitterX.Hide(); - FindFirstEvent(); + GetFirstEvent(); bool bUpdate = false; DB::ECPTR pCursor(DB::EventsRev(m_hContact)); @@ -594,7 +590,7 @@ INT_PTR CMsgDialog::DlgProc(UINT uMsg, WPARAM wParam, LPARAM lParam) return TRUE; case HM_DBEVENTADDED: - if (wParam == m_hContact) { + if (wParam == m_hContact && !isChat()) { MEVENT hDbEvent = lParam; if (m_hDbEventFirst == 0) m_hDbEventFirst = hDbEvent; @@ -1300,7 +1296,7 @@ void CMsgDialog::CloseTab() else SendMessage(m_hwndParent, WM_CLOSE, 0, 0); } -void CMsgDialog::FindFirstEvent() +bool CMsgDialog::GetFirstEvent() { // This finds the first message to display, it works like shit m_hDbEventFirst = db_event_firstUnread(m_hContact); @@ -1339,6 +1335,7 @@ void CMsgDialog::FindFirstEvent() } break; } + return true; } void CMsgDialog::NotifyTyping(int mode) diff --git a/src/core/stdmsg/src/msgs.h b/src/core/stdmsg/src/msgs.h index 0e9f38dead..8234296277 100644 --- a/src/core/stdmsg/src/msgs.h +++ b/src/core/stdmsg/src/msgs.h @@ -55,7 +55,6 @@ class CMsgDialog : public CSrmmBaseDialog friend class CTabbedWindow; typedef CSrmmBaseDialog CSuper; - void FindFirstEvent(); void Init(void); void NotifyTyping(int mode); void SetButtonsPos(void); @@ -141,8 +140,6 @@ public: return ((CLogWindow *)m_pLog); } - MEVENT m_hDbEventFirst, m_hDbEventLast; - int m_avatarWidth = 0, m_avatarHeight = 0; bool m_bIsAutoRTL = false; @@ -156,6 +153,7 @@ public: } void CloseTab() override; + bool GetFirstEvent() override; bool IsActive() const override; void LoadSettings() override; void SetStatusText(const wchar_t *, HICON) override; 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 @@ - - - \ 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 @@ {2f5b2fe9-25c8-4029-8a52-f34a11f984a7} - - - \ 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 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) { -- cgit v1.2.3