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