Telegram 一键批量静音教程:手把手教你魔改客户端

作为一个长期混迹电报圈的“潜水员”,我加入的群组和频道多得数不清。虽然我喜欢挂着 TG 收集信息,但那些无处不在的红点提示音实在让人抓狂。要是能把它们全部设为“永久静音”就好了。

如果你也试过一个一个右键选择“Mute Forever”,那你一定懂那种绝望——手都要点断了。官方客户端至今没有提供“批量静音”的功能,但这难不倒咱们爱折腾的精神。今天就来分享一下,我是如何通过修改第三方客户端源码,实现“一键全体静音”的。

Forkgram tdesktop GitHub 仓库

Fork tdesktop 源码作为开发基础

为什么选择修改源码?

市面上有不少现成的 TG 客户端,比如 64Gram、Forkgram 等,它们大多基于官方的 TDesktop 源码魔改而来。虽然功能丰富,但这种细粒度的“批量操作”往往不在官方或开发者的优先列表里。

与其等待,不如自己动手。我们需要做的是:在“对话分组”的右键菜单里,加一个“Mute All”按钮,点击它就遍历该分组下所有对话,统统设为静音。

准备工作:环境与思路

不想从零开始造轮子,所以我选择直接 Fork 代码。这里以 forkgram/tdesktop为例进行二次开发。

Telegram 侧边栏右键菜单

右键菜单中出现 'Mute All' 选项

  1. 建分支:在 GitHub 上基于 dev 分支新建一个分支,命名为 feat-mute-all
  2. 找参照:不想瞎写代码,最好的办法就是“抄作业”。先看看现有的功能是怎么实现的。
    • 分析对象 A:对话分组的右键菜单里,原本有个“Mark as read”(全部标为已读)。我们可以参考它的逻辑,因为它也需要遍历分组内的对话。
    • 分析对象 B:单个对话的右键菜单里,有个“Mute forever”。这是我们想要实现的具体效果。

核心实现:逻辑与代码

Telegram 消息列表静音前后对比

点击 'Mute All' 后,群组红点全部消失

1. 分析工作流程

通过阅读源码,我们发现程序处理右键菜单的逻辑非常清晰。我们需要做两件事:

  • 添加菜单项:在 UI 层面的右键菜单中增加一个 Mute All 选项。
  • 实现处理函数:编写具体的代码逻辑,当点击这个选项时触发。

2. 编写“静音循环”逻辑

思路很简单:获取当前选中的 Folder 对象 -> 遍历其中的所有 Peer(对话) -> 对每一个 Peer 执行“设置静音”的操作。

这里直接复用了单个对话的静音底层逻辑,只不过包装了一层 for 循环。代码的核心伪代码逻辑大致如下:

// 伪代码示例
void MuteAllInFolder(Folder* folder) {
    auto list = folder->getAllChats();
    for (auto &chat : list) {
        chat->setMuteForever();
    }
}

3. 编译与测试

为了编译方便,我新建了一个 yml 文件配置编译环境。一键编译,坐等生成新的二进制文件。

遇到的坑: 第一次编译完启动,兴冲冲地去右键点击侧边栏的 Folder,结果傻眼了——根本没有“Mute All”这个选项!

向 AI 助手反馈后才发现,原来 TG 的 UI 结构里,侧边栏的 Folder 和顶部的 Folder 走的是两套完全不同的代码路径!刚才我只改了顶部的逻辑,侧边栏却没动静。

解决方案: 这就很简单了,把刚才的代码移植一份到侧边栏菜单的处理逻辑里。两个入口,同一个后端处理函数。

效果展示

再次编译运行,世界终于清静了。

右键点击任意分组,菜单中赫然出现了 “Mute All” 选项。

  • 操作前:几百个群组红点闪烁,不胜其烦。
  • 操作后:点击一下,瞬间全部归零。不管是群组还是超级频道,统统闭嘴。

总结

通过这次摸索,不仅解决了消息轰炸的痛点,也顺便复习了一下 C++ 的大型项目代码阅读能力。对于不想折腾代码的朋友,其实也可以期待一下后续是否有修改版的客户端合入这个 Feature。

如果你也想体验这个功能,或者想自己动手试试,可以去翻翻对应的源码分支。虽然修改客户端略显极客,但在官方不给力的时候,这就是最高效的“羊毛”获取方式——毕竟,节省下的注意力才是最宝贵的资源。

注:修改客户端源码需要一定的 C++ 和编译环境基础,新手小白建议先在虚拟机中尝试。

标签: none

AI Skills Smart Station on Nick Launches

评论已关闭