Добавить в корзинуПозвонить
Найти в Дзене
AndranikFutureLabs_Channel

Telegram Desktop Mod: @AndranikFutureLabs (V2)

Данная модификация Telegram Desktop (@AndranikFutureLabs) направлена на снятие ограничений, накладываемых владельцами каналов и групп на контент. Основная цель — обеспечить пользователю полный контроль над данными, включая возможность сохранения медиафайлов и пересылки сообщений из защищенных чатов. Файл: Telegram/SourceFiles/history/view/history_view_context_menu.cpp В этом файле была изменена логика проверки разрешений на пересылку сообщений. Фрагмент 1 (Пересылка одного сообщения): Было (строки ~409-411): } else if (!item || !item->allowsForward()) { return false; } Стало: } else if (!item) { return false; } Фрагмент 2 (Пересылка группы сообщений): Было (строки ~415-417): if (const auto group = owner->groups().find(item)) { if (!ranges::all_of(group->items, &HistoryItem::allowsForward)) { return false; } } Стало: if (const auto group = owner->groups().find(item)) { } Фрагмент 3 (Пересылка выделенных сообщений): Было (строки ~383-385): if (!ranges::all_of(request.selectedItems, &Se
Оглавление

Описание проекта

Данная модификация Telegram Desktop (@AndranikFutureLabs) направлена на снятие ограничений, накладываемых владельцами каналов и групп на контент. Основная цель — обеспечить пользователю полный контроль над данными, включая возможность сохранения медиафайлов и пересылки сообщений из защищенных чатов.

GitHub - AndranikFutureLabs/tdesktop-mod: tdesktop-mod.git

Изменения в исходном коде

1. Обход ограничений контекстного меню

Файл: Telegram/SourceFiles/history/view/history_view_context_menu.cpp

В этом файле была изменена логика проверки разрешений на пересылку сообщений.

Фрагмент 1 (Пересылка одного сообщения): Было (строки ~409-411):

} else if (!item || !item->allowsForward()) { return false; }

Стало:

} else if (!item) {

return false;

}

Фрагмент 2 (Пересылка группы сообщений): Было (строки ~415-417):

if (const auto group = owner->groups().find(item)) {

if (!ranges::all_of(group->items, &HistoryItem::allowsForward)) { return false;

}

}

Стало:

if (const auto group = owner->groups().find(item)) {

}

Фрагмент 3 (Пересылка выделенных сообщений): Было (строки ~383-385):

if (!ranges::all_of(request.selectedItems, &SelectedItem::canForward)) { return false; }

Стало:

if (false) {

return false;

}

2. Снятие ограничений на копирование и выделение в интерфейсе

Файл: Telegram/SourceFiles/history/history_inner_widget.cpp

Здесь была отключена проверка hasSelectRestriction, которая блокирует выделение текста и вызов контекстного меню в защищенных чатах.

Фрагмент 1 (Метод hasSelectRestriction): Было (строки ~737-748):

bool HistoryInner::hasSelectRestriction() const {

if (session().frozen()) { return true;

} else if (!_sharingDisallowed.current()) { return false;

} else if (const auto chat = _peer->asChat()) { return !chat->canDeleteMessages();

} else if (const auto channel = _peer->asChannel()) { return !channel->canDeleteMessages();

}

return true; }

Стало:

bool HistoryInner::hasSelectRestriction() const { return false;

}

3. Принудительное включение кнопки "Сохранить как" для документов

Файл: Telegram/SourceFiles/history/view/media/history_view_save_document_action.cpp

Удалена проверка ItemHasTtl(item), которая скрывает опцию сохранения для исчезающих сообщений или сообщений с ограничениями.

Фрагмент 1 (Метод AddSaveDocumentAction): Было (строки ~116-118):

if (!item || ItemHasTtl(item)) {

return; }

Стало:

if (!item) { return; }

CI/CD Процессы

Исправление депрекации Node.js 20 в GitHub Actions

В рабочем процессе GitHub Actions возникло предупреждение о депрекации Node.js 20. Для решения этой проблемы было настроено принудительное использование Node.js 24.

Файл: .github/workflows/waiting-for-answer.yml

В конфигурацию workflow добавлена переменная окружения:

env:

FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: 'true'

Логика обхода ограничений

allowsForwarding

В Telegram API и внутреннем коде allowsForward проверяет флаг noforwards у чата. Модификация игнорирует этот флаг в функциях построения контекстного меню, позволяя вызывать диалог пересылки (Window::ShowForwardMessagesBox) для любого сообщения.

hasCopyMediaRestriction

