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 | |
parent | 6ef65121fed3c38c467238a08bf96bf98a23d7d8 (diff) |
SRMM: better support for group chats in database
Diffstat (limited to 'src')
-rw-r--r-- | src/core/stdmsg/src/msgdialog.cpp | 13 | ||||
-rw-r--r-- | src/core/stdmsg/src/msgs.h | 4 | ||||
-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 |
12 files changed, 90 insertions, 25 deletions
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 @@ <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) {
|