CracksHash Magnet Getter with Popup Blocker

Adds a floating button that gets the magnet link when pressed and blocks pop-up windows

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         CracksHash Magnet Getter with Popup Blocker
// @namespace    http://tampermonkey.net/
// @version      1.7
// @description  Adds a floating button that gets the magnet link when pressed and blocks pop-up windows
// @author       ThatDudeJBob
// @match        *://crackshash.com/*
// @grant        none
// @license MIT
// ==/UserScript==

(function() {
    'use strict';

    // Configuration
    const buttonConfig = {
        text: localStorage.getItem('buttonText') || 'Click Magnet',
        backgroundColor: localStorage.getItem('buttonBgColor') || '#007bff',
        textColor: 'white',
        initialTop: localStorage.getItem('buttonTop') || '10px',
        initialRight: localStorage.getItem('buttonRight') || '10px'
    };

    // Helper function to create and style elements
    function createElement(type, styles, textContent = '') {
        const element = document.createElement(type);
        Object.assign(element.style, styles);
        element.textContent = textContent;
        return element;
    }

    // Function to show overlay warning
    function showOverlayWarning(message, type) {
        const overlay = createElement('div', {
            position: 'fixed',
            top: '10px',
            left: '50%',
            transform: 'translateX(-50%)',
            backgroundColor: type === 'error' ? 'rgba(245, 0, 0, 0.5)' : 'rgba(0, 0, 0, 0.5)',
            color: 'white',
            padding: '10px',
            borderRadius: '5px',
            zIndex: '1000',
            transition: 'opacity 1s',
            opacity: '1'
        }, message);
        document.body.appendChild(overlay);

        setTimeout(() => {
            overlay.style.opacity = '0';
            setTimeout(() => document.body.removeChild(overlay), 1000);
        }, 2000);
    }

    // Function to toggle settings menu visibility
    function toggleSettingsMenu() {
        settingsMenu.style.display = settingsMenu.style.display === 'none' ? 'block' : 'none';
    }

    // Save settings
    function saveSettings() {
        localStorage.setItem('buttonText', buttonTextInput.value);
        localStorage.setItem('buttonBgColor', buttonBgColorInput.value);
        localStorage.setItem('buttonTop', buttonTopInput.value + 'px');
        localStorage.setItem('buttonRight', buttonRightInput.value + 'px');
        button.innerText = buttonTextInput.value;
        button.style.backgroundColor = buttonBgColorInput.value;
        button.style.top = buttonTopInput.value + 'px';
        button.style.right = buttonRightInput.value + 'px';
        settingsMenu.style.display = 'none';
    }

    // Block pop-up windows, except for settings menu interactions
    function preventPopup(e) {
        if (e.target.tagName === 'A' && (e.target.href.startsWith('magnet:') || new URL(e.target.href).hostname === window.location.hostname)) {
            return;
        }

        if (settingsMenu.contains(e.target) || e.target === settingsButton) {
            return;
        }

        e.preventDefault();
    }

    // Create the floating button
    const button = createElement('button', {
        position: 'fixed',
        top: buttonConfig.initialTop,
        right: buttonConfig.initialRight,
        zIndex: '1000',
        backgroundColor: buttonConfig.backgroundColor,
        color: buttonConfig.textColor,
        border: 'none',
        padding: '10px',
        borderRadius: '5px',
        cursor: 'pointer',
        width: 'auto',
        whiteSpace: 'nowrap'
    }, buttonConfig.text);
    document.body.appendChild(button);

    // Create the settings button
    const settingsButton = createElement('button', {
        position: 'fixed',
        top: '10px',
        right: '50px', // Adjusted to avoid overlap
        zIndex: '1000',
        backgroundColor: '#555',
        color: 'white',
        border: 'none',
        padding: '10px',
        borderRadius: '5px',
        cursor: 'pointer',
        width: 'auto',
        whiteSpace: 'nowrap'
    }, '?');
    document.body.appendChild(settingsButton);

    // Create the settings menu
    const settingsMenu = createElement('div', {
        position: 'fixed',
        top: '40px',
        right: '10px',
        zIndex: '1000',
        backgroundColor: '#333',
        color: 'white',
        padding: '10px',
        borderRadius: '5px',
        display: 'none'
    });
    document.body.appendChild(settingsMenu);

    const buttonTextInput = createElement('input', { display: 'block', marginBottom: '10px' });
    buttonTextInput.type = 'text';
    buttonTextInput.placeholder = 'Button Text';
    buttonTextInput.value = buttonConfig.text;
    settingsMenu.appendChild(buttonTextInput);

    const buttonBgColorInput = createElement('input', { display: 'block', marginBottom: '10px' });
    buttonBgColorInput.type = 'color';
    buttonBgColorInput.value = buttonConfig.backgroundColor;
    settingsMenu.appendChild(buttonBgColorInput);

    const buttonTopInput = createElement('input', { display: 'block', marginBottom: '10px' });
    buttonTopInput.type = 'number';
    buttonTopInput.placeholder = 'Top Position (px)';
    buttonTopInput.value = parseInt(buttonConfig.initialTop, 10);
    settingsMenu.appendChild(buttonTopInput);

    const buttonRightInput = createElement('input', { display: 'block', marginBottom: '10px' });
    buttonRightInput.type = 'number';
    buttonRightInput.placeholder = 'Right Position (px)';
    buttonRightInput.value = parseInt(buttonConfig.initialRight, 10);
    settingsMenu.appendChild(buttonRightInput);

    const saveButton = createElement('button', {
        marginTop: '10px',
        backgroundColor: '#007bff',
        color: 'white',
        border: 'none',
        padding: '5px',
        borderRadius: '5px',
        cursor: 'pointer'
    }, 'Save');
    settingsMenu.appendChild(saveButton);

    settingsButton.addEventListener('click', toggleSettingsMenu);
    saveButton.addEventListener('click', saveSettings);

    document.addEventListener('click', (event) => {
        if (!settingsMenu.contains(event.target) && event.target !== settingsButton) {
            settingsMenu.style.display = 'none';
        }
    });

    // Add click event to the button
    button.addEventListener('click', () => {
        const magnetLink = document.querySelector('a[href^="magnet:"]');
        if (magnetLink) {
            const originalBeforeUnload = window.onbeforeunload; // Backup the original onbeforeunload handler
            window.onbeforeunload = null; // Allow navigation for this action
            magnetLink.click();
            window.onbeforeunload = originalBeforeUnload; // Restore the original handler
        } else {
            showOverlayWarning('No magnet link found on this page.', 'error');
        }
    });

    // Override window.open to detect blocked pop-ups
    const originalWindowOpen = window.open;
    window.open = function(url, name, specs) {
        const newWindow = originalWindowOpen(url, name, specs);
        if (!newWindow || newWindow.closed || typeof newWindow.closed === 'undefined') {
            showOverlayWarning('Blocked a pop-up window.', 'error');
        }
        return newWindow;
    };

    window.addEventListener('beforeunload', preventPopup);
    window.addEventListener('unload', preventPopup);
    document.addEventListener('click', preventPopup);
})();