Ограничение на копирование медиа и текста (hasCopyRestriction) завязано на метод hasSelectRestriction. Возвращая всегда false в этом методе, мы обманываем UI-логику, заставляя её считать, что текущий чат не имеет ограничений на взаимодействие с контентом. Это автоматически включает возможность выделения текста, копирования ссылок и вызова стандартных действий сохранения.

Документация подготовлена @AndranikFutureLabs. Версия V2.

Telegram Desktop: Проблемы сборки и решения (V2)

Проект: @AndranikFutureLabs

В данном документе описаны технические сложности, возникшие при сборке Telegram Desktop в специфическом окружении (Windows Server 2025, Visual Studio 2026 Insiders), и методы их решения.

1. Использованные команды

Подготовка окружения (Native Tools Command Prompt x64):

:: Установка переменных окружения Visual Studio

call "C:\Program Files\Microsoft Visual Studio\18\Insiders\VC\Auxiliary\Build\vcvars64.bat"

:: Клонирование репозитория (если не сделано)

git clone --recursive https://github.com/telegramdesktop/tdesktop.git cd tdesktop

Сборка зависимостей:

:: Запуск скрипта подготовки с указанием версии Qt python Telegram/build/prepare/prepare.py qt6

Генерация проекта и сборка:

:: Генерация файлов проекта через CMake

cmake -B out -G "Visual Studio 18 2026" -A x64 -DCMAKE_BUILD_TYPE=Debug

:: Сборка цели Telegram

cmake --build out --config Debug --target Telegram

2. Модификация модуля prepare.py

Для успешной сборки на Windows Server 2025 с использованием Visual Studio 2026 (v18) были внесены критические правки в скрипт Telegram/build/prepare/prepare.py.

Исправление кодировки (UTF-8)

Для предотвращения ошибок UnicodeDecodeError при чтении вывода системных команд:

# Строка ~1934

currentCodePage = subprocess.run('chcp', capture_output=True, shell=True, text=True, env=modifiedEnv).stdout.strip().split()[-1] subprocess.run('chcp 65001 > nul', shell=True, env=modifiedEnv) runStages() subprocess.run('chcp ' + currentCodePage + ' > nul', shell=True, env=modifiedEnv)

Автозамена Toolset (v143) и версии VS

Скрипт был дополнен логикой автоматической подмены устаревших версий тулсета на актуальный для VS 2026:

# Строка ~433

commands = commands.replace('v140', 'v143').replace('v141', 'v143').replace('v142', 'v143') commands = commands.replace('Visual Studio 17 2022', 'Visual Studio 18 2026')

Патчинг Breakpad

Модуль breakpad требовал особого внимания из-за жестко прописанных путей и версий в .vcxproj файлах:

# Строка ~438 if stage['name'] == 'breakpad':

patch_cmd = 'python -c "import glob; [open(f, \'wb\').write(open(f, \'rb\').read().replace(b\'v140\', b\'v143\').replace(b\'v141\', b\'v143\').replace(b\'v142\ # ... замена команд msbuild с внедрением patch_cmd

3. Решение ошибок MSBuild

Ошибки MSB1011, MSB4025, MSB4102

Эти ошибки возникали из-за неправильного определения путей к таргетам и версии SDK в новой версии Visual Studio.

Решение: В скрипте prepare.py была реализована принудительная передача параметров VCTargetsPath и PlatformToolset во все вызовы MSBuild:

# Строка ~430

msbuild_path = '"C:\\Program Files\\Microsoft Visual Studio\\18\\Insiders\\MSBuild\\Current\\Bin\\amd64\\MSBuild.exe"' vc_targets = "C:\\Program Files\\Microsoft Visual Studio\\18\\Insiders\\MSBuild\\Microsoft\\VC\\v170"

# Строка ~450 commands = commands.replace('msbuild', f'{msbuild_path} /p:PlatformToolset=v143 /p:WindowsTargetPlatformVersion=10.0 /p:VCTargetsPath="{vc_t

Это позволило MSBuild корректно находить файлы Microsoft.Cpp.Default.props и другие компоненты системы сборки, которые в Insiders-версии VS находятся по нестандартным путям.

4. Проблемы CI/CD (GitHub Actions)

Предупреждение о депрекации Node.js 20

В GitHub Actions при выполнении рабочих процессов стало появляться предупреждение о том, что Node.js 20 скоро перестанет поддерживаться.

Решение: Принудительное использование Node.js 24 через переменную окружения в файле конфигурации workflow (.github/workflows/waiting-for-answer.yml):

env:

FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: 'true'

Документация подготовлена @AndranikFutureLabs. Версия V2.