summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorge Hazan <george.hazan@gmail.com>2024-05-19 19:33:11 +0300
committerGeorge Hazan <george.hazan@gmail.com>2024-05-19 19:33:11 +0300
commitc81ee3954f95848ccb0ed8b3a1346c06a6c3820c (patch)
tree70ba3dcf6fb85d363a4ef24459c0c3f34668b771
parent4da01b6a9e9cfcf7f5d7f2103b866b7ddf7e37c1 (diff)
fixes #4421 (Telegram: некорректно работает покидание чата с ветками)
-rw-r--r--protocols/Telegram/src/groupchat.cpp5
-rw-r--r--protocols/Telegram/src/proto.h2
-rw-r--r--protocols/Telegram/src/server.cpp17
-rw-r--r--protocols/Telegram/src/utils.cpp14
4 files changed, 25 insertions, 13 deletions
diff --git a/protocols/Telegram/src/groupchat.cpp b/protocols/Telegram/src/groupchat.cpp
index 7529281288..80d217aff6 100644
--- a/protocols/Telegram/src/groupchat.cpp
+++ b/protocols/Telegram/src/groupchat.cpp
@@ -435,6 +435,7 @@ void CTelegramProto::ProcessForum(TD::updateForumTopicInfo *pForum)
si->pParent = pUser->m_si;
SetId(si->hContact, pForum->info_->message_thread_id_, DBKEY_THREAD);
+ SetId(si->hContact, pUser->id, DBKEY_OWNER);
Chat_Mute(si->hContact, Chat_IsMuted(pUser->hContact));
Clist_SetGroup(si->hContact, ptrW(Clist_GetGroup(pUser->hContact)));
@@ -461,16 +462,18 @@ void CTelegramProto::ProcessSuperGroup(TD::updateSupergroup *pObj)
if (iStatusId == TD::chatMemberStatusLeft::ID) {
auto *pUser = AddFakeUser(tmp.id, true);
+ pUser->isForum = pGroup->group->is_forum_;
if (pUser->hContact == INVALID_CONTACT_ID) {
// cache some information for the search
if (pUser->wszNick.IsEmpty())
pUser->wszNick = Utf2T(getName(pGroup->group->usernames_.get()));
pUser->wszLastName.Format(TranslateT("%d member(s)"), pGroup->group->member_count_);
}
- else Contact::RemoveFromList(pUser->hContact);
+ else RemoveFromClist(pUser);
}
else {
auto *pChat = AddUser(tmp.id, true);
+ pChat->isForum = pGroup->group->is_forum_;
if (!pGroup->group->is_channel_)
pChat->bLoadMembers = true;
diff --git a/protocols/Telegram/src/proto.h b/protocols/Telegram/src/proto.h
index deff69a9b0..76c6c5d3d0 100644
--- a/protocols/Telegram/src/proto.h
+++ b/protocols/Telegram/src/proto.h
@@ -2,6 +2,7 @@
#define DBKEY_ID "id"
#define DBKEY_COMPAT "Compatibility"
+#define DBKEY_OWNER "OwnerId"
#define DBKEY_THREAD "ThreadId"
#define DBKEY_LAST_MSG "LastMessageId"
#define DBKEY_AUTHORIZED "Authorized"
@@ -355,6 +356,7 @@ class CTelegramProto : public PROTO<CTelegramProto>
void SetId(MCONTACT, int64_t id, const char *pszSetting = DBKEY_ID);
MCONTACT GetRealContact(const TG_USER *pUser);
+ void RemoveFromClist(TG_USER *pUser);
// Menus
HGENMENU hmiForward, hmiReaction;
diff --git a/protocols/Telegram/src/server.cpp b/protocols/Telegram/src/server.cpp
index 5b82721765..02582fa653 100644
--- a/protocols/Telegram/src/server.cpp
+++ b/protocols/Telegram/src/server.cpp
@@ -525,8 +525,7 @@ void CTelegramProto::ProcessChat(TD::updateNewChat *pObj)
int64_t userId;
auto *pChat = pObj->chat_.get();
std::string szTitle;
- bool isForum = false;
-
+
switch (pChat->type_->get_id()) {
case TD::chatTypePrivate::ID:
case TD::chatTypeSecret::ID:
@@ -541,14 +540,6 @@ void CTelegramProto::ProcessChat(TD::updateNewChat *pObj)
case TD::chatTypeSupergroup::ID:
userId = ((TD::chatTypeSupergroup *)pChat->type_.get())->supergroup_id_;
szTitle = pChat->title_;
- {
- TG_SUPER_GROUP tmp(userId, 0);
- if (auto *pGroup = m_arSuperGroups.find(&tmp))
- isForum = pGroup->group->is_forum_;
-
- if (isForum)
- SendQuery(new TD::getForumTopics(pChat->id_, "", 0, 0, 0, 100), &CTelegramProto::OnGetForumTopics);
- }
break;
default:
@@ -563,7 +554,9 @@ void CTelegramProto::ProcessChat(TD::updateNewChat *pObj)
}
pUser->chatId = pChat->id_;
- pUser->isForum = isForum;
+ if (pUser->isForum)
+ SendQuery(new TD::getForumTopics(pChat->id_, "", 0, 0, 0, 100), &CTelegramProto::OnGetForumTopics);
+
MCONTACT hContact = (pUser->id == m_iOwnId) ? 0 : pUser->hContact;
if (!m_arChats.find(pUser))
@@ -1108,7 +1101,7 @@ void CTelegramProto::ProcessUser(TD::updateUser *pObj)
case TD::userTypeRegular::ID:
auto *pu = AddFakeUser(pUser->id_, false);
if (pu->hContact != INVALID_CONTACT_ID)
- Contact::RemoveFromList(pu->hContact);
+ RemoveFromClist(pu);
pu->wszFirstName = Utf2T(pUser->first_name_.c_str());
pu->wszLastName = Utf2T(pUser->last_name_.c_str());
diff --git a/protocols/Telegram/src/utils.cpp b/protocols/Telegram/src/utils.cpp
index 7c3e9f8741..bda59c0768 100644
--- a/protocols/Telegram/src/utils.cpp
+++ b/protocols/Telegram/src/utils.cpp
@@ -179,6 +179,20 @@ CMStringW TG_USER::getDisplayName() const
return wszNick;
}
+void CTelegramProto::RemoveFromClist(TG_USER *pUser)
+{
+ Contact::RemoveFromList(pUser->hContact);
+
+ if (pUser->isForum) {
+ if (MGROUP hGroup = Clist_GroupExists(ptrW(Clist_GetGroup(pUser->hContact))))
+ Clist_GroupDelete(hGroup, true);
+
+ for (auto &cc : AccContacts())
+ if (pUser->id == GetId(cc, DBKEY_OWNER))
+ Contact::RemoveFromList(cc);
+ }
+}
+
MCONTACT CTelegramProto::GetRealContact(const TG_USER *pUser)
{
return (pUser->hContact != 0) ? pUser->hContact : m_iSavedMessages;