summaryrefslogtreecommitdiff
path: root/protocols/VKontakte/src
diff options
context:
space:
mode:
authorElzorFox <elzorfox@ya.ru>2023-12-07 13:51:23 +0500
committerElzorFox <elzorfox@ya.ru>2023-12-07 13:51:23 +0500
commit70ed7a9490a48464aa6cf4dd65f06deb50dbfd56 (patch)
tree0b4bc3227f61bde2cce44a7d7884f9f182840013 /protocols/VKontakte/src
parentc5b2cbe38b0f23005c8bab0ed9eaab7701f8166a (diff)
VKontakte: fix #4022
Diffstat (limited to 'protocols/VKontakte/src')
-rw-r--r--protocols/VKontakte/src/misc.cpp22
-rw-r--r--protocols/VKontakte/src/vk_chats.cpp4
-rw-r--r--protocols/VKontakte/src/vk_dialogs.cpp10
-rw-r--r--protocols/VKontakte/src/vk_dialogs.h3
-rw-r--r--protocols/VKontakte/src/vk_proto.cpp4
-rw-r--r--protocols/VKontakte/src/vk_proto.h3
-rw-r--r--protocols/VKontakte/src/vk_struct.h7
7 files changed, 44 insertions, 9 deletions
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<void> 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<CVkProto>
void WriteVKUserID(MCONTACT hContact, VKUserID_t iUserId);
int ForwardMsg(MCONTACT hContact, std::vector<MEVENT> &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 {