summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Pösel <robyer@seznam.cz>2017-08-20 13:37:25 +0200
committerRobert Pösel <robyer@seznam.cz>2017-08-20 13:38:08 +0200
commitfdf4ca9cfb31f8a2776849c33b7321af3c979b3b (patch)
tree6e2613cc52304d1213ed536c63aeabe7223e9a23
parent47847fafba59c20ecde3e7ece4bf4fac57b99439 (diff)
parentab6b80d2ba56b4df04090c35f42dd2179f0267a2 (diff)
Steam: Fix creating duplicate contacts (fixes #816)
-rw-r--r--protocols/Steam/src/steam_contacts.cpp83
-rw-r--r--protocols/Steam/src/steam_proto.cpp2
-rw-r--r--protocols/Steam/src/steam_proto.h6
3 files changed, 48 insertions, 43 deletions
diff --git a/protocols/Steam/src/steam_contacts.cpp b/protocols/Steam/src/steam_contacts.cpp
index 5ed053fecb..1b3620e736 100644
--- a/protocols/Steam/src/steam_contacts.cpp
+++ b/protocols/Steam/src/steam_contacts.cpp
@@ -94,7 +94,7 @@ MCONTACT CSteamProto::FindContact(const char *steamId)
return hContact;
}
-void CSteamProto::UpdateContact(MCONTACT hContact, JSONNode *data)
+void CSteamProto::UpdateContactDetails(MCONTACT hContact, JSONNode *data)
{
// set common data
JSONNode *node = json_get(data, "personaname");
@@ -346,7 +346,17 @@ void CSteamProto::ContactIsAskingAuth(MCONTACT hContact)
MCONTACT CSteamProto::AddContact(const char *steamId, bool isTemporary)
{
- MCONTACT hContact = this->FindContact(steamId);
+ MCONTACT hContact = NULL;
+
+ mir_cslock lck(this->contact_search_lock);
+
+ for (hContact = db_find_first(this->m_szModuleName); hContact; hContact = db_find_next(hContact, this->m_szModuleName))
+ {
+ ptrA cSteamId(db_get_sa(hContact, this->m_szModuleName, "SteamID"));
+ if (!lstrcmpA(cSteamId, steamId))
+ break;
+ }
+
if (!hContact)
{
// create contact
@@ -378,19 +388,13 @@ MCONTACT CSteamProto::AddContact(const char *steamId, bool isTemporary)
return hContact;
}
-void CSteamProto::ProcessContact(std::map<std::string, JSONNode*>::iterator *it, MCONTACT hContact)
+void CSteamProto::UpdateContactRelationship(MCONTACT hContact, JSONNode *data)
{
- std::string steamId = (*it)->first;
- JSONNode *child = (*it)->second;
-
- if (!hContact)
- hContact = AddContact(steamId.c_str());
-
- JSONNode *node = json_get(child, "friend_since");
+ JSONNode *node = json_get(data, "friend_since");
if (node)
db_set_dw(hContact, "UserInfo", "ContactAddTime", json_as_int(node));
- node = json_get(child, "relationship");
+ node = json_get(data, "relationship");
if (node == NULL)
return;
@@ -442,30 +446,34 @@ void CSteamProto::OnGotFriendList(const HttpResponse *response)
}
}
- // 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;
+ // Check and update contacts in database
+ mir_cslock lck(this->contact_search_lock);
- ptrA id(getStringA(hContact, "SteamID"));
- if (id == NULL)
- continue;
+ for (MCONTACT hContact = db_find_first(m_szModuleName); hContact; hContact = db_find_next(hContact, m_szModuleName))
+ {
+ if (isChatRoom(hContact))
+ continue;
- std::map<std::string, JSONNode*>::iterator it = friends.find(std::string(id));
+ ptrA id(getStringA(hContact, "SteamID"));
+ if (id == NULL)
+ continue;
- if (it != friends.end())
- {
- // Contact is on server-list, update (and eventually notify) it
- ProcessContact(&it, hContact);
+ std::map<std::string, JSONNode*>::iterator it = friends.find(std::string(id));
- steamIds.append(",").append(it->first);
- friends.erase(it);
- }
- else
- {
- // Contact was removed from server-list, notify it
- ContactIsRemoved(hContact);
+ if (it != friends.end())
+ {
+ // Contact is on server-list, update (and eventually notify) it
+ UpdateContactRelationship(hContact, it->second);
+
+ steamIds.append(",").append(it->first);
+ friends.erase(it);
+ }
+ else
+ {
+ // Contact was removed from server-list, notify it
+ ContactIsRemoved(hContact);
+ }
}
}
@@ -473,7 +481,8 @@ void CSteamProto::OnGotFriendList(const HttpResponse *response)
for (std::map<std::string, JSONNode*>::iterator it = friends.begin(); it != friends.end();)
{
// Contact is on server-list, but not in database, add (but not notify) it
- ProcessContact(&it, NULL);
+ MCONTACT hContact = AddContact(it->first.c_str());
+ UpdateContactRelationship(hContact, it->second);
steamIds.append(",").append(it->first);
it = friends.erase(it);
@@ -568,12 +577,10 @@ void CSteamProto::OnGotUserSummaries(const HttpResponse *response)
MCONTACT hContact = NULL;
if (!IsMe(steamId)) {
- hContact = FindContact(steamId);
- if (!hContact)
- hContact = AddContact(steamId);
+ hContact = AddContact(steamId);
}
- UpdateContact(hContact, item);
+ UpdateContactDetails(hContact, item);
}
json_delete(nroot);
}
@@ -676,11 +683,9 @@ void CSteamProto::OnAuthRequested(const HttpResponse *response, void *arg)
node = json_get(nroot, "steamid");
ptrA steamId(mir_u2a(ptrW(json_as_string(node))));
- MCONTACT hContact = FindContact(steamId);
- if (!hContact)
- hContact = AddContact(steamId);
+ MCONTACT hContact = AddContact(steamId);
- UpdateContact(hContact, nroot);
+ UpdateContactDetails(hContact, nroot);
ContactIsAskingAuth(hContact);
}
diff --git a/protocols/Steam/src/steam_proto.cpp b/protocols/Steam/src/steam_proto.cpp
index aef0747f81..5ea69328b8 100644
--- a/protocols/Steam/src/steam_proto.cpp
+++ b/protocols/Steam/src/steam_proto.cpp
@@ -104,7 +104,7 @@ MCONTACT CSteamProto::AddToList(int, PROTOSEARCHRESULT* psr)
{
STEAM_SEARCH_RESULT *ssr = (STEAM_SEARCH_RESULT*)psr;
hContact = AddContact(steamId, true);
- UpdateContact(hContact, ssr->data);
+ UpdateContactDetails(hContact, ssr->data);
}
return hContact;
diff --git a/protocols/Steam/src/steam_proto.h b/protocols/Steam/src/steam_proto.h
index b9d4ca8556..4a2aff8d47 100644
--- a/protocols/Steam/src/steam_proto.h
+++ b/protocols/Steam/src/steam_proto.h
@@ -137,9 +137,9 @@ protected:
MCONTACT GetContactFromAuthEvent(MEVENT hEvent);
- void UpdateContact(MCONTACT hContact, JSONNode *data);
- void ProcessContact(std::map<std::string, JSONNode*>::iterator *it, MCONTACT hContact);
-
+ void UpdateContactDetails(MCONTACT hContact, JSONNode *data);
+ void UpdateContactRelationship(MCONTACT hContact, JSONNode *data);
+
void ContactIsRemoved(MCONTACT hContact);
void ContactIsFriend(MCONTACT hContact);
void ContactIsIgnored(MCONTACT hContact);