Telegram 拯救计划:手把手教你修改源码实现一键全体静音
作为重度 Telegram 用户,大家肯定都有过这样的崩溃时刻:手机或桌面端突然疯狂震动,打开一看,全是各种羊毛群、技术交流群甚至是新闻频道的消息。虽然官方客户端支持单独对某个会话进行“静音”或“仅通知”,但当群组数量多达几十上百个时,一个个去点简直是折磨。
消息过载时的手机震动通知
虽然市面上有不少第三方的 Telegram 客户端(如 Plus Messenger、Graph Messenger 等)早就支持了“全局静音”或“批量操作”,但如果你是桌面端用户,或者出于安全隐私考虑更信任官方开源代码(如 TDesktop 或其上游的 Forkgram),那么这个需求似乎就成了一个痛点。
今天,我就来带大家深入了解一下,如何通过“魔改”源码,在桌面版客户端中把缺失的“全体静音”功能给焊上去。
为什么官方不直接加这个功能?
从软件设计的角度来看,Telegram 作为一个强调即时通讯的工具,其默认逻辑是鼓励互动。如果允许一键全局静音,可能会导致用户错过真正重要的通知,这对于普通用户来说是体验问题。但对于我们这种信息流过载的重度用户,这就是刚需。
官方 TDesktop(以及 Forkgram)是基于 Qt 和 C++ 开发的,这意味着它具有极高的可定制性。既然官方不给,我们就自己动手丰衣足食。
准备工作:你需要什么?
在开始敲代码之前,请确保你已经准备好以下环境,否则编译过程会让你非常头秃:
- 基础环境:Linux(推荐 Ubuntu/Debian)或 Windows/macOS(Linux 下编译环境最容易配置)。
- 编译工具链:CMake、GCC/Clang、Python、Perl、Git 等。
- Qt 库:TDesktop 依赖特定的 Qt 版本,通常需要 Qt 5.15 或 Qt 6.x 具体取决于你下载的分支。
- 源码获取:这里我们推荐使用 Forkgram 的源码,因为它本身就集成了许多官方没有的 Tweaks,结构相对活跃。
核心修改思路与实战
在 C++ 代码编辑器中编写全局静音逻辑
修改的核心逻辑并不复杂,我们需要做的就是找到处理“会话设置”的数据结构,然后写一个循环,遍历当前所有的对话框,将它们的通知状态统一设置为“Mute”。
1. 找到入口文件
首先,在源码中定位菜单相关的代码。通常在 Telegram/SourceFiles/mainwindow.cpp 或者相关的设置菜单文件中。我们需要在菜单栏(比如 Settings 或者 File 菜单下)添加一个新的 Action 按钮,命名为「Mute All」或「全局静音」。
2. 构造遍历逻辑
这是最关键的一步。Telegram 内部维护了一个会话列表。我们需要通过 AuthSession 或者 Session 对象获取到当前账号下的所有对���。
逻辑大致如下:
// 伪代码示例,仅供逻辑参考
void MainWindow::onMuteAllClicked() {
// 获取当前会话控制器
auto session = controller()->session();
auto &data = session->data();
// 遍历所有会话
for (const auto &history : data->histories()) {
// 排除“收藏夹”或特定的用户对话框(可选),只操作群组和频道
if (history->isChat() || history->isChannel()) {
// 设置为永久静音
history->updateMuteForever();
}
}
// 给用户一个友好的提示
Ui::show(Box<InformBox>("所有群组和频道已静音"));
}
在实际的代码中,你需要调用类似 history->owner().history(...) 或者利用 Dialogs 的迭代器。需要注意的是,Telegram 的数据模型采用了大量的弱指针和引用,直接遍历时要小心指针的有效性。
3. 编译与部署
修改完代码保存后,就是激动人心的编译环节了。对于 Forkgram,通常执行以下命令即可:
cd Telegram cd ../out/Debug # 或者Release cmake ../.. cmake --build .
如果你在 Windows 下开发,可能需要用到 Visual Studio 的工程文件生成;macOS 则需要 Xcode。编译完成后,你会得到一个可执行文件(如 Telegram),直接替换掉原客户端即可运行。
进阶思考:更人性化的方案
虽然直接“一键静音”很爽,但有时候我们只想静音“所有群组”而保留“私聊”,或者只想静音“所有频道”。这就需要在遍历时加上更细致的判断条件:
history->peer()->isChat():用于识别普通群组。history->peer()->isMegagroup():超大型群组。history->peer()->isChannel():频道。
你可以根据自己的需求,把代码写成多个函数,如 MuteAllChats() 和 MuteAllChannels(),并在界面上创建两个按钮。
结语
开源软件最大的魅力就在于“折腾”。通过这几行代码的修改,我们不仅解决了一个实际的使用痛点,也顺便窥探了一下 Telegram 客户端的底层架构。如果你不想自己动手折腾编译,也可以关注一些社区发布的改版客户端,但自己编译出来的版本用着才最放心,不是吗?
快去试试吧,把手机和电脑从消息轰炸中解救出来!

评论已关闭