Page Roulette

Bored? Click the dice and discover a random interesting website

คุณจะต้องติดตั้งส่วนขยาย เช่น Tampermonkey, Greasemonkey หรือ Violentmonkey เพื่อติดตั้งสคริปต์นี้

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

คุณจะต้องติดตั้งส่วนขยาย เช่น Tampermonkey หรือ Violentmonkey เพื่อติดตั้งสคริปต์นี้

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         Page Roulette
// @namespace    http://tampermonkey.net/
// @version      11.5
// @description  Bored? Click the dice and discover a random interesting website
// @author       Mustafa Hakan
// @icon https://img.icons8.com/fluency/48/maintenance.png
// @match        *://*/*
// @grant        GM_openInTab
// @grant        GM_addStyle
// @run-at       document-end
// ==/UserScript==

(function() {
    'use strict';

    const SITES = [
        { n: 'This Is Sand', u: 'https://thisissand.com', d: 'Paint with sand' },
        { n: 'Silk', u: 'http://weavesilk.com', d: 'Interactive light drawing' },
        { n: 'Pointer Pointer', u: 'https://pointerpointer.com', d: 'Cursor tracking fun' },
        { n: 'Hacker Typer', u: 'https://hackertyper.com', d: 'Pretend to be a hacker' },
        { n: 'Scale of Universe', u: 'https://htwins.net/scale2/', d: 'Zoom from quarks to galaxies' },
        { n: 'Quick Draw', u: 'https://quickdraw.withgoogle.com', d: 'AI guesses your drawing' },
        { n: 'A Soft Murmur', u: 'https://asoftmurmur.com', d: 'Ambient sounds' },
        { n: 'Radio Garden', u: 'http://radio.garden', d: 'Explore world radios' },
        { n: 'Window Swap', u: 'https://window-swap.com', d: 'Peek through windows worldwide' },
        { n: 'Patatap', u: 'https://patatap.com', d: 'Visual sound toy' },
        { n: '2048', u: 'https://play2048.co', d: 'Merge number tiles' },
        { n: 'Little Alchemy', u: 'https://littlealchemy.com', d: 'Combine elements' },
        { n: 'Neal Fun', u: 'https://neal.fun', d: 'Oddly satisfying experiments' },
        { n: 'Rainy Mood', u: 'https://rainymood.com', d: 'Rain sounds' },
        { n: 'The Useless Web', u: 'https://theuselessweb.com', d: 'Random weird sites' },
        { n: 'Bored Panda', u: 'https://www.boredpanda.com', d: 'Funny & creative content' },
        { n: 'Zoom Quilt', u: 'https://zoomquilt.org', d: 'Infinite zoom illusion' },
        { n: 'Staggering Beauty', u: 'https://staggeringbeauty.com', d: 'Wiggle it!' },
        { n: 'Cat Bounce', u: 'https://cat-bounce.com', d: 'Bouncing cats' },
        { n: 'Remove BG', u: 'https://www.remove.bg', d: 'Remove image backgrounds' },
        { n: 'Photopea', u: 'https://www.photopea.com', d: 'Online Photoshop' },
        { n: 'Every Noise', u: 'https://everynoise.com', d: 'All music genres' },
        { n: 'Flight Radar', u: 'https://www.flightradar24.com', d: 'Live air traffic' },
        { n: 'NASA APOD', u: 'https://apod.nasa.gov/apod/', d: 'Daily astronomy picture' },
        { n: 'GeoGuessr', u: 'https://www.geoguessr.com/free', d: 'Guess the location' },
        { n: 'Coolors', u: 'https://coolors.co', d: 'Color palette generator' },
        { n: 'Poolside FM', u: 'https://poolside.fm', d: 'Retro summer radio' },
        { n: 'This Person Does Not Exist', u: 'https://thispersondoesnotexist.com', d: 'AI‑generated faces' },
        { n: 'Spend Elon Money', u: 'https://neal.fun/spend/', d: 'Spend billions' },
        { n: 'Internet Archive', u: 'https://archive.org', d: 'Digital library' }
    ];

    let spinning = false;

    GM_addStyle(`
        #r-trigger {
            position: fixed;
            bottom: 24px;
            right: 24px;
            width: 48px;
            height: 48px;
            background-color: #2a2a2a;
            background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Crect x='5' y='5' width='90' height='90' rx='20' fill='%23ffffff'/%3E%3Ccircle cx='30' cy='30' r='10' fill='%23000'/%3E%3Ccircle cx='70' cy='70' r='10' fill='%23000'/%3E%3C/svg%3E");
            background-size: 36px;
            background-repeat: no-repeat;
            background-position: center;
            border: 1px solid #555;
            border-radius: 12px;
            cursor: pointer;
            z-index: 2147483644;
            box-shadow: 0 4px 12px rgba(0,0,0,0.5);
            transition: transform 0.2s ease, border-color 0.2s, box-shadow 0.2s;
        }
        #r-trigger:hover {
            transform: scale(1.08);
            border-color: #888;
            box-shadow: 0 6px 18px rgba(0,0,0,0.6);
        }
        #r-trigger:active {
            transform: scale(0.96);
            transition: transform 0.1s;
        }
        #r-panel {
            position: fixed;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%);
            background: #1e1e1e;
            border: 1px solid #444;
            border-radius: 16px;
            padding: 24px;
            z-index: 2147483646;
            font-family: system-ui, -apple-system, sans-serif;
            color: #ddd;
            min-width: 320px;
            text-align: center;
            box-shadow: 0 20px 50px rgba(0,0,0,0.8);
            animation: rFadeIn 0.25s ease;
            user-select: none;
        }
        @keyframes rFadeIn {
            from { opacity: 0; transform: translate(-50%, -48%); }
            to { opacity: 1; transform: translate(-50%, -50%); }
        }
        @keyframes rPop {
            0%,100% { transform: scale(1); }
            50% { transform: scale(1.04); }
        }
        #r-panel .panel-title {
            font-weight: 600;
            font-size: 17px;
            margin-bottom: 12px;
            color: #ccc;
        }
        #r-display {
            min-height: 60px;
            padding: 12px;
            background: rgba(255,255,255,0.03);
            border-radius: 12px;
            margin: 10px 0;
            display: flex;
            align-items: center;
            justify-content: center;
            flex-direction: column;
            transition: background 0.2s;
        }
        #r-display .placeholder {
            color: #888;
        }
        #r-spin, #r-go, #r-close {
            width: 100%;
            padding: 12px;
            border-radius: 10px;
            border: 1px solid #555;
            background: #333;
            color: #eee;
            font-size: 15px;
            cursor: pointer;
            margin: 6px 0;
            transition: background 0.2s, border-color 0.2s, color 0.2s;
        }
        #r-spin:hover, #r-go:hover, #r-close:hover {
            background: #444;
            border-color: #777;
        }
        #r-spin:active, #r-go:active, #r-close:active {
            background: #2a2a2a;
        }
        #r-go {
            background: #444;
            display: none;
        }
        #r-close {
            background: transparent;
            border-color: #444;
            color: #888;
        }
        #r-close:hover {
            color: #ccc;
            background: rgba(255,255,255,0.05);
        }
    `);

    function spin() {
        if (spinning) return;
        spinning = true;
        const display = document.getElementById('r-display');
        const goBtn = document.getElementById('r-go');

        let count = 0;
        const interval = setInterval(() => {
            const s = SITES[Math.floor(Math.random() * SITES.length)];
            display.innerHTML = `<div style="font-size:28px;">${s.n}</div><div style="color:#aaa;font-size:12px;">${s.d}</div>`;
            count++;
            if (count >= 25) {
                clearInterval(interval);
                const final = SITES[Math.floor(Math.random() * SITES.length)];
                display.innerHTML = `<div style="font-size:32px;">${final.n}</div><div style="color:#aaa;font-size:12px;">${final.d}</div>`;
                display.style.animation = 'rPop 0.4s';
                setTimeout(() => display.style.animation = '', 400);
                goBtn.style.display = 'block';
                goBtn.onclick = () => GM_openInTab(final.u, { active: true });
                spinning = false;
            }
        }, 70);
    }

    function createPanel() {
        const existing = document.getElementById('r-panel');
        if (existing) existing.remove();

        const panel = document.createElement('div');
        panel.id = 'r-panel';
        panel.innerHTML = `
            <div class="panel-title">🎲 Page Roulette</div>
            <div id="r-display"><div class="placeholder">Ready to spin</div></div>
            <button id="r-spin">Spin</button>
            <button id="r-go">Go!</button>
            <button id="r-close">Close</button>
        `;
        document.body.appendChild(panel);

        document.getElementById('r-spin').onclick = spin;
        document.getElementById('r-close').onclick = () => panel.remove();
    }

    function createTrigger() {
        if (document.getElementById('r-trigger')) return;
        const trigger = document.createElement('div');
        trigger.id = 'r-trigger';
        trigger.title = 'Page Roulette (Ctrl+Shift+R)';
        trigger.addEventListener('click', () => {
            if (document.getElementById('r-panel')) {
                document.getElementById('r-panel').remove();
            } else {
                createPanel();
            }
        });
        document.body.appendChild(trigger);
    }

    document.addEventListener('keydown', e => {
        if (e.ctrlKey && e.shiftKey && e.key === 'R') {
            e.preventDefault();
            if (document.getElementById('r-panel')) {
                document.getElementById('r-panel').remove();
            } else {
                createPanel();
            }
        }
    });

    setTimeout(createTrigger, 800);
})();