diff options
author | George Hazan <george.hazan@gmail.com> | 2024-05-19 19:33:11 +0300 |
---|---|---|
committer | George Hazan <george.hazan@gmail.com> | 2024-05-19 19:33:11 +0300 |
commit | c81ee3954f95848ccb0ed8b3a1346c06a6c3820c (patch) | |
tree | 70ba3dcf6fb85d363a4ef24459c0c3f34668b771 | |
parent | 4da01b6a9e9cfcf7f5d7f2103b866b7ddf7e37c1 (diff) |
fixes #4421 (Telegram: некорректно работает покидание чата с ветками)
-rw-r--r-- | protocols/Telegram/src/groupchat.cpp | 5 | ||||
-rw-r--r-- | protocols/Telegram/src/proto.h | 2 | ||||
-rw-r--r-- | protocols/Telegram/src/server.cpp | 17 | ||||
-rw-r--r-- | protocols/Telegram/src/utils.cpp | 14 |
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;
|