Pull to refresh

Comments 39

А есть какой ни будь клиент где можно скрыть все сообщение со ссылкам на другие сообщества?
Краткая инструкция по добавлению игнора — берём клиент, который готов добавить функцию игнора «но нет времени», пишем этот код, делаем пулл реквест. Используем. (примерно это тут и есть, видимо)
Но я как-то пытался вносить правки в софт с TDLib, и это был худший код что я видел, с++ в самом кошмарном виде, неймспейсы классов неймспейсов с постоянными непонятными переопределениями и совершенно невнятной работой с кодом. Оно будто специально огорожено неадекватной сложностью.
Оно будто специально огорожено неадекватной сложностью.

Мне тоже так кажется, потому что все, к кому я обращался, говорят именно это — «адский код, лучше и не лезть»
Как более простой вариант, можете попробовать покопаться в веб-версии. Там наверняка код проще. Потом его можно будет (наверное) собрать с чем-нибудь вроде Electron в исполняемый exe-шник (да простят меня коллеги-программисты, не пытайтест повторить это дома)
Теоретически конечно JS проще, чем c++, но на практике хотелось бы всё-таки использовать десктопное приложение.

Кажется простым вариант взять веб-версию и юзерскриптом или может даже просто хитрым правилом для блокировщика рекламы скрывать все такие сообщения (если вдруг у тегов сообщений в каких-нибудь атрибутах написан 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: я так понимаю, что это отработал код второго комментатора, где просто скрывается значение безо всяких замен. Добавил в комментарий к его варианту.
То есть у вас имеется версия десктоп клиента с игнорированием пользователя и в общем чате? Можете выложить, пожалуйста, ссылочку на ваш форк.
в конце статьи есть ссылка
Это exe. Или там есть полные исходники форка?
Зачем нужны полные исходники, если там в коде нужно поменять всего десяток строк?

Форкайте оригинальный телеграм и добавляйте строки по инструкции, если вам нужна именно ветка на гитхабе.
правка веб-клиента — это вариант!
я наверно слишком ленивый, я бы их на рисовании выкидывал в 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, можно прямо на следующей строке.

Огромное вам спасибо!
mea culpa!
Но я рад, что совместными усилиями ваш вопрос был решен :)

PS: (мечтательно) Осталось только придумать, кому-бы продать идею — докрутить чекбокс в настройках «скрывать заблоканных полностью», и предложить мерж в основной репозиторий %)
Любой из создателей форков это может сделать, но у всех ЛАПКИ нет времени, поэтому большинство форков, насколько мне известно, в итоге забрасываются (кроме самых крупных, которые по сути ничего и не добавляют, кроме всяких рюшечек в темы).

А оригинальные программисты, как я уже написал в статье, принципиально требуют, чтобы все пользователи кушали кактус.
Так почему же на самом деле эта функция не существует?
Ну, конспирологическая версия гласит, что основная цель Телеграма
после исчерпывающих статей о реальности 2-факторной аутентификации в телеге любые вопросы могли бы пропасть, а любые конспирологии — воспрянуть, имхо ненастоящего сварщика.
UFO just landed and posted this here
сознательный отказ от реализации этой фичи одназначно говорит что братья Дуровы придурки

Мой опыт показывает, что когда люди, особенно богатые или влиятельные, делают какую-то глупость — это обычно не глупость.
Не в том смысле, что она не может нанести никому вреда (часто наносит) или не ухудшит отношение к ним самим (часто ухудшает).
Но обычно это глупость приносит им как минимум краткосрочный доход.
«Дура не дура, а сто рублей в день имею» ©
A114n опубликуете готовое приложение в общий доступ?
Если нужно, я наверное выложу куда-нибудь и дам ссылку в статье.
Если на гитхабе, там же есть раздел releases, туда как раз zip архив можно загрузить, бинарные .exe файлы тоже. Так что подходящее место кроме Dropbox есть.
Ну мне показалось неправильным создавать ветку на гитхабе не для кода, а просто для готового файла >_> Но я буду иметь ввиду, да.
Отличная статья, надо попробовать!
Друзья, а вопрос не совсем по теме: на сегодняшний день имеются ли какие-либо примочки для того, чтобы узнать номер телефона человека только по одному нику в телеграм?
Почему не рассматривается вариант «выйти из группового чата»?
Ооо! Почти офтопик: может быть хоть вы мне расскажете, зачем писать == true в условиях?
для очевидного единообразия и простоты понимания человеком читающим код:
икс == 10
игрек == 8
имя == «Маша» (что отлично валидно во многих языках, хотя в С\С++ все зависит от того — какое значение в имя, а в С++ — еще и какой у него тип + какие есть перегрузки ==)
а
булевое_условие == true
А, вы из тех людей, которые существование и сущность считают тождественными?
Тоже уважаю докантовскую философию, но не могу согласиться ней.

Астрологи провозгласили неделю ковидоскептиков - количество статей с теориями заговора увеличилось вдвое!

а как сохранить это изменение при обновлениях ?

Only those users with full accounts are able to leave comments. Log in, please.

Articles