Fix removing chats from dialogs.

This commit is contained in:
John Preston 2019-01-22 17:05:06 +04:00
parent ebc2043055
commit bf87de3706
5 changed files with 17 additions and 19 deletions

View file

@ -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 {

View file

@ -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;

View file

@ -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()) {

View file

@ -189,12 +189,12 @@ rpl::producer<bool> CanWriteValue(ChatData *chat) {
MTPDchat::Flags flags,
Data::Flags<ChatAdminRights>::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);

View file

@ -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;
}