summaryrefslogtreecommitdiff
path: root/src/mir_app/src/chat_svc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mir_app/src/chat_svc.cpp')
-rw-r--r--src/mir_app/src/chat_svc.cpp57
1 files changed, 35 insertions, 22 deletions
diff --git a/src/mir_app/src/chat_svc.cpp b/src/mir_app/src/chat_svc.cpp
index 4e68112ff7..7f92ba37c8 100644
--- a/src/mir_app/src/chat_svc.cpp
+++ b/src/mir_app/src/chat_svc.cpp
@@ -1,7 +1,7 @@
/*
Chat module plugin for Miranda IM
-Copyright 2000-12 Miranda IM, 2012-24 Miranda NG team,
+Copyright 2000-12 Miranda IM, 2012-25 Miranda NG team,
all portions of this codebase are copyrighted to the people
listed in contributors.txt.
@@ -23,6 +23,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "stdafx.h"
CMOption<bool> Chat::bShowNicklist(CHAT_MODULE, "ShowNicklist", true);
+CMOption<bool> Chat::bShowFormatting(CHAT_MODULE, "ShowFormatting", false); // Hidden option
CMOption<bool> Chat::bFilterEnabled(CHAT_MODULE, "FilterEnabled", false);
CMOption<bool> Chat::bTopicOnClist(CHAT_MODULE, "TopicOnClist", false);
CMOption<bool> Chat::bPopupOnJoin(CHAT_MODULE, "PopupOnJoin", false);
@@ -31,7 +32,6 @@ CMOption<bool> Chat::bUseGroup(CHAT_MODULE, "UseGroup", true);
CMOption<bool> Chat::bDoubleClick4Privat(CHAT_MODULE, "DoubleClick4Privat", false);
CMOption<bool> Chat::bShowContactStatus(CHAT_MODULE, "ShowContactStatus", true);
CMOption<bool> Chat::bContactStatusFirst(CHAT_MODULE, "ContactStatusFirst", false);
-CMOption<bool> Chat::bEnableCustomLogs(SRMM_MODULE, "EnableCustomLogs", false);
CMOption<bool> Chat::bFlashWindow(CHAT_MODULE, "FlashWindow", false);
CMOption<bool> Chat::bFlashWindowHighlight(CHAT_MODULE, "FlashWindowHighlight", false);
@@ -209,7 +209,7 @@ MIR_APP_DLL(SESSION_INFO*) Chat_NewSession(
SESSION_INFO *si = Chat_Find(ptszID, pszModule);
if (si != nullptr) {
UM_RemoveAll(si);
- g_chatApi.TM_RemoveAll(&si->pStatuses);
+ si->arStatuses.destroy();
lck.unlock();
si->iStatusCount = 0;
@@ -292,9 +292,9 @@ static void SetInitDone(SESSION_INFO *si)
return;
si->bInitDone = true;
- for (STATUSINFO *p = si->pStatuses; p; p = p->next)
- if (p->iIconIndex < STATUSICONCOUNT)
- p->iIconIndex = si->iStatusCount - p->iIconIndex - 1;
+ for (auto &it : si->arStatuses)
+ if (it->iIconIndex < STATUSICONCOUNT)
+ it->iIconIndex = si->iStatusCount - it->iIconIndex - 1;
}
static int RoomControlHandler(int iCommand, SESSION_INFO *si)
@@ -428,7 +428,7 @@ MIR_APP_DLL(int) Chat_Terminate(SESSION_INFO *si)
static void AddUser(SESSION_INFO *si, GCEVENT &gce)
{
- uint16_t status = TM_StringToWord(si->pStatuses, gce.pszStatus.w);
+ uint16_t status = TM_StringToWord(si, gce.pszStatus.w);
USERINFO *ui = UM_AddUser(si, gce.pszUID.w, gce.pszNick.w, status);
if (ui == nullptr)
@@ -621,14 +621,10 @@ MIR_APP_DLL(int) Chat_AddGroup(SESSION_INFO *si, const wchar_t *wszText)
return 0;
mir_cslock lck(csChat);
- STATUSINFO *ti = TM_AddStatus(&si->pStatuses, wszText, &si->iStatusCount);
- if (ti) {
- si->iStatusCount++;
- si->bIsDirty = true;
- }
-
- if (g_chatApi.OnAddStatus)
+ STATUSINFO *ti = TM_AddStatus(si, wszText);
+ if (ti && g_chatApi.OnAddStatus)
g_chatApi.OnAddStatus(si, ti);
+
return 0;
}
@@ -680,6 +676,11 @@ MIR_APP_DLL(int) Chat_ChangeUserId(SESSION_INFO *si, const wchar_t *wszOldId, co
return 0;
}
+MIR_APP_DLL(STATUSINFO *) Chat_GetStatus(SESSION_INFO *si, const USERINFO *ui)
+{
+ return TM_FindStatus(si, TM_WordToString(si, ui->Status));
+}
+
MIR_APP_DLL(void*) Chat_GetUserInfo(SESSION_INFO *si)
{
return (si) ? si->pItemData : nullptr;
@@ -796,12 +797,18 @@ static HGENMENU hJoinMenuItem, hLeaveMenuItem, hMuteRootMenuItem, hMute0MenuItem
static INT_PTR JoinChat(WPARAM hContact, LPARAM lParam)
{
if (hContact) {
- char *szProto = Proto_GetBaseAccountName(hContact);
- if (szProto) {
- if (db_get_w(hContact, szProto, "Status", 0) == ID_STATUS_OFFLINE)
- CallProtoService(szProto, PS_JOINCHAT, hContact, lParam);
- else
- RoomDoubleclicked(hContact, 0);
+ if (char *szProto = Proto_GetBaseAccountName(hContact)) {
+ if (Proto_GetStatus(szProto) != ID_STATUS_OFFLINE) {
+ if (Contact::GetStatus(hContact, szProto) == ID_STATUS_OFFLINE)
+ CallProtoService(szProto, PS_JOINCHAT, hContact, lParam);
+ else
+ RoomDoubleclicked(hContact, 0);
+ }
+ else {
+ auto *pMM = MM_FindModule(szProto);
+ if (pMM->bDatabase)
+ CallService(MS_HISTORY_SHOWCONTACTHISTORY, hContact, 0);
+ }
}
}
@@ -851,7 +858,7 @@ static int OnContactDeleted(WPARAM hContact, LPARAM)
if (auto *si = SM_FindSessionByContact(hContact))
_wremove(Chat_GetFolderName(si));
- if (Contact::GetStatus(hContact) != ID_STATUS_OFFLINE)
+ if (Contact::GetStatus(hContact, szProto) != ID_STATUS_OFFLINE)
CallProtoService(szProto, PS_LEAVECHAT, hContact);
}
return 0;
@@ -892,7 +899,7 @@ static int PrebuildContactMenu(WPARAM hContact, LPARAM)
bIsChat = true;
// still hide it for offline protos
if (Proto_GetStatus(szProto) != ID_STATUS_OFFLINE) {
- if (db_get_w(hContact, szProto, "Status", 0) == ID_STATUS_OFFLINE) {
+ if (Contact::GetStatus(hContact, szProto) == ID_STATUS_OFFLINE) {
if (ProtoServiceExists(szProto, PS_JOINCHAT)) {
bEnabledJoin = true;
Menu_ModifyItem(hJoinMenuItem, LPGENW("&Join chat"));
@@ -903,6 +910,12 @@ static int PrebuildContactMenu(WPARAM hContact, LPARAM)
Menu_ModifyItem(hJoinMenuItem, LPGENW("&Open/close chat window"));
}
}
+ else if (auto *pMM = MM_FindModule(szProto))
+ if (pMM->bDatabase) {
+ bEnabledJoin = true;
+ Menu_ModifyItem(hJoinMenuItem, LPGENW("&History"));
+ }
+
bEnabledLeave = ProtoServiceExists(szProto, PS_LEAVECHAT) != 0;
}
}