From f60dfaf14a1e51e17e60d8829a29b1e6f3dc1c91 Mon Sep 17 00:00:00 2001 From: John Preston Date: Mon, 16 Feb 2026 23:53:02 +0400 Subject: [PATCH] Always use fresh admin rank, remembered user rank. --- .../SourceFiles/data/data_channel_admins.cpp | 21 +++++++++++++++---- Telegram/SourceFiles/history/history_item.cpp | 9 ++++++++ .../history/history_item_edition.cpp | 3 +++ .../history/history_item_edition.h | 1 + .../history/view/history_view_message.cpp | 20 ++++++++---------- 5 files changed, 39 insertions(+), 15 deletions(-) diff --git a/Telegram/SourceFiles/data/data_channel_admins.cpp b/Telegram/SourceFiles/data/data_channel_admins.cpp index a14b548c52..157c532be1 100644 --- a/Telegram/SourceFiles/data/data_channel_admins.cpp +++ b/Telegram/SourceFiles/data/data_channel_admins.cpp @@ -10,6 +10,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "history/history.h" #include "data/data_channel.h" #include "data/data_session.h" +#include "data/data_user.h" #include "main/main_session.h" namespace Data { @@ -76,12 +77,24 @@ void ChannelMemberRankChanges::feed( } ChannelMemberRankChanges::~ChannelMemberRankChanges() { - if (_changes.size() > 1 - || (!_changes.empty() - && _changes.front() != _channel->session().userId())) { + if (_changes.empty()) { + return; + } + const auto info = _channel->mgInfo.get(); + auto adminChanges = base::flat_set(); + for (const auto &userId : _changes) { + if (info->admins.contains(userId) + || (info->creator + && peerToUser(info->creator->id) == userId)) { + adminChanges.emplace(userId); + } + } + if (adminChanges.size() > 1 + || (!adminChanges.empty() + && adminChanges.front() != _channel->session().userId())) { if (const auto history = _channel->owner().historyLoaded(_channel)) { - history->applyGroupAdminChanges(_changes); + history->applyGroupAdminChanges(adminChanges); } } } diff --git a/Telegram/SourceFiles/history/history_item.cpp b/Telegram/SourceFiles/history/history_item.cpp index 0629a64e36..15444a3550 100644 --- a/Telegram/SourceFiles/history/history_item.cpp +++ b/Telegram/SourceFiles/history/history_item.cpp @@ -2117,6 +2117,15 @@ void HistoryItem::applyEdition(HistoryMessageEdition &&edition) { applyTTL(edition.ttl); setFactcheck(FromMTP(this, edition.mtpFactcheck)); + if (!edition.fromRank.isEmpty()) { + if (!Has()) { + AddComponents(HistoryMessageFromRank::Bit()); + } + Get()->rank = edition.fromRank; + } else { + RemoveComponents(HistoryMessageFromRank::Bit()); + } + finishEdition(keyboardTop); } diff --git a/Telegram/SourceFiles/history/history_item_edition.cpp b/Telegram/SourceFiles/history/history_item_edition.cpp index ef67bf603e..0094d3965a 100644 --- a/Telegram/SourceFiles/history/history_item_edition.cpp +++ b/Telegram/SourceFiles/history/history_item_edition.cpp @@ -34,6 +34,9 @@ HistoryMessageEdition::HistoryMessageEdition( replies = HistoryMessageRepliesData(mtpReplies); } invertMedia = message.is_invert_media(); + if (const auto rank = message.vfrom_rank()) { + fromRank = qs(*rank); + } const auto period = message.vttl_period(); ttl = (period && period->v > 0) ? (message.vdate().v + period->v) : 0; diff --git a/Telegram/SourceFiles/history/history_item_edition.h b/Telegram/SourceFiles/history/history_item_edition.h index 49efa90848..897fd3459b 100644 --- a/Telegram/SourceFiles/history/history_item_edition.h +++ b/Telegram/SourceFiles/history/history_item_edition.h @@ -41,4 +41,5 @@ struct HistoryMessageEdition { const MTPMessageMedia *mtpMedia = nullptr; const MTPMessageReactions *mtpReactions = nullptr; const MTPFactCheck *mtpFactcheck = nullptr; + QString fromRank; }; diff --git a/Telegram/SourceFiles/history/view/history_view_message.cpp b/Telegram/SourceFiles/history/view/history_view_message.cpp index a7b17e6b0d..14e1e5bab8 100644 --- a/Telegram/SourceFiles/history/view/history_view_message.cpp +++ b/Telegram/SourceFiles/history/view/history_view_message.cpp @@ -293,18 +293,16 @@ void Message::refreshRightBadge() { } const auto info = channel->mgInfo.get(); const auto userId = peerToUser(user->id); + const auto isCreator = (info->creator == user); const auto isAdmin = info->admins.contains(userId); - const auto r = info->memberRanks.find(userId); - const auto custom = (r != info->memberRanks.end()) - ? r->second - : QString(); - if (!custom.isEmpty()) { - return { custom, isAdmin || info->creator == user }; - } - if (info->creator == user) { - return { tr::lng_owner_badge(tr::now), true }; - } - if (isAdmin) { + if (isCreator || isAdmin) { + const auto r = info->memberRanks.find(userId); + if (r != info->memberRanks.end() && !r->second.isEmpty()) { + return { r->second, true }; + } + if (isCreator) { + return { tr::lng_owner_badge(tr::now), true }; + } return { tr::lng_admin_badge(tr::now), true }; } const auto fromRank = item->fromRank();