Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions Telegram/Resources/langs/lang.strings
Original file line number Diff line number Diff line change
Expand Up @@ -5187,6 +5187,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_context_select_msg" = "Select";
"lng_context_select_msg_bulk" = "Select up to this message";
"lng_context_report_msg" = "Report";
"lng_context_filter_sender" = "Hide sender's messages";
"lng_context_unfilter_sender" = "Show sender's messages";
"lng_filtered_senders_title" = "Hidden senders";
"lng_filtered_senders_menu" = "Hidden senders";
"lng_context_pin_msg" = "Pin";
"lng_context_unpin_msg" = "Unpin";
"lng_context_cancel_upload" = "Cancel Upload";
Expand Down
13 changes: 13 additions & 0 deletions Telegram/SourceFiles/data/data_session.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2070,6 +2070,19 @@ rpl::producer<not_null<const HistoryItem*>> Session::itemResizeRequest() const {
return _itemResizeRequest.events();
}

void Session::requestSenderViewsResize(not_null<PeerData*> sender) {
auto items = std::vector<not_null<const HistoryItem*>>();
items.reserve(_views.size());
for (const auto &[item, views] : _views) {
if (item->from() == sender) {
items.push_back(item);
}
}
for (const auto item : items) {
requestItemResize(item);
}
}

void Session::requestViewResize(not_null<ViewElement*> view) {
view->setPendingResize();
_viewResizeRequest.fire_copy(view);
Expand Down
1 change: 1 addition & 0 deletions Telegram/SourceFiles/data/data_session.h
Original file line number Diff line number Diff line change
Expand Up @@ -408,6 +408,7 @@ class Session final {
[[nodiscard]] rpl::producer<RequestViewRepaint> viewRepaintRequest() const;
void requestItemResize(not_null<const HistoryItem*> item);
[[nodiscard]] rpl::producer<not_null<const HistoryItem*>> itemResizeRequest() const;
void requestSenderViewsResize(not_null<PeerData*> sender);
void requestViewResize(not_null<ViewElement*> view);
[[nodiscard]] rpl::producer<not_null<ViewElement*>> viewResizeRequest() const;
struct ViewHeightAdjusted {
Expand Down
2 changes: 2 additions & 0 deletions Telegram/SourceFiles/history/history_inner_widget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3355,6 +3355,7 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) {
reportItem(itemId);
}, &st::menuIconReport);
}
HistoryView::AddFilterSenderAction(_menu, controller, item);
}
addSelectMessageAction(item);
if (isUponSelected != -2 && blockSender) {
Expand Down Expand Up @@ -3650,6 +3651,7 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) {
reportAsGroup(itemId);
}, &st::menuIconReport);
}
HistoryView::AddFilterSenderAction(_menu, controller, item);
}
addSelectMessageAction(partItemOrLeader);
if (isUponSelected != -2 && canBlockSender) {
Expand Down
35 changes: 35 additions & 0 deletions Telegram/SourceFiles/history/view/history_view_context_menu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1070,6 +1070,9 @@ void AddMessageActions(
AddDeleteAction(menu, request, list);
AddDownloadFilesAction(menu, request, list);
AddReportAction(menu, request, list);
if (request.selectedItems.empty()) {
AddFilterSenderAction(menu, list->controller(), request.item);
}
AddSelectionAction(menu, request, list);
AddRescheduleAction(menu, request, list);
}
Expand Down Expand Up @@ -2093,6 +2096,38 @@ void AddWhenEditedForwardedAuthorActionHelper(
}
}

void AddFilterSenderAction(
not_null<Ui::PopupMenu*> menu,
not_null<Window::SessionController*> controller,
HistoryItem *item) {
if (!item || !item->isRegular()) {
return;
}
const auto peer = item->history()->peer;
if (!peer->isChat() && !peer->isMegagroup()) {
return;
}
const auto session = &controller->session();
const auto sender = item->from();
if (sender->id == session->userPeerId()) {
return;
}
const auto senderId = sender->id;
const auto filtered = session->settings().isGroupSenderFiltered(
senderId);
menu->addAction(
(filtered
? tr::lng_context_unfilter_sender(tr::now)
: tr::lng_context_filter_sender(tr::now)),
crl::guard(controller, [=] {
session->settings().setGroupSenderFiltered(senderId, !filtered);
session->saveSettingsDelayed();
session->data().requestSenderViewsResize(
session->data().peer(senderId));
}),
(filtered ? &st::menuIconUserShow : &st::menuIconUserHide));
}

