extancs / Bypass SFL

// ==UserScript==
// @name         Bypass SFL
// @namespace    bypass.sfl
// @version      1.0
// @description  Auto bypass SFL.GL. Skip timers, block ads, and click all buttons until the OPEN LINK page.
// @author       traaa
// @license      MIT
// @icon         https://i.postimg.cc/P5VBTtwZ/20260913-000711.png
// @match        *://sfl.gl/*
// @match        *://app.khaddavi.net/*
// @run-at       document-end
// @grant        none
// @noframes
// @updateURL    https://openuserjs.org/meta/extancs/Bypass_SFL.meta.js
// @downloadURL  https://openuserjs.org/install/extancs/Bypass_SFL.user.js
// ==/UserScript==

(function () {
    'use strict';

    var DEBUG = true;
    var CLICK_DELAY = 700;
    var SCAN_INTERVAL = 500;
    var scanInterval = null;

    function log(message) {
        if (DEBUG) console.log('[Bypass SFL] ' + message);
    }

    var state = window.name;

    if (!state || state.indexOf('sfl_') !== 0) {
        state = 'sfl_idle';
        window.name = state;
    }

    var _hostCheck = window.location.hostname.toLowerCase();
    var _urlCheck = window.location.href.toLowerCase();
    var _isFinalUrl = _urlCheck.indexOf('ready/go') !== -1 || _urlCheck.indexOf('open-link') !== -1;
    if (state === 'sfl_success' && (_hostCheck === 'sfl.gl' || _hostCheck === 'www.sfl.gl') && !_isFinalUrl) {
        state = 'sfl_idle';
        window.name = state;
    }

    var isEnabled = state === 'sfl_running' || state === 'sfl_success';
    var isSuccess = state === 'sfl_success';

    function setState(newState) {
        window.name = newState;
        isEnabled = newState === 'sfl_running' || newState === 'sfl_success';
        isSuccess = newState === 'sfl_success';
        log('State: ' + newState);
    }

    function isFinalPageNow() {
        var url = window.location.href;
        if (url.indexOf('ready/go') !== -1) return true;
        if (url.indexOf('open-link') !== -1) return true;
        var bodyText = (document.body && document.body.innerText || '').toLowerCase();
        if (bodyText.indexOf('open link') !== -1) return true;
        return false;
    }

    window.open = function() { return null; };
    window.onbeforeunload = null;
    window.addEventListener('beforeunload', function(e) {
        e.stopImmediatePropagation();
    }, true);

    document.addEventListener('click', function(e) {
        var link = e.target.closest('a[target="_blank"]');
        if (link && link.href) {
            e.preventDefault();
            window.location.href = link.href;
        }
    }, true);

    function skipTimer() {
        if (!window.__timerPatched) {
            window.__timerPatched = true;

            var origSetTimeout = window.setTimeout;
            var origSetInterval = window.setInterval;

            window.setTimeout = function(fn, delay) {
                if (delay > 100) delay = 10;
                return origSetTimeout(fn, delay);
            };

            window.setInterval = function(fn, delay) {
                if (delay > 100) delay = 10;
                return origSetInterval(fn, delay);
            };

            var origDate = Date;
            var startTime = origDate.now();

            window.Date.now = function() {
                return startTime + (origDate.now() - startTime) * 10;
            };
        }

        var timers = document.querySelectorAll(
            '[class*="timer"], [id*="timer"], ' +
            '[class*="countdown"], [id*="countdown"], ' +
            '[class*="waktu"], [id*="waktu"], ' +
            '[class*="detik"], [id*="detik"]'
        );

        for (var i = 0; i < timers.length; i++) {
            timers[i].style.display = 'none';
            timers[i].innerText = '0';
        }

        var all = document.querySelectorAll('*');
        for (var j = 0; j < all.length; j++) {
            var el = all[j];
            if (el.children.length === 0) {
                var text = (el.innerText || '').trim();
                if (/^\d+$/.test(text) && parseInt(text) <= 60) {
                    el.innerText = '0';
                    el.style.display = 'none';
                }
            }
        }

        var canvases = document.querySelectorAll('canvas');
        for (var c = 0; c < canvases.length; c++) {
            canvases[c].click();
        }
    }

    function textOf(element) {
        if (!element) return '';
        return (
            element.innerText ||
            element.textContent ||
            element.value ||
            element.getAttribute('aria-label') ||
            ''
        ).replace(/\s+/g, ' ').trim().toLowerCase();
    }

    function visible(element) {
        if (!element) return false;
        var style = window.getComputedStyle(element);
        var rect = element.getBoundingClientRect();
        return (
            style.display !== 'none' &&
            style.visibility !== 'hidden' &&
            parseFloat(style.opacity || '1') > 0 &&
            rect.width > 0 &&
            rect.height > 0
        );
    }

    function disabled(element) {
        return (
            element.disabled === true ||
            element.hasAttribute('disabled') ||
            element.getAttribute('aria-disabled') === 'true' ||
            element.classList.contains('disabled')
        );
    }

    function getElements() {
        var selectors = ['button', 'a', 'input[type="button"]', 'input[type="submit"]', '[role="button"]'];
        var result = [];
        for (var i = 0; i < selectors.length; i++) {
            var nodes = document.querySelectorAll(selectors[i]);
            for (var j = 0; j < nodes.length; j++) {
                result.push(nodes[j]);
            }
        }
        return result;
    }

    function findButton(names) {
        var elements = getElements();
        for (var i = 0; i < elements.length; i++) {
            if (!visible(elements[i]) || disabled(elements[i])) continue;
            var text = textOf(elements[i]);
            for (var j = 0; j < names.length; j++) {
                if (text.indexOf(names[j]) !== -1) {
                    return elements[i];
                }
            }
        }
        return null;
    }

    function safeClick(element, name) {
        if (!element) return false;
        if (!visible(element) || disabled(element)) return false;
        log('Click: ' + name);
        try {
            element.scrollIntoView({ behavior: 'smooth', block: 'center' });
        } catch (e) {}
        setTimeout(function () {
            if (!document.contains(element)) return;
            if (!visible(element) || disabled(element)) return;
            try {
                element.click();
            } catch (e) {
                try {
                    element.dispatchEvent(new MouseEvent('click', {
                        bubbles: true, cancelable: true, view: window
                    }));
                } catch (err) {
                    log('Click failed: ' + name);
                }
            }
        }, CLICK_DELAY);
        return true;
    }

    function stepOpen() {
        var button = findButton(['open']);
        if (button) return safeClick(button, 'Open');
        return false;
    }

    function stepNext() {
        var button = findButton(['next']);
        if (button) return safeClick(button, 'Next');
        return false;
    }

    function stepSecondOpen() {
        var button = findButton(['open']);
        if (button) return safeClick(button, 'Open #2');
        return false;
    }

    function stepContinue() {
        var button = findButton(['continue', 'continue to link']);
        if (button) return safeClick(button, 'Continue');
        return false;
    }

    function stepGoToLink() {
        var button = findButton(['go to link', 'go to link now', 'get link']);
        if (button) return safeClick(button, 'Go to Link');
        return false;
    }

    function run() {
        if (!isEnabled) return;

        skipTimer();

        if (isFinalPageNow()) {
            if (!isSuccess) {
                setState('sfl_success');
                updateButtonState('success');
                log('Reached final page - SUCCESS');
            }

            var finalBtn = findButton(['open link', 'open link now']);
            if (finalBtn) {
                if (!finalBtn.dataset.bypassClicked) {
                    finalBtn.dataset.bypassClicked = 'true';
                    log('Final page: waiting 2 seconds before clicking OPEN LINK');

                    setTimeout(function() {
                        if (!document.contains(finalBtn)) return;
                        if (!visible(finalBtn) || disabled(finalBtn)) return;
                        log('Click: OPEN LINK (after 2s delay)');
                        try {
                            finalBtn.click();
                        } catch (e) {
                            try {
                                finalBtn.dispatchEvent(new MouseEvent('click', {
                                    bubbles: true, cancelable: true, view: window
                                }));
                            } catch (err) {
                                log('Click failed: OPEN LINK');
                            }
                        }
                    }, 2000);
                }
            }
            return;
        }

        var host = window.location.hostname.toLowerCase();

        if (host === 'sfl.gl' || host === 'www.sfl.gl') {
            stepOpen();
            return;
        }

        if (host === 'app.khaddavi.net' || host === 'www.app.khaddavi.net') {
            if (stepGoToLink()) return;
            if (stepContinue()) return;
            if (stepNext()) return;
            stepSecondOpen();
        }
    }

    var buttonEl = null;

    function createGUI() {
        var oldGui = document.getElementById('bypass-sfl-gui');
        if (oldGui) oldGui.remove();

        var container = document.createElement('div');
        container.id = 'bypass-sfl-gui';
        container.style.cssText = [
            'position: fixed !important',
            'bottom: 20px !important',
            'right: 20px !important',
            'z-index: 2147483647 !important',
            'font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif',
            'user-select: none',
            'pointer-events: auto',
            'display: block !important',
            'visibility: visible !important',
            'opacity: 1 !important',
        ].join(';');

        buttonEl = document.createElement('button');
        buttonEl.id = 'bypass-sfl-button';
        buttonEl.style.cssText = [
            'padding: 12px 24px',
            'border: none',
            'border-radius: 8px',
            'font-size: 14px',
            'font-weight: 700',
            'cursor: pointer',
            'box-shadow: 0 4px 12px rgba(0,0,0,0.3)',
            'transition: all 0.2s ease',
            'display: flex',
            'align-items: center',
            'gap: 8px',
            'letter-spacing: 0.5px',
        ].join(';');

        buttonEl.onclick = function() {
            if (isSuccess) {
                setState('sfl_idle');
                stopScan();
                updateButtonState('off');
                return;
            }
            if (!isEnabled) {
                setState('sfl_running');
                updateButtonState('starting');
                startScan();
            } else {
                setState('sfl_idle');
                updateButtonState('off');
                stopScan();
            }
        };

        container.appendChild(buttonEl);
        var target = document.documentElement || document.body;
        target.appendChild(container);

        var guiObserver = new MutationObserver(function() {
            if (!document.getElementById('bypass-sfl-gui')) {
                var newTarget = document.documentElement || document.body;
                if (newTarget) {
                    newTarget.appendChild(container);
                }
            }
        });
        guiObserver.observe(document.documentElement, { childList: true, subtree: false });
    }

    function updateButtonState(stateName) {
        if (!buttonEl) return;

        if (stateName === 'off') {
            buttonEl.style.background = '#dc2626';
            buttonEl.style.color = '#ffffff';
            buttonEl.innerHTML = '▶️ Start';
        } else if (stateName === 'starting') {
            buttonEl.style.background = '#16a34a';
            buttonEl.style.color = '#ffffff';
            buttonEl.innerHTML = '⏳ Starting...';
        } else if (stateName === 'success') {
            buttonEl.style.background = '#16a34a';
            buttonEl.style.color = '#ffffff';
            buttonEl.innerHTML = '✅ Successful';
        }
    }

    function startScan() {
        if (scanInterval) return;
        scanInterval = setInterval(run, SCAN_INTERVAL);
        run();
    }

    function stopScan() {
        if (scanInterval) {
            clearInterval(scanInterval);
            scanInterval = null;
        }
    }

    function init() {
        if (document.body) {
            if (isEnabled && isFinalPageNow()) {
                setState('sfl_success');
            }
            createGUI();

            if (isSuccess && isFinalPageNow()) {
                updateButtonState('success');
            } else if (isEnabled) {
                updateButtonState('starting');
                startScan();
            } else {
                updateButtonState('off');
            }
        } else {
            document.addEventListener('DOMContentLoaded', function() {
                if (isEnabled && isFinalPageNow()) {
                    setState('sfl_success');
                }
                createGUI();

                if (isSuccess && isFinalPageNow()) {
                    updateButtonState('success');
                } else if (isEnabled) {
                    updateButtonState('starting');
                    startScan();
                } else {
                    updateButtonState('off');
                }
            });
        }
    }

    init();

})();