Reddit Default Sort

Automatically sets Reddit's default sorting order for home and subreddits.

À partir de 2025-02-11. Voir la dernière version.

Vous devrez installer une extension telle que Tampermonkey, Greasemonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Userscripts pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey pour installer ce script.

Vous devrez installer une extension de gestionnaire de script utilisateur pour installer ce script.

(J'ai déjà un gestionnaire de scripts utilisateur, laissez-moi l'installer !)

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

(J'ai déjà un gestionnaire de style utilisateur, laissez-moi l'installer!)

// ==UserScript==
// @name         Reddit Default Sort
// @version      1.1.0
// @description  Automatically sets Reddit's default sorting order for home and subreddits.
// @author       yodaluca23
// @license      MIT
// @match        *://*.reddit.com/*
// @grant        GM_getValue
// @grant        GM_setValue
// @namespace https://greasyfork.org/users/1315976
// ==/UserScript==

(function() {
    'use strict';

    // Default values
    const defaultHomePageSort = "new";
    const defaultSubredditSort = "new";
    // This allows you to use the Reddit filters temporariliy, without it redirecting you to the default
    let lastUrl = "";

    // Function to get the stored sort option, or the default if none is stored.
    function getSortOption(key, defaultValue) {
        let value = GM_getValue(key);
        return value === undefined ? defaultValue : value;
    }

    // Get the stored sort options
    let homePageSort = getSortOption("homePageSort", defaultHomePageSort);
    let subredditSort = getSortOption("subredditSort", defaultSubredditSort);

    // Function to redirect if necessary
    function redirectIfNeeded() {
        const currentUrl = window.location.href;

        // Check for home page URLs
        const homeUrls = [
            "https://www.reddit.com/",
            "https://www.reddit.com/?feed=home",
            "https://www.reddit.com/best/?feed=home",
            "https://www.reddit.com/hot/?feed=home",
            "https://www.reddit.com/top/?feed=home",
            "https://www.reddit.com/new/?feed=home",
            "https://www.reddit.com/rising/?feed=home"
        ];

        const homeTargetUrl = `https://www.reddit.com/${homePageSort}/?feed=home`;

        if (homeUrls.includes(currentUrl) && currentUrl !== homeTargetUrl && !homeUrls.includes(lastUrl)) {
            window.location.replace(homeTargetUrl);
            return;
        }

        // Check for subreddit URLs
        const subredditPattern = /https:\/\/www\.reddit\.com\/r\/([^/]+)(\/(hot|new|top|best|rising))?(\/)?(\?.*)?$/;

        if (subredditPattern.test(currentUrl)) {
            const match = currentUrl.match(subredditPattern);
            const subredditName = match[1];

            // Check if were still on the same sub indicates the user only changed their sort we should not set it back
            if (subredditPattern.test(lastUrl)) {
              const matchLast = lastUrl.match(subredditPattern);
              if (subredditName == matchLast[1]) {
                return;
              }
            }

            const targetUrl = `https://www.reddit.com/r/${subredditName}/${subredditSort}`;
            const altTargetUrl = `https://www.reddit.com/r/${subredditName}/${subredditSort}/`;

            if (currentUrl !== targetUrl && currentUrl !== altTargetUrl) {
                window.location.replace(targetUrl);
            }
        }
    }

    // Function to create the settings UI
    function createSettingsUI() {
        // Create the settings container
        const settingsContainer = document.createElement('div');
        settingsContainer.style.position = 'fixed';
        settingsContainer.style.top = '50%';
        settingsContainer.style.left = '50%';
        settingsContainer.style.transform = 'translate(-50%, -50%)';
        settingsContainer.style.backgroundColor = 'white';
        settingsContainer.style.border = '1px solid #ccc';
        settingsContainer.style.padding = '15px';
        settingsContainer.style.borderRadius = '10px';
        settingsContainer.style.boxShadow = '0px 4px 10px rgba(0, 0, 0, 0.2)';
        settingsContainer.style.zIndex = '1000';
        settingsContainer.style.minWidth = '250px';
        settingsContainer.style.textAlign = 'center';

        // Home page sort select
        const homePageLabel = document.createElement('label');
        homePageLabel.textContent = 'Home Page Sort:';
        const homePageSelect = document.createElement('select');
        homePageSelect.id = 'homePageSortSelect';
        ['best', 'hot', 'top', 'new', 'rising'].forEach(option => {
            const opt = document.createElement('option');
            opt.value = option;
            opt.textContent = option.charAt(0).toUpperCase() + option.slice(1);
            homePageSelect.appendChild(opt);
        });
        homePageSelect.value = homePageSort;

        // Subreddit sort select
        const subredditLabel = document.createElement('label');
        subredditLabel.textContent = 'Subreddit Sort:';
        const subredditSelect = document.createElement('select');
        subredditSelect.id = 'subredditSortSelect';
        ['best', 'hot', 'top', 'new', 'rising'].forEach(option => {
            const opt = document.createElement('option');
            opt.value = option;
            opt.textContent = option.charAt(0).toUpperCase() + option.slice(1);
            subredditSelect.appendChild(opt);
        });
        subredditSelect.value = subredditSort;

        // Save button
        const saveButton = document.createElement('button');
        saveButton.textContent = 'Save Settings';
        saveButton.addEventListener('click', () => {
            homePageSort = document.getElementById('homePageSortSelect').value;
            subredditSort = document.getElementById('subredditSortSelect').value;

            GM_setValue("homePageSort", homePageSort);
            GM_setValue("subredditSort", subredditSort);

            alert('Settings Saved!');
            settingsContainer.remove(); // Remove the settings UI after saving
            redirectIfNeeded(); // Redirect immediately after saving
        });

        // Close button
        const closeButton = document.createElement('button');
        closeButton.textContent = 'Close';
        closeButton.addEventListener('click', () => {
            settingsContainer.remove();
        });

        // Append elements
        settingsContainer.appendChild(homePageLabel);
        settingsContainer.appendChild(homePageSelect);
        settingsContainer.appendChild(subredditLabel);
        settingsContainer.appendChild(subredditSelect);
        settingsContainer.appendChild(saveButton);
        settingsContainer.appendChild(closeButton);

        document.body.appendChild(settingsContainer);
    }

    // Add a button to the page to open the settings
    function addSettingsButton() {
        const container = document.querySelector('.pl-lg.gap-xs.flex.items-center.justify-end');

        if (!container) {
            console.warn("Sort Settings button: Target container not found.");
            return; // Exit if container is missing
        }

        const settingsButton = document.createElement('button');
        settingsButton.textContent = 'Sort Settings';
        settingsButton.style.marginLeft = '10px'; // Add spacing
        settingsButton.className = 'btn btn-primary'; // Reddit-style button class
        settingsButton.addEventListener('click', createSettingsUI);

        container.appendChild(settingsButton);
    }


    // Initialize
    addSettingsButton();
    redirectIfNeeded();

      // Function to monitor URL changes in single-page app
    function observeUrlChanges(callback) {
        lastUrl = location.href;

        new MutationObserver(() => {
            if (location.href !== lastUrl) {
                lastUrl = location.href;
                callback();
            }
        }).observe(document, { subtree: true, childList: true });

        // Also intercept history changes
        const pushState = history.pushState;
        const replaceState = history.replaceState;

        history.pushState = function() {
            pushState.apply(this, arguments);
            callback();
        };
        history.replaceState = function() {
            replaceState.apply(this, arguments);
            callback();
        };
    }

    // Run `redirectIfNeeded` whenever Reddit changes the page
    observeUrlChanges(redirectIfNeeded);

})();