From 70ed7a9490a48464aa6cf4dd65f06deb50dbfd56 Mon Sep 17 00:00:00 2001 From: ElzorFox Date: Thu, 7 Dec 2023 13:51:23 +0500 Subject: VKontakte: fix #4022 --- protocols/VKontakte/src/misc.cpp | 22 ++++++++++++++++++++++ protocols/VKontakte/src/vk_chats.cpp | 4 +++- protocols/VKontakte/src/vk_dialogs.cpp | 10 ++++++---- protocols/VKontakte/src/vk_dialogs.h | 3 ++- protocols/VKontakte/src/vk_proto.cpp | 4 +++- protocols/VKontakte/src/vk_proto.h | 3 ++- protocols/VKontakte/src/vk_struct.h | 7 ++++++- 7 files changed, 44 insertions(+), 9 deletions(-) (limited to 'protocols/VKontakte/src') diff --git a/protocols/VKontakte/src/misc.cpp b/protocols/VKontakte/src/misc.cpp index 07a737377c..885f270381 100644 --- a/protocols/VKontakte/src/misc.cpp +++ b/protocols/VKontakte/src/misc.cpp @@ -927,6 +927,28 @@ char* CVkProto::GetStickerId(const char *szMsg, int &iStickerId) return szRetMsg; } +uint8_t CVkProto::GetContactType(MCONTACT hContact) +{ + if (hContact == INVALID_CONTACT_ID) + return 0; + + if (isChatRoom(hContact)) + return VKContactType::vkContactMUCUser; + + if (IsGroupUser(hContact)) + return VKContactType::vkContactGroupUser; + + VKUserID_t iUserId = ReadVKUserID(hContact); + + if (!hContact || iUserId == m_iMyUserId) + return VKContactType::vkContactSelf; + + if (iUserId == VK_FEED_USER) + return 0; + + return VKContactType::vkContactNormal; +} + const char* FindVKUrls(const char *Msg) { if (IsEmpty(Msg)) diff --git a/protocols/VKontakte/src/vk_chats.cpp b/protocols/VKontakte/src/vk_chats.cpp index 8a3d27b41d..1fa6d8b774 100644 --- a/protocols/VKontakte/src/vk_chats.cpp +++ b/protocols/VKontakte/src/vk_chats.cpp @@ -987,12 +987,14 @@ INT_PTR CVkProto::SvcCreateChat(WPARAM, LPARAM) if (!IsOnline()) return (INT_PTR)1; + CVkUserListForm dlg( this, "", TranslateT("Create group chat"), TranslateT("Mark users you want to invite to a new chat"), - TranslateT("New chat's title:") + TranslateT("New chat's title:"), + VKContactType::vkContactSelf | VKContactType::vkContactMUCUser | VKContactType::vkContactGroupUser ); if (!dlg.DoModal()) diff --git a/protocols/VKontakte/src/vk_dialogs.cpp b/protocols/VKontakte/src/vk_dialogs.cpp index afe7e1d4ae..38897e61c7 100644 --- a/protocols/VKontakte/src/vk_dialogs.cpp +++ b/protocols/VKontakte/src/vk_dialogs.cpp @@ -174,13 +174,14 @@ CVkUserListForm::CVkUserListForm(CVkProto* proto) : m_edtMessage(this, IDC_MESSAGE), m_stListCaption(this, IDC_STATIC_MARKCONTAKTS), m_stMessageCaption(this, IDC_STATIC_MESSAGE), - lContacts(20, NumericKeySortT) + lContacts(20, NumericKeySortT), + uClcFilterFlag(0) { m_clc.OnListRebuilt = Callback(this, &CVkUserListForm::FilterList); } -CVkUserListForm::CVkUserListForm(CVkProto* proto, CMStringW _wszMessage, CMStringW _wszFormCaption, CMStringW _wszListCaption, CMStringW _wszMessageCaption) : +CVkUserListForm::CVkUserListForm(CVkProto* proto, CMStringW _wszMessage, CMStringW _wszFormCaption, CMStringW _wszListCaption, CMStringW _wszMessageCaption, uint8_t _uClcFilterFlag) : CVkDlgBase(proto, IDD_VKUSERFORM), m_clc(this, IDC_CONTACTLIST), m_edtMessage(this, IDC_MESSAGE), @@ -190,7 +191,8 @@ CVkUserListForm::CVkUserListForm(CVkProto* proto, CMStringW _wszMessage, CMStrin wszFormCaption(_wszFormCaption), wszListCaption(_wszListCaption), wszMessageCaption(_wszMessageCaption), - lContacts(5, PtrKeySortT) + lContacts(5, PtrKeySortT), + uClcFilterFlag(_uClcFilterFlag) { m_clc.OnListRebuilt = Callback(this, &CVkUserListForm::FilterList); } @@ -230,7 +232,7 @@ void CVkUserListForm::FilterList(CCtrlClc*) { for (auto& hContact : Contacts()) { char* proto = Proto_GetBaseAccountName(hContact); - if (mir_strcmp(proto, m_proto->m_szModuleName) || Contact::IsReadonly(hContact) || m_proto->ReadVKUserID(hContact) == VK_FEED_USER) + if (mir_strcmp(proto, m_proto->m_szModuleName) || Contact::IsReadonly(hContact) || m_proto->ReadVKUserID(hContact) == VK_FEED_USER || (m_proto->GetContactType(hContact) & uClcFilterFlag)) if (HANDLE hItem = m_clc.FindContact(hContact)) m_clc.DeleteItem(hItem); } diff --git a/protocols/VKontakte/src/vk_dialogs.h b/protocols/VKontakte/src/vk_dialogs.h index a0b6ce11a1..4bf45ebaf9 100644 --- a/protocols/VKontakte/src/vk_dialogs.h +++ b/protocols/VKontakte/src/vk_dialogs.h @@ -126,9 +126,10 @@ public: CMStringW wszMessageCaption; CMStringW wszMessage; LIST lContacts; + uint8_t uClcFilterFlag; CVkUserListForm(CVkProto* proto); - CVkUserListForm(CVkProto* proto, CMStringW _wszMessage, CMStringW _wszFormCaption, CMStringW _wszListCaption, CMStringW _wszMessageCaption); + CVkUserListForm(CVkProto* proto, CMStringW _wszMessage, CMStringW _wszFormCaption, CMStringW _wszListCaption, CMStringW _wszMessageCaption, uint8_t _uFilterClcFlag); bool OnInitDialog() override; bool OnApply() override; diff --git a/protocols/VKontakte/src/vk_proto.cpp b/protocols/VKontakte/src/vk_proto.cpp index 2283459cea..85d0ac9770 100644 --- a/protocols/VKontakte/src/vk_proto.cpp +++ b/protocols/VKontakte/src/vk_proto.cpp @@ -450,8 +450,10 @@ INT_PTR CVkProto::SvcNSExecMenu(WPARAM iCommand, LPARAM pHandle) wszMsg, TranslateT("Mark contacts for forwarding messages"), TranslateT("Mark contacts you want to forward messages"), - TranslateT("Enter accompanying messages") + TranslateT("Enter accompanying messages"), + 0 ); + if (!dlg.DoModal()) break; diff --git a/protocols/VKontakte/src/vk_proto.h b/protocols/VKontakte/src/vk_proto.h index f0dd5cab62..d71bf32576 100644 --- a/protocols/VKontakte/src/vk_proto.h +++ b/protocols/VKontakte/src/vk_proto.h @@ -143,6 +143,7 @@ struct CVkProto : public PROTO void WriteVKUserID(MCONTACT hContact, VKUserID_t iUserId); int ForwardMsg(MCONTACT hContact, std::vector &vForvardEvents, const char* szMsg); + uint8_t GetContactType(MCONTACT hContact); private: @@ -360,7 +361,6 @@ private: void SetAllContactStatuses(int iStatus); MCONTACT FindUser(VKUserID_t iUserId, bool bCreate = false); MCONTACT FindChat(VKUserID_t iUserId); - bool IsGroupUser(MCONTACT hContact); JSONNode& CheckJsonResponse(AsyncHttpRequest *pReq, NETLIBHTTPREQUEST *reply, JSONNode &root); bool CheckJsonResult(AsyncHttpRequest *pReq, const JSONNode &Node); void OnReceiveSmth(NETLIBHTTPREQUEST*, AsyncHttpRequest*); @@ -380,6 +380,7 @@ private: void SetSrmmReadStatus(MCONTACT hContact); void MarkDialogAsRead(MCONTACT hContact); void CheckUpdate(); + bool IsGroupUser(MCONTACT hContact); char* GetStickerId(const char *szMsg, int& iStickerid); CMStringA GetAttachmentsFromMessage(const char * szMsg); CMStringW SpanVKNotificationType(CMStringW& wszType, VKObjType& vkFeedback, VKObjType& vkParent); diff --git a/protocols/VKontakte/src/vk_struct.h b/protocols/VKontakte/src/vk_struct.h index 1415c0a609..f25072f89f 100644 --- a/protocols/VKontakte/src/vk_struct.h +++ b/protocols/VKontakte/src/vk_struct.h @@ -322,7 +322,12 @@ struct CVKDeactivateEvent { char *szDescription; }; -enum VKContactType : uint8_t { vkContactNormal, vkContactSelf, vkContactMUCUser }; +enum VKContactType : uint8_t { + vkContactNormal = 0x01, + vkContactSelf = 0x02, + vkContactMUCUser = 0x04, + vkContactGroupUser = 0x08 +}; enum VKMesType : uint8_t { vkALL, vkIN, vkOUT }; struct CVKImageSizeItem { -- cgit v1.2.3