From 2d74ff3a09c40efda6ad6e9c6b569820776a54f1 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Mon, 14 Nov 2022 20:04:02 +0300 Subject: basic set for storing group chat messages in a database + reusing log settings like show 10 recent messages --- src/core/stdmsg/src/msgdialog.cpp | 85 +++++++++++++++++++++------------------ src/core/stdmsg/src/msgs.h | 1 + 2 files changed, 47 insertions(+), 39 deletions(-) (limited to 'src/core/stdmsg') diff --git a/src/core/stdmsg/src/msgdialog.cpp b/src/core/stdmsg/src/msgdialog.cpp index 63ed7f47fa..8e0c4ff3ed 100644 --- a/src/core/stdmsg/src/msgdialog.cpp +++ b/src/core/stdmsg/src/msgdialog.cpp @@ -140,50 +140,16 @@ bool CMsgDialog::OnInitDialog() UpdateStatusBar(); UpdateTitle(); - NotifyEvent(MSG_WINDOW_EVT_OPEN); + if (m_si->pMI->bDatabase) { + FindFirstEvent(); + RemakeLog(); + } } else { m_nickList.Hide(); m_splitterX.Hide(); - // This finds the first message to display, it works like shit - m_hDbEventFirst = db_event_firstUnread(m_hContact); - { - DB::ECPTR pCursor(DB::EventsRev(m_hContact, m_hDbEventFirst)); - - switch (g_plugin.iLoadHistory) { - case LOADHISTORY_COUNT: - for (int i = g_plugin.nLoadCount; i--;) { - MEVENT hPrevEvent = pCursor.FetchNext(); - if (hPrevEvent == 0) - break; - - DBEVENTINFO dbei = {}; - m_hDbEventFirst = hPrevEvent; - db_event_get(hPrevEvent, &dbei); - if (!DbEventIsShown(&dbei)) - i++; - } - break; - - case LOADHISTORY_TIME: - DBEVENTINFO dbei = {}; - if (m_hDbEventFirst == 0) - dbei.timestamp = (uint32_t)time(0); - else - db_event_get(m_hDbEventFirst, &dbei); - - uint32_t firstTime = dbei.timestamp - 60 * g_plugin.nLoadTime; - while (MEVENT hPrevEvent = pCursor.FetchNext()) { - dbei.cbBlob = 0; - db_event_get(hPrevEvent, &dbei); - if (dbei.timestamp < firstTime) - break; - m_hDbEventFirst = hPrevEvent; - } - break; - } - } + FindFirstEvent(); bool bUpdate = false; DB::ECPTR pCursor(DB::EventsRev(m_hContact)); @@ -1335,6 +1301,47 @@ void CMsgDialog::CloseTab() else SendMessage(m_hwndParent, WM_CLOSE, 0, 0); } +void CMsgDialog::FindFirstEvent() +{ + // This finds the first message to display, it works like shit + m_hDbEventFirst = db_event_firstUnread(m_hContact); + + DB::ECPTR pCursor(DB::EventsRev(m_hContact, m_hDbEventFirst)); + + switch (g_plugin.iLoadHistory) { + case LOADHISTORY_COUNT: + for (int i = g_plugin.nLoadCount; i--;) { + MEVENT hPrevEvent = pCursor.FetchNext(); + if (hPrevEvent == 0) + break; + + DBEVENTINFO dbei = {}; + m_hDbEventFirst = hPrevEvent; + db_event_get(hPrevEvent, &dbei); + if (!DbEventIsShown(&dbei)) + i++; + } + break; + + case LOADHISTORY_TIME: + DBEVENTINFO dbei = {}; + if (m_hDbEventFirst == 0) + dbei.timestamp = (uint32_t)time(0); + else + db_event_get(m_hDbEventFirst, &dbei); + + uint32_t firstTime = dbei.timestamp - 60 * g_plugin.nLoadTime; + while (MEVENT hPrevEvent = pCursor.FetchNext()) { + dbei.cbBlob = 0; + db_event_get(hPrevEvent, &dbei); + if (dbei.timestamp < firstTime) + break; + m_hDbEventFirst = hPrevEvent; + } + break; + } +} + void CMsgDialog::NotifyTyping(int mode) { if (!m_hContact) diff --git a/src/core/stdmsg/src/msgs.h b/src/core/stdmsg/src/msgs.h index d9bc5f78dc..f21110e641 100644 --- a/src/core/stdmsg/src/msgs.h +++ b/src/core/stdmsg/src/msgs.h @@ -55,6 +55,7 @@ class CMsgDialog : public CSrmmBaseDialog friend class CTabbedWindow; typedef CSrmmBaseDialog CSuper; + void FindFirstEvent(); void Init(void); void NotifyTyping(int mode); void SetButtonsPos(void); -- cgit v1.2.3