X/Twitter Clean menu and sidebar (Supports multiple language)

hidden Menu,Grok,Premium subscription,Explore,Notifications,Messages,Bookmarks and Customizable Settings

目前為 2024-06-11 提交的版本,檢視 最新版本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

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

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         X/Twitter Clean menu and sidebar (Supports multiple language)
// @version      1.0
// @description  hidden Menu,Grok,Premium subscription,Explore,Notifications,Messages,Bookmarks and Customizable Settings
// @license      MIT
// @author       movwei
// @match        https://x.com/*
// @match        https://twitter.com/*
// @grant        GM_registerMenuCommand
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_addStyle
// @namespace https://greasyfork.org/users/1041101
// ==/UserScript==

(function() {
    'use strict';

    const defaultSettings = {
        hideGrok: true,
        hidePremiumSignUp: true,
        hideSelectors: true,
        hideExplore: false,
        hideNotifications: false,
        hideBookmarks: false,
        hideMessages: false
    };

    const settings = {
        hideGrok: GM_getValue('hideGrok', defaultSettings.hideGrok),
        hidePremiumSignUp: GM_getValue('hidePremiumSignUp', defaultSettings.hidePremiumSignUp),
        hideSelectors: GM_getValue('hideSelectors', defaultSettings.hideSelectors),
        hideExplore: GM_getValue('hideExplore', defaultSettings.hideExplore),
        hideNotifications: GM_getValue('hideNotifications', defaultSettings.hideNotifications),
        hideBookmarks: GM_getValue('hideBookmarks', defaultSettings.hideBookmarks),
        hideMessages: GM_getValue('hideMessages', defaultSettings.hideMessages)
    };


    function createSettingsPanel() {
        const panel = document.createElement('div');
        panel.id = 'settingsPanel';
        panel.innerHTML = `
            <div id="settingsPanelContent">
                <h2>Settings</h2>
                <label><input type="checkbox" id="hideGrokCheckbox" ${settings.hideGrok ? 'checked' : ''}> Hide Grok</label><br>
                <label><input type="checkbox" id="hidePremiumSignUpCheckbox" ${settings.hidePremiumSignUp ? 'checked' : ''}> Hide Premium Sign-up</label><br>
                <label><input type="checkbox" id="hideSelectorsCheckbox" ${settings.hideSelectors ? 'checked' : ''}> Hide Subscribe Message</label><br>
                <label><input type="checkbox" id="hideExploreCheckbox" ${settings.hideExplore ? 'checked' : ''}> Hide Explore</label><br>
                <label><input type="checkbox" id="hideNotificationsCheckbox" ${settings.hideNotifications ? 'checked' : ''}> Hide Notifications</label><br>
                <label><input type="checkbox" id="hideMessagesCheckbox" ${settings.hideMessages ? 'checked' : ''}> Hide Messages</label><br>
                <label><input type="checkbox" id="hideBookmarksCheckbox" ${settings.hideBookmarks ? 'checked' : ''}> Hide Bookmarks</label><br>
                <button id="saveSettingsButton">Save & refresh</button>
                <button id="closeSettingsButton">Close</button>
            </div>
        `;
        document.body.appendChild(panel);

        document.getElementById('saveSettingsButton').addEventListener('click', saveSettings);

        document.getElementById('closeSettingsButton').addEventListener('click', () => {
            document.getElementById('settingsPanel').style.display = 'none';
        });
    }


    function saveSettings() {
        settings.hideGrok = document.getElementById('hideGrokCheckbox').checked;
        settings.hidePremiumSignUp = document.getElementById('hidePremiumSignUpCheckbox').checked;
        settings.hideSelectors = document.getElementById('hideSelectorsCheckbox').checked;
        settings.hideExplore = document.getElementById('hideExploreCheckbox').checked;
        settings.hideNotifications = document.getElementById('hideNotificationsCheckbox').checked;
        settings.hideBookmarks = document.getElementById('hideBookmarksCheckbox').checked;
        settings.hideMessages = document.getElementById('hideMessagesCheckbox').checked;

        GM_setValue('hideGrok', settings.hideGrok);
        GM_setValue('hidePremiumSignUp', settings.hidePremiumSignUp);
        GM_setValue('hideSelectors', settings.hideSelectors);
        GM_setValue('hideExplore', settings.hideExplore);
        GM_setValue('hideNotifications', settings.hideNotifications);
        GM_setValue('hideBookmarks', settings.hideBookmarks);
        GM_setValue('hideMessages', settings.hideMessages);
        location.reload();
    }


    GM_addStyle(`
        #settingsPanel {
            position: fixed;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%);
            background-color: white;
            border: 1px solid #ccc;
            padding: 20px;
            z-index: 10000;
            display: none;
            box-shadow: 0 4px 8px rgba(0,0,0,0.1);
            border-radius: 8px;
            max-width: 300px;
        }

        #settingsPanelContent {
            display: flex;
            flex-direction: column;
            align-items: flex-start;
            width: 100%;
        }

        #settingsPanel h2 {
            margin: 0 0 15px 0;
            font-size: 18px;
            color: #333;
            text-align: center;
            width: 100%;
        }

        #settingsPanel label {
            margin: 5px 0;
            font-size: 14px;
            color: #333;
        }

        #settingsPanel button {
            margin-top: 10px;
            padding: 8px 15px;
            font-size: 14px;
            color: white;
            background-color: #007BFF;
            border: none;
            border-radius: 4px;
            cursor: pointer;
            width: 100%;
        }

        #settingsPanel button#closeSettingsButton {
            background-color: #6c757d;
        }
    `);


    createSettingsPanel();
    GM_registerMenuCommand('Settings', () => {
        const panel = document.getElementById('settingsPanel');
        panel.style.display = 'block';
    });

    function addGlobalStyle(css) {
        var head, style;
        head = document.getElementsByTagName('head')[0];
        if (!head) { return; }
        style = document.createElement('style');
        style.type = 'text/css';
        style.innerHTML = css;
        head.appendChild(style);
    }


    var phrases = [
        'Premium\'a Abone Ol', // 土耳其文 - Türkçe
        'Abonner på Premium', // 丹麥文 - dansk
        '', // 巴斯克文 (測試版) - euskara
        'プレミアムにサブスクライブ', // 日文 - 日本語
        '', // 加利西亞文 (測試版) - galego
        'Subscriu-te a Premium', // 加泰蘭文 - català
        'પ્રીમિયમ પર સબ્સ્ક્રાઇબ કરો', // 古吉拉特文 - ગુજરાતી
        'Fizess elő a Premiumra!', // 匈牙利文 - magyar
        'Berlangganan Premium', // 印尼文 - Indonesia
        'Premium को सब्सक्राइब करें', // 印地文 - हिन्दी
        'Suscríbete a Premium', // 西班牙文 - español
        'Pretplatite se na Premium', // 克羅埃西亞文 - hrvatski
        'Premiumಗೆ ಸಬ್‌ಸ್ರೈಬ್ ಮಾಡಿ', // 坎那達文 - ಕನ್ನಡ
        'הרשמה ל-Premium', // 希伯來文 - עברית
        'Εγγραφή στο Premium', // 希臘文 - Ελληνικά
        'Premium-க்குச் சப்ஸ்கிரைப் செய்', // 坦米爾文 - தமிழ்
        'Premium-এ সাবস্ক্রাইব করুন', // 孟加拉文 - বাংলা
        'Abonnez‑vous à Premium', // 法文 - français
        'اشتراک در Premium', // 波斯文 - فارسی
        'Zasubskrybuj usługę Premium', // 波蘭文 - polski
        'Tilaa Premium', // 芬蘭文 - suomi
        'الاشتراك في Premium', // 阿拉伯文 - العربية
        'الاشتراك في Premium', // 阿拉伯文 (陰性) - العربية (مؤنث)
        'Подпишитесь на Premium', // 俄文 - русский
        'Абонирайте се за Premium', // 保加利亞文 - български
        'Subscribe to Premium', // 英文 - English
        'Subscribe to Premium', // 英文(英國) - British English
        '', // 挪威文 - norsk
        'สมัครสมาชิก Premium', // 泰文 - ไทย
        'Передплатити Premium', // 烏克蘭文 - українська
        '', // 烏都文 (測試版) - اردو
        'Langgan Premium', // 馬來文 - Melayu
        'Premium ची सदस्यता घ्या', // 馬拉地文 - मराठी
        'Přihlaste se k odběru předplatného Premium', // 捷克文 - čeština X
        'Abonneren op Premium', // 荷蘭文 - Nederlands
        'Zaregistrujte sa do služby Premium', // 斯洛伐克文 - slovenčina
        'Mag-subscribe sa Premium', // 菲律賓文 - Filipino
        'Đăng ký gói Premium', // 越南文 - Tiếng Việt
        'Претплати се на Premium', // 塞爾維亞文 - српски
        '', // 愛爾蘭文 (測試版) - Gaeilge
        'Prenumerera på Premium', // 瑞典文 - svenska
        'Abbonati a Premium', // 義大利文 - italiano
        'Assine o Premium', // 葡萄牙文 - português
        'Premium abonnieren', // 德文 - Deutsch
        '訂閱 Premium', // 繁體中文
        'Premium 구독하기', // 韓文 - 한국어
        '订阅 Premium', // 简体中文
        'Abonează-te la Premium', // 羅馬尼亞文 - română
    ];


    var selectors = phrases.map(function(phrase) {
        if (phrase !== '') {
            return 'aside[aria-label="' + phrase + '"]';
        } else {
            return '';
        }
    }).filter(selector => selector !== '').join(', ');

    var cssRules = '';
    if (settings.hideSelectors) {
        cssRules += selectors + '{ display: none !important; }';
    }
    if (settings.hideGrok) {
        cssRules += 'a[href="/i/grok"] { display: none !important; }';
    }
    if (settings.hidePremiumSignUp) {
        cssRules += 'a[href="/i/premium_sign_up"] { display: none !important; }';
    }
    if (settings.hideExplore) {
        cssRules += 'a[href="/explore"] { display: none !important; }';
    }
    if (settings.hideNotifications) {
        cssRules += 'a[href="/notifications"] { display: none !important; }';
    }
    if (settings.hideBookmarks) {
        cssRules += 'a[href="/i/bookmarks"] { display: none !important; }';
    }
    if (settings.hideMessages) {
        cssRules += 'a[href="/messages"] { display: none !important; }';
    }

    addGlobalStyle(cssRules);
})();