summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorge Hazan <george.hazan@gmail.com>2023-12-23 15:10:58 +0300
committerGeorge Hazan <george.hazan@gmail.com>2023-12-23 15:10:58 +0300
commit7d792ed6fb393548f886d30c2fa69f0a8555d01b (patch)
treeb5ab0bed484eae85ae01c1ecbd63c7c00c537467
parent371ac8f6da293e5f4b69d51e3bcb511ba5c1b6e1 (diff)
fixes #3803 (ICQ: Нет уведомлений о новых сообщениях, если я пишу с другого клиента самому себе)
-rw-r--r--protocols/ICQ-WIM/src/poll.cpp14
-rw-r--r--protocols/ICQ-WIM/src/proto.h4
-rw-r--r--protocols/ICQ-WIM/src/utils.cpp7
3 files changed, 16 insertions, 9 deletions
diff --git a/protocols/ICQ-WIM/src/poll.cpp b/protocols/ICQ-WIM/src/poll.cpp
index a75b972e15..cbf17cfa54 100644
--- a/protocols/ICQ-WIM/src/poll.cpp
+++ b/protocols/ICQ-WIM/src/poll.cpp
@@ -179,7 +179,7 @@ void CIcqProto::ProcessHistData(const JSONNode &ev)
break;
}
- if ((si = CreateGroupChat(wszId, wszNick)) == nullptr)
+ if ((si = GcCreate(wszId, wszNick)) == nullptr)
return;
}
@@ -328,12 +328,13 @@ void CIcqProto::ProcessPresence(const JSONNode &ev)
if (pUser == nullptr)
return;
- int iNewStatus = StatusFromPresence(ev, pUser->m_hContact);
+ MCONTACT hContact = GetRealContact(pUser);
+ int iNewStatus = StatusFromPresence(ev, hContact);
if (iNewStatus != -1)
ProcessStatus(pUser, iNewStatus);
- Json2string(pUser->m_hContact, ev, "friendly", "Nick", true);
- CheckAvatarChange(pUser->m_hContact, ev);
+ Json2string(hContact, ev, "friendly", "Nick", true);
+ CheckAvatarChange(hContact, ev);
}
void CIcqProto::ProcessSessionEnd(const JSONNode &/*ev*/)
@@ -352,10 +353,11 @@ void CIcqProto::ProcessTyping(const JSONNode &ev)
auto *pUser = FindUser(aimId);
if (pUser) {
+ MCONTACT hContact = GetRealContact(pUser);
if (wszStatus == "typing")
- CallService(MS_PROTO_CONTACTISTYPING, pUser->m_hContact, 60);
+ CallService(MS_PROTO_CONTACTISTYPING, hContact, 60);
else
- CallService(MS_PROTO_CONTACTISTYPING, pUser->m_hContact, PROTOTYPE_CONTACTTYPING_OFF);
+ CallService(MS_PROTO_CONTACTISTYPING, hContact, PROTOTYPE_CONTACTTYPING_OFF);
}
}
diff --git a/protocols/ICQ-WIM/src/proto.h b/protocols/ICQ-WIM/src/proto.h
index 1afe659e85..1771a37e43 100644
--- a/protocols/ICQ-WIM/src/proto.h
+++ b/protocols/ICQ-WIM/src/proto.h
@@ -265,7 +265,6 @@ class CIcqProto : public PROTO<CIcqProto>
void OnGetUserCaps(NETLIBHTTPREQUEST *pReply, AsyncHttpRequest *pReq);
void OnGetUserHistory(NETLIBHTTPREQUEST *pReply, AsyncHttpRequest *pReq);
void OnGetUserInfo(NETLIBHTTPREQUEST *pReply, AsyncHttpRequest *pReq);
- void OnLastSeen(NETLIBHTTPREQUEST *pReply, AsyncHttpRequest *pReq);
void OnLeaveChat(NETLIBHTTPREQUEST *pReply, AsyncHttpRequest *pReq);
void OnLoginViaPhone(NETLIBHTTPREQUEST *pReply, AsyncHttpRequest *pReq);
void OnNormalizePhone(NETLIBHTTPREQUEST *pReply, AsyncHttpRequest *pReq);
@@ -354,7 +353,7 @@ class CIcqProto : public PROTO<CIcqProto>
void InitContactCache(void);
IcqUser* FindUser(const CMStringW &pwszId);
MCONTACT CreateContact(const CMStringW &pwszId, bool bTemporary);
-
+
void GetAvatarFileName(MCONTACT hContact, wchar_t *pszDest, size_t cbLen);
////////////////////////////////////////////////////////////////////////////////////////
@@ -450,6 +449,7 @@ public:
CMOption<uint32_t> m_iStatus2;
void CheckStatus(void);
+ MCONTACT GetRealContact(IcqUser *pUser);
CMStringW GetUserId(MCONTACT);
__forceinline int TS() const
diff --git a/protocols/ICQ-WIM/src/utils.cpp b/protocols/ICQ-WIM/src/utils.cpp
index e0c39c27a6..6af29df66d 100644
--- a/protocols/ICQ-WIM/src/utils.cpp
+++ b/protocols/ICQ-WIM/src/utils.cpp
@@ -94,7 +94,7 @@ MCONTACT CIcqProto::CreateContact(const CMStringW &wszId, bool bTemporary)
{
auto *pUser = FindUser(wszId);
if (pUser != nullptr)
- return pUser->m_hContact;
+ return GetRealContact(pUser);
MCONTACT hContact = db_add_contact();
setWString(hContact, DB_KEY_ID, wszId);
@@ -149,6 +149,11 @@ void CIcqProto::Json2string(MCONTACT hContact, const JSONNode &node, const char
/////////////////////////////////////////////////////////////////////////////////////////
+MCONTACT CIcqProto::GetRealContact(IcqUser *pUser)
+{
+ return (pUser->m_hContact == 0) ? m_hFavContact : pUser->m_hContact;
+}
+
CMStringW CIcqProto::GetUserId(MCONTACT hContact)
{
return getMStringW(hContact, DB_KEY_ID);