summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorge Hazan <george.hazan@gmail.com>2023-11-29 22:55:29 +0300
committerGeorge Hazan <george.hazan@gmail.com>2023-11-29 22:55:29 +0300
commit170f3ffab20cd0cea6ccb9c4ff4420f2fdf1f603 (patch)
treee6755e77f8d3c7f78841765b6eb305dbff8c2b5c
parent234690422a029ae52ce24247b559428a4c08afc1 (diff)
for #3985 - patch for basic groups
-rw-r--r--include/m_chat_int.h1
-rw-r--r--protocols/Telegram/src/groupchat.cpp110
-rw-r--r--protocols/Telegram/src/proto.h2
-rw-r--r--protocols/Telegram/src/server.cpp71
-rw-r--r--src/mir_app/src/chat_manager.cpp1
5 files changed, 109 insertions, 76 deletions
diff --git a/include/m_chat_int.h b/include/m_chat_int.h
index 66b0b2fdf9..ae50a4eab3 100644
--- a/include/m_chat_int.h
+++ b/include/m_chat_int.h
@@ -280,6 +280,7 @@ struct CHAT_MANAGER
USERINFO* (*UM_AddUser)(SESSION_INFO *si, const wchar_t *pszUID, const wchar_t *pszNick, uint16_t wStatus);
USERINFO* (*UM_FindUser)(SESSION_INFO *si, const wchar_t *pszUID);
USERINFO* (*UM_GiveStatus)(SESSION_INFO *si, const wchar_t *pszUID, uint16_t status);
+ BOOL (*UM_RemoveAll)(SESSION_INFO *si);
USERINFO* (*UM_SetContactStatus)(SESSION_INFO *si, const wchar_t *pszUID, uint16_t status);
USERINFO* (*UM_TakeStatus)(SESSION_INFO *si, const wchar_t *pszUID, uint16_t status);
wchar_t* (*UM_FindUserAutoComplete)(SESSION_INFO *si, const wchar_t* pszOriginal, const wchar_t* pszCurrent);
diff --git a/protocols/Telegram/src/groupchat.cpp b/protocols/Telegram/src/groupchat.cpp
index 8a75c17339..e0eec733c5 100644
--- a/protocols/Telegram/src/groupchat.cpp
+++ b/protocols/Telegram/src/groupchat.cpp
@@ -81,25 +81,26 @@ void CTelegramProto::StartGroupChat(td::ClientManager::Response &response, void
if (!response.object)
return;
- TD::array<TD::object_ptr<TD::chatMember>> *pMembers;
+ auto *pChat = (TG_USER *)pUserData;
switch (response.object->get_id()) {
case TD::basicGroupFullInfo::ID:
- pMembers = &((TD::basicGroupFullInfo *)response.object.get())->members_;
+ GcAddMembers(pChat, ((TD::basicGroupFullInfo *)response.object.get())->members_, false);
break;
case TD::chatMembers::ID:
- pMembers = &((TD::chatMembers *)response.object.get())->members_;
+ GcAddMembers(pChat, ((TD::chatMembers *)response.object.get())->members_, false);
break;
default:
debugLogA("Gotten class ID %d instead of %d, exiting", response.object->get_id(), TD::basicGroupFullInfo::ID);
return;
}
+}
- auto *pUser = (TG_USER *)pUserData;
-
- for (auto &it : *pMembers) {
+void CTelegramProto::GcAddMembers(TG_USER *pChat, const TD::array<TD::object_ptr<TD::chatMember>> &pMembers, bool bSilent)
+{
+ for (auto &it : pMembers) {
auto *pMember = it.get();
const wchar_t *pwszRole;
@@ -127,9 +128,11 @@ void CTelegramProto::StartGroupChat(td::ClientManager::Response &response, void
wchar_t wszUserId[100];
_i64tow(memberId, wszUserId, 10);
- GCEVENT gce = { pUser->m_si, GC_EVENT_JOIN };
+ GCEVENT gce = { pChat->m_si, GC_EVENT_JOIN };
gce.pszUID.w = wszUserId;
gce.pszStatus.w = pwszRole;
+ if (bSilent)
+ gce.dwFlags = GCEF_SILENT;
switch (pChatUser->hContact) {
case 0:
@@ -148,8 +151,8 @@ void CTelegramProto::StartGroupChat(td::ClientManager::Response &response, void
Chat_Event(&gce);
}
- Chat_Control(pUser->m_si, m_bHideGroupchats ? WINDOW_HIDDEN : SESSION_INITDONE);
- Chat_Control(pUser->m_si, SESSION_ONLINE);
+ Chat_Control(pChat->m_si, m_bHideGroupchats ? WINDOW_HIDDEN : SESSION_INITDONE);
+ Chat_Control(pChat->m_si, SESSION_ONLINE);
}
/////////////////////////////////////////////////////////////////////////////////////////
@@ -326,3 +329,92 @@ int CTelegramProto::GcMenuHook(WPARAM, LPARAM lParam)
}
return 0;
}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+// Server data
+
+void CTelegramProto::ProcessBasicGroup(TD::updateBasicGroup *pObj)
+{
+ auto *pBasicGroup = pObj->basic_group_.get();
+
+ auto iStatusId = pBasicGroup->status_->get_id();
+ if (iStatusId == TD::chatMemberStatusBanned::ID) {
+ if (pBasicGroup->upgraded_to_supergroup_id_) {
+ auto *pUser = FindUser(pBasicGroup->upgraded_to_supergroup_id_);
+ if (pUser) {
+ pUser->bLoadMembers = true;
+ if (pUser->m_si)
+ pUser->m_si->bHasNicklist = true;
+
+ if (auto *pOldUser = FindUser(pBasicGroup->id_)) {
+ pUser->hContact = pOldUser->hContact;
+ SetId(pUser->hContact, pBasicGroup->upgraded_to_supergroup_id_);
+ }
+ }
+ }
+
+ debugLogA("We are banned here, skipping");
+ return;
+ }
+
+ TG_BASIC_GROUP tmp(pBasicGroup->id_, 0);
+ auto *pGroup = m_arBasicGroups.find(&tmp);
+ if (pGroup == nullptr) {
+ pGroup = new TG_BASIC_GROUP(tmp.id, std::move(pObj->basic_group_));
+ m_arBasicGroups.insert(pGroup);
+ }
+ else pGroup->group = std::move(pObj->basic_group_);
+
+ TG_USER *pUser;
+ if (iStatusId == TD::chatMemberStatusLeft::ID) {
+ pUser = AddFakeUser(tmp.id, true);
+ pUser->wszLastName.Format(TranslateT("%d member(s)"), pGroup->group->member_count_);
+ }
+ else pUser = AddUser(tmp.id, true);
+
+ pUser->bLoadMembers = true;
+}
+
+void CTelegramProto::ProcessBasicGroupInfo(TD::updateBasicGroupFullInfo *pObj)
+{
+ auto *pChat = FindUser(pObj->basic_group_id_);
+ if (pChat == nullptr || pChat->m_si == nullptr)
+ return;
+
+ if (auto *pInfo = pObj->basic_group_full_info_.get()) {
+ if (!pInfo->description_.empty()) {
+ Utf2T wszTopic(pInfo->description_.c_str());
+ GCEVENT gce = { pChat->m_si, GC_EVENT_TOPIC };
+ gce.pszText.w = wszTopic;
+ Chat_Event(&gce);
+ }
+
+ g_chatApi.UM_RemoveAll(pChat->m_si);
+ GcAddMembers(pChat, pInfo->members_, true);
+ }
+}
+
+void CTelegramProto::ProcessSuperGroup(TD::updateSupergroup *pObj)
+{
+ auto iStatusId = pObj->supergroup_->status_->get_id();
+ if (iStatusId == TD::chatMemberStatusBanned::ID) {
+ debugLogA("We are banned here, skipping");
+ return;
+ }
+
+ TG_SUPER_GROUP tmp(pObj->supergroup_->id_, 0);
+
+ auto *pGroup = m_arSuperGroups.find(&tmp);
+ if (pGroup == nullptr) {
+ pGroup = new TG_SUPER_GROUP(tmp.id, std::move(pObj->supergroup_));
+ m_arSuperGroups.insert(pGroup);
+ }
+ else pGroup->group = std::move(pObj->supergroup_);
+
+ if (iStatusId == TD::chatMemberStatusLeft::ID) {
+ auto *pUser = AddFakeUser(tmp.id, true);
+ pUser->wszNick = getName(pGroup->group->usernames_.get());
+ pUser->wszLastName.Format(TranslateT("%d member(s)"), pGroup->group->member_count_);
+ }
+ else AddUser(tmp.id, true);
+}
diff --git a/protocols/Telegram/src/proto.h b/protocols/Telegram/src/proto.h
index 1156182caa..a88e1699b1 100644
--- a/protocols/Telegram/src/proto.h
+++ b/protocols/Telegram/src/proto.h
@@ -241,6 +241,7 @@ class CTelegramProto : public PROTO<CTelegramProto>
void ProcessAuth(TD::updateAuthorizationState *pObj);
void ProcessBasicGroup(TD::updateBasicGroup *pObj);
+ void ProcessBasicGroupInfo(TD::updateBasicGroupFullInfo *pObj);
void ProcessChat(TD::updateNewChat *pObj);
void ProcessChatLastMessage(TD::updateChatLastMessage *pObj);
void ProcessChatNotification(TD::updateChatNotificationSettings *pObj);
@@ -287,6 +288,7 @@ class CTelegramProto : public PROTO<CTelegramProto>
void Chat_LogMenu(GCHOOK *gch);
bool GetGcUserId(TG_USER *pUser, const TD::message *pMsg, char *dest);
+ void GcAddMembers(TG_USER *pChat, const TD::array<TD::object_ptr<TD::chatMember>> &pMembers, bool bSilent);
void GcChangeMember(TG_USER *pChat, TD::int53 userId, bool bJoined);
void GcChangeTopic(TG_USER *pChat, const wchar_t *pwszNewTopic);
diff --git a/protocols/Telegram/src/server.cpp b/protocols/Telegram/src/server.cpp
index 19d5a3100b..0a7703fdfb 100644
--- a/protocols/Telegram/src/server.cpp
+++ b/protocols/Telegram/src/server.cpp
@@ -178,6 +178,10 @@ void CTelegramProto::ProcessResponse(td::ClientManager::Response response)
ProcessBasicGroup((TD::updateBasicGroup*)response.object.get());
break;
+ case TD::updateBasicGroupFullInfo::ID:
+ ProcessBasicGroupInfo((TD::updateBasicGroupFullInfo *)response.object.get());
+ break;
+
case TD::updateChatFolders::ID:
ProcessGroups((TD::updateChatFolders *)response.object.get());
break;
@@ -405,48 +409,6 @@ INT_PTR CTelegramProto::SvcLoadServerHistory(WPARAM hContact, LPARAM)
///////////////////////////////////////////////////////////////////////////////
-void CTelegramProto::ProcessBasicGroup(TD::updateBasicGroup *pObj)
-{
- auto *pBasicGroup = pObj->basic_group_.get();
-
- auto iStatusId = pBasicGroup->status_->get_id();
- if (iStatusId == TD::chatMemberStatusBanned::ID) {
- if (pBasicGroup->upgraded_to_supergroup_id_) {
- auto *pUser = FindUser(pBasicGroup->upgraded_to_supergroup_id_);
- if (pUser) {
- pUser->bLoadMembers = true;
- if (pUser->m_si)
- pUser->m_si->bHasNicklist = true;
-
- if (auto *pOldUser = FindUser(pBasicGroup->id_)) {
- pUser->hContact = pOldUser->hContact;
- SetId(pUser->hContact, pBasicGroup->upgraded_to_supergroup_id_);
- }
- }
- }
-
- debugLogA("We are banned here, skipping");
- return;
- }
-
- TG_BASIC_GROUP tmp(pBasicGroup->id_, 0);
- auto *pGroup = m_arBasicGroups.find(&tmp);
- if (pGroup == nullptr) {
- pGroup = new TG_BASIC_GROUP(tmp.id, std::move(pObj->basic_group_));
- m_arBasicGroups.insert(pGroup);
- }
- else pGroup->group = std::move(pObj->basic_group_);
-
- TG_USER *pUser;
- if (iStatusId == TD::chatMemberStatusLeft::ID) {
- pUser = AddFakeUser(tmp.id, true);
- pUser->wszLastName.Format(TranslateT("%d member(s)"), pGroup->group->member_count_);
- }
- else pUser = AddUser(tmp.id, true);
-
- pUser->bLoadMembers = true;
-}
-
void CTelegramProto::ProcessChat(TD::updateNewChat *pObj)
{
int64_t userId;
@@ -879,31 +841,6 @@ void CTelegramProto::ProcessStatus(TD::updateUserStatus *pObj)
}
}
-void CTelegramProto::ProcessSuperGroup(TD::updateSupergroup *pObj)
-{
- auto iStatusId = pObj->supergroup_->status_->get_id();
- if (iStatusId == TD::chatMemberStatusBanned::ID) {
- debugLogA("We are banned here, skipping");
- return;
- }
-
- TG_SUPER_GROUP tmp(pObj->supergroup_->id_, 0);
-
- auto *pGroup = m_arSuperGroups.find(&tmp);
- if (pGroup == nullptr) {
- pGroup = new TG_SUPER_GROUP(tmp.id, std::move(pObj->supergroup_));
- m_arSuperGroups.insert(pGroup);
- }
- else pGroup->group = std::move(pObj->supergroup_);
-
- if (iStatusId == TD::chatMemberStatusLeft::ID) {
- auto *pUser = AddFakeUser(tmp.id, true);
- pUser->wszNick = getName(pGroup->group->usernames_.get());
- pUser->wszLastName.Format(TranslateT("%d member(s)"), pGroup->group->member_count_);
- }
- else AddUser(tmp.id, true);
-}
-
void CTelegramProto::ProcessUser(TD::updateUser *pObj)
{
auto *pUser = pObj->user_.get();
diff --git a/src/mir_app/src/chat_manager.cpp b/src/mir_app/src/chat_manager.cpp
index 1f6efed99e..284d51c559 100644
--- a/src/mir_app/src/chat_manager.cpp
+++ b/src/mir_app/src/chat_manager.cpp
@@ -736,6 +736,7 @@ static void ResetApi()
g_chatApi.UM_CompareItem = ::UM_CompareItem;
g_chatApi.UM_FindUser = ::UM_FindUser;
g_chatApi.UM_GiveStatus = ::UM_GiveStatus;
+ g_chatApi.UM_RemoveAll = ::UM_RemoveAll;
g_chatApi.UM_SetContactStatus = ::UM_SetContactStatus;
g_chatApi.UM_TakeStatus = ::UM_TakeStatus;
g_chatApi.UM_FindUserAutoComplete = ::UM_FindUserAutoComplete;