From 17407bbf6ccf9f45e2f2acf26dd71aefb5b1ea7e Mon Sep 17 00:00:00 2001 From: George Hazan Date: Mon, 13 Mar 2023 20:52:03 +0300 Subject: =?UTF-8?q?fixes=20#3424=20(ICQ:=20=D0=BF=D0=BE=D1=81=D0=BB=D0=B5?= =?UTF-8?q?=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?=20=D0=B2=20=D0=B3=D1=80=D1=83=D0=BF=D0=BF=D0=BE=D0=B2=D0=BE?= =?UTF-8?q?=D0=B9=20=D1=87=D0=B0=D1=82=20=D0=BD=D0=B5=20=D0=B2=D0=B8=D0=B4?= =?UTF-8?q?=D0=B5=D0=BD=20=D1=81=D0=BF=D0=B8=D1=81=D0=BE=D0=BA=20=D1=83?= =?UTF-8?q?=D1=87=D0=B0=D1=81=D1=82=D0=BD=D0=B8=D0=BA=D0=BE=D0=B2)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- protocols/ICQ-WIM/src/groupchats.cpp | 25 +++++++++++++++++++++++++ protocols/ICQ-WIM/src/poll.cpp | 14 ++++++-------- protocols/ICQ-WIM/src/proto.h | 3 +++ protocols/ICQ-WIM/src/server.cpp | 15 +++------------ 4 files changed, 37 insertions(+), 20 deletions(-) (limited to 'protocols/ICQ-WIM/src') diff --git a/protocols/ICQ-WIM/src/groupchats.cpp b/protocols/ICQ-WIM/src/groupchats.cpp index 0e4bbb1a53..b0c438f535 100644 --- a/protocols/ICQ-WIM/src/groupchats.cpp +++ b/protocols/ICQ-WIM/src/groupchats.cpp @@ -20,6 +20,21 @@ #include "stdafx.h" +SESSION_INFO* CIcqProto::CreateGroupChat(const wchar_t *pwszId, const wchar_t *pwszNick) +{ + auto *si = Chat_NewSession(GCW_CHATROOM, m_szModuleName, pwszId, pwszNick); + if (si != nullptr) { + Chat_AddGroup(si, TranslateT("admin")); + Chat_AddGroup(si, TranslateT("member")); + Chat_Control(si, m_bHideGroupchats ? WINDOW_HIDDEN : SESSION_INITDONE); + Chat_Control(si, SESSION_ONLINE); + } + + return si; +} + +///////////////////////////////////////////////////////////////////////////////////////// + void CIcqProto::LoadChatInfo(SESSION_INFO *si) { int memberCount = getDword(si->hContact, "MemberCount"); @@ -48,6 +63,16 @@ void CIcqProto::LoadChatInfo(SESSION_INFO *si) } } +///////////////////////////////////////////////////////////////////////////////////////// + +void CIcqProto::RetrieveChatInfo(SESSION_INFO *si) +{ + auto *pReq = new AsyncRapiRequest(this, "getChatInfo", &CIcqProto::OnGetChatInfo); + pReq->params << WCHAR_PARAM("sn", si->ptszID) << INT_PARAM("memberLimit", 100) << CHAR_PARAM("aimSid", m_aimsid); + pReq->pUserInfo = si; + Push(pReq); +} + void CIcqProto::OnGetChatInfo(NETLIBHTTPREQUEST *pReply, AsyncHttpRequest *pReq) { SESSION_INFO *si = (SESSION_INFO*)pReq->pUserInfo; diff --git a/protocols/ICQ-WIM/src/poll.cpp b/protocols/ICQ-WIM/src/poll.cpp index b7cd908ea2..fe344a8ccc 100644 --- a/protocols/ICQ-WIM/src/poll.cpp +++ b/protocols/ICQ-WIM/src/poll.cpp @@ -169,20 +169,18 @@ void CIcqProto::ProcessHistData(const JSONNode &ev) if (IsChat(wszId)) { SESSION_INFO *si = Chat_Find(wszId, m_szModuleName); if (si == nullptr) - return; + if ((si = CreateGroupChat(wszId, L"")) == nullptr) + return; hContact = si->hContact; if (si->arUsers.getCount() == 0) { __int64 srvInfoVer = _wtoi64(ev["mchatState"]["infoVersion"].as_mstring()); __int64 srvMembersVer = _wtoi64(ev["mchatState"]["membersVersion"].as_mstring()); - if (srvInfoVer != getId(hContact, "InfoVersion") || srvMembersVer != getId(hContact, "MembersVersion")) { - auto *pReq = new AsyncRapiRequest(this, "getChatInfo", &CIcqProto::OnGetChatInfo); - pReq->params << WCHAR_PARAM("sn", wszId) << INT_PARAM("memberLimit", 100) << CHAR_PARAM("aimSid", m_aimsid); - pReq->pUserInfo = si; - Push(pReq); - } - else LoadChatInfo(si); + if (srvInfoVer != getId(hContact, "InfoVersion") || srvMembersVer != getId(hContact, "MembersVersion")) + RetrieveChatInfo(si); + else + LoadChatInfo(si); } } else { diff --git a/protocols/ICQ-WIM/src/proto.h b/protocols/ICQ-WIM/src/proto.h index 75e33ef5c2..c511107a8d 100644 --- a/protocols/ICQ-WIM/src/proto.h +++ b/protocols/ICQ-WIM/src/proto.h @@ -361,6 +361,9 @@ class CIcqProto : public PROTO void Chat_ProcessLogMenu(SESSION_INFO *si, int); void Chat_SendPrivateMessage(GCHOOK *gch); + SESSION_INFO* CreateGroupChat(const wchar_t *pwszId, const wchar_t *pwszNick); + + void RetrieveChatInfo(SESSION_INFO *si); void InviteUserToChat(SESSION_INFO *si); void LeaveDestroyChat(SESSION_INFO *si); void LoadChatInfo(SESSION_INFO *si); diff --git a/protocols/ICQ-WIM/src/server.cpp b/protocols/ICQ-WIM/src/server.cpp index 818807d3ea..d4a8299cf2 100644 --- a/protocols/ICQ-WIM/src/server.cpp +++ b/protocols/ICQ-WIM/src/server.cpp @@ -274,22 +274,13 @@ MCONTACT CIcqProto::ParseBuddyInfo(const JSONNode &buddy, MCONTACT hContact, boo // user chat? CMStringW wszId(buddy["aimId"].as_mstring()); if (IsChat(wszId)) { - CMStringW wszChatId(buddy["aimId"].as_mstring()); - CMStringW wszChatName(buddy["friendly"].as_mstring()); - auto *pUser = FindUser(wszId); if (pUser && pUser->m_iApparentMode == ID_STATUS_OFFLINE) return INVALID_CONTACT_ID; - auto *si = Chat_NewSession(GCW_CHATROOM, m_szModuleName, wszChatId, wszChatName); - if (si == nullptr) - return INVALID_CONTACT_ID; - - Chat_AddGroup(si, TranslateT("admin")); - Chat_AddGroup(si, TranslateT("member")); - Chat_Control(si, m_bHideGroupchats ? WINDOW_HIDDEN : SESSION_INITDONE); - Chat_Control(si, SESSION_ONLINE); - return si->hContact; + CMStringW wszChatName(buddy["friendly"].as_mstring()); + auto *si = CreateGroupChat(wszId, wszChatName); + return (si) ? si->hContact : INVALID_CONTACT_ID; } bool bIgnored = !IsValidType(buddy); -- cgit v1.2.3