void AddWhoReactedAction(
not_null<Ui::PopupMenu*> menu,
not_null<QWidget*> context,
Expand Down
4 changes: 4 additions & 0 deletions Telegram/SourceFiles/history/view/history_view_context_menu.h
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,10 @@ void AddSaveSoundForNotifications(
not_null<HistoryItem*> item,
not_null<DocumentData*> document,
not_null<Window::SessionController*> controller);
void AddFilterSenderAction(
not_null<Ui::PopupMenu*> menu,
not_null<Window::SessionController*> controller,
HistoryItem *item);
void AddWhoReactedAction(
not_null<Ui::PopupMenu*> menu,
not_null<QWidget*> context,
Expand Down
14 changes: 13 additions & 1 deletion Telegram/SourceFiles/history/view/history_view_element.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ For license and copyright information please follow this link:
#include "core/ui_integration.h"
#include "main/main_app_config.h"
#include "main/main_session.h"
#include "main/main_session_settings.h"
#include "spellcheck/spellcheck_highlight_syntax.h"
#include "chat_helpers/stickers_emoji_pack.h"
#include "payments/payments_reaction_process.h" // TryAddingPaidReaction.
Expand Down Expand Up @@ -1461,7 +1462,18 @@ bool Element::isHiddenByGroup() const {
}

bool Element::isHidden() const {
return isHiddenByGroup();
if (isHiddenByGroup()) {
return true;
}
const auto item = data();
const auto peer = item->history()->peer;
if (peer->isChat() || peer->isMegagroup()) {
const auto &settings = item->history()->session().settings();
if (settings.isGroupSenderFiltered(item->from()->id)) {
return true;
}
}
return false;
}

void Element::overrideMedia(std::unique_ptr<Media> media) {
Expand Down
25 changes: 25 additions & 0 deletions Telegram/SourceFiles/main/main_session_settings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,8 @@ QByteArray SessionSettings::serialize() const {
size += sizeof(qint32)
+ _subsectionTabsModes.size() * (sizeof(quint64) + sizeof(qint32));
size += sizeof(qint32); // _phoneNumberHidden
size += sizeof(qint32) // _groupFilteredSenders size
+ (_groupFilteredSenders.size() * sizeof(quint64));

auto result = QByteArray();
result.reserve(size);
Expand Down Expand Up @@ -159,6 +161,10 @@ QByteArray SessionSettings::serialize() const {
stream << SerializePeerId(peerId) << qint32(mode);
}
stream << qint32(_phoneNumberHidden.current() ? 1 : 0);
stream << qint32(_groupFilteredSenders.size());
for (const auto &peerId : _groupFilteredSenders) {
stream << SerializePeerId(peerId);
}
}

Ensures(result.size() == size);
Expand Down Expand Up @@ -234,6 +240,7 @@ void SessionSettings::addFromSerialized(const QByteArray &serialized) {
std::vector<int32> moderateCommonGroups;
qint32 disableSharingBoxShowsCount = 0;
qint32 phoneNumberHidden = 0;
base::flat_set<PeerId> groupFilteredSenders;

stream >> versionTag;
if (versionTag == kVersionTag) {
Expand Down Expand Up @@ -692,6 +699,23 @@ void SessionSettings::addFromSerialized(const QByteArray &serialized) {
if (!stream.atEnd()) {
stream >> phoneNumberHidden;
}
if (!stream.atEnd()) {
auto count = qint32(0);
stream >> count;
if (stream.status() == QDataStream::Ok) {
for (auto i = 0; i != count; ++i) {
quint64 peerId;
stream >> peerId;
if (stream.status() != QDataStream::Ok) {
LOG(("App Error: "
"Bad data for SessionSettings::addFromSerialized()"
"with groupFilteredSenders"));
return;
}
groupFilteredSenders.emplace(DeserializePeerId(peerId));
}
}
}
if (stream.status() != QDataStream::Ok) {
LOG(("App Error: "
"Bad data for SessionSettings::addFromSerialized()"));
Expand Down Expand Up @@ -758,6 +782,7 @@ void SessionSettings::addFromSerialized(const QByteArray &serialized) {
_moderateCommonGroups = std::move(moderateCommonGroups);
_disableSharingBoxShowsCount = disableSharingBoxShowsCount;
_phoneNumberHidden = (phoneNumberHidden == 1);
_groupFilteredSenders = std::move(groupFilteredSenders);

if (version < 2) {
app.setLastSeenWarningSeen(appLastSeenWarningSeen == 1);
Expand Down
16 changes: 16 additions & 0 deletions Telegram/SourceFiles/main/main_session_settings.h
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,20 @@ class SessionSettings final {
return _moderateCommonGroups;
}

[[nodiscard]] bool isGroupSenderFiltered(PeerId peerId) const {
return _groupFilteredSenders.contains(peerId);
}
void setGroupSenderFiltered(PeerId peerId, bool filtered) {
if (filtered) {
_groupFilteredSenders.insert(peerId);
} else {
_groupFilteredSenders.remove(peerId);
}
}
[[nodiscard]] const base::flat_set<PeerId> &groupFilteredSenders() const {
return _groupFilteredSenders;
}

void setPhoneNumberHidden(bool hidden) {
_phoneNumberHidden = hidden;
}
Expand Down Expand Up @@ -249,6 +263,8 @@ class SessionSettings final {

rpl::variable<bool> _phoneNumberHidden = false;

base::flat_set<PeerId> _groupFilteredSenders;

};

} // namespace Main
58 changes: 58 additions & 0 deletions Telegram/SourceFiles/window/window_peer_menu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -320,6 +320,7 @@ class Filler {
void addDirectMessages();
void addToggleTopicClosed();
void addExportChat();
void addFilteredSenders();
void addTranslate();
void addReport();
void addNewContact();
Expand Down Expand Up @@ -959,6 +960,62 @@ void Filler::addExportChat() {
&st::menuIconExport);
}

class FilteredSendersBoxController final : public PeerListController {
public:
explicit FilteredSendersBoxController(not_null<Main::Session*> session)
: _session(session) {
}

Main::Session &session() const override {
return *_session;
}

void prepare() override {
delegate()->peerListSetTitle(tr::lng_filtered_senders_title());
for (const auto &peerId : _session->settings().groupFilteredSenders()) {
if (const auto peer = _session->data().peerLoaded(peerId)) {
delegate()->peerListAppendRow(
std::make_unique<PeerListRow>(peer));
}
}
delegate()->peerListRefreshRows();
}

void rowClicked(not_null<PeerListRow*> row) override {
const auto peer = row->peer();
_session->settings().setGroupSenderFiltered(peer->id, false);
_session->saveSettingsDelayed();
_session->data().requestSenderViewsResize(peer);
delegate()->peerListRemoveRow(row);
delegate()->peerListRefreshRows();
}

private:
const not_null<Main::Session*> _session;

};

void Filler::addFilteredSenders() {
const auto peer = _peer;
if (_topic
|| !peer
|| (!peer->isChat() && !peer->isMegagroup())
|| peer->session().settings().groupFilteredSenders().empty()) {
return;
}
const auto controller = _controller;
const auto session = &peer->session();
_addAction(tr::lng_filtered_senders_menu(tr::now), [=] {
controller->show(Box<PeerListBox>(
std::make_unique<FilteredSendersBoxController>(session),
[=](not_null<PeerListBox*> box) {
box->addButton(tr::lng_close(), [=] {
box->closeBox();
});
}));
}, &st::menuIconUserHide);
}

void Filler::addTranslate() {
if (_peer->translationFlag() != PeerData::TranslationFlag::Disabled
|| !_peer->session().premium()
Expand Down Expand Up @@ -1790,6 +1847,7 @@ void Filler::fillHistoryActions() {
addViewDiscussion();
addDirectMessages();
addExportChat();
addFilteredSenders();
addTranslate();
addReport();
addClearHistory();
Expand Down