diff options
author | George Hazan <ghazan@miranda.im> | 2021-12-10 21:29:51 +0300 |
---|---|---|
committer | George Hazan <ghazan@miranda.im> | 2021-12-10 21:29:51 +0300 |
commit | 0d1988620932dc892064e1423db82358ae0bf744 (patch) | |
tree | 6ae9b70522d8df0730c655d72a7279031738beeb | |
parent | f2a434a0b4809d0445b72c36e1f20030d96d31ad (diff) |
ICQ: fixes problems with status wiping
-rw-r--r-- | protocols/ICQ-WIM/src/poll.cpp | 25 | ||||
-rw-r--r-- | protocols/ICQ-WIM/src/server.cpp | 4 | ||||
-rw-r--r-- | protocols/ICQ-WIM/src/stdafx.h | 1 | ||||
-rw-r--r-- | protocols/ICQ-WIM/src/utils.cpp | 33 |
4 files changed, 32 insertions, 31 deletions
diff --git a/protocols/ICQ-WIM/src/poll.cpp b/protocols/ICQ-WIM/src/poll.cpp index a7e59c3744..d76cf4df18 100644 --- a/protocols/ICQ-WIM/src/poll.cpp +++ b/protocols/ICQ-WIM/src/poll.cpp @@ -325,20 +325,21 @@ void CIcqProto::ProcessPresence(const JSONNode &ev) return; int iNewStatus = StatusFromPresence(ev, pCache->m_hContact); - - // major crutch dedicated to the official client behaviour to go offline - // when its window gets closed. we change the status of a contact to the - // first chosen one from options and initialize a timer - if (iNewStatus == ID_STATUS_OFFLINE) { - if (m_iTimeDiff1) { - iNewStatus = m_iStatus1; - pCache->m_timer1 = time(0); + if (iNewStatus > 0) { + // major crutch dedicated to the official client behaviour to go offline + // when its window gets closed. we change the status of a contact to the + // first chosen one from options and initialize a timer + if (iNewStatus == ID_STATUS_OFFLINE) { + if (m_iTimeDiff1) { + iNewStatus = m_iStatus1; + pCache->m_timer1 = time(0); + } } - } - // if a client returns back online, we clear timers not to play with statuses anymore - else pCache->m_timer1 = pCache->m_timer2 = 0; + // if a client returns back online, we clear timers not to play with statuses anymore + else pCache->m_timer1 = pCache->m_timer2 = 0; - setWord(pCache->m_hContact, "Status", iNewStatus); + setWord(pCache->m_hContact, "Status", iNewStatus); + } Json2string(pCache->m_hContact, ev, "friendly", "Nick"); CheckAvatarChange(pCache->m_hContact, ev); diff --git a/protocols/ICQ-WIM/src/server.cpp b/protocols/ICQ-WIM/src/server.cpp index b50e304079..e25272a0af 100644 --- a/protocols/ICQ-WIM/src/server.cpp +++ b/protocols/ICQ-WIM/src/server.cpp @@ -367,7 +367,9 @@ MCONTACT CIcqProto::ParseBuddyInfo(const JSONNode &buddy, MCONTACT hContact) Json2int(hContact, buddy, "idleTime", "IdleTS"); Json2int(hContact, buddy, "memberSince", DB_KEY_MEMBERSINCE); - setWord(hContact, "Status", StatusFromPresence(buddy, hContact)); + int iStatus = StatusFromPresence(buddy, hContact); + if (iStatus > 0) + setWord(hContact, "Status", iStatus); const JSONNode &profile = buddy["profile"]; if (profile) { diff --git a/protocols/ICQ-WIM/src/stdafx.h b/protocols/ICQ-WIM/src/stdafx.h index 0761099b7f..9bb96fd4f7 100644 --- a/protocols/ICQ-WIM/src/stdafx.h +++ b/protocols/ICQ-WIM/src/stdafx.h @@ -102,7 +102,6 @@ bool IsChat(const CMStringW &aimid); void RefreshGroups(void); -int StatusFromString(const CMStringW&); char* time2text(time_t time); extern bool g_bSecureIM, g_bMessageState; diff --git a/protocols/ICQ-WIM/src/utils.cpp b/protocols/ICQ-WIM/src/utils.cpp index 1204cbfb53..fc3eaf0ecb 100644 --- a/protocols/ICQ-WIM/src/utils.cpp +++ b/protocols/ICQ-WIM/src/utils.cpp @@ -270,25 +270,24 @@ bool IsChat(const CMStringW &aimid) return aimid.Right(11) == "@chat.agent"; } -int StatusFromString(const CMStringW &wszStatus) -{ - if (wszStatus == L"online") - return ID_STATUS_ONLINE; - if (wszStatus == L"n/a") - return ID_STATUS_NA; - if (wszStatus == L"away") - return ID_STATUS_AWAY; - if (wszStatus == L"occupied") - return ID_STATUS_OCCUPIED; - if (wszStatus == L"dnd") - return ID_STATUS_DND; - - return ID_STATUS_OFFLINE; -} - int CIcqProto::StatusFromPresence(const JSONNode &presence, MCONTACT hContact) { - int iStatus = StatusFromString(presence["state"].as_mstring()); + CMStringW wszStatus = presence["state"].as_mstring(); + int iStatus; + if (wszStatus == L"online") + iStatus = ID_STATUS_ONLINE; + if (wszStatus == L"offline") + iStatus = ID_STATUS_OFFLINE; + else if (wszStatus == L"n/a") + iStatus = ID_STATUS_NA; + else if (wszStatus == L"away") + iStatus = ID_STATUS_AWAY; + else if (wszStatus == L"occupied") + iStatus = ID_STATUS_OCCUPIED; + else if (wszStatus == L"dnd") + iStatus = ID_STATUS_DND; + else + iStatus = -1; int iLastSeen = presence["lastseen"].as_int(); if (iLastSeen != 0) |