summaryrefslogtreecommitdiff
path: root/protocols/Icq10/src/server.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'protocols/Icq10/src/server.cpp')
-rw-r--r--protocols/Icq10/src/server.cpp39
1 files changed, 34 insertions, 5 deletions
diff --git a/protocols/Icq10/src/server.cpp b/protocols/Icq10/src/server.cpp
index ad56d91617..52daefef3f 100644
--- a/protocols/Icq10/src/server.cpp
+++ b/protocols/Icq10/src/server.cpp
@@ -46,12 +46,12 @@ void CIcqProto::CheckLastId(MCONTACT hContact, const JSONNode &ev)
void CIcqProto::CheckNickChange(MCONTACT hContact, const JSONNode &ev)
{
- CMStringW wszNick(getMStringW(hContact, "Nick"));
- if (!wszNick.IsEmpty())
+ // if we already set a nick, ignore change when friendly names aren't used
+ if (!m_bUseFriendly && !getMStringW(hContact, "Nick").IsEmpty())
return;
- wszNick = ev["friendly"].as_mstring();
- if (!wszNick.IsEmpty())
+ CMStringW wszNick = ev["friendly"].as_mstring();
+ if (m_bUseFriendly || !wszNick.IsEmpty())
setWString(hContact, "Nick", wszNick);
}
@@ -135,7 +135,8 @@ MCONTACT CIcqProto::ParseBuddyInfo(const JSONNode &buddy)
str = profile["friendlyName"].as_mstring();
if (!str.IsEmpty())
- setWString(hContact, "Nick", str);
+ if (!m_bUseFriendly || getMStringW("Nick").IsEmpty())
+ setWString(hContact, "Nick", str);
time_t birthDate = profile["birthDate"].as_int();
if (birthDate != 0) {
@@ -624,12 +625,40 @@ void CIcqProto::ProcessBuddyList(const JSONNode &ev)
db_set_b(it->m_hContact, "CList", "NotOnList", 1);
}
+void CIcqProto::ProcessDiff(const JSONNode &ev)
+{
+ for (auto &block : ev) {
+ CMStringW szType = block["type"].as_mstring();
+ if (szType != "updated")
+ continue;
+
+ for (auto &it : block["data"]) {
+ CMStringW szGroup = it["name"].as_mstring();
+ bool bCreated = false;
+
+ for (auto &buddy : it["buddies"]) {
+ MCONTACT hContact = ParseBuddyInfo(buddy);
+ if (db_get_sm(hContact, "CList", "Group").IsEmpty()) {
+ if (!bCreated) {
+ Clist_GroupCreate(0, szGroup);
+ bCreated = true;
+ }
+
+ db_set_ws(hContact, "CList", "Group", szGroup);
+ }
+ }
+ }
+ }
+}
+
void CIcqProto::ProcessEvent(const JSONNode &ev)
{
const JSONNode &pData = ev["eventData"];
CMStringW szType = ev["type"].as_mstring();
if (szType == L"buddylist")
ProcessBuddyList(pData);
+ else if (szType == L"diff")
+ ProcessDiff(pData);
else if (szType == L"histDlgState")
ProcessHistData(pData);
else if (szType == L"imState")