summaryrefslogtreecommitdiff
path: root/protocols/Steam/src/steam_history.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'protocols/Steam/src/steam_history.cpp')
-rw-r--r--protocols/Steam/src/steam_history.cpp108
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);
}