not_null<PeerData*> HistoryItem::senderOriginal() const { if (const auto forwarded = Get<HistoryMessageForwarded>()) { return forwarded->originalSender; } const auto peer = history()->peer; return (peer->isChannel() && !peer->isMegagroup()) ? peer : from(); }
void ChannelData::applyEditAdmin(not_null<UserData*> user, const MTPChannelAdminRights &oldRights, const MTPChannelAdminRights &newRights) { auto flags = Notify::PeerUpdate::Flag::AdminsChanged | Notify::PeerUpdate::Flag::None; if (mgInfo) { // If rights are empty - still add participant? TODO check if (!base::contains(mgInfo->lastParticipants, user)) { mgInfo->lastParticipants.push_front(user); setMembersCount(membersCount() + 1); if (user->botInfo && !mgInfo->bots.contains(user)) { mgInfo->bots.insert(user); if (mgInfo->botStatus != 0 && mgInfo->botStatus < 2) { mgInfo->botStatus = 2; } } } // If rights are empty - still remove restrictions? TODO check if (mgInfo->lastRestricted.contains(user)) { mgInfo->lastRestricted.remove(user); if (restrictedCount() > 0) { setRestrictedCount(restrictedCount() - 1); } } auto userId = peerToUser(user->id); auto it = mgInfo->lastAdmins.find(user); if (newRights.c_channelAdminRights().vflags.v != 0) { auto lastAdmin = MegagroupInfo::Admin { newRights }; lastAdmin.canEdit = true; if (it == mgInfo->lastAdmins.cend()) { mgInfo->lastAdmins.emplace(user, lastAdmin); setAdminsCount(adminsCount() + 1); } else { it->second = lastAdmin; } Data::ChannelAdminChanges(this).feed(userId, true); } else { if (it != mgInfo->lastAdmins.cend()) { mgInfo->lastAdmins.erase(it); if (adminsCount() > 0) { setAdminsCount(adminsCount() - 1); } } Data::ChannelAdminChanges(this).feed(userId, false); } } if (oldRights.c_channelAdminRights().vflags.v && !newRights.c_channelAdminRights().vflags.v) { // We removed an admin. if (adminsCount() > 1) { setAdminsCount(adminsCount() - 1); } if (!isMegagroup() && user->botInfo && membersCount() > 1) { // Removing bot admin removes it from channel. setMembersCount(membersCount() - 1); } } else if (!oldRights.c_channelAdminRights().vflags.v && newRights.c_channelAdminRights().vflags.v) { // We added an admin. setAdminsCount(adminsCount() + 1); updateFullForced(); } Notify::peerUpdatedDelayed(this, flags); }
bool ChannelData::canPinMessages() const { if (isMegagroup()) { return (adminRights() & AdminRight::f_pin_messages) || amCreator(); } return (adminRights() & AdminRight::f_edit_messages) || amCreator(); }
void ChannelData::setMembersCount(int newMembersCount) { if (_membersCount != newMembersCount) { if (isMegagroup() && !mgInfo->lastParticipants.empty()) { mgInfo->lastParticipantsStatus |= MegagroupInfo::LastParticipantsCountOutdated; mgInfo->lastParticipantsCount = membersCount(); } _membersCount = newMembersCount; Notify::peerUpdatedDelayed(this, Notify::PeerUpdate::Flag::MembersChanged); } }
QString HistoryItem::directLink() const { if (hasDirectLink()) { auto channel = _history->peer->asChannel(); Assert(channel != nullptr); auto query = channel->username + '/' + QString::number(id); if (!channel->isMegagroup()) { if (const auto media = this->media()) { if (const auto document = media->document()) { if (document->isVideoMessage()) { return qsl("https://telesco.pe/") + query; } } } } return Core::App().createInternalLinkFull(query); } return QString(); }
void ChannelData::setRestrictedRights(const MTPChannelBannedRights &rights) { if (rights.c_channelBannedRights().vflags.v == restrictions() && rights.c_channelBannedRights().vuntil_date.v == _restrictedUntill) { return; } _restrictedUntill = rights.c_channelBannedRights().vuntil_date.v; _restrictions.set(rights.c_channelBannedRights().vflags.v); if (isMegagroup()) { if (hasRestrictions()) { if (!amCreator()) { auto me = MegagroupInfo::Restricted { rights }; mgInfo->lastRestricted.emplace(App::self(), me); } mgInfo->lastAdmins.remove(App::self()); Data::ChannelAdminChanges(this).feed(Auth().userId(), false); } else { mgInfo->lastRestricted.remove(App::self()); } } Notify::peerUpdatedDelayed(this, UpdateFlag::ChannelRightsChanged | UpdateFlag::AdminsChanged | UpdateFlag::BannedUsersChanged); }
void ChannelData::setAdminRights(const MTPChannelAdminRights &rights) { if (rights.c_channelAdminRights().vflags.v == adminRights()) { return; } _adminRights.set(rights.c_channelAdminRights().vflags.v); if (isMegagroup()) { if (hasAdminRights()) { if (!amCreator()) { auto me = MegagroupInfo::Admin { rights }; me.canEdit = false; mgInfo->lastAdmins.emplace(App::self(), me); } mgInfo->lastRestricted.remove(App::self()); } else { mgInfo->lastAdmins.remove(App::self()); } auto amAdmin = hasAdminRights() || amCreator(); Data::ChannelAdminChanges(this).feed(Auth().userId(), amAdmin); } Notify::peerUpdatedDelayed(this, UpdateFlag::ChannelRightsChanged | UpdateFlag::AdminsChanged | UpdateFlag::BannedUsersChanged); }
bool ChannelData::canViewAdmins() const { return (isMegagroup() || hasAdminRights() || amCreator()); }