作为重度 Telegram 用户,大家肯定都有过这样的崩溃时刻:手机或桌面端突然疯狂震动,打开一看,全是各种羊毛群、技术交流群甚至是新闻频道的消息。虽然官方客户端支持单独对某个会话进行“静音”或“仅通知”,但当群组数量多达几十上百个时,一个个去点简直是折磨。

手机震动提示收到大量消息

消息过载时的手机震动通知

虽然市面上有不少第三方的 Telegram 客户端(如 Plus Messenger、Graph Messenger 等)早就支持了“全局静音”或“批量操作”,但如果你是桌面端用户,或者出于安全隐私考虑更信任官方开源代码(如 TDesktop 或其上游的 Forkgram),那么这个需求似乎就成了一个痛点。

今天,我就来带大家深入了解一下,如何通过“魔改”源码,在桌面版客户端中把缺失的“全体静音”功能给焊上去。

为什么官方不直接加这个功能?

从软件设计的角度来看,Telegram 作为一个强调即时通讯的工具,其默认逻辑是鼓励互动。如果允许一键全局静音,可能会导致用户错过真正重要的通知,这对于普通用户来说是体验问题。但对于我们这种信息流过载的重度用户,这就是刚需。

官方 TDesktop(以及 Forkgram)是基于 Qt 和 C++ 开发的,这意味着它具有极高的可定制性。既然官方不给,我们就自己动手丰衣足食。

准备工作:你需要什么?

在开始敲代码之前,请确保你已经准备好以下环境,否则编译过程会让你非常头秃:

  1. 基础环境:Linux(推荐 Ubuntu/Debian)或 Windows/macOS(Linux 下编译环境最容易配置)。
  2. 编译工具链:CMake、GCC/Clang、Python、Perl、Git 等。
  3. Qt 库:TDesktop 依赖特定的 Qt 版本,通常需要 Qt 5.15 或 Qt 6.x 具体取决于你下载的分支。
  4. 源码获取:这里我们推荐使用 Forkgram 的源码,因为它本身就集成了许多官方没有的 Tweaks,结构相对活跃。

核心修改思路与实战

显示 Telegram 源码修改逻辑的代码编辑器界面

在 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 客户端的底层架构。如果你不想自己动手折腾编译,也可以关注一些社区发布的改版客户端,但自己编译出来的版本用着才最放心,不是吗?

快去试试吧,把手机和电脑从消息轰炸中解救出来!

标签: none

AI Skills Smart Station on Nick Launches

评论已关闭