- 即时通讯
- 桌面应用
- 前端
- 插件系统
【免费下载链接】Vencord
The cutest Discord modification
NotificationVolume 是 Vencord 内置的一款音频体验优化插件,核心能力是让用户为「通知提示音」和「应用内音效」(如消息提示、通话响铃、静音/取消静音提示)分别设置独立的音量,避免通知声音过大伤耳。本文将结合插件源码与 Vencord 的插件设置体系,从功能定位、底层实现原理、配置参数到源码结构,完整讲解这一插件的工作方式,读完即可理解它是如何在不修改 Discord 本体逻辑的前提下实现「独立音量」的。
插件定位:一套音量,两套用途
根据插件的官方 README(见 src/plugins/notificationVolume/README.md),该插件的用途一句话即可概括:
Set a separate volume for notifications and in-app sounds (e.g. messages, call sound, mute/unmute) helping your ears stay healthy for many years to come.
即:为通知音与应用内音效(消息、通话铃声、静音/取消静音等)设置一个独立的音量档位,与 Discord 的主音量解耦,从而保护听力。插件在插件列表中的描述为 "Save your ears and set a separate volume for notifications and in-app sounds",并带有Notifications与Voice两个标签,说明它归属于「通知」与「语音」两个功能域,作者为 Vencord 贡献者 philipbry(见 src/utils/constants.ts 中Devs.philipbry条目)。
核心实现:一行补丁改写音量计算公式
插件本体非常精简,全部逻辑集中在 src/plugins/notificationVolume/index.ts,核心是一个 Vencord 标准的 Patch(补丁)机制:
patches: [ { find: "ensureAudio(){", replacement: { match: /(?=Math\.min\(\i\.\i\.getOutputVolume\(\)\/100)/g, replace: "$self.settings.store.notificationVolume/100*" }, }, ],其原理拆解如下:
- 定位(find):在 Discord 的 Webpack 模块中搜索包含字符串
ensureAudio(){的模块。ensureAudio是 Discord 音频模块中负责「确保音频上下文可用」并计算实际输出音量的函数,插件用它作为锚点定位到目标模块。 - 匹配(match):正则
(?=Math\.min\(\i\.\i\.getOutputVolume\(\)\/100)使用了零宽正向断言(lookahead),只匹配但不消耗字符。其中\i是 Vencord 补丁语法中的「任意合法标识符」占位符,会在编译期被规范化为(?:[A-Za-z_$][\w$]*)(见 src/utils/patches.ts 的canonicalizeMatch),因此能容忍 Discord 内部变量名的混淆变化。该断言匹配的位置是 Discord 计算最终音量的表达式Math.min(... .getOutputVolume()/100)之前。 - 替换(replace):在被断言命中的位置前插入
$self.settings.store.notificationVolume/100*,使原始表达式变成:
Math.min(notificationVolume/100 * <某Store>.getOutputVolume()/100, ...)其中$self是 Vencord 补丁系统的占位符,会被替换为该插件模块的实际导入路径(见 src/utils/patches.ts 中canonicalizeReplace:replace.replaceAll("$self", pluginPath))。这样,最终播放的音量就等于「用户设置的独立通知音量(0~1)」乘以「Discord 原有的输出音量系数」,实现音量缩放而不改动 Discord 原有计算逻辑。
从实现方式看,可以推断该插件依赖一个关键前提:Discord 通知音与部分应用内音效在播放时会经过getOutputVolume()这一统一的音量换算出口,插件正是抓住了这个出口做了一次乘法缩放,因而无需逐一拦截每个音效的播放调用。
配置参数详解:Slider 音量滑杆
插件通过 Vencord 的definePluginSettingsAPI 声明了一个名为notificationVolume的设置项:
const settings = definePluginSettings({ notificationVolume: { type: OptionType.SLIDER, description: "Notification volume", markers: [0, 25, 50, 75, 100], default: 100, stickToMarkers: false } });对照 Vencord 设置类型定义(src/utils/types.ts 中OptionType.SLIDER与PluginSettingSliderDef接口),各字段含义与取值范围如下:
| 字段 | 值 | 含义 |
|---|---|---|
type | OptionType.SLIDER | 声明该设置以滑杆(Slider)形式渲染在设置面板中 |
description | "Notification volume" | 设置项在 UI 上的说明文案 |
markers | [0, 25, 50, 75, 100] | 滑杆上显示的刻度点(0%~100%,步进 25%),按类型定义要求至少两个值,这里提供了 5 个 |
default | 100 | 默认音量 100%,即默认不改变 Discord 原有音量 |
stickToMarkers | false | 是否「吸附刻度」。类型定义注释明确:为false时允许用户选中刻度之间的任意值,为true时只能停在刻度点上 |
需要特别说明的是,这里的音量值是百分比形式(0~100),而补丁公式中除以 100 后才参与乘法,因此设置 50 即表示以原音量的 50% 播放,设置 0 即完全静音。默认值 100 意味着插件启用后不做任何音量改动,必须由用户主动调低音量才生效,这保证了启用插件零副作用。
definePluginSettings返回的对象带有store访问器(见 src/api/Settings.ts 的definePluginSettings实现),补丁中使用的$self.settings.store.notificationVolume正是通过该store读取用户当前保存的实时值,因此无需重启客户端,拖动滑杆即可即时生效(该设置项未标记restartNeeded)。
使用方式
- 打开 Vencord 设置 → 插件(Plugins)页面,搜索并启用NotificationVolume。
- 展开插件的设置区域,找到 "Notification volume" 滑杆。
- 拖动滑杆到期望的音量百分比(0~100,支持 25 的整数倍刻度,也可停在任意中间值)。建议从 50~75 开始,若同时希望保留系统通知的提醒效果又降低刺耳感,可继续下调。
- 播放一条消息提示音或进行一次通话,即可听到独立音量立即生效。
若要恢复 Discord 原生音量行为,将滑杆拖回 100,或直接关闭该插件即可;关闭插件后所有补丁随之移除,行为完全还原。
源码结构小结
该插件属于「单文件补丁型」插件的典型代表,目录结构非常精简:
src/plugins/notificationVolume/ ├── README.md # 功能说明 └── index.ts # 设置定义 + 补丁逻辑(全部核心代码)它没有独立的 CSS、组件或跨文件依赖,一次definePluginSettings声明设置、一次patches补丁即完成全部功能,非常适合作为理解 Vencord 补丁机制(find/match/replace/$self占位符)与滑块设置项(OptionType.SLIDER)的入门范例。如果你想进一步了解补丁替换中$self的规范化过程,可阅读 src/utils/patches.ts;想了解滑块设置项的类型约束(markers至少两个值、stickToMarkers语义),可阅读 src/utils/types.ts 的PluginSettingSliderDef定义。
- 即时通讯
- 桌面应用
- 前端
- 插件系统
【免费下载链接】Vencord
The cutest Discord modification
相关推荐
Seal应用内通知声音:自定义通知提示音的设置
Seal应用内通知声音:自定义通知提示音的设置 你是否厌倦了手机上所有应用都使用相同的通知声音?作为一款功能强大的Android音视频下载工具,Seal不仅能帮
移动开发音视频揭秘Twitch CLI内部工作原理:从代码到实战的深度剖析
揭秘Twitch CLI内部工作原理:从代码到实战的深度剖析 Twitch CLI是官方推出的终极开发工具,能让开发者轻松构建Twitch应用。本文将带你探索其
BlockTheSpot通知设置详解:控制桌面提醒与声音提示
BlockTheSpot通知设置详解:控制桌面提醒与声音提示 1. 引言:通知管理的重要性 在日常使用Spotify(声田)时,频繁的广告通知和声音提示可能会打
桌面应用
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考