From 916f86b4015e8908165723310ab67d8c30d6494c Mon Sep 17 00:00:00 2001 From: John Preston Date: Wed, 8 Jun 2022 16:53:16 +0400 Subject: [PATCH] Don't show premium star when premium unavailable. --- .../Resources/icons/profile_admin_star.png | Bin 282 -> 0 bytes .../Resources/icons/profile_admin_star@2x.png | Bin 524 -> 0 bytes .../Resources/icons/profile_admin_star@3x.png | Bin 718 -> 0 bytes .../boxes/peers/edit_participants_box.cpp | 2 +- Telegram/SourceFiles/info/info.style | 23 ------- .../info/profile/info_profile_cover.cpp | 3 + Telegram/SourceFiles/main/main_session.cpp | 26 +++++++- Telegram/SourceFiles/main/main_session.h | 3 + Telegram/SourceFiles/profile/profile.style | 4 -- .../profile/profile_block_group_members.cpp | 57 ++++++++++-------- .../profile/profile_block_peer_list.cpp | 13 ++-- .../profile/profile_block_peer_list.h | 8 +-- .../SourceFiles/settings/settings_premium.cpp | 6 +- Telegram/SourceFiles/ui/unread_badge.cpp | 5 +- 14 files changed, 75 insertions(+), 75 deletions(-) delete mode 100644 Telegram/Resources/icons/profile_admin_star.png delete mode 100644 Telegram/Resources/icons/profile_admin_star@2x.png delete mode 100644 Telegram/Resources/icons/profile_admin_star@3x.png diff --git a/Telegram/Resources/icons/profile_admin_star.png b/Telegram/Resources/icons/profile_admin_star.png deleted file mode 100644 index bee28eba7f6d2ddf3c7992c0470ecb397fb6f758..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 282 zcmV+#0p2a}aiyGrgG4z6B`KjG@)on3oe8^^kc{kS{ck@2 z5N`2&J^=v7aokII`~|G*3ILdLVz&_#u$VU&~+WGwe200QskU# g_U@b`rPTHR0)=ASw5T6h0{{R307*qoM6N<$g1er1jsO4v diff --git a/Telegram/Resources/icons/profile_admin_star@2x.png b/Telegram/Resources/icons/profile_admin_star@2x.png deleted file mode 100644 index 4756363b41e833719fbbfa9a5d4c529a35851b4b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 524 zcmV+n0`vWeP)~UY|;d~Xm4j@AreHC z^NPpv-mbbayL-UGJNKS5=gx5F7ZHILf^$xcF?u{6OH1hY;!Gmi?RK=^?_Vh)qQ4HF zeu|=?ZCkW$3q?^D)esRDJMcV@IOoJUC(rYK)&XM-MN!}lMNxn;w$#P*B-eHE5w7e0 zoIo7MBY`-Mzb7EeGBizt<2WPoH#m+1P17LD^1Og3ir8+qNRk9umZ2<5^nE`|I)}dR zQI;jLEJGAU*laf7oP!u+I3ABL6F$S?aDX5P|61hx{+D+C5q;mo_x?l%uLD!Z5@z3;=-3<+5zp ziK2+}`HUnpda*MU z3y9-5T-3$I#s4drD2jo1_xJa4ECC?mN)8SV(6X#RhD_5$ilTO(Awduzo6QE^6GGtb z?k=h=07P8L$Hzw?J9DY3y4$9%R;w#v=HfUm5>RSR#j-3Ei$yp(I$ApN`Mm#32nm&X z%d)^Q4A6BQbX^C-Fu*Vj`2PO(pAEwRP18VC)t@Efc^*yE+_>_jHJMEC>gsBF$yk=f z@p!y5n9t8oWLb8750%U1wGEq;6h*;OsT8iMDT+c#lKvTtBuVQo;^p0*PN(tt`8jcz zr>7^}+uMu2?c41(x~>}=#C2V4wOYxXLpL`!IGfEP!&sJu*Vos{9*oUqGcpj*^PvyM z(05rbmkS#j5W_H`V?zVgYPCo(008xReXICTsT_?)kxSO^_qVyvHU|}p#mF#-h@R(R zp-@P!hc=~rI-SC7He2~Ul}d#!c_^TDW^ZqAaC&+QXJ=>d{{9}xV^JH^s3=OH3}0Vg zczb&rh!q3@HBAe|%d(tI4>1h$(b!`~Uy|07*qoM6N<$f+U1c Ag8%>k diff --git a/Telegram/SourceFiles/boxes/peers/edit_participants_box.cpp b/Telegram/SourceFiles/boxes/peers/edit_participants_box.cpp index d1bfee78c8..fcaf8dbf43 100644 --- a/Telegram/SourceFiles/boxes/peers/edit_participants_box.cpp +++ b/Telegram/SourceFiles/boxes/peers/edit_participants_box.cpp @@ -1941,7 +1941,7 @@ auto ParticipantsBoxController::computeType( ? Badge::Fake : user->isVerified() ? Badge::Verified - : user->isPremium() + : (user->isPremium() && participant->session().premiumPossible()) ? Badge::Premium : Badge::None; return result; diff --git a/Telegram/SourceFiles/info/info.style b/Telegram/SourceFiles/info/info.style index 186920fd1e..559dcb3828 100644 --- a/Telegram/SourceFiles/info/info.style +++ b/Telegram/SourceFiles/info/info.style @@ -472,29 +472,6 @@ infoChannelsAddChannel: IconButton(infoMembersButton) { iconOver: icon {{ "settings/settings_edit_name", menuIconFgOver, point(9px, 9px) }}; } -infoMembersCreatorIcon: icon {{ - "profile_admin_star", - profileAdminStartFg, - point(4px, 3px) -}}; -infoMembersCreatorIconOver: icon {{ - "profile_admin_star", - profileAdminStarFgOver, - point(4px, 3px) -}}; -infoMembersAdminIcon: icon {{ - "profile_admin_star", - profileOtherAdminStarFg, - point(4px, 3px) -}}; -infoMembersAdminIconOver: icon {{ - "profile_admin_star", - profileOtherAdminStarFgOver, - point(4px, 3px) -}}; -infoMembersAdminIconMarigns: margins(10px, 18px, 10px, 10px); -infoMembersRemoveIconMargins: margins(10px, 12px, 12px, 10px); - infoMediaHeaderStyle: TextStyle(semiboldTextStyle) { } infoMediaHeaderHeight: 28px; diff --git a/Telegram/SourceFiles/info/profile/info_profile_cover.cpp b/Telegram/SourceFiles/info/profile/info_profile_cover.cpp index 563e9eaaeb..b8d2788110 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_cover.cpp +++ b/Telegram/SourceFiles/info/profile/info_profile_cover.cpp @@ -271,6 +271,9 @@ void Cover::initViewers(rpl::producer title) { BadgeValue( _peer ) | rpl::start_with_next([=](Badge badge) { + if (badge == Badge::Premium && !_peer->session().premiumPossible()) { + badge = Badge::None; + } setBadge(badge); }, lifetime()); } diff --git a/Telegram/SourceFiles/main/main_session.cpp b/Telegram/SourceFiles/main/main_session.cpp index bf12fcbb48..00b1231d6b 100644 --- a/Telegram/SourceFiles/main/main_session.cpp +++ b/Telegram/SourceFiles/main/main_session.cpp @@ -133,6 +133,13 @@ Session::Session( } }, _lifetime); + _account->appConfig().value( + ) | rpl::start_with_next([=] { + _premiumPossible = !_account->appConfig().get( + "premium_purchase_blocked", + true); + }, _lifetime); + if (_settings->hadLegacyCallsPeerToPeerNobody()) { api().userPrivacy().save( Api::UserPrivacy::Key::CallsPeer2Peer, @@ -224,9 +231,22 @@ bool Session::premium() const { } bool Session::premiumPossible() const { - return !premium() && !_account->appConfig().get( - "premium_purchase_blocked", - true); + return premium() || _premiumPossible.current(); +} + +rpl::producer Session::premiumPossibleValue() const { + using namespace rpl::mappers; + + auto premium = _user->flagsValue( + ) | rpl::filter([=](UserData::Flags::Change change) { + return (change.diff & UserDataFlag::Premium); + }) | rpl::map([=] { + return _user->isPremium(); + }); + return rpl::combine( + std::move(premium), + _premiumPossible.value(), + _1 || _2); } uint64 Session::uniqueId() const { diff --git a/Telegram/SourceFiles/main/main_session.h b/Telegram/SourceFiles/main/main_session.h index e898495e04..bc2c8bc4b0 100644 --- a/Telegram/SourceFiles/main/main_session.h +++ b/Telegram/SourceFiles/main/main_session.h @@ -82,6 +82,8 @@ public: [[nodiscard]] bool premium() const; [[nodiscard]] bool premiumPossible() const; + [[nodiscard]] rpl::producer premiumPossibleValue() const; + [[nodiscard]] uint64 uniqueId() const; // userId() with TestDC shift. [[nodiscard]] UserId userId() const; [[nodiscard]] PeerId userPeerId() const; @@ -208,6 +210,7 @@ private: const std::unique_ptr _supportHelper; std::shared_ptr _selfUserpicView; + rpl::variable _premiumPossible = false; rpl::event_stream _termsLockChanges; std::unique_ptr _termsLock; diff --git a/Telegram/SourceFiles/profile/profile.style b/Telegram/SourceFiles/profile/profile.style index 548bc0c07a..a0c0da35c3 100644 --- a/Telegram/SourceFiles/profile/profile.style +++ b/Telegram/SourceFiles/profile/profile.style @@ -104,10 +104,6 @@ profileLimitReachedSkip: 6px; profileMemberPaddingLeft: 16px; profileMemberNameFg: windowBoldFg; -profileMemberCreatorIcon: icon {{ "profile_admin_star", profileAdminStartFg, point(4px, 3px) }}; -profileMemberCreatorIconOver: icon {{ "profile_admin_star", profileAdminStarFgOver, point(4px, 3px) }}; -profileMemberAdminIcon: icon {{ "profile_admin_star", profileOtherAdminStarFg, point(4px, 3px) }}; -profileMemberAdminIconOver: icon {{ "profile_admin_star", profileOtherAdminStarFgOver, point(4px, 3px) }}; profileLimitReachedLabel: FlatLabel(defaultFlatLabel) { minWidth: 180px; margin: margins(profileMemberPaddingLeft, 9px, profileMemberPaddingLeft, 6px); diff --git a/Telegram/SourceFiles/profile/profile_block_group_members.cpp b/Telegram/SourceFiles/profile/profile_block_group_members.cpp index 3614c8f7a7..c69941690e 100644 --- a/Telegram/SourceFiles/profile/profile_block_group_members.cpp +++ b/Telegram/SourceFiles/profile/profile_block_group_members.cpp @@ -170,7 +170,8 @@ void GroupMembersWidget::updateItemStatusText(Item *item) { auto user = member->user(); if (member->statusText.isEmpty() || (member->onlineTextTill <= _now)) { if (user->isBot()) { - auto seesAllMessages = (user->botInfo->readsAllHistory || (member->adminState != Item::AdminState::None)); + const auto seesAllMessages = user->botInfo->readsAllHistory + || member->rank.has_value(); member->statusText = seesAllMessages ? tr::lng_status_bot_reads_all(tr::now) : tr::lng_status_bot_not_reads_all(tr::now); @@ -294,25 +295,24 @@ void GroupMembersWidget::fillChatMembers(not_null chat) { void GroupMembersWidget::setItemFlags( not_null item, not_null chat) { - using AdminState = Item::AdminState; const auto user = getMember(item)->user(); const auto isCreator = (peerFromUser(chat->creator) == item->peer->id); const auto isAdmin = (item->peer->isSelf() && chat->hasAdminRights()) || chat->admins.contains(user); - const auto adminState = isCreator - ? AdminState::Creator + const auto rank = isCreator + ? tr::lng_owner_badge(tr::now) : isAdmin - ? AdminState::Admin - : AdminState::None; - item->adminState = adminState; + ? tr::lng_admin_badge(tr::now) + : std::optional(); + item->rank = rank; + item->rankWidth = rank ? st::normalFont->width(*rank) : 0; if (item->peer->id == chat->session().userPeerId()) { item->hasRemoveLink = false; } else if (chat->amCreator() || ((chat->adminRights() & ChatAdminRight::BanUsers) - && (adminState == AdminState::None))) { + && !rank.has_value())) { item->hasRemoveLink = true; - } else if (chat->invitedByMe.contains(user) - && (adminState == AdminState::None)) { + } else if (chat->invitedByMe.contains(user) && !rank.has_value()) { item->hasRemoveLink = true; } else { item->hasRemoveLink = false; @@ -386,20 +386,27 @@ bool GroupMembersWidget::addUsersToEnd(not_null megagroup) { void GroupMembersWidget::setItemFlags( not_null item, not_null megagroup) { - using AdminState = Item::AdminState; - auto amCreator = item->peer->isSelf() && megagroup->amCreator(); - auto amAdmin = item->peer->isSelf() && megagroup->hasAdminRights(); - auto adminIt = megagroup->mgInfo->lastAdmins.find(getMember(item)->user()); - auto isAdmin = (adminIt != megagroup->mgInfo->lastAdmins.cend()); - auto isCreator = megagroup->mgInfo->creator == item->peer; - auto adminCanEdit = isAdmin && adminIt->second.canEdit; - auto adminState = (amCreator || isCreator) - ? AdminState::Creator + const auto amCreator = item->peer->isSelf() && megagroup->amCreator(); + const auto amAdmin = item->peer->isSelf() && megagroup->hasAdminRights(); + const auto user = getMember(item)->user(); + const auto adminIt = megagroup->mgInfo->lastAdmins.find(user); + const auto isAdmin = (adminIt != megagroup->mgInfo->lastAdmins.cend()); + const auto isCreator = (megagroup->mgInfo->creator == item->peer); + const auto rankIt = megagroup->mgInfo->admins.find(peerToUser(user->id)); + const auto adminCanEdit = isAdmin && adminIt->second.canEdit; + const auto rank = (amCreator || isCreator) + ? (megagroup->mgInfo->creatorRank.isEmpty() + ? megagroup->mgInfo->creatorRank + : tr::lng_owner_badge(tr::now)) : (amAdmin || isAdmin) - ? AdminState::Admin - : AdminState::None; - if (item->adminState != adminState) { - item->adminState = adminState; + ? ((rankIt != megagroup->mgInfo->admins.end() + && !rankIt->second.isEmpty()) + ? rankIt->second + : tr::lng_admin_badge(tr::now)) + : std::optional(); + if (item->rank != rank) { + item->rank = rank; + item->rankWidth = rank ? st::normalFont->width(*rank) : 0; auto user = item->peer->asUser(); Assert(user != nullptr); if (user->isBot()) { @@ -410,7 +417,9 @@ void GroupMembersWidget::setItemFlags( } if (item->peer->isSelf()) { item->hasRemoveLink = false; - } else if (megagroup->amCreator() || (megagroup->canBanMembers() && ((adminState == AdminState::None) || adminCanEdit))) { + } else if (megagroup->amCreator() + || (megagroup->canBanMembers() + && (!rank.has_value() || adminCanEdit))) { item->hasRemoveLink = true; } else { item->hasRemoveLink = false; diff --git a/Telegram/SourceFiles/profile/profile_block_peer_list.cpp b/Telegram/SourceFiles/profile/profile_block_peer_list.cpp index 329d15ab3a..2ac6569602 100644 --- a/Telegram/SourceFiles/profile/profile_block_peer_list.cpp +++ b/Telegram/SourceFiles/profile/profile_block_peer_list.cpp @@ -110,14 +110,11 @@ void PeerListWidget::paintItem(Painter &p, int x, int y, Item *item, bool select p.setPen(st::windowActiveTextFg); p.drawTextLeft(nameLeft + nameWidth - _removeWidth, nameTop, width(), _removeText, _removeWidth); nameWidth -= _removeWidth + skip; - } - if (item->adminState != Item::AdminState::None) { - nameWidth -= st::profileMemberAdminIcon.width(); - auto iconLeft = nameLeft + qMin(nameWidth, item->name.maxWidth()); - auto &icon = (item->adminState == Item::AdminState::Creator) - ? (selected ? st::profileMemberCreatorIconOver : st::profileMemberCreatorIcon) - : (selected ? st::profileMemberAdminIconOver : st::profileMemberAdminIcon); - icon.paint(p, QPoint(iconLeft, nameTop), width()); + } else if (item->rank) { + p.setFont(st::normalFont); + p.setPen(st::windowActiveTextFg); + p.drawTextLeft(nameLeft + nameWidth - item->rankWidth, nameTop, width(), *item->rank, item->rankWidth); + nameWidth -= item->rankWidth + skip; } p.setPen(st::profileMemberNameFg); item->name.drawLeftElided(p, nameLeft, nameTop, nameWidth, width()); diff --git a/Telegram/SourceFiles/profile/profile_block_peer_list.h b/Telegram/SourceFiles/profile/profile_block_peer_list.h index 02a208ef87..0ca1027cab 100644 --- a/Telegram/SourceFiles/profile/profile_block_peer_list.h +++ b/Telegram/SourceFiles/profile/profile_block_peer_list.h @@ -37,12 +37,8 @@ public: Ui::Text::String name; QString statusText; bool statusHasOnlineColor = false; - enum class AdminState { - None, - Admin, - Creator, - }; - AdminState adminState = AdminState::None; + std::optional rank; + int rankWidth = 0; bool hasRemoveLink = false; std::unique_ptr ripple; }; diff --git a/Telegram/SourceFiles/settings/settings_premium.cpp b/Telegram/SourceFiles/settings/settings_premium.cpp index b995276719..a559e2234e 100644 --- a/Telegram/SourceFiles/settings/settings_premium.cpp +++ b/Telegram/SourceFiles/settings/settings_premium.cpp @@ -927,17 +927,13 @@ QPointer Premium::createPinnedToBottom( }, status->lifetime()); const auto session = &_controller->session(); - auto premiumPossible = session->account().appConfig().value( - ) | rpl::map([=] { - return session->premiumPossible(); - }); rpl::combine( terms->heightValue(), button->heightValue(), status->heightValue(), std::move(text), Data::AmPremiumValue(session), - std::move(premiumPossible) + session->premiumPossibleValue() ) | rpl::start_with_next([=]( int termsHeight, int buttonHeight, diff --git a/Telegram/SourceFiles/ui/unread_badge.cpp b/Telegram/SourceFiles/ui/unread_badge.cpp index c0bea237d7..040f18b346 100644 --- a/Telegram/SourceFiles/ui/unread_badge.cpp +++ b/Telegram/SourceFiles/ui/unread_badge.cpp @@ -8,6 +8,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/unread_badge.h" #include "data/data_peer.h" +#include "main/main_session.h" #include "dialogs/ui/dialogs_layout.h" #include "lang/lang_keys.h" #include "styles/style_dialogs.h" @@ -117,7 +118,9 @@ int DrawPeerBadgeGetWidth( rectForName.y(), outerWidth); return iconw; - } else if (peer->isPremium() && st.premium) { + } else if (peer->isPremium() + && st.premium + && peer->session().premiumPossible()) { const auto iconw = st.premium->width(); st.premium->paint( p,