summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorge Hazan <george.hazan@gmail.com>2023-12-20 20:45:14 +0300
committerGeorge Hazan <george.hazan@gmail.com>2023-12-20 20:45:14 +0300
commita37cb1ece9d185cc5071fc0cc9f8e5c1b6f1fe79 (patch)
tree6cbffdbbe0fbefcf8be0656ed87b1072498882be
parent78cf4cb0dc9e9ec06a7a7fd12a77e8fdf229644d (diff)
fixes #3758 (ICQ: реализовать поддержку "Избранного")
-rw-r--r--protocols/ICQ-WIM/src/mra.cpp4
-rw-r--r--protocols/ICQ-WIM/src/options.cpp2
-rw-r--r--protocols/ICQ-WIM/src/proto.h2
-rw-r--r--protocols/ICQ-WIM/src/server.cpp30
4 files changed, 30 insertions, 8 deletions
diff --git a/protocols/ICQ-WIM/src/mra.cpp b/protocols/ICQ-WIM/src/mra.cpp
index 0c1422ddab..cfe427a136 100644
--- a/protocols/ICQ-WIM/src/mra.cpp
+++ b/protocols/ICQ-WIM/src/mra.cpp
@@ -101,9 +101,7 @@ void CIcqProto::OnCheckMrimLogin(NETLIBHTTPREQUEST *pReply, AsyncHttpRequest *)
m_szSessionKey = data["sessionKey"].as_mstring();
- CMStringW szUin = data["loginId"].as_mstring();
- if (szUin)
- m_szOwnId = szUin;
+ SetOwnId(data["loginId"].as_mstring());
int srvTS = data["hostTime"].as_int();
m_iTimeShift = (srvTS) ? time(0) - srvTS : 0;
diff --git a/protocols/ICQ-WIM/src/options.cpp b/protocols/ICQ-WIM/src/options.cpp
index ab17121a30..b06ee210a1 100644
--- a/protocols/ICQ-WIM/src/options.cpp
+++ b/protocols/ICQ-WIM/src/options.cpp
@@ -207,7 +207,7 @@ void CIcqProto::OnLoginViaPhone(NETLIBHTTPREQUEST *pReply, AsyncHttpRequest *pRe
m_szSessionKey = data["sessionKey"].as_mstring();
setString(DB_KEY_SESSIONKEY, m_szSessionKey);
- m_szOwnId = data["loginId"].as_mstring();
+ SetOwnId(data["loginId"].as_mstring());
setByte(DB_KEY_PHONEREG, 1);
}
diff --git a/protocols/ICQ-WIM/src/proto.h b/protocols/ICQ-WIM/src/proto.h
index c373a6f184..f665094ad3 100644
--- a/protocols/ICQ-WIM/src/proto.h
+++ b/protocols/ICQ-WIM/src/proto.h
@@ -217,6 +217,7 @@ class CIcqProto : public PROTO<CIcqProto>
void RetrieveUserHistory(MCONTACT, __int64 startMsgId, bool bCreateRead);
void RetrieveUserInfo(MCONTACT hContact);
void SendMrimLogin(NETLIBHTTPREQUEST *pReply);
+ void SetOwnId(const CMStringW &wszId);
void SetServerStatus(int iNewStatus);
void ShutdownSession(void);
void StartSession(void);
@@ -300,6 +301,7 @@ class CIcqProto : public PROTO<CIcqProto>
LONG m_msgId = 1;
int m_iRClientId;
HGENMENU m_hUploadGroups;
+ MCONTACT m_hFavContact = INVALID_CONTACT_ID;
mir_cs m_csOwnIds;
OBJLIST<IcqOwnMessage> m_arOwnIds;
diff --git a/protocols/ICQ-WIM/src/server.cpp b/protocols/ICQ-WIM/src/server.cpp
index 0b4213c09d..b160cea08a 100644
--- a/protocols/ICQ-WIM/src/server.cpp
+++ b/protocols/ICQ-WIM/src/server.cpp
@@ -320,6 +320,8 @@ void CIcqProto::OnLoggedIn()
for (auto &it : m_arCache)
it->m_timer1 = it->m_timer2 = 0;
+ setWord(m_hFavContact, "Status", ID_STATUS_ONLINE);
+
SetServerStatus(m_iDesiredStatus);
RetrieveUserInfo(0);
GetPermitDeny();
@@ -412,7 +414,7 @@ MCONTACT CIcqProto::ParseBuddyInfo(const JSONNode &buddy, MCONTACT hContact, boo
else delSetting(hContact, "MirVer");
const JSONNode &var = buddy["friendly"];
- if (var)
+ if (var && hContact != m_hFavContact)
setWString(hContact, "Nick", var.as_mstring());
if (buddy["deleted"].as_bool()) {
@@ -903,6 +905,28 @@ void CIcqProto::RetrieveHistoryChunk(MCONTACT hContact, __int64 patchVer, __int6
/////////////////////////////////////////////////////////////////////////////////////////
+void CIcqProto::SetOwnId(const CMStringW &wszId)
+{
+ if (wszId.IsEmpty())
+ return;
+
+ m_szOwnId = wszId;
+
+ auto *pUser = FindUser(wszId);
+ if (!pUser) {
+ MCONTACT hContact = CreateContact(wszId, false);
+ Clist_SetGroup(hContact, TranslateT("Conferences"));
+ pUser = FindUser(wszId);
+ }
+
+ setWString(pUser->m_hContact, "Nick", TranslateT("Favorites"));
+
+ if (m_hFavContact == INVALID_CONTACT_ID) {
+ m_hFavContact = pUser->m_hContact;
+ pUser->m_hContact = 0;
+ }
+}
+
void CIcqProto::SetServerStatus(int iStatus)
{
const char *szStatus = "online";
@@ -1079,9 +1103,7 @@ void CIcqProto::OnCheckPassword(NETLIBHTTPREQUEST *pReply, AsyncHttpRequest*)
m_szSessionKey = ptrA(mir_base64_encode(hashOut, sizeof(hashOut)));
setString(DB_KEY_SESSIONKEY, m_szSessionKey);
- CMStringW szUin = data["loginId"].as_mstring();
- if (szUin)
- m_szOwnId = szUin;
+ SetOwnId(data["loginId"].as_mstring());
int srvTS = data["hostTime"].as_int();
m_iTimeShift = (srvTS) ? time(0) - srvTS : 0;