终极修复指南:Return-ShowHiddenChannels服务器黑名单功能深度解析与实战
引言:你还在为黑名单功能失效而烦恼吗?
作为Discord平台上最受欢迎的插件之一,Return-ShowHiddenChannels (以下简称SHC) 为用户提供了查看隐藏频道的强大功能。然而,许多用户在使用服务器黑名单功能时遇到了各种问题,导致插件无法正常工作或功能受限。本指南将深入剖析SHC的黑名单功能原理,详细讲解常见问题的诊断方法,并提供完整的修复方案,帮助你彻底解决黑名单功能失效的困扰。
读完本文后,你将能够:
- 深入理解SHC黑名单功能的工作原理
- 准确诊断黑名单功能失效的根本原因
- 熟练应用多种修复方法解决不同场景下的问题
- 掌握高级配置技巧,优化黑名单功能的使用体验
- 了解未来版本的发展方向,提前做好适配准备
一、SHC黑名单功能核心原理
1.1 功能概述
SHC的服务器黑名单功能允许用户指定某些服务器,在这些服务器中插件将不会显示隐藏频道。这一功能对于那些既需要在某些服务器使用插件,又希望在其他服务器保持默认行为的用户来说非常实用。
1.2 技术架构
SHC的黑名单功能主要通过以下几个关键组件实现:
核心数据结构定义如下:
const defaultSettings = {
// 其他设置...
blacklistedGuilds: {}, // 黑名单设置存储对象
};
1.3 工作流程
SHC黑名单功能的工作流程可以分为以下几个关键步骤:
具体实现上,插件通过修改ChannelPermissionStore的can方法来控制隐藏频道的可见性:
Patcher.after(
ChannelPermissionStore,
"can",
(_, [permission, channel], res) => {
if (!channel?.isHidden?.()) return res;
if (permission === DiscordConstants.Permissions.VIEW_CHANNEL) {
return (
!this.settings.blacklistedGuilds[channel.guild_id] &&
this.settings.channels[
DiscordConstants.ChannelTypes[channel.type]
]
);
}
// 其他权限检查...
return res;
}
);
二、黑名单功能常见问题诊断
2.1 问题分类与特征
SHC黑名单功能的问题主要可以分为以下几类,每类问题都有其独特的特征:
| 问题类型 | 典型特征 | 发生频率 | 严重程度 |
|---|---|---|---|
| 设置不保存 | 重启Discord后黑名单设置丢失 | 高 | 中 |
| 部分服务器不生效 | 某些服务器的黑名单设置不起作用 | 中 | 中 |
| 全部服务器不生效 | 黑名单功能完全失效,所有服务器都显示隐藏频道 | 低 | 高 |
| 性能问题 | 添加黑名单后Discord卡顿或崩溃 | 低 | 高 |
| 界面显示异常 | 黑名单设置界面错乱或选项缺失 | 中 | 低 |
2.2 诊断工具与方法
要准确诊断黑名单功能的问题,我们需要使用以下工具和方法:
2.2.1 日志分析
SHC提供了详细的日志功能,可以通过以下步骤查看:
- 打开Discord设置
- 进入"插件"选项卡
- 找到SHC插件,点击"设置"
- 启用"调试模式"(debugMode)
- 打开开发者工具(按F12)
- 切换到"控制台"(Console)选项卡
- 查找以"[SHC]"或"ShowHiddenChannels"开头的日志信息
关键日志条目示例:
[SHC] Settings saved. {blacklistedGuilds: { "123456789": true }}
[SHC] Checking channel permissions for guild 123456789
[SHC] Guild 123456789 is blacklisted, hiding channels
2.2.2 配置文件检查
SHC的设置保存在本地文件系统中,可以通过以下路径找到:
%appdata%\BetterDiscord\plugins\ShowHiddenChannels\settings.json
或在Linux/Mac系统上:
~/.config/BetterDiscord/plugins/ShowHiddenChannels/settings.json
健康的配置文件应包含类似以下的内容:
{
"hiddenChannelIcon": "lock",
"sort": "native",
"showPerms": true,
"showAdmin": "channel",
"MarkUnread": false,
"checkForUpdates": true,
"usePreRelease": false,
"shouldShowEmptyCategory": false,
"debugMode": false,
"channels": {
"GUILD_TEXT": true,
"GUILD_VOICE": true,
"GUILD_ANNOUNCEMENT": true,
"GUILD_STORE": true,
"GUILD_STAGE_VOICE": true,
"GUILD_FORUM": true
},
"blacklistedGuilds": {
"123456789012345678": true,
"987654321098765432": true
}
}
2.2.3 调试工具
利用浏览器开发者工具,我们可以进行更深入的调试:
- 在Discord中按F12打开开发者工具
- 切换到" Sources"选项卡
- 在左侧导航栏中找到"ShowHiddenChannels.plugin.js"
- 在关键函数处设置断点,如
processContextMenu和ChannelPermissionStore.can的补丁函数 - 观察变量值和执行流程
三、全面修复方案
3.1 设置不保存问题修复
设置不保存是黑名单功能最常见的问题之一,通常有以下几种修复方法:
3.1.1 文件权限修复
问题根源:Discord或BetterDiscord没有足够的权限写入设置文件。
修复步骤:
- 关闭Discord
- 导航到BetterDiscord插件目录:
%appdata%\BetterDiscord\plugins\ - 右键点击"ShowHiddenChannels"文件夹
- 选择"属性" > "安全"选项卡
- 点击"编辑",选择你的用户账户
- 确保"写入"权限已勾选
- 点击"应用"并确认更改
- 重新启动Discord
3.1.2 配置文件重建
如果权限修复无效,可以尝试重建配置文件:
// 代码示例:重置SHC设置
const fs = require('fs');
const path = require('path');
const settingsPath = path.join(
BdApi.Plugins.folder,
'ShowHiddenChannels',
'settings.json'
);
// 备份旧设置
if (fs.existsSync(settingsPath)) {
fs.renameSync(
settingsPath,
path.join(
BdApi.Plugins.folder,
'ShowHiddenChannels',
'settings_backup.json'
)
);
}
// 创建新的默认设置
const defaultSettings = {
// 默认设置内容...
blacklistedGuilds: {},
};
fs.writeFileSync(
settingsPath,
JSON.stringify(defaultSettings, null, 2)
);
操作步骤:
- 打开Discord并确保SHC已加载
- 打开开发者工具(F12)
- 切换到"Console"选项卡
- 粘贴上述代码并按Enter执行
- 重启Discord
3.2 黑名单功能部分失效修复
当黑名单对某些服务器不起作用时,可以尝试以下解决方案:
3.2.1 服务器ID验证
问题根源:服务器ID格式不正确或已更改。
验证方法:
// 在Discord开发者工具中执行,获取当前服务器ID
const currentGuildId = BdApi.Webpack.getModule(
m => m?.getGuildId && typeof m.getGuildId === 'function',
{ searchExports: true }
).getGuildId();
console.log('当前服务器ID:', currentGuildId);
// 检查是否在黑名单中
const settings = BdApi.Data.load('ShowHiddenChannels', 'settings');
console.log('是否在黑名单中:', settings.blacklistedGuilds[currentGuildId]);
如果返回undefined或false,表示该服务器不在黑名单中或ID不匹配。
3.2.2 强制添加服务器到黑名单
如果通过UI无法添加服务器到黑名单,可以通过代码强制添加:
// 在Discord开发者工具中执行
const guildId = '要添加的服务器ID';
const settings = BdApi.Data.load('ShowHiddenChannels', 'settings') || {};
// 确保blacklistedGuilds属性存在
if (!settings.blacklistedGuilds) {
settings.blacklistedGuilds = {};
}
// 添加服务器到黑名单
settings.blacklistedGuilds[guildId] = true;
// 保存设置
BdApi.Data.save('ShowHiddenChannels', 'settings', settings);
// 通知用户
BdApi.UI.showToast(`已将服务器 ${guildId} 添加到黑名单`, { type: 'success' });
// 重新加载插件
BdApi.Plugins.reload('ShowHiddenChannels');
3.3 黑名单功能完全失效修复
当黑名单功能完全不工作时,可能需要更深入的修复:
3.3.1 核心逻辑修复
通过修改SHC的核心权限检查逻辑来修复黑名单功能:
// ChannelPermissionStore.can补丁函数修复
Patcher.after(
ChannelPermissionStore,
"can",
(_, [permission, channel], res) => {
if (!channel?.isHidden?.()) return res;
if (permission === DiscordConstants.Permissions.VIEW_CHANNEL) {
// 修复:确保guild_id存在且黑名单检查正确
+ if (!channel.guild_id) {
+ Logger.warn("Channel missing guild_id", channel);
+ return res;
+ }
+
+ const isBlacklisted = this.settings.blacklistedGuilds[channel.guild_id] === true;
+ Logger.debug(`Guild ${channel.guild_id} blacklisted: ${isBlacklisted}`);
+
return (
- !this.settings.blacklistedGuilds[channel.guild_id] &&
+ !isBlacklisted &&
this.settings.channels[
DiscordConstants.ChannelTypes[channel.type]
]
);
}
if (permission === DiscordConstants.Permissions.CONNECT) {
return false;
}
return res;
}
);
应用此修复的步骤:
- 打开SHC插件文件
- 搜索
ChannelPermissionStore.can补丁 - 应用上述代码更改
- 保存文件并重新加载插件
3.3.2 上下文菜单修复
如果无法通过服务器上下文菜单添加黑名单,可以修复上下文菜单集成:
// 修复上下文菜单集成
processContextMenu(menu, { guild }) {
const menuCategory = menu?.props?.children?.find((buttonCategory) => {
const children = buttonCategory?.props?.children;
return (
Array.isArray(children) &&
children.some((button) => button?.props?.id === "hide-muted-channels")
);
});
+ // 修复:确保menuCategory存在
+ if (!menuCategory || !menuCategory.props || !Array.isArray(menuCategory.props.children)) {
+ Logger.warn("Failed to find menu category for context menu");
+ return menu;
+ }
if (!menuCategory || !guild) return;
menuCategory.props.children.push(
ContextMenu.buildItem({
type: "toggle",
label: "Disable SHC",
checked: this.settings.blacklistedGuilds[guild.id],
action: () => {
this.settings.blacklistedGuilds[guild.id] =
!this.settings.blacklistedGuilds[guild.id];
this.saveSettings();
},
})
);
+ return menu;
}
3.4 性能优化与冲突解决
如果添加黑名单后出现性能问题,可能是由于资源冲突或低效代码导致:
3.4.1 冲突检测
使用以下代码检测可能的插件冲突:
// 检测可能与SHC冲突的插件
const conflictingPlugins = BdApi.Plugins.all.filter(plugin =>
plugin.name.includes('Hidden') ||
plugin.name.includes('Channel') ||
plugin.name.includes('Blacklist')
);
console.log('可能的冲突插件:', conflictingPlugins.map(p => p.name));
解决方法:
- 禁用列出的冲突插件
- 重启Discord
- 逐个重新启用,找出冲突源
- 选择保留SHC或冲突插件
3.4.2 黑名单检查优化
优化黑名单检查逻辑,减少性能开销:
// 优化前
Patcher.after(
ChannelPermissionStore,
"can",
(_, [permission, channel], res) => {
if (!channel?.isHidden?.()) return res;
if (permission === DiscordConstants.Permissions.VIEW_CHANNEL) {
return (
!this.settings.blacklistedGuilds[channel.guild_id] &&
this.settings.channels[DiscordConstants.ChannelTypes[channel.type]]
);
}
// ...
}
);
// 优化后
+ // 缓存黑名单状态
+ const blacklistedGuildsCache = new Set(
+ Object.entries(this.settings.blacklistedGuilds)
+ .filter(([_, value]) => value)
+ .map(([guildId]) => guildId)
+ );
+
+ // 监听设置变化以更新缓存
+ this.api.Data.onChange('settings', () => {
+ blacklistedGuildsCache.clear();
+ Object.entries(this.settings.blacklistedGuilds)
+ .filter(([_, value]) => value)
+ .forEach(([guildId]) => blacklistedGuildsCache.add(guildId));
+ });
+
Patcher.after(
ChannelPermissionStore,
"can",
(_, [permission, channel], res) => {
if (!channel?.isHidden?.()) return res;
if (permission === DiscordConstants.Permissions.VIEW_CHANNEL) {
return (
- !this.settings.blacklistedGuilds[channel.guild_id] &&
+ !blacklistedGuildsCache.has(channel.guild_id) &&
this.settings.channels[DiscordConstants.ChannelTypes[channel.type]]
);
}
// ...
}
);
四、高级配置与优化
4.1 批量管理黑名单
对于需要管理大量服务器的用户,可以使用以下高级脚本批量管理黑名单:
4.1.1 导入/导出黑名单
// 导出黑名单设置
function exportBlacklist() {
const settings = BdApi.Data.load('ShowHiddenChannels', 'settings');
const blacklist = settings.blacklistedGuilds || {};
// 创建下载链接
const blob = new Blob(
[JSON.stringify(blacklist, null, 2)],
{ type: 'application/json' }
);
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = 'shc_blacklist_export.json';
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
URL.revokeObjectURL(url);
}
// 导入黑名单设置
function importBlacklist(fileContent) {
try {
const importedBlacklist = JSON.parse(fileContent);
const settings = BdApi.Data.load('ShowHiddenChannels', 'settings') || {};
// 合并现有黑名单与导入的黑名单
settings.blacklistedGuilds = {
...settings.blacklistedGuilds,
...importedBlacklist
};
BdApi.Data.save('ShowHiddenChannels', 'settings', settings);
BdApi.UI.showToast('黑名单导入成功', { type: 'success' });
// 重新加载插件
BdApi.Plugins.reload('ShowHiddenChannels');
} catch (error) {
BdApi.UI.showToast('黑名单导入失败: ' + error.message, { type: 'error' });
}
}
使用方法:
- 导出:在控制台执行
exportBlacklist(),下载JSON文件 - 导入:准备好JSON文件,执行
importBlacklist(JSON.stringify(你的黑名单对象))
4.1.2 按服务器名称批量添加
// 按服务器名称批量添加到黑名单
function batchAddBlacklistByName(nameContains) {
// 获取所有服务器
const GuildStore = BdApi.Webpack.getModule(
m => m?.getGuilds && typeof m.getGuilds === 'function',
{ searchExports: true }
);
const allGuilds = GuildStore.getGuilds();
const matchedGuilds = Object.values(allGuilds).filter(guild =>
guild.name.toLowerCase().includes(nameContains.toLowerCase())
);
if (matchedGuilds.length === 0) {
BdApi.UI.showToast(`未找到名称包含"${nameContains}"的服务器`, { type: 'info' });
return;
}
const settings = BdApi.Data.load('ShowHiddenChannels', 'settings') || {};
settings.blacklistedGuilds = settings.blacklistedGuilds || {};
// 添加匹配的服务器到黑名单
matchedGuilds.forEach(guild => {
settings.blacklistedGuilds[guild.id] = true;
});
BdApi.Data.save('ShowHiddenChannels', 'settings', settings);
BdApi.UI.showToast(`已添加 ${matchedGuilds.length} 个服务器到黑名单`, { type: 'success' });
// 重新加载插件
BdApi.Plugins.reload('ShowHiddenChannels');
// 显示匹配的服务器列表
console.log('已添加到黑名单的服务器:', matchedGuilds.map(g => ({
id: g.id,
name: g.name
})));
}
// 使用示例:添加所有名称包含"test"的服务器到黑名单
// batchAddBlacklistByName("test");
4.2 黑名单与其他功能协同优化
4.2.1 与排序功能协同
SHC提供了多种频道排序方式,与黑名单功能协同使用可以获得更好的体验:
// 优化:黑名单服务器的排序设置
const optimizeBlacklistedGuildSorting = () => {
const settings = BdApi.Data.load('ShowHiddenChannels', 'settings') || {};
// 对于黑名单服务器,自动禁用特殊排序
Object.keys(settings.blacklistedGuilds).forEach(guildId => {
// 这里可以添加特定于黑名单服务器的排序优化
console.log(`优化服务器 ${guildId} 的排序设置`);
});
BdApi.Data.save('ShowHiddenChannels', 'settings', settings);
};
推荐配置组合:
| 场景 | 排序设置 | 黑名单行为 | 性能影响 |
|---|---|---|---|
| 普通使用 | "native" | 完全隐藏 | 低 |
| 开发测试 | "extra" | 仅标记 | 中 |
| 大型服务器 | "bottom" | 完全隐藏 | 低 |
| 多服务器管理 | "category" | 分类隐藏 | 中 |
4.2.2 与权限检查优化
// 优化:缓存权限检查结果
const permissionCache = new Map();
// 带缓存的权限检查
function checkPermissionWithCache(channel, permission) {
const cacheKey = `${channel.id}-${permission}`;
// 如果缓存存在且未过期,使用缓存
if (permissionCache.has(cacheKey)) {
const cached = permissionCache.get(cacheKey);
if (Date.now() - cached.timestamp < 30000) { // 30秒缓存
return cached.result;
}
}
// 实际执行权限检查
const result = ChannelPermissionStore.can(permission, channel);
// 更新缓存
permissionCache.set(cacheKey, {
result,
timestamp: Date.now()
});
// 限制缓存大小
if (permissionCache.size > 1000) {
const oldestKey = permissionCache.keys().next().value;
permissionCache.delete(oldestKey);
}
return result;
}
4.3 自动化与脚本集成
4.3.1 自动备份黑名单
// 自动备份黑名单设置
function setupAutoBackup() {
// 监听设置变化
const originalSaveSettings = ShowHiddenChannels.prototype.saveSettings;
ShowHiddenChannels.prototype.saveSettings = function() {
// 执行原始保存逻辑
originalSaveSettings.apply(this, arguments);
// 备份设置
const backupPath = path.join(
BdApi.Plugins.folder,
'ShowHiddenChannels',
`settings_backup_${new Date().toISOString().split('T')[0]}.json`
);
fs.copyFileSync(
path.join(
BdApi.Plugins.folder,
'ShowHiddenChannels',
'settings.json'
),
backupPath
);
Logger.debug(`黑名单设置已备份到: ${backupPath}`);
};
Logger.info('已启用黑名单自动备份');
}
4.3.2 黑名单状态指示器
创建自定义指示器,显示当前服务器的黑名单状态:
/* 添加自定义CSS显示黑名单状态 */
.shc-blacklist-indicator {
position: absolute;
top: 5px;
right: 5px;
width: 12px;
height: 12px;
border-radius: 50%;
background-color: #f04747;
z-index: 1000;
}
/* 服务器列表项中的指示器 */
.guilds-2JjMmN .guild-1EfMGQ.shc-blacklisted::after {
content: '';
position: absolute;
right: 5px;
top: 50%;
transform: translateY(-50%);
width: 8px;
height: 8px;
border-radius: 50%;
background-color: #f04747;
}
// 添加黑名单状态指示器
function addBlacklistIndicators() {
const settings = BdApi.Data.load('ShowHiddenChannels', 'settings') || {};
const blacklistedGuilds = settings.blacklistedGuilds || {};
// 为服务器列表项添加标记
document.querySelectorAll('.guilds-2JjMmN .guild-1EfMGQ').forEach(el => {
const guildId = el.getAttribute('data-guild-id');
if (blacklistedGuilds[guildId]) {
el.classList.add('shc-blacklisted');
} else {
el.classList.remove('shc-blacklisted');
}
});
// 在当前服务器信息中添加指示器
const currentGuildHeader = document.querySelector('.guildHeader-2VlaZq');
if (currentGuildHeader) {
const guildId = BdApi.Webpack.getModule(
m => m?.getGuildId && typeof m.getGuildId === 'function',
{ searchExports: true }
).getGuildId();
let indicator = currentGuildHeader.querySelector('.shc-blacklist-indicator');
if (blacklistedGuilds[guildId]) {
if (!indicator) {
indicator = document.createElement('div');
indicator.className = 'shc-blacklist-indicator';
indicator.title = '此服务器在SHC黑名单中';
currentGuildHeader.appendChild(indicator);
}
} else if (indicator) {
indicator.remove();
}
}
}
五、未来展望与最佳实践
5.1 功能改进建议
基于当前黑名单功能的实现,未来版本可以考虑以下改进:
5.2 最佳实践指南
5.2.1 日常使用建议
- 定期备份:每周至少备份一次黑名单设置
- 分类管理:对于大量服务器,考虑按用途分类管理黑名单
- 定期清理:每季度审查并清理不再需要的黑名单条目
- 谨慎分享:导出的黑名单包含服务器ID,分享时注意隐私保护
5.2.2 故障排除流程
5.2.3 资源与社区支持
- 官方仓库:https://gitcode.com/gh_mirrors/re/return-ShowHiddenChannels
- 支持服务器:通过插件设置中的"Support Server"链接加入
- 问题反馈:在GitHub仓库提交issue,包含详细日志和复现步骤
- 更新渠道:确保启用自动更新,或定期检查最新版本
结语
通过本文的深入解析和实战指南,你现在应该已经掌握了Return-ShowHiddenChannels服务器黑名单功能的工作原理、常见问题诊断方法和全面的修复方案。无论是简单的设置不保存问题,还是复杂的功能完全失效,你都有了相应的解决工具和技术。
记住,开源项目的发展离不开社区的支持和贡献。如果你发现了新的问题或有更好的解决方案,欢迎通过官方渠道参与贡献,帮助改进这个优秀的开源插件。
最后,希望本文提供的知识和工具能够帮助你更好地管理Discord服务器,提升使用体验。如有任何疑问或需要进一步的帮助,请随时在支持社区中提问。
点赞收藏本指南,关注项目更新,获取最新修复方案!
下期预告:Return-ShowHiddenChannels高级权限管理与自定义规则配置详解
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



