diff options
author | George Hazan <ghazan@miranda.im> | 2019-01-04 21:51:55 +0300 |
---|---|---|
committer | George Hazan <ghazan@miranda.im> | 2019-01-04 21:52:04 +0300 |
commit | 968f63306e70ddc7e83a7de5c9cb6de462d281c1 (patch) | |
tree | ab6380c5a17a6b6bad3f2392e261753f2248e407 /protocols/Icq10 | |
parent | feadcce02aad819c312e04a5ce11e054c688fe3c (diff) |
also we analyze im state of newly sent message to avoid problems with dups
Diffstat (limited to 'protocols/Icq10')
-rw-r--r-- | protocols/Icq10/src/proto.h | 2 | ||||
-rw-r--r-- | protocols/Icq10/src/server.cpp | 35 |
2 files changed, 32 insertions, 5 deletions
diff --git a/protocols/Icq10/src/proto.h b/protocols/Icq10/src/proto.h index c995a463c5..e90138fdf3 100644 --- a/protocols/Icq10/src/proto.h +++ b/protocols/Icq10/src/proto.h @@ -68,6 +68,7 @@ class CIcqProto : public PROTO<CIcqProto> bool m_bOnline = false, m_bTerminated = false; void CheckAvatarChange(MCONTACT hContact, const JSONNode&); + void CheckLastId(MCONTACT hContact, const JSONNode&); void CheckNickChange(MCONTACT hContact, const JSONNode&); void CheckPassword(void); void ConnectionFailed(int iReason); @@ -102,6 +103,7 @@ class CIcqProto : public PROTO<CIcqProto> void ProcessBuddyList(const JSONNode&); void ProcessEvent(const JSONNode&); void ProcessHistData(const JSONNode&); + void ProcessImState(const JSONNode&); void ProcessMyInfo(const JSONNode&); void ProcessPresence(const JSONNode&); void ProcessTyping(const JSONNode&); diff --git a/protocols/Icq10/src/server.cpp b/protocols/Icq10/src/server.cpp index ba78846ca2..2df4d8bd1f 100644 --- a/protocols/Icq10/src/server.cpp +++ b/protocols/Icq10/src/server.cpp @@ -36,6 +36,14 @@ void CIcqProto::CheckAvatarChange(MCONTACT hContact, const JSONNode &ev) } } +void CIcqProto::CheckLastId(MCONTACT hContact, const JSONNode &ev) +{ + __int64 msgId = _wtoi64(ev["histMsgId"].as_mstring()); + __int64 lastId = getId(hContact, DB_KEY_LASTMSGID); + if (msgId > lastId) + setId(hContact, DB_KEY_LASTMSGID, msgId); +} + void CIcqProto::CheckNickChange(MCONTACT hContact, const JSONNode &ev) { CMStringW wszNick(getMStringW(hContact, "Nick")); @@ -572,11 +580,7 @@ void CIcqProto::OnSendMessage(NETLIBHTTPREQUEST *pReply, AsyncHttpRequest *pReq) } } - const JSONNode &data = root.data(); - __int64 msgId = _wtoi64(data["histMsgId"].as_mstring()); - __int64 lastId = getId(ownMsg->m_hContact, DB_KEY_LASTMSGID); - if (msgId > lastId) - setId(ownMsg->m_hContact, DB_KEY_LASTMSGID, msgId); + CheckLastId(ownMsg->m_hContact, root.data()); } ///////////////////////////////////////////////////////////////////////////////////////// @@ -613,6 +617,8 @@ void CIcqProto::ProcessEvent(const JSONNode &ev) ProcessBuddyList(pData); else if (szType == L"histDlgState") ProcessHistData(pData); + else if (szType == L"imState") + ProcessImState(pData); else if (szType == L"myInfo") ProcessMyInfo(pData); else if (szType == L"presence") @@ -641,6 +647,25 @@ void CIcqProto::ProcessHistData(const JSONNode &ev) ParseMessage(hContact, it); } +void CIcqProto::ProcessImState(const JSONNode &ev) +{ + for (auto &it : ev["imStates"]) { + if (it["state"].as_mstring() != L"sent") + continue; + + MCONTACT hContact = 0; + CMStringA reqId(it["sendReqId"].as_mstring()); + for (auto &own : m_arOwnIds) + if (reqId == own->m_guid) { + hContact = own->m_hContact; + break; + } + + if (hContact) + CheckLastId(hContact, ev); + } +} + void CIcqProto::ProcessMyInfo(const JSONNode &ev) { CheckNickChange(0, ev); |