diff options
Diffstat (limited to 'protocols/Steam/src/steam_history.cpp')
-rw-r--r-- | protocols/Steam/src/steam_history.cpp | 108 |
1 files changed, 68 insertions, 40 deletions
diff --git a/protocols/Steam/src/steam_history.cpp b/protocols/Steam/src/steam_history.cpp index 8158c9e4c6..616f54c9df 100644 --- a/protocols/Steam/src/steam_history.cpp +++ b/protocols/Steam/src/steam_history.cpp @@ -1,66 +1,94 @@ #include "stdafx.h" -void CSteamProto::OnGotConversations(const CFriendsMessagesGetActiveMessageSessionsResponse &reply, const CMsgProtoBufHeader &hdr) +void CSteamProto::SendHistoryRequest(uint64_t accountId, uint32_t startTime) +{ + CFriendMessagesGetRecentMessagesRequest request; + request.steamid1 = m_iSteamId; request.has_steamid1 = true; + request.steamid2 = AccountIdToSteamId(accountId); request.has_steamid2 = true; + request.rtime32_start_time = startTime; request.has_rtime32_start_time = true; + WSSendService(FriendGetRecentMessages, request); +} + +void CSteamProto::OnGotRecentMessages(const CFriendMessagesGetRecentMessagesResponse &reply, const CMsgProtoBufHeader &hdr) { if (hdr.failed()) return; - for (int i=0; i < reply.n_message_sessions; i++) { - auto *session = reply.message_sessions[i]; + for (int i = 0; i < reply.n_messages; i++) { + auto *pMsg = reply.messages[i]; + auto steamId = AccountIdToSteamId(pMsg->accountid); - uint64_t steamId = session->accountid_friend; MCONTACT hContact = GetContact(steamId); if (!hContact) continue; - // Don't load any messages when we don't have lastMessageTS, as it may cause duplicates - time_t storedMessageTS = getDword(hContact, DB_KEY_LASTMSGTS); - if (storedMessageTS == 0) - continue; + char szMsgId[100]; + itoa(pMsg->timestamp, szMsgId, 10); - time_t lastMessageTS = session->last_message; - if (lastMessageTS > storedMessageTS) - SendRequest(new GetHistoryMessagesRequest(m_szAccessToken, m_iSteamId, steamId, storedMessageTS), &CSteamProto::OnGotHistoryMessages, (void*)hContact); + DB::EventInfo dbei(pMsg->has_timestamp ? db_event_getById(m_szModuleName, szMsgId) : 0); + dbei.flags = DBEF_UTF; + if (steamId == m_iSteamId) + dbei.flags |= DBEF_SENT; + dbei.cbBlob = (int)mir_strlen(pMsg->message); + dbei.pBlob = mir_strdup(pMsg->message); + dbei.timestamp = pMsg->has_timestamp ? pMsg->timestamp : time(0); + dbei.szId = szMsgId; + + if (dbei.getEvent()) + db_event_edit(dbei.getEvent(), &dbei, true); + else + ProtoChainRecvMsg(hContact, dbei); } } -void CSteamProto::OnGotHistoryMessages(const JSONNode &root, void *arg) +void CSteamProto::OnGotConversations(const CFriendsMessagesGetActiveMessageSessionsResponse &reply, const CMsgProtoBufHeader &hdr) { - if (root.isnull()) + if (hdr.failed()) return; - MCONTACT hContact = UINT_PTR(arg); - time_t storedMessageTS = getDword(hContact, DB_KEY_LASTMSGTS); - time_t newTS = storedMessageTS; - - const JSONNode &response = root["response"]; - const JSONNode &messages = response["messages"]; - for (size_t i = messages.size(); i > 0; i--) { - const JSONNode &message = messages[i - 1]; - - long long accountId = _wtoi64(message["accountid"].as_mstring()); - uint64_t steamId = AccountIdToSteamId(accountId); - - json_string text = message["message"].as_string(); - - time_t timestamp = _wtoi64(message["timestamp"].as_mstring()); + for (int i=0; i < reply.n_message_sessions; i++) { + auto *session = reply.message_sessions[i]; - // Ignore already existing messages - if (timestamp <= storedMessageTS) + uint64_t steamId = AccountIdToSteamId(session->accountid_friend); + MCONTACT hContact = GetContact(steamId); + if (!hContact) continue; - DB::EventInfo dbei; - dbei.timestamp = timestamp; - dbei.pBlob = (char *)text.c_str(); + time_t storedMessageTS = getDword(hContact, DBKEY_LASTMSG); + if (session->last_message > storedMessageTS) + SendHistoryRequest(steamId, storedMessageTS); + } +} - if (steamId == m_iSteamId) - dbei.flags = DBEF_SENT; +void CSteamProto::OnGotHistoryMessages(const CMsgClientChatGetFriendMessageHistoryResponse &reply, const CMsgProtoBufHeader &hdr) +{ + if (hdr.failed()) + return; - RecvMsg(hContact, dbei); + MCONTACT hContact = GetContact(reply.steamid); + if (!hContact) + return; - if (timestamp > newTS) - newTS = timestamp; + for (int i = 0; i < reply.n_messages; i++) { + auto *pMsg = reply.messages[i]; + + char szMsgId[100]; + itoa(pMsg->timestamp, szMsgId, 10); + + DB::EventInfo dbei(pMsg->has_timestamp ? db_event_getById(m_szModuleName, szMsgId) : 0); + dbei.flags = DBEF_UTF; + if (pMsg->has_unread && !pMsg->unread) + dbei.flags |= DBEF_READ; + if (pMsg->accountid == m_iSteamId) + dbei.flags |= DBEF_SENT; + dbei.cbBlob = (int)mir_strlen(pMsg->message); + dbei.pBlob = mir_strdup(pMsg->message); + dbei.timestamp = pMsg->has_timestamp ? pMsg->timestamp : time(0); + dbei.szId = szMsgId; + + if (dbei.getEvent()) + db_event_edit(dbei.getEvent(), &dbei, true); + else + ProtoChainRecvMsg(hContact, dbei); } - - setDword(hContact, DB_KEY_LASTMSGTS, newTS); } |