Комментарии 39
Но я как-то пытался вносить правки в софт с TDLib, и это был худший код что я видел, с++ в самом кошмарном виде, неймспейсы классов неймспейсов с постоянными непонятными переопределениями и совершенно невнятной работой с кодом. Оно будто специально огорожено неадекватной сложностью.
Кажется простым вариант взять веб-версию и юзерскриптом или может даже просто хитрым правилом для блокировщика рекламы скрывать все такие сообщения (если вдруг у тегов сообщений в каких-нибудь атрибутах написан id пользователя). Вероятно, уведомления от этого не отключатся. Возможно, вам не подходит этот вариант, потому что десктопная версия нравится больше (или, например, веб-версия не открывается у вашего провайдера).
Касательно вопроса: на строке 445 setText(... data.vmessage() ...)
— похоже на то, что вы ищете. Вокруг напишите свой if (видимо, используя data.vfrom_id().value_or_empty()
) и поменяйте текст. Опять же, наверняка не спасет от уведомлений, придется покопаться еще, чтобы и их отключить. Хотя, наверное, у вас эти групповые чаты и так на мьюте.
Однако, там несколько конструкторов, так что написать подобный if нужно будет в каждом. Еще стоит обратить внимание, что на 443 строке вызывается setMedia()
— скорее всего, так добавляются для отображения прикрепления. Так что чтобы забанить мемы, нужно будет этот кусочек тоже под if загнать.
Я думаю, у вас есть примерно три варианта, как модифицировать код:
- добавить прямо в код список id, которые вы хотите блокировать, и проверять, что UserId (который является просто int32, его можно получить через
data.vfrom_id().value_or_empty()
) входит в этот список. Естественно, придется каждый раз пересобирать клиент, когда захотелось изменить список; - сохранить этот список в файлик. Тогда нужно будет лишь перезапускать клиент (или написать код так, чтобы файлик периодически перечитывался);
- сделать все по красоте, чтобы можно было пользователей блокировать прямо из интерфейса, и все такое.
Первые два варианта несложные, но нужно будет узнать UserId. Наверное, можно его приделать к config.author на строке 438, и тогда он будет показываться прямо в клиенте.
В третьем варианте придется поразбираться с кодом. Однако, как я понял, вы хотите использовать ЧС — в таком случае нужно просто выяснить, что пользователь в нем находится.
HistoryItem
, от которого унаследован HistoryMessage
, из History*
достает PeerData*
, соответствующий юзеру. У этого PeerData есть метод asUser(), а у UserData — isBlocked().
Так что, вероятно, должно сработать что-то такое (после строки 440):
UserId from = data.vfrom_id().value_or_empty();
PeerData* pd = from ? history->owner().user(from) : history->peer;
if (pd->isUser() && pd->asUser()->isBlocked()) {
setText({
TextUtilities::Clean(qs("<blocked>")),
Api::EntitiesFromMTP(data.ventities().value_or_empty())
});
} else {
// оригинальные строки 442-448:
if (const auto media = data.vmedia()) {
setMedia(*media);
}
setText({
TextUtilities::Clean(qs(data.vmessage())),
Api::EntitiesFromMTP(data.ventities().value_or_empty())
});
}
Странно, конечно. Можно предположить, что изменения коснутся только новых сообщений, потому что старые каким-то образом "кэшируются" (хотя вроде бы и не должны). Вы можете создать с товарищем чат для экспериментов и посмотреть, что будет, если вы его занесете в ЧС. Будут ли новые сообщения заменяться на <blocked>
, что будет происходить со старыми сообщениями при перезапуске, и все такое.
Собственно, вы в ЧС-то кого-то из чата отправили?
UPD: я так понимаю, что это отработал код второго комментатора, где просто скрывается значение безо всяких замен. Добавил в комментарий к его варианту.
я наверно слишком ленивый, я бы их на рисовании выкидывал в dialogs_layout.cpp ф-ция void paintRow, тем более что там уже есть PeerData *from.
Вставить в самом начале
if (from->isUser() && from->asUser()->isBlocked())return;и все.
Действительно, так может быть попроще. Кода там много, так что я не стал особо вчитываться. Непонятно, как себя начнет вести клиент — может появятся дырки вместо заблокированных сообщений, если их высота рассчитывается где-то еще.
Стоит отметить, что предложенный мной код не удаляет сообщения, а только заменяет их на текст <blocked>
. Если хочется их выкинуть из истории сообщений, нужно будет поискать, где они в нее добавляются, и дописать подобную проверку.

Но в чате его отлично видно :(
Ага, потому что dialogs у них называется список диалогов сбоку, а сам лог сообщений — history. В директории history есть поддиректория view, где, по-видимому, собрались как раз файлы, заведующие отрисовкой этих сообщений. Можно попробовать в файле history_view_message.cpp добавить подобную проверку:
PeerData* pd = item->from();
if (pd->isUser() && pd->asUser()->isBlocked()) return;
Правда, скорее всего, такие сообщения тоже просто будут странно отрисовываться, а не совсем пропадут.
Выше в этом файле есть функция, которая вычисляет габариты сообщения на экране. Возможно, придется добавить почти тот же самый код и туда, только надо будет написать return QSize(0,0);
— тогда, скорее всего, оно даже не попытается отрисоваться. Код, естественно, надо вставлять после объявления переменной item, можно прямо на следующей строке.
Но я рад, что совместными усилиями ваш вопрос был решен :)
PS: (мечтательно) Осталось только придумать, кому-бы продать идею — докрутить чекбокс в настройках «скрывать заблоканных полностью», и предложить мерж в основной репозиторий %)
А оригинальные программисты, как я уже написал в статье, принципиально требуют, чтобы все пользователи кушали кактус.
Так почему же на самом деле эта функция не существует?после исчерпывающих статей о реальности 2-факторной аутентификации в телеге любые вопросы могли бы пропасть, а любые конспирологии — воспрянуть, имхо ненастоящего сварщика.
Ну, конспирологическая версия гласит, что основная цель Телеграма
сознательный отказ от реализации этой фичи одназначно говорит что братья Дуровы придурки
Мой опыт показывает, что когда люди, особенно богатые или влиятельные, делают какую-то глупость — это обычно не глупость.
Не в том смысле, что она не может нанести никому вреда (часто наносит) или не ухудшит отношение к ним самим (часто ухудшает).
Но обычно это глупость приносит им как минимум краткосрочный доход.
«Дура не дура, а сто рублей в день имею» ©
Друзья, а вопрос не совсем по теме: на сегодняшний день имеются ли какие-либо примочки для того, чтобы узнать номер телефона человека только по одному нику в телеграм?
== true
в условиях?икс == 10
игрек == 8
имя == «Маша» (что отлично валидно во многих языках, хотя в С\С++ все зависит от того — какое значение в имя, а в С++ — еще и какой у него тип + какие есть перегрузки ==)
а
булевое_условие == true
Тоже уважаю докантовскую философию, но не могу согласиться ней.
Астрологи провозгласили неделю ковидоскептиков - количество статей с теориями заговора увеличилось вдвое!
а как сохранить это изменение при обновлениях ?
Как реализовать игнор заблокированных пользователей в группах Telegram?