From f16b4030068686b9f8bc1c4d22cd8c52b78a21d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20P=C3=B6sel?= Date: Thu, 4 Dec 2014 14:00:12 +0000 Subject: Steam: - Save timestamp when user created his account ("MemberTS") - Save timestamp when user was removed from friends ("DeletedTS") - Save timestamp when user was added to friends ("ContactAddTime" in branch "UserInfo" - compatibility with UserInfoEx) - Properly set info about deleted contacts at login - Notify when user is deleted or added again to contacts git-svn-id: http://svn.miranda-ng.org/main/trunk@11240 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- protocols/Steam/src/steam_contacts.cpp | 139 +++++++++++++++++++++++++++------ 1 file changed, 113 insertions(+), 26 deletions(-) (limited to 'protocols/Steam/src/steam_contacts.cpp') diff --git a/protocols/Steam/src/steam_contacts.cpp b/protocols/Steam/src/steam_contacts.cpp index 505a088038..f0498f25f6 100644 --- a/protocols/Steam/src/steam_contacts.cpp +++ b/protocols/Steam/src/steam_contacts.cpp @@ -108,6 +108,9 @@ void CSteamProto::UpdateContact(MCONTACT hContact, JSONNODE *data) else delSetting(hContact, "Country"); + node = json_get(data, "timecreated"); + setDword(hContact, "MemberTS", json_as_int(node)); + // only for contacts if (hContact) { @@ -139,6 +142,44 @@ void CSteamProto::UpdateContact(MCONTACT hContact, JSONNODE *data) } } +void CSteamProto::ContactIsRemoved(MCONTACT hContact) +{ + if (!getDword(hContact, "DeletedTS", 0) && getByte(hContact, "Auth", 0) == 0) + { + setByte(hContact, "Auth", 1); + setDword(hContact, "DeletedTS", ::time(NULL)); + setWord(hContact, "Status", ID_STATUS_OFFLINE); + + ptrT nick(getTStringA(hContact, "Nick")); + TCHAR message[MAX_PATH]; + mir_sntprintf(message, MAX_PATH, TranslateT("%s has been removed from your contact list"), nick); + + ShowNotification(_T("Steam"), message); + } +} + +void CSteamProto::ContactIsFriend(MCONTACT hContact) +{ + if (getDword(hContact, "DeletedTS", 0) || getByte(hContact, "Auth", 0) != 0) + { + delSetting(hContact, "Auth"); + delSetting(hContact, "DeletedTS"); + delSetting(hContact, "Grant"); + + ptrT nick(getTStringA(hContact, "Nick")); + TCHAR message[MAX_PATH]; + mir_sntprintf(message, MAX_PATH, TranslateT("%s is back in your contact list"), nick); + + ShowNotification(_T("Steam"), message); + } +} + +void CSteamProto::ContactIsIgnored(MCONTACT hContact) +{ + // todo + setByte(hContact, "Block", 1); +} + MCONTACT CSteamProto::AddContact(const char *steamId, bool isTemporary) { MCONTACT hContact = this->FindContact(steamId); @@ -172,6 +213,34 @@ MCONTACT CSteamProto::AddContact(const char *steamId, bool isTemporary) return hContact; } +void CSteamProto::ProcessContact(std::map::iterator *it, MCONTACT hContact) +{ + std::string steamId = (*it)->first; + JSONNODE *child = (*it)->second; + + if (!hContact) + hContact = AddContact(steamId.c_str()); + + JSONNODE *node = json_get(child, "friend_since"); + db_set_dw(hContact, "UserInfo", "ContactAddTime", json_as_int(node)); + + node = json_get(child, "relationship"); + ptrA relationship(mir_u2a(json_as_string(node))); + if (!lstrcmpiA(relationship, "friend")) + { + ContactIsFriend(hContact); + } + else if (!lstrcmpiA(relationship, "ignoredfriend")) + { + ContactIsIgnored(hContact); + } + else if (!lstrcmpiA(relationship, "requestrecipient")) + { + // todo + //RaiseAuthRequestThread((void*)hContact); + } +} + void CSteamProto::OnGotFriendList(const NETLIBHTTPREQUEST *response, void *arg) { if (response == NULL) @@ -183,6 +252,9 @@ void CSteamProto::OnGotFriendList(const NETLIBHTTPREQUEST *response, void *arg) std::string steamIds = ptrA(getStringA("SteamID")); + std::map friends; + + // Remember contacts on server JSONNODE *node = json_get(root, "friends"); JSONNODE *nroot = json_as_array(node); if (nroot != NULL) @@ -194,36 +266,51 @@ void CSteamProto::OnGotFriendList(const NETLIBHTTPREQUEST *response, void *arg) break; node = json_get(child, "steamid"); - ptrA steamId(mir_u2a(json_as_string(node))); - steamIds.append(",").append(steamId); + if (node == NULL) + continue; - MCONTACT hContact = FindContact(steamId); - if (!hContact) - hContact = AddContact(steamId); + std::string steamId = _T2A(json_as_string(node)); + friends.insert(std::make_pair(steamId, child)); + } + } - node = json_get(child, "relationship"); - ptrA relationship(mir_u2a(json_as_string(node))); - /*if (!lstrcmpiA(relationship, "friend")) - { - if (!FindContact(steamId)) - { - AddContact(steamId); - steamIds.append(steamId).append(","); - } - } - else */if (!lstrcmpiA(relationship, "ignoredfriend")) - { - // todo - setByte(hContact, "Block", 1); - } - else if (!lstrcmpiA(relationship, "requestrecipient")) - { - // todo - //RaiseAuthRequestThread((void*)hContact); - } - else continue; + // Check and update contacts in database + for (MCONTACT hContact = db_find_first(m_szModuleName); hContact; hContact = db_find_next(hContact, m_szModuleName)) + { + if (isChatRoom(hContact)) + continue; + + ptrA id(getStringA(hContact, "SteamID")); + if (id == NULL) + continue; + + std::map::iterator it = friends.find(std::string(id)); + + if (it != friends.end()) + { + // Contact is on server-list, update (and eventually notify) it + ProcessContact(&it, hContact); + + steamIds.append(",").append(it->first); + friends.erase(it); } + else + { + // Contact was removed from server-list, notify it + ContactIsRemoved(hContact); + } + } + + // Check remaining contacts in map and add them to contact list + for (std::map::iterator it = friends.begin(); it != friends.end();) + { + // Contact is on server-list, but not in database, add (but not notify) it + ProcessContact(&it, NULL); + + steamIds.append(",").append(it->first); + it = friends.erase(it); } + friends.clear(); if (!steamIds.empty()) { -- cgit v1.2.3