终极修复指南:Return-ShowHiddenChannels服务器黑名单功能深度解析与实战

终极修复指南:Return-ShowHiddenChannels服务器黑名单功能深度解析与实战

【免费下载链接】return-ShowHiddenChannels A BetterDiscord plugin which displays all hidden channels and allows users to view information about them. 【免费下载链接】return-ShowHiddenChannels 项目地址: https://gitcode.com/gh_mirrors/re/return-ShowHiddenChannels

引言:你还在为黑名单功能失效而烦恼吗?

作为Discord平台上最受欢迎的插件之一,Return-ShowHiddenChannels (以下简称SHC) 为用户提供了查看隐藏频道的强大功能。然而,许多用户在使用服务器黑名单功能时遇到了各种问题,导致插件无法正常工作或功能受限。本指南将深入剖析SHC的黑名单功能原理,详细讲解常见问题的诊断方法,并提供完整的修复方案,帮助你彻底解决黑名单功能失效的困扰。

读完本文后,你将能够:

  • 深入理解SHC黑名单功能的工作原理
  • 准确诊断黑名单功能失效的根本原因
  • 熟练应用多种修复方法解决不同场景下的问题
  • 掌握高级配置技巧,优化黑名单功能的使用体验
  • 了解未来版本的发展方向,提前做好适配准备

一、SHC黑名单功能核心原理

1.1 功能概述

SHC的服务器黑名单功能允许用户指定某些服务器,在这些服务器中插件将不会显示隐藏频道。这一功能对于那些既需要在某些服务器使用插件,又希望在其他服务器保持默认行为的用户来说非常实用。

1.2 技术架构

SHC的黑名单功能主要通过以下几个关键组件实现:

mermaid

核心数据结构定义如下:

const defaultSettings = {
    // 其他设置...
    blacklistedGuilds: {},  // 黑名单设置存储对象
};

1.3 工作流程

SHC黑名单功能的工作流程可以分为以下几个关键步骤:

mermaid

具体实现上,插件通过修改ChannelPermissionStorecan方法来控制隐藏频道的可见性:

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提供了详细的日志功能,可以通过以下步骤查看:

  1. 打开Discord设置
  2. 进入"插件"选项卡
  3. 找到SHC插件,点击"设置"
  4. 启用"调试模式"(debugMode)
  5. 打开开发者工具(按F12)
  6. 切换到"控制台"(Console)选项卡
  7. 查找以"[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 调试工具

利用浏览器开发者工具,我们可以进行更深入的调试:

  1. 在Discord中按F12打开开发者工具
  2. 切换到" Sources"选项卡
  3. 在左侧导航栏中找到"ShowHiddenChannels.plugin.js"
  4. 在关键函数处设置断点,如processContextMenuChannelPermissionStore.can的补丁函数
  5. 观察变量值和执行流程

三、全面修复方案

3.1 设置不保存问题修复

设置不保存是黑名单功能最常见的问题之一,通常有以下几种修复方法:

3.1.1 文件权限修复

问题根源:Discord或BetterDiscord没有足够的权限写入设置文件。

修复步骤:

  1. 关闭Discord
  2. 导航到BetterDiscord插件目录:
    %appdata%\BetterDiscord\plugins\
    
  3. 右键点击"ShowHiddenChannels"文件夹
  4. 选择"属性" > "安全"选项卡
  5. 点击"编辑",选择你的用户账户
  6. 确保"写入"权限已勾选
  7. 点击"应用"并确认更改
  8. 重新启动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)
);

操作步骤:

  1. 打开Discord并确保SHC已加载
  2. 打开开发者工具(F12)
  3. 切换到"Console"选项卡
  4. 粘贴上述代码并按Enter执行
  5. 重启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]);

如果返回undefinedfalse,表示该服务器不在黑名单中或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;
    }
);

应用此修复的步骤:

  1. 打开SHC插件文件
  2. 搜索ChannelPermissionStore.can补丁
  3. 应用上述代码更改
  4. 保存文件并重新加载插件
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));

解决方法:

  1. 禁用列出的冲突插件
  2. 重启Discord
  3. 逐个重新启用,找出冲突源
  4. 选择保留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' });
    }
}

使用方法:

  1. 导出:在控制台执行exportBlacklist(),下载JSON文件
  2. 导入:准备好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 功能改进建议

基于当前黑名单功能的实现,未来版本可以考虑以下改进:

mermaid

5.2 最佳实践指南

5.2.1 日常使用建议
  1. 定期备份:每周至少备份一次黑名单设置
  2. 分类管理:对于大量服务器,考虑按用途分类管理黑名单
  3. 定期清理:每季度审查并清理不再需要的黑名单条目
  4. 谨慎分享:导出的黑名单包含服务器ID,分享时注意隐私保护
5.2.2 故障排除流程

mermaid

5.2.3 资源与社区支持
  • 官方仓库:https://gitcode.com/gh_mirrors/re/return-ShowHiddenChannels
  • 支持服务器:通过插件设置中的"Support Server"链接加入
  • 问题反馈:在GitHub仓库提交issue,包含详细日志和复现步骤
  • 更新渠道:确保启用自动更新,或定期检查最新版本

结语

通过本文的深入解析和实战指南,你现在应该已经掌握了Return-ShowHiddenChannels服务器黑名单功能的工作原理、常见问题诊断方法和全面的修复方案。无论是简单的设置不保存问题,还是复杂的功能完全失效,你都有了相应的解决工具和技术。

记住,开源项目的发展离不开社区的支持和贡献。如果你发现了新的问题或有更好的解决方案,欢迎通过官方渠道参与贡献,帮助改进这个优秀的开源插件。

最后,希望本文提供的知识和工具能够帮助你更好地管理Discord服务器,提升使用体验。如有任何疑问或需要进一步的帮助,请随时在支持社区中提问。

点赞收藏本指南,关注项目更新,获取最新修复方案!

下期预告:Return-ShowHiddenChannels高级权限管理与自定义规则配置详解

【免费下载链接】return-ShowHiddenChannels A BetterDiscord plugin which displays all hidden channels and allows users to view information about them. 【免费下载链接】return-ShowHiddenChannels 项目地址: https://gitcode.com/gh_mirrors/re/return-ShowHiddenChannels

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值