diff --git a/Telegram/SourceFiles/data/data_chat.cpp b/Telegram/SourceFiles/data/data_chat.cpp index c9f23265f..6439cb9f1 100644 --- a/Telegram/SourceFiles/data/data_chat.cpp +++ b/Telegram/SourceFiles/data/data_chat.cpp @@ -39,10 +39,6 @@ void ChatData::setPhoto(PhotoId photoId, const MTPChatPhoto &photo) { } } -bool ChatData::actionsUnavailable() const { - return isDeactivated() || !amIn(); -} - auto ChatData::DefaultAdminRights() -> AdminRights { using Flag = AdminRight; return Flag::f_change_info @@ -54,17 +50,15 @@ auto ChatData::DefaultAdminRights() -> AdminRights { bool ChatData::canWrite() const { // Duplicated in Data::CanWriteValue(). - return !actionsUnavailable() - && !amRestricted(Restriction::f_send_messages); + return amIn() && !amRestricted(Restriction::f_send_messages); } bool ChatData::canEditInformation() const { - return !actionsUnavailable() - && !amRestricted(Restriction::f_change_info); + return amIn() && !amRestricted(Restriction::f_change_info); } bool ChatData::canEditPermissions() const { - return !actionsUnavailable() + return amIn() && (amCreator() || (adminRights() & AdminRight::f_ban_users)); } @@ -78,18 +72,15 @@ bool ChatData::canEditPreHistoryHidden() const { } bool ChatData::canAddMembers() const { - return !actionsUnavailable() - && !amRestricted(Restriction::f_invite_users); + return amIn() && !amRestricted(Restriction::f_invite_users); } bool ChatData::canSendPolls() const { - return !actionsUnavailable() - && !amRestricted(Restriction::f_send_polls); + return amIn() && !amRestricted(Restriction::f_send_polls); } bool ChatData::canAddAdmins() const { - return !actionsUnavailable() - && amCreator(); + return amIn() && amCreator(); } bool ChatData::canBanMembers() const { diff --git a/Telegram/SourceFiles/data/data_chat.h b/Telegram/SourceFiles/data/data_chat.h index 66d88a4ca..7dfc047cb 100644 --- a/Telegram/SourceFiles/data/data_chat.h +++ b/Telegram/SourceFiles/data/data_chat.h @@ -103,7 +103,10 @@ public: return flags() & MTPDchat_ClientFlag::f_forbidden; } bool amIn() const { - return !isForbidden() && !haveLeft() && !wasKicked(); + return !isForbidden() + && !isDeactivated() + && !haveLeft() + && !wasKicked(); } bool haveLeft() const { return flags() & MTPDchat::Flag::f_left; diff --git a/Telegram/SourceFiles/data/data_peer.cpp b/Telegram/SourceFiles/data/data_peer.cpp index d063942d0..e65e1e034 100644 --- a/Telegram/SourceFiles/data/data_peer.cpp +++ b/Telegram/SourceFiles/data/data_peer.cpp @@ -350,7 +350,7 @@ bool PeerData::canPinMessages() const { if (const auto user = asUser()) { return user->fullFlags() & MTPDuserFull::Flag::f_can_pin_message; } else if (const auto chat = asChat()) { - return !chat->isDeactivated() + return chat->amIn() && ((chat->adminRights() & ChatAdminRight::f_pin_messages) || chat->amCreator()); } else if (const auto channel = asChannel()) { diff --git a/Telegram/SourceFiles/data/data_peer_values.cpp b/Telegram/SourceFiles/data/data_peer_values.cpp index e969bdc7a..41becf1de 100644 --- a/Telegram/SourceFiles/data/data_peer_values.cpp +++ b/Telegram/SourceFiles/data/data_peer_values.cpp @@ -189,12 +189,12 @@ rpl::producer CanWriteValue(ChatData *chat) { MTPDchat::Flags flags, Data::Flags::Change adminRights, bool defaultSendMessagesRestriction) { - const auto actionsUnavailableFlags = 0 + const auto amOutFlags = 0 | MTPDchat::Flag::f_deactivated | MTPDchat_ClientFlag::f_forbidden | MTPDchat::Flag::f_left | MTPDchat::Flag::f_kicked; - return !(flags & actionsUnavailableFlags) + return !(flags & amOutFlags) && ((flags & MTPDchat::Flag::f_creator) || (adminRights.value != MTPDchatAdminRights::Flags(0)) || !defaultSendMessagesRestriction); diff --git a/Telegram/SourceFiles/history/history.cpp b/Telegram/SourceFiles/history/history.cpp index c8bacef0b..a2d4af0ce 100644 --- a/Telegram/SourceFiles/history/history.cpp +++ b/Telegram/SourceFiles/history/history.cpp @@ -2304,6 +2304,10 @@ bool History::shouldBeInChatList() const { } else if (const auto feed = channel->feed()) { return !feed->needUpdateInChatList(); } + } else if (const auto chat = peer->asChat()) { + return chat->amIn() + || !lastMessageKnown() + || (lastMessage() != nullptr); } return true; }