Misskey服务器跳转

Misskey增强工具,支持自定义服务器跳转、按钮颜色自定义(默认自动识别主题色),自带设置菜单,更多设置项请查看源码(有中文标注)

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name         Misskey服务器跳转
// @namespace    https://github.com/YFTree
// @version      1.0
// @description  Misskey增强工具,支持自定义服务器跳转、按钮颜色自定义(默认自动识别主题色),自带设置菜单,更多设置项请查看源码(有中文标注)
// @author       YFTree
// @match        *misskey.io/*
// @match        *nya.one/*
// @grant        GM_getValue
// @grant        GM_setValue
// @grant        GM_registerMenuCommand
// @grant        GM_addStyle
// @license      MIT
// @compatible    edge
// @compatible    chrome
// ==/UserScript==

(function () {
    'use strict';

    // 添加全局样式
    GM_addStyle(`
        /* 基础按钮样式 */
        .modern-button {
            padding: 12px 24px;
            border: none;
            border-radius: 8px;
            cursor: pointer;
            font-weight: 500;
            transition: all 0.2s ease;
            display: inline-flex;
            align-items: center;
            gap: 8px;
            box-shadow: 1px 2px 4px rgba(0,0,0,0.1);
            font-family: system-ui, -apple-system, sans-serif;
            color: black;
        }

        /* 设置面板样式 */
        .settings-panel {
            position: fixed;
            top: 50%;  /* 设置面板默认顶部距离 */
            left: 50%;  /* 设置面板默认左边距离 */
            transform: translate(-50%, -50%);
            padding: 24px;
            border: 1px solid var(--border-color);
            border-radius: 12px;
            box-shadow: 0 8px 24px rgba(0, 0, 0, 0.15);
            z-index: 99999; /* 设置面板默认堆叠顺序 */
            display: none;
            width: min(80vw, 300px);
            background: var(--bg-color);
            color: var(--text-color);
        }

        /* 设置项网格布局 */
        .settings-grid {
            display: grid;
            grid-template-columns: repeat(2, 1fr);
            gap: 16px;
            margin: 16px 0;
        }

        /* 输入组样式 */
        .settings-input-group label {
            display: block;
            margin-bottom: 6px;
            font-size: 0.9em;
            color: var(--text-secondary);
        }

        /* 输入框基础样式 */
        .settings-input {
            width: 100%;
            padding: 8px 12px;
            border-radius: 6px;
            border: 1px solid var(--border-color);
            background: var(--input-bg);
            color: var(--text-color);
            transition: all 0.2s ease;
            box-sizing: border-box;
        }

        /* 输入框聚焦状态 */
        .settings-input:focus {
            outline: none;
            border-color: var(--accent-color);
            box-shadow: 0 0 0 2px var(--accent-color-20);
        }

        /* 保存按钮样式 */
        .save-button {
            background: linear-gradient(135deg, #4CAF50, #66BB6A);
            color: white;
        }

        /* 重置按钮样式 */
        .reset-button {
            background: linear-gradient(135deg, #6b6bff, #8787ff);
            color: white;
        }

        /* 二级菜单样式 */
        .submenu {
            display: none;
            margin-top: 10px;
        }

        /* 二级菜单标题样式 */
        .submenu-title {
            font-size: 1em;
            font-weight: bold;
            margin-bottom: 10px;
            cursor: pointer;
            color: var(--text-color);
        }

        /* 居中按钮容器 */
        .button-container {
            display: flex;
            justify-content: center;
            gap: 20px;
            margin-top: 20px;
        }
    `);

    // 配置存储结构
    const defaultConfig = {
        position: {
            bottom: 60, // 默认底部距离
            right: 94,  // 默认右边距离
            unit: '%'  // 默认位置单位
        },

        size: {
            width: 24,  // 默认按钮宽度
            height: 100, // 默认按钮长度
            fontSize: 10 // 默认按钮文本大小
        },

        colorMode: 'auto', // 默认按钮颜色模式
        customColor: '', // 默认自定义按钮颜色
        colorType: 'hex', // 默认按钮颜色类型
        openInNewTab: true, // 默认新窗口打开设置
        jumpDomain: 'nya.one', // 默认跳转服务器域名
        textColorMode: 'dark', // 默认文本颜色模式设置
        customTextColor: '', // 默认自定义文本颜色
        textColorType: 'hex' // 默认文本颜色类型
    };

    // 初始化配置
    let config = JSON.parse(GM_getValue('buttonConfig', JSON.stringify(defaultConfig)));

    // 创建设置面板
    const settingsPanel = createSettingsPanel();
    document.body.appendChild(settingsPanel);

    // 创建主按钮
    const mainButton = createMainButton();
    document.body.appendChild(mainButton);

    // 注册菜单命令
    GM_registerMenuCommand('⚙️ 调整按钮设置', () => toggleSettingsPanel());

    // 绑定主按钮点击事件
    mainButton.addEventListener('click', handleMainButtonClick);

    // 初始化主题系统
    initThemeSystem();

    // 创建主按钮
    function createMainButton() {
        const btn = document.createElement('button');
        btn.textContent = '打开用户页面'; // 默认按钮显示文本
        Object.assign(btn.style, {
            position: 'fixed',
            zIndex: '999999', // 默认按钮堆叠顺序(越大覆盖的页面越多)
            cursor: 'pointer',
            borderRadius: '40px', // 默认按钮圆角
            boxShadow: '0 4px 12px rgba(0,0,0,0.15)',
            transition: 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)'
        });
        updateButtonStyles(btn);
        return btn;
    }

    // 创建设置面板
   function createSettingsPanel() {
    const panel = document.createElement('div');
    panel.className = 'settings-panel';
    panel.innerHTML = `
        <h3 style="margin:0 0 20px; font-size:1.1em">按钮设置</h3>
        <div class="submenu-title" id="positionSizeMenu">位置与大小设置</div>
        <div class="submenu" id="positionSizeSubmenu">
            <div class="settings-grid">
                <!-- 位置设置 -->
                <div class="settings-input-group">
                    <label>底部距离</label>
                    <input type="number" class="settings-input" id="bottom" value="${config.position.bottom}">
                </div>
                <div class="settings-input-group">
                    <label>右侧距离</label>
                    <input type="number" class="settings-input" id="right" value="${config.position.right}">
                </div>
                <!-- 尺寸设置 -->
                <div class="settings-input-group">
                    <label>宽度 (px)</label>
                    <input type="number" class="settings-input" id="width" value="${config.size.width}">
                </div>
                <div class="settings-input-group">
                    <label>高度 (px)</label>
                    <input type="number" class="settings-input" id="height" value="${config.size.height}">
                </div>
                <div class="settings-input-group">
                    <label>文字大小 (px)</label>
                    <input type="number" class="settings-input" id="fontSize" value="${config.size.fontSize}">
                </div>
                <!-- 单位选择 -->
                <div class="settings-input-group">
                    <label>按钮位置单位类型</label>
                    <select class="settings-input" id="unit">
                        <option value="px" ${config.position.unit === 'px' ? 'selected' : ''}>像素(px)</option>
                        <option value="%" ${config.position.unit === '%' ? 'selected' : ''}>百分比(%)</option>
                    </select>
                </div>
            </div>
        </div>
        <div class="submenu-title" id="colorMenu">颜色设置</div>
        <div class="submenu" id="colorSubmenu">
            <div class="settings-grid">
    <!-- 按钮颜色模式(1) -->
    <div class="settings-input-group">
        <label>按钮颜色模式</label>
        <select class="settings-input" id="colorMode">
            <option value="auto" ${config.colorMode === 'auto' ? 'selected' : ''}>自动</option>
            <option value="light" ${config.colorMode === 'light' ? 'selected' : ''}>浅色主题色</option>
            <option value="dark" ${config.colorMode === 'dark' ? 'selected' : ''}>深色主题色</option>
            <option value="custom" ${config.colorMode === 'custom' ? 'selected' : ''}>自定义颜色</option>
        </select>
    </div>

    <!-- 文本颜色模式(2) -->
    <div class="settings-input-group">
        <label>文本颜色模式</label>
        <select class="settings-input" id="textColorMode">
            <option value="auto" ${config.textColorMode === 'auto' ? 'selected' : ''}>自动</option>
            <option value="light" ${config.textColorMode === 'light' ? 'selected' : ''}>浅色</option>
            <option value="dark" ${config.textColorMode === 'dark' ? 'selected' : ''}>深色</option>
            <option value="custom" ${config.textColorMode === 'custom' ? 'selected' : ''}>自定义颜色</option>
        </select>
    </div>

    <!-- 自定义按钮颜色(3) -->
    <div class="settings-input-group" id="customColorGroup" style="display: ${config.colorMode === 'custom' ? 'block' : 'none'}">
        <label>自定义按钮颜色</label>
        <select class="settings-input" id="colorType">
            <option value="hex" ${config.colorType === 'hex' ? 'selected' : ''}>#RRGGBB</option>
            <option value="shortHex" ${config.colorType === 'shortHex' ? 'selected' : ''}>#RGB</option>
            <option value="rgb" ${config.colorType === 'rgb' ? 'selected' : ''}>RGB(RRR,GGG,BBB)</option>
        </select>
        <input type="text" class="settings-input" id="customColor" value="${config.customColor.replace(/^#|^rgb\(|\)$/g, '')}">
    </div>

    <!-- 自定义文本颜色(4) -->
    <div class="settings-input-group" id="customTextColorGroup" style="display: ${config.textColorMode === 'custom' ? 'block' : 'none'}">
        <label>自定义文本颜色</label>
        <select class="settings-input" id="textColorType">
            <option value="hex" ${config.textColorType === 'hex' ? 'selected' : ''}>#RRGGBB</option>
            <option value="shortHex" ${config.textColorType === 'shortHex' ? 'selected' : ''}>#RGB</option>
            <option value="rgb" ${config.textColorType === 'rgb' ? 'selected' : ''}>RGB(RRR,GGG,BBB)</option>
        </select>
        <input type="text" class="settings-input" id="customTextColor" value="${config.customTextColor.replace(/^#|^rgb\(|\)$/g, '')}">
    </div>
</div>
        </div>
        <div class="submenu-title" id="openJumpMenu">打开和跳转设置</div>
        <div class="submenu" id="openJumpSubmenu">
            <div class="settings-grid">
                <!-- 打开方式设置 -->
                <div class="settings-input-group">
                    <label>打开方式</label>
                    <select class="settings-input" id="openInNewTab">
                        <option value="false" ${!config.openInNewTab ? 'selected' : ''}>当前标签页</option>
                        <option value="true" ${config.openInNewTab ? 'selected' : ''}>新标签页</option>
                    </select>
                </div>
                <!-- 跳转域名设置 -->
                <div class="settings-input-group">
                    <label>跳转域名</label>
                    <input type="text" class="settings-input" id="jumpDomain" value="${config.jumpDomain}">
                </div>
            </div>
        </div>
        <!-- 操作按钮 -->
        <div class="button-container">
            <button class="modern-button reset-button" id="resetSettings">
                <svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentColor" d="M12 20q-3.35 0-5.675-2.325T4 12q0-3.35 2.325-5.675T12 4q1.725 0 3.3.713T18 6.75V4h2v7h-7V9h4.2q-.8-1.4-2.188-2.2T12 6Q9.5 6 7.75 7.75T6 12q0 2.5 1.75 4.25T12 18q1.7 0 3.113-.862t2.187-2.313l1.8.75Q17.2 17.725 15.4 18.862T12 20Z"/></svg>
                重置
            </button>
            <button class="modern-button save-button" id="saveSettings">
                <svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentColor" d="M17 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V7l-4-4zm-5 16c-1.66 0-3-1.34-3-3s1.34-3 3-3 3 1.34 3 3-1.34 3-3 3zm3-10H5V5h10v4z"/></svg>
                保存
            </button>
        </div>
    `;

    // 为所有输入项添加事件监听
    const inputs = panel.querySelectorAll('input, select');
    inputs.forEach(input => {
        input.addEventListener('input', () => updatePreview());
    });

    // 绑定重置和保存按钮事件
    panel.querySelector('#resetSettings').addEventListener('click', resetSettings);
    panel.querySelector('#saveSettings').addEventListener('click', saveSettings);

    // 绑定按钮颜色模式更改事件
    panel.querySelector('#colorMode').addEventListener('change', () => {
        const customColorGroup = panel.querySelector('#customColorGroup');
        customColorGroup.style.display = panel.querySelector('#colorMode').value === 'custom' ? 'block' : 'none';
        saveColorSettings();
        updateButtonColor(mainButton);
        updateCustomColorInput();
    });

    // 绑定按钮颜色类型更改事件
    panel.querySelector('#colorType').addEventListener('change', () => {
        updateButtonColor(mainButton);
        updateCustomColorInput();
    });

    // 绑定按钮颜色值输入事件
    panel.querySelector('#customColor').addEventListener('input', () => {
        updateButtonColor(mainButton);
    });

    // 绑定文本颜色模式更改事件
    panel.querySelector('#textColorMode').addEventListener('change', () => {
        const customTextColorGroup = panel.querySelector('#customTextColorGroup');
        customTextColorGroup.style.display = panel.querySelector('#textColorMode').value === 'custom' ? 'block' : 'none';
        saveColorSettings();
        updateButtonTextColor(mainButton);
        updateCustomTextColorInput(mainButton);
    });

    // 绑定文本颜色类型更改事件
    panel.querySelector('#textColorType').addEventListener('change', () => {
        updateButtonTextColor(mainButton);
        updateCustomTextColorInput();
    });

    // 绑定文本颜色值输入事件
    panel.querySelector('#customTextColor').addEventListener('input', () => {
        updateButtonTextColor(mainButton);
        updateCustomTextColorInput(mainButton);
    });

    // 绑定二级菜单点击事件
    panel.querySelectorAll('.submenu-title').forEach(title => {
        title.addEventListener('click', () => {
            const submenu = title.nextElementSibling;
            toggleSubmenu(submenu);
        });
    });
    return panel;
}

    // 更新预览效果
    function updatePreview() {
        const formData = getFormData();
        mainButton.style.bottom = `${formData.position.bottom}${formData.position.unit}`;
        mainButton.style.right = `${formData.position.right}${formData.position.unit}`;
        mainButton.style.width = `${formData.size.width}px`;
        mainButton.style.height = `${formData.size.height}px`;
        mainButton.style.fontSize = `${formData.size.fontSize}px`;
        updateButtonColor(mainButton);
        updateButtonTextColor(mainButton);
    }

    // 保存设置
    function saveSettings() {
        const formData = getFormData();
        if (formData.colorMode === 'custom' && !isValidColor(formData.customColor)) {
            alert('自定义颜色格式错误,请输入有效的颜色值(如 #RGB、#RRGGBB 或 rgb() 等格式)');
            return;
        }

        if (formData.textColorMode === 'custom' && !isValidColor(formData.customTextColor)) {
            alert('自定义文本颜色格式错误,请输入有效的颜色值(如 #RGB、#RRGGBB 或 rgb() 等格式)');
            return;
        }

        config = formData;
        GM_setValue('buttonConfig', JSON.stringify(config));
        settingsPanel.style.display = 'none';
        updateButtonStyles(mainButton);
    }

    // 重置设置
    function resetSettings() {
        config = JSON.parse(JSON.stringify(defaultConfig));
        updateFormData(config);
        updatePreview();
    }

    // 获取表单数据
    function getFormData() {
        const colorType = settingsPanel.querySelector('#colorType').value;
        let customColor = settingsPanel.querySelector('#customColor').value;
        if (customColor) {
            if (colorType === 'hex') {
                customColor = `#${customColor}`;
            } else if (colorType === 'shortHex') {
                if (customColor.length === 3) {
                    customColor = `#${customColor[0]}${customColor[0]}${customColor[1]}${customColor[1]}${customColor[2]}${customColor[2]}`;
                } else {
                    customColor = `#${customColor}`;
                }
            } else if (colorType === 'rgb') {
                customColor = `rgb(${customColor})`;
            }
        }

        const textColorType = settingsPanel.querySelector('#textColorType').value;
        let customTextColor = settingsPanel.querySelector('#customTextColor').value;
        if (customTextColor) {
            if (textColorType === 'hex') {
                customTextColor = `#${customTextColor}`;
            } else if (textColorType === 'shortHex') {
                if (customTextColor.length === 3) {
                    customTextColor = `#${customTextColor[0]}${customTextColor[0]}${customTextColor[1]}${customTextColor[1]}${customTextColor[2]}${customTextColor[2]}`;
                } else {
                    customTextColor = `#${customTextColor}`;
                }
            } else if (textColorType === 'rgb') {
                customTextColor = `rgb(${customTextColor})`;
            }
        }
        return {
            position: {
                bottom: parseInt(settingsPanel.querySelector('#bottom').value) || 60,
                right: parseInt(settingsPanel.querySelector('#right').value) || 90,
                unit: settingsPanel.querySelector('#unit').value
            },
            size: {
                width: settingsPanel.querySelector('#width').value,
                height: parseInt(settingsPanel.querySelector('#height').value) || 40,
                fontSize: parseInt(settingsPanel.querySelector('#fontSize').value) || 14
            },
            colorMode: settingsPanel.querySelector('#colorMode').value,
            customColor: customColor,
            colorType: colorType,
            openInNewTab: settingsPanel.querySelector('#openInNewTab').value === 'true',
            jumpDomain: settingsPanel.querySelector('#jumpDomain').value || 'nya.one',
            textColorMode: settingsPanel.querySelector('#textColorMode').value,
            customTextColor: customTextColor,
            textColorType: textColorType
        };
    }

    // 更新表单数据
    function updateFormData(data) {
        settingsPanel.querySelector('#bottom').value = data.position.bottom;
        settingsPanel.querySelector('#right').value = data.position.right;
        settingsPanel.querySelector('#unit').value = data.position.unit;
        settingsPanel.querySelector('#width').value = data.size.width;
        settingsPanel.querySelector('#height').value = data.size.height;
        settingsPanel.querySelector('#fontSize').value = data.size.fontSize;
        settingsPanel.querySelector('#colorMode').value = data.colorMode;
        settingsPanel.querySelector('#colorType').value = data.colorType;

        if (settingsPanel.querySelector('#customColor')) {
            let customColor = data.customColor || '';
            if (data.colorType === 'hex' && customColor.startsWith('#')) {
                customColor = customColor.slice(1);
            } else if (data.colorType === 'rgb' && customColor.startsWith('rgb(')) {
                customColor = customColor.slice(4, -1);
            }
            settingsPanel.querySelector('#customColor').value = customColor;
        }
        settingsPanel.querySelector('#openInNewTab').value = data.openInNewTab ? 'true' : 'false';
        settingsPanel.querySelector('#jumpDomain').value = data.jumpDomain;
        settingsPanel.querySelector('#textColorMode').value = data.textColorMode;
        settingsPanel.querySelector('#textColorType').value = data.textColorType;

        if (settingsPanel.querySelector('#customTextColor')) {
            let customTextColor = data.customTextColor || '';
            if (data.textColorType === 'hex' && customTextColor.startsWith('#')) {
                customTextColor = customTextColor.slice(1);
            } else if (data.textColorType === 'rgb' && customTextColor.startsWith('rgb(')) {
                customTextColor = customTextColor.slice(4, -1);
            }
            settingsPanel.querySelector('#customTextColor').value = customTextColor;
        }

        // 重置后更新自定义颜色输入框的显示状态
        const customColorGroup = settingsPanel.querySelector('#customColorGroup');
        customColorGroup.style.display = data.colorMode === 'custom' ? 'block' : 'none';
        const customTextColorGroup = settingsPanel.querySelector('#customTextColorGroup');
        customTextColorGroup.style.display = data.textColorMode === 'custom' ? 'block' : 'none';
    }

    // 更新按钮样式
    function updateButtonStyles(btn) {
        btn.style.bottom = `${config.position.bottom}${config.position.unit}`;
        btn.style.right = `${config.position.right}${config.position.unit}`;
        btn.style.width = `${config.size.width}px`;
        btn.style.height = `${config.size.height}px`;
        btn.style.fontSize = `${config.size.fontSize}px`;
        updateButtonColor(btn);
        updateButtonTextColor(btn);
    }

    // 更新按钮文本颜色
function updateButtonTextColor(btn) {
    let textColor = '#000000'; // 默认文本颜色
    switch (config.textColorMode) {
        case 'auto':
            textColor = getComputedStyle(document.documentElement).getPropertyValue('--text-color').trim();
            break;
        case 'light':
            textColor = '#ffffff';
            break;
        case 'dark':
            textColor = '#000000';
            break;
        case 'custom':
            const textColorType = settingsPanel.querySelector('#textColorType').value;
            let customTextColor = settingsPanel.querySelector('#customTextColor').value;

            if (customTextColor) {
                if (textColorType === 'hex') {
                    customTextColor = `#${customTextColor}`;
                } else if (textColorType === 'shortHex') {
                    if (customTextColor.length === 3) {
                        customTextColor = `#${customTextColor[0]}${customTextColor[0]}${customTextColor[1]}${customTextColor[1]}${customTextColor[2]}${customTextColor[2]}`;
                    } else {
                        customTextColor = `#${customTextColor}`;
                    }
                } else if (textColorType === 'rgb') {
                    customTextColor = `rgb(${customTextColor})`;
                }
                if (isValidColor(customTextColor)) {
                    textColor = customTextColor;
                } else {
                    textColor = '#000000';
                }
            }
            break;
    }
    btn.style.color = textColor;
}

    // 初始化主题系统
    function initThemeSystem() {
        const darkModeMedia = window.matchMedia('(prefers-color-scheme: dark)');
        const updateTheme = () => {
            const isDark = darkModeMedia.matches;
            document.documentElement.style.setProperty('--bg-color', isDark ? '#2d2d2d' : '#ffffff');
            document.documentElement.style.setProperty('--text-color', isDark ? 'rgba(255,255,255,.85)' : '#333333');
            document.documentElement.style.setProperty('--text-secondary', isDark ? '#aaaaaa' : '#666666');
            document.documentElement.style.setProperty('--border-color', isDark ? '#444444' : '#dddddd');
            document.documentElement.style.setProperty('--input-bg', isDark ? '#383838' : '#f5f5f5');
            document.documentElement.style.setProperty('--accent-color', getThemeColor('accentLighten'));
            document.documentElement.style.setProperty('--accent-color-20', `${getThemeColor('accentLighten')}33`);
        };
        darkModeMedia.addEventListener('change', updateTheme);
        updateTheme();
    }

    // 获取主题颜色
    function getThemeColor() {
        try {
            let themeAccentColor = getComputedStyle(document.documentElement).getPropertyValue('--MI_THEME-accent').trim();
            if (!themeAccentColor || !isValidColor(themeAccentColor)) {
                themeAccentColor = getComputedStyle(document.documentElement).getPropertyValue('--accent').trim();
            }
            if (!themeAccentColor || !isValidColor(themeAccentColor)) {
                themeAccentColor = '#9ab3da';
            }
            return themeAccentColor;
        } catch (error) {
            console.error('获取主题颜色时出错:', error);
            return '#9ab3da';
        }
    }

    // 更新按钮颜色
    function updateButtonColor(btn = mainButton) {
        try {
            let color = '#9ab3da';
            switch (config.colorMode) {
                case 'auto':
                    color = getThemeColor();
                    break;
                case 'light':
                    color = '#ffffff';
                    break;
                case 'dark':
                    color = '#2d2d2d';
                    break;
                case 'custom':
                    const colorType = settingsPanel.querySelector('#colorType').value;
                    let customColor = settingsPanel.querySelector('#customColor').value;
                    if (customColor) {
                        if (colorType === 'hex') {
                            customColor = `#${customColor}`;
                        } else if (colorType === 'shortHex') {
                            if (customColor.length === 3) {
                                customColor = `#${customColor[0]}${customColor[0]}${customColor[1]}${customColor[1]}${customColor[2]}${customColor[2]}`;
                            } else {
                                customColor = `#${customColor}`;
                            }
                        } else if (colorType === 'rgb') {
                            customColor = `rgb(${customColor})`;
                        }
                        if (isValidColor(customColor)) {
                            color = customColor;
                        } else {
                            color = '#9ab3da';
                        }
                    }
                    break;
            }
            btn.style.backgroundColor = color;
            btn.style.boxShadow = `0 4px 12px ${color}33`;
        } catch (error) {
            console.error('更新按钮颜色错误:', error);
        }
    }

    // 保存颜色相关设置
    function saveColorSettings() {
        const formData = getFormData();
        config.colorMode = formData.colorMode;
        config.customColor = formData.customColor;
        config.colorType = formData.colorType;
        config.textColorMode = formData.textColorMode;
        config.customTextColor = formData.customTextColor;
        config.textColorType = formData.textColorType;
        GM_setValue('buttonConfig', JSON.stringify(config));
    }

    // 切换设置面板显示状态
    function toggleSettingsPanel() {
    if (settingsPanel.style.display === 'none' || settingsPanel.style.display === '') {
        // 显示设置面板
        settingsPanel.style.display = 'block';
        // 更新颜色输入框的值
        updateCustomColorInput();
        updateCustomTextColorInput();
        // 更新自定义颜色输入框的显示状态
        const customColorGroup = settingsPanel.querySelector('#customColorGroup');
        customColorGroup.style.display = config.colorMode === 'custom' ? 'block' : 'none';
        const customTextColorGroup = settingsPanel.querySelector('#customTextColorGroup');
        customTextColorGroup.style.display = config.textColorMode === 'custom' ? 'block' : 'none';
    } else {
        // 隐藏设置面板
        settingsPanel.style.display = 'none';
    }
}

    // 切换二级菜单显示状态
    function toggleSubmenu(submenu) {
        if (submenu.style.display === 'none' || submenu.style.display === '') {
            submenu.style.display = 'block';
        } else {
            submenu.style.display = 'none';
        }
    }
    // 验证颜色格式
    function isValidColor(color) {
        return /^(#([0-9A-Fa-f]{3,4}){1,2}|rgb\((\d{1,3},\s*){2}\d{1,3}\)|rgba\((\d{1,3},\s*){3}\d*\.?\d+\))$/.test(color);
    }

    // 更新输入框中的颜色值
    function updateCustomColorInput() {
        const colorType = settingsPanel.querySelector('#colorType').value;
        let customColor = settingsPanel.querySelector('#customColor').value;
        if (colorType === 'hex' && customColor.startsWith('#')) {
            customColor = customColor.slice(1);
        } else if (colorType === 'rgb' && customColor.startsWith('rgb(')) {
            customColor = customColor.slice(4, -1);
        }
        settingsPanel.querySelector('#customColor').value = customColor;
    }

    // 更新输入框中的文本颜色值
    function updateCustomTextColorInput() {
        const textColorType = settingsPanel.querySelector('#textColorType').value;
        let customTextColor = settingsPanel.querySelector('#customTextColor').value;

        if (textColorType === 'hex' && customTextColor.startsWith('#')) {
            customTextColor = customTextColor.slice(1);
        } else if (textColorType === 'rgb' && customTextColor.startsWith('rgb(')) {
            customTextColor = customTextColor.slice(4, -1);
        }
        settingsPanel.querySelector('#customTextColor').value = customTextColor;
    }

    // 处理主按钮点击事件
    function handleMainButtonClick() {
    const spans = document.querySelectorAll('span');
    let username = null;
    for (const span of spans) {
        if (span.textContent && span.textContent.startsWith('@')) {
            username = span.textContent.trim();
            break;
        }
    }
    const fullUrl = window.location.href;
    const server = window.location.hostname;
    const keywords = ['/@', '/notes/']; // 自定义关键词以启用链接跳转功能
    const containsKeywords = keywords.some(keyword => fullUrl.includes(keyword));
    if (containsKeywords) {
        if (username && server) {
            const cleanUsername = (username.match(/@/g) && username.match(/@/g).length === 2) ? username : `${username}@${server}`;
            const url = `https://${config.jumpDomain}/${cleanUsername}`;
            if (config.openInNewTab) {
                window.open(url, '_blank');
            } else {
                window.location.href = url;
            }
        } else {
                alert('无法解析用户名或服务器信息');
            }
        }
        }
})();