summaryrefslogtreecommitdiff
path: root/protocols/Icq10
diff options
context:
space:
mode:
authorGeorge Hazan <ghazan@miranda.im>2019-01-04 21:51:55 +0300
committerGeorge Hazan <ghazan@miranda.im>2019-01-04 21:52:04 +0300
commit968f63306e70ddc7e83a7de5c9cb6de462d281c1 (patch)
treeab6380c5a17a6b6bad3f2392e261753f2248e407 /protocols/Icq10
parentfeadcce02aad819c312e04a5ce11e054c688fe3c (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.h2
-rw-r--r--protocols/Icq10/src/server.cpp35
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);