steamfaucet / Hourly Faucets Rotator

// ==UserScript==
// @name         Hourly Faucets Rotator
// @namespace    Hourly Faucets Rotator
// @version      0.2
// @description  Script to claim faucets
// @author       steamfaucet
// @match        https://*.coinfaucet.io/*
// @match        https://*.freematic.com/*
// @match        https://*.freecardano.com/*
// @match        https://*.freenem.com/*
// @match        https://*.freebitcoin.io/*
// @match        https://*.freesteam.io/*
// @match        https://*.freetether.com/*
// @match        https://*.freeusdcoin.com/*
// @match        https://*.freepancake.com/*
// @match        https://*.freebinancecoin.com/*
// @match        https://*.free-tron.com/*
// @match        https://*.freeethereum.com/*
// @match        https://*.freedash.io/*
// @match        https://*.freeneo.io/*
// @match        https://*.free-doge.com/*
// @match        https://*.free-ltc.com/*
// @match        https://*.freechainlink.io/*
// @match        https://*.freeshibainu.com/*
// @match        https://*.www.free-litecoin.com/*
// @match        https://*.www.free-ethereum.io/*
// @match        https://*.free-litecoin.com/*
// @match        https://*.free-ethereum.io/*
// @match        https://*.freebittorrent.com/*
// @match        https://*.freebfg.com/*
// @match        https://*.freebitco.in/*
// @match        https://*.www.flashfaucet.com/*
// @match        https://*.darkusd.com/*
// @match        https://*.freecryptom.com/*
// @match        https://freeth.in/*
// @match        https://bnbfree.in/*
// @match        https://freetrx.in/*
// @match        https://dogefree.in/*
// @match        https://btcfre.com/*
// @match        https://ethfre.com/*
// @match        https://freebnbnow.com/*
// @match        https://bnbpi.com/*
// @match        https://fredoge.com/*
// @match        https://tronths.com/*
// @match        https://freeudt.com/*
// @match        https://miningsol.com/*
// @match        https://maticfreee.com/*
// @match        https://bnbfe.com/*
// @match        https://freearb.co/*
// @match        https://www.bestchange.com/*
// @match        https://bnbpick.io/*
// @match        https://litepick.io/*
// @match        https://solpick.io/*
// @match        https://dogepick.io/*
// @match        https://tronpick.io/*
// @match        https://maticpick.io/*
// @connect      t.me
// @license      GPL-3.0-or-later; https://www.gnu.org/licenses/gpl-3.0.txt
// @noframes
// @grant        GM_xmlhttpRequest
// @grant        GM_getValue
// @grant        GM_setValue
// @grant        window.close
// ==/UserScript==
(function() {
    'use strict';

    //==========================================================================================================================
    
    // Enter yuor faucetpay wallet address and BNB wallet address wherever it is required

    var faucetpayEmail = ""; //Ex: var faucetpayEmail = "*****@gmail.com"
    var bitcoin="";           
    var binance="";
    var bitcoincash ="";
    var dash ="";
    var dogecoin ="";
    var digibyte="";
    var ethereum="";
    var feyorra="";
    var litecoin ="";
    var solana ="";
    var tron ="";
    var tether="";
    var zcash ="";
    var matic = "";
    var arbitrumWallet = "";
    
    //List of the faucet websites
    //Comment the lines of url if you don't use them
    //Enter your login and password if you wish you login automatically
    //You need to be careful while inputting the login and password in order to avoid account locks


    var websiteData = [

        {url : "https://coinfaucet.io", login: "", password: ""}, // Ex: login: "test@gmail.com", password: "test@123"
        {url : "https://freecardano.com", login: "", password: ""},
        {url : "https://freenem.com", login: "", password: ""},
        {url : "https://freebitcoin.io", login: "", password: ""},
        {url : "https://freesteam.io", login: "", password: ""},
        {url : "https://freetether.com", login: "", password: ""},
        {url : "https://freeusdcoin.com", login: "", password: ""},
        {url : "https://freebinancecoin.com", login: "", password: ""},
        {url : "https://free-tron.com", login: "", password: ""},
        {url : "https://freeethereum.com", login: "", password: ""},
        {url : "https://freedash.io", login: "", password: ""},
        {url : "https://freeneo.io", login: "", password: ""},
        {url : "https://free-doge.com", login: "", password: ""},
        {url : "https://free-ltc.com", login: "", password: ""},
        {url : "https://freeshibainu.com", login: "", password: ""},
        {url : "https://freeth.in", login: "", password: ""},
        {url : "https://bnbfree.in/", login: "", password: ""},
        {url : "https://freetrx.in/", login: "", password: ""},
        {url : "https://dogefree.in/", login: "", password: ""},
        {url : "https://freematic.com", login: "", password: ""},
        {url : "https://freepancake.com", login: "", password: ""},
        {url : "https://freecryptom.com", login: "", password: ""},
        {url : "https://freebfg.com", login: "", password: ""},
        {url : "https://freebittorrent.com", login: "", password: ""},
        {url : "https://www.free-litecoin.com", login: "", password: ""},
        {url : "https://www.free-ethereum.io", login: "", password: ""},
        {url : "https://freebitco.in", login: "", password: ""},
        {url : "https://bnbpick.io/faucet.php", login: "", password: ""},
        {url : "https://litepick.io/faucet.php", login: "", password: ""},
        {url : "https://solpick.io/faucet.php", login: "", password: ""},
        {url : "https://dogepick.io/faucet.php", login: "", password: ""},
        {url : "https://tronpick.io/faucet.php", login: "", password: ""},
        {url : "https://maticpick.io/faucet.php", login: "", password: ""},



        // No username or password is required for the below mentioned website list if you already entered your faucetpay wallet address above

        {url : "https://www.flashfaucet.com/faucet", address: faucetpayEmail},
        {url : "https://www.bestchange.com/", address: bitcoin},
        {url : "https://btcfre.com/", address: bitcoin},
        {url : "https://ethfre.com", address: ethereum},
        {url : "https://freebnbnow.com", address: binance},
        {url : "https://bnbpi.com/", address: binance},
        {url : "https://bnbfe.com/", address: binance},
        {url : "https://fredoge.com/", address: dogecoin},
        {url : "https://tronths.com/", address: tron},
        {url : "https://freeudt.com/", address: tether},
        {url : "https://miningsol.com/", address: solana},
        {url : "https://maticfreee.com/", address: matic},
        {url : "https://freearb.co", address: arbitrumWallet},

    ];


    //==========================================================================================================================


    //Do not run if it is a pop up window
    if(window.name){
        return;
    }

    if(window.history.length <3 && window.location.href.includes("dashboard")){
        window.close();
    }

    if(window.location.href.includes("games")){

        window.location.href="/free";
    }

    setInterval(function(){
        if(window.location.href.includes("games")){

            window.location.href="/free";
        }
    },10000);

    //Message selectors are for success or failure to move on to the next website
    //Add only domain name in website as mentioned below. Follow the same pattern.
    //Use arrays wherever it is required
    //Login Selectors are in the format email,password and button

    var websiteMap = [

        {website : ["freepancake.com","coinfaucet.io","freecardano.com", "freenem.com", "freebitcoin.io", "freesteam.io", "freetether.com",
                    "freeusdcoin.com", "freebinancecoin.com", "free-tron.com", "freeethereum.com", "freedash.io", "freeneo.io",
                    "free-doge.com", "free-ltc.com", "freechainlink.io", "freeshibainu.com","freebittorrent.com","freebfg.com",
                    "freecryptom.com","freematic.com"],
         defaultButtonSelectors: [".p-button.p-component.p-button-lg",".main-button-2.roll-button.bg-2",".btn.btn-primary.text-dark.w-100.toggleLogin.rounded-xl"],
         loginSelectors:[".form-control[name=email]",".form-control[name=password]","#login-btn"],
         allMessageSelectors: [".alert.alert-success",".alert.alert-danger",".result"],
         timeoutMessageSelectors: [".timeout-wrapper .seconds .digits", ".timeout-wrapper .minutes .digits", ".text-3xl"],
         messagesToCheckBeforeMovingToNextUrl: ["You must to wait","has been sent","You have received", "countdown to next roll"]},

        {website : ["free-litecoin.com","free-ethereum.io"],
         loginSelectors:["#loginform .form-control[type=email]","#loginform .form-control[type=password]","#loginbutton"],
         loginCaptcha : true,
         captchaButtonSubmitSelectors: ["#loginbutton","#roll",".btn.btn-success"],
         allMessageSelectors: [".alert.alert-success",".alert.alert-danger",".result"],
         timeoutMessageSelectors: ["#cislo1","#cislo2"],
         messagesToCheckBeforeMovingToNextUrl: ["You must to wait","has been sent","You have received"]},

        {website : ["dogefree.in","freebitco.in","freeth.in","bnbfree.in","freetrx.in"],
         loginSelectors:["#login_form_btc_address","#login_form_password","#login_button"],
         captchaButtonSubmitSelectors: ["#free_play_form_button"],
         allMessageSelectors: [".alert.alert-success",".alert.alert-danger",".result"],
         timeoutMessageSelectors: ["#time_remaining"],
         messagesToCheckBeforeMovingToNextUrl: ["You must to wait","has been sent","You have received"],
         timeoutbeforeMovingToNextUrl: 180000
        },

        {website : ["btcfre.com", "freebnbnow.com", "fredoge.com", "tronths.com", "miningsol.com", "maticfreee.com", "bnbfe.com"],
         loginSelectors:["input[type=text][placeholder", "button.btn.btn-warning"],
         defaultButtonSelectors: ["td a.btn.btn-sm.btn-outline-success"],
         allMessageSelectors: [".alert.alert-success",".alert.alert-danger",".result"],
         timeoutMessageSelectors: ["#time_remaining"],
         messagesToCheckBeforeMovingToNextUrl: ["You must to wait","has been sent","You have received"],
         timeoutbeforeMovingToNextUrl: 30000
        },

        {website : ["ethfre.com"],
         loginSelectors:["input[type=text][placeholder", "button.btn.btn-secondary"],
         defaultButtonSelectors: ["td a.btn.btn-sm.btn-outline-secondary"],
         allMessageSelectors: [".alert.alert-success",".alert.alert-danger",".result"],
         timeoutMessageSelectors: ["#time_remaining"],
         messagesToCheckBeforeMovingToNextUrl: ["You must to wait","has been sent","You have received"],
         timeoutbeforeMovingToNextUrl: 30000
        },

        {website : ["bestchange.com"],
         defaultButtonSelectors: ["#tab_bonus > a"],
         loginSelectors:["#bonus_purse"],
         loginCaptcha : true,
         captchaButtonSubmitSelectors: ["#bonus_button"],
         allMessageSelectors: [".alert.alert-success",".alert.alert-danger",".result","#bonus_status", "#bonus_button"],
         timeoutMessageSelectors: ["#time_remaining"],
         messagesToCheckBeforeMovingToNextUrl: ["You must to wait","has been sent","You have received", "added to your balance", "Time left"],
         timeoutbeforeMovingToNextUrl: 120000
        },

        {website : ["bnbpi.com", "freearb.co"],
         loginSelectors:["input[type=text][placeholder", "button.btn.btn-primary"],
         defaultButtonSelectors: ["td a.btn.btn-sm.btn-outline-primary"],
         allMessageSelectors: [".alert.alert-success",".alert.alert-danger",".result"],
         timeoutMessageSelectors: ["#time_remaining"],
         messagesToCheckBeforeMovingToNextUrl: ["You must to wait","has been sent","You have received"],
         timeoutbeforeMovingToNextUrl: 30000
        },
        {website : ["freeudt.com"],
         loginSelectors:["input[type=text][placeholder", "button.btn.btn-success"],
         defaultButtonSelectors: ["td a.btn.btn-sm.btn-outline-success"],
         allMessageSelectors: [".alert.alert-success",".alert.alert-danger",".result"],
         timeoutMessageSelectors: ["#time_remaining"],
         messagesToCheckBeforeMovingToNextUrl: ["You must to wait","has been sent","You have received"],
         timeoutbeforeMovingToNextUrl: 30000
        },
        
        {website : ["bnbpick.io", "solpick.io", "litepick.io", "dogepick.io", "tronpick.io", "maticpick.io"],
         loginSelectors: ["input[type=email]", "input[type=password]", "#process_login"],
         loginCaptcha : true,
         captchaButtonSubmitSelectors: ["#process_login, button[type=submit]"],
         timeoutbeforeMovingToNextUrl: 120000
        },

        {website : ["flashfaucet.com"],
         defaultButtonSelectors: ["a[href='login']"],
         loginSelectors:["input[type=text]","button[type=submit]"],
         captchaButtonSubmitSelectors: [".btn.btn-primary"],
         allMessageSelectors: [".alert.alert-success",".alert.alert-danger", "#newClaim"],
         timeoutMessageSelectors: ["#time_remaining", "#demo"],
         messagesToCheckBeforeMovingToNextUrl: ["You must to wait","You have won","You have received"],
         additionalFunctions: usdFaucets}

    ];

    //HtmlEvents dispatcher
    function triggerEvent(el, type) {
        try{
            var e = document.createEvent('HTMLEvents');
            e.initEvent(type, false, true);
            el.dispatchEvent(e);
        }catch(exception){
            console.log(exception);
        }
    }

    function toggleCaptcha(selector, index){
        if( document.querySelector(selector)){
            document.querySelector(selector).selectedIndex = index;
        }
        var targetNode = document.querySelector(selector);
        if (targetNode) {
            setTimeout(function() {
                triggerEvent(targetNode, 'change');
            }, 5000);
        }
    }

    async function getPromoCode(){
        // Function to extract promo codes from HTML
        function extractPromoCodes(html) {
            const promoCodes = [];
            const regex = /Promo Code = <b>(.*?)<\/b>/g;
            let match;
            while ((match = regex.exec(html)) !== null) {
                promoCodes.push(match[1]);
            }
            return promoCodes;
        }

        async function getPromoCodes(url) {
            return new Promise((resolve, reject) => {
                GM_xmlhttpRequest({
                    method: "GET",
                    url: url,
                    onload: function(response) {
                        const promoCodes = extractPromoCodes(response.responseText);
                        resolve(promoCodes);
                    },
                    onerror: function(error) {
                        reject(error);
                    }
                });
            });
        }

        // Function to check if a day has passed since the last execution
        function isDayPassed() {

            if(!GM_getValue( 'lastExecution')){
                return 1;
            }

            const lastExecution = GM_getValue('lastExecution');
            console.log(lastExecution);
            const now = Date.now();
            const oneDay = 24 * 60 * 60 * 1000; // milliseconds in a day
            return now - lastExecution >= oneDay;
        }

        // Function to update the last execution time
        function updateLastExecution() {
            GM_setValue('lastExecution', Date.now());
        }


        // Check if a day has passed since the last execution
        if (isDayPassed()) {
            const url = 'https://t.me/s/freecryptosfaucets';
            try {
                const promoCodes = await getPromoCodes(url);

                console.log('Promo Codes:', promoCodes);
                updateLastExecution();
                if(promoCodes.length > 0){
                    GM_setValue('lastPromoCode', promoCodes[promoCodes.length -1]);

                    return promoCodes[promoCodes.length -1];
                }else {
                    return "";
                }

            } catch (error) {
                console.error('Error fetching URL:', error);
                return "";
            }
        } else{
            console.log("Day is not passed");
            return "";
        }
    }

    //Check if a string is present in Array
    String.prototype.includesOneOf = function(arrayOfStrings) {

        //If this is not an Array, compare it as a String
        if (!Array.isArray(arrayOfStrings)) {
            return this.toLowerCase().includes(arrayOfStrings.toLowerCase());
        }

        for (var i = 0; i < arrayOfStrings.length; i++) {
            if (this.toLowerCase().includes(arrayOfStrings[i].toLowerCase())) {
                return true;
            }
        }
        return false;
    }

    var websiteDataValues = {};

    //Get selector details from the websiteMap
    for (let value of Object.values(websiteMap)) {
        if(window.location.href.includesOneOf(value.website)){
            websiteDataValues.beforeLoginButton = value.beforeLoginButton;
            websiteDataValues.inputTextSelector= value.inputTextSelector;
            websiteDataValues.inputTextSelectorButton = value.inputTextSelectorButton;
            websiteDataValues.defaultButtonSelectors = value.defaultButtonSelectors;
            websiteDataValues.claimButtonSelector = value.claimButtonSelector;
            websiteDataValues.captchaButtonSubmitSelectors = value.captchaButtonSubmitSelectors;
            websiteDataValues.loginSelectors = value.loginSelectors;
            websiteDataValues.loginCaptcha = value.loginCaptcha;
            websiteDataValues.allMessageSelectors = value.allMessageSelectors;
            websiteDataValues.messagesToCheckBeforeMovingToNextUrl = value.messagesToCheckBeforeMovingToNextUrl;
            websiteDataValues.withdrawPageUrl = value.withdrawPageUrl;
            websiteDataValues.withdrawEnabled = value.withdrawEnabled;
            websiteDataValues.balanceSelector = value.balanceSelector;
            websiteDataValues.withdrawMinAmount = value.withdrawMinAmount;
            websiteDataValues.successMessageSelectors = value.successMessageSelectors;
            websiteDataValues.toggleCaptchaSelector = value.toggleCaptchaSelector;
            websiteDataValues.toggleCaptchaSelectorIndex = value.toggleCaptchaSelectorIndex;
            websiteDataValues.timeoutbeforeMovingToNextUrl = value.timeoutbeforeMovingToNextUrl;
            websiteDataValues.timeoutMessageSelectors = value.timeoutMessageSelectors;
            websiteDataValues.additionalFunctions = value.additionalFunctions;
            break;
        }
    }

    //Identify which coin to input, based on the url input
    //If the URL does not contain the coin, then use the default from the domain name
    var count = 0;
    var addressAssigned = false;
    for (let value of Object.values(websiteData)) {
        count = count + 1;
        if(window.location.href.includes("/" + value.regex)){
            addressAssigned = true;
            break;
        }
    }

    var login = "";
    var password = "";
    var address = "";
    //If URL does not have coin, check the default from the domain name
    if(!addressAssigned){
        count = 0;
        for (let value of Object.values(websiteData)) {
            count = count + 1;
            if(value.url.includes(window.location.hostname.replace("app.",""))){
                login = value.login;
                password = value.password;
                address = value.address;
                break;
            }
        }
    }

    //Get the next Url from the website data map
    async function getNextUrl(){

        //Go to the beginning if the end of the array is reached
        if(count >= websiteData.length){
            websiteDataValues.nextUrl = websiteData[0].url;
        }else{
            websiteDataValues.nextUrl = websiteData[count].url;
        }

        //Ping Test to check if a website is up before proceeding to next url
        //  pingTest(websiteDataValues.nextUrl);
    }

    var isNextUrlReachable = false;
    //Get the next Url from the website
    function pingTest(websiteUrl) {
        GM_xmlhttpRequest({
            method: "GET",
            url: websiteUrl,
            headers: {
                "Content-Type": "application/x-www-form-urlencoded"
            },
            timeout: 5000,
            onload: function(response) {
                //Website is reachable
                isNextUrlReachable = true;
            },
            onerror: function(e) {
                count=count+1;
                getNextUrl();
            },
            ontimeout: function() {
                count=count+1;
                getNextUrl();
            },
        });

    }


    async function delay(ms) {
        return new Promise(resolve => setTimeout(resolve, ms))
    }


    var movingToNextUrl = false;
    async function goToNextUrl() {
        if(!movingToNextUrl){
            movingToNextUrl = true;
            getNextUrl();
            while (!isNextUrlReachable) {
                await delay(3000);
                isNextUrlReachable = true;

            }
            console.log(websiteDataValues.nextUrl);
            window.location.href = websiteDataValues.nextUrl;
        }
    }

    async function goToWithdrawPage() {
        if(!movingToNextUrl){
            movingToNextUrl = true;
            window.location.href = websiteDataValues.withdrawPageUrl;
        }

    }

    //Default Setting: After 120 seconds go to next Url
    var delayBeforeMovingToNextUrl = 90000;
    if(websiteDataValues.timeoutbeforeMovingToNextUrl){
        delayBeforeMovingToNextUrl = websiteDataValues.timeoutbeforeMovingToNextUrl;
    }

    setTimeout(function(){
        goToNextUrl();
    },delayBeforeMovingToNextUrl);

    unsafeWindow.goToNextUrl = goToNextUrl;

    function checkTimeoutMessageSelectors(){

        if(websiteDataValues.timeoutMessageSelectors){
            var checkTimeoutInterval = setInterval(function(){
                for(let i=0; i< websiteDataValues.timeoutMessageSelectors.length; i++){
                    if(document.querySelector(websiteDataValues.timeoutMessageSelectors[i]) &&
                       document.querySelector(websiteDataValues.timeoutMessageSelectors[i]).innerText.length > 1) {
                        goToNextUrl();
                        clearInterval(checkTimeoutInterval);
                        break;
                    }
                }
            },5000);
        }
    }

    //Returns true if message selectors are present
    function messageSelectorsPresent(){

        if(websiteDataValues.allMessageSelectors){
            for(var j=0;j<websiteDataValues.allMessageSelectors.length;j++){
                for(var k=0; k< document.querySelectorAll(websiteDataValues.allMessageSelectors[j]).length;k++){
                    if(document.querySelectorAll(websiteDataValues.allMessageSelectors[j])[k] &&
                       (document.querySelectorAll(websiteDataValues.allMessageSelectors[j])[k].innerText.includesOneOf(websiteDataValues.messagesToCheckBeforeMovingToNextUrl) ||
                        (document.querySelectorAll(websiteDataValues.allMessageSelectors[j])[k].value &&
                         document.querySelectorAll(websiteDataValues.allMessageSelectors[j])[k].value.includesOneOf(websiteDataValues.messagesToCheckBeforeMovingToNextUrl)))){
                        return true;
                    }
                }
            }
        }
        return false;
    }

    //Returns true if message selectors are present
    function successMessageSelectorsPresent(){
        if(websiteDataValues.successMessageSelectors){
            for(var j=0;j<websiteDataValues.successMessageSelectors.length;j++){
                for(var k=0; k< document.querySelectorAll(websiteDataValues.successMessageSelectors[j]).length;k++){
                    if(document.querySelectorAll(websiteDataValues.successMessageSelectors[j])[k] && document.querySelectorAll(websiteDataValues.successMessageSelectors[j])[k].innerText.includesOneOf(websiteDataValues.messagesToCheckBeforeMovingToNextUrl)){
                        return true;
                    }
                }
            }
        }
        return false;
    }


    function checkLoginSelectors(){

        if(window.location.href.endsWith('/rewards') || window.location.href.endsWith('/rewards/')){
            setTimeout(function(){
                window.close();
            },3000);
            movingToNextUrl = true;
            return;
        }

        if(websiteDataValues.loginSelectors){
            //Check if all login selectors are present
            let count =0;
            for(let i=0; i< websiteDataValues.loginSelectors.length; i++){
                if(document.querySelector(websiteDataValues.loginSelectors[i])){
                    count++;
                }

            }

            if(count == 2 && count == websiteDataValues.loginSelectors.length){

                if(address.length > 0 && !websiteDataValues.loginCaptcha){
                    document.querySelector(websiteDataValues.loginSelectors[0]).value = address;
                    triggerEvent(document.querySelector(websiteDataValues.loginSelectors[0]), 'input');

                    movingToNextUrl = true;
                    setTimeout(function(){
                        document.querySelector(websiteDataValues.loginSelectors[1])?.click();
                    },3000);
                    return;
                }

            }

            if(count == 1 && count == websiteDataValues.loginSelectors.length){
                if(address.length > 0 && websiteDataValues.loginCaptcha){
                    setTimeout(function(){
                        document.querySelector(websiteDataValues.loginSelectors[0]).value = address;
                    },3000)
                    return;
                }

            }

            if(count == websiteDataValues.loginSelectors.length){

                if(login.length > 0 && password.length > 0){
                    //Input Login
                    document.querySelector(websiteDataValues.loginSelectors[0]).value = login;

                    //Input Password
                    document.querySelector(websiteDataValues.loginSelectors[1]).value = password;

                    //Click Login Button (No Captcha before login button)
                    if(!websiteDataValues.loginCaptcha){
                        movingToNextUrl = true;
                        document.querySelector(websiteDataValues.loginSelectors[2])?.click();
                    }
                }

            }

        }

    }

    //Special Usecase for Recaptcha Login
    var callbackDefinedForRecaptcha = false;
    for(let i=0; i< document.querySelectorAll(".g-recaptcha").length;i++){

        if(document.querySelectorAll(".g-recaptcha")[i].getAttribute("data-callback")){
            var currentCallback = document.querySelectorAll(".g-recaptcha")[i].getAttribute("data-callback");
            let script_callback= document.createElement('script');
            script_callback.type= 'text/javascript';
            script_callback.innerText = 'var recaptcha_callback' + i + ' = function(response){currentCallback(response); document.querySelector(".g-recaptcha").setAttribute("value",response)}';
            let body = document.getElementsByTagName('body')[0];
            body.appendChild(script_callback);
            document.querySelectorAll(".g-recaptcha")[i].setAttribute("data-callback","recaptcha_callback"+i);

        }else{
            if(!callbackDefinedForRecaptcha){
                callbackDefinedForRecaptcha = true;
                let script_callback= document.createElement('script');
                script_callback.type= 'text/javascript';
                script_callback.innerText = 'var recaptcha_callback = function(response){ document.querySelector(".g-recaptcha").setAttribute("value",response)}';
                let body = document.getElementsByTagName('body')[0];
                body.appendChild(script_callback);
            }
            document.querySelectorAll(".g-recaptcha")[i].setAttribute("data-callback","recaptcha_callback");
        }
    }


    checkTimeoutMessageSelectors();



    function usdFaucets(){
        if(window.location.href.includes("dashboard")){
            if(document.querySelector("a[href='faucet']")){
                movingToNextUrl = true;
                document.querySelector("a[href='faucet']").click();
            }
        }
    }


    async function checkPromo(){

        if(window.location.href.includes("/promotion/")){
            var promo = window.location.pathname.replaceAll("/promotion/","")
            GM_setValue(window.location.hostname, promo);
            var promoInterval = setInterval(function(){
                if(grecaptcha && grecaptcha.getResponse().length > 0){
                    window.location.href="https://" + window.location.hostname;
                    clearInterval(promoInterval);
                }
            },5000);
            // goToNextUrl();
        }

        console.log(GM_getValue(window.location.hostname))


        if(document.querySelector("[placeholder='Promo code']")){
            //Check if latest promo and existing promo are same
            console.log("Checking Promo");
            await getPromoCode();

            if(!GM_getValue("lastPromoCode")){
                return;
            }

            //  PROMO_CODES[0]=GM_getValue("lastPromoCode");

            if(!GM_getValue(window.location.hostname) || (GM_getValue(window.location.hostname) != GM_getValue("lastPromoCode"))){
                //  window.location.href = "https://" + window.location.hostname + "/promotion/" + PROMO_CODES[0];
                window.location.href = "https://" + window.location.hostname + "/promotion/" + GM_getValue("lastPromoCode");
            }else{
                return;
            }

            var interval =  setInterval(function(){
                if(document.querySelector(".pending-rolls") && document.querySelector(".pending-rolls").innerText.includes("Rolls left")){
                    window.location.reload();
                    clearInterval(interval);
                }

            },5000)
            }
    }

    setTimeout(function(){
        checkPromo();
    },5000);


    setTimeout(function(){

        if(!movingToNextUrl && websiteDataValues.beforeLoginButton){
            for(let i=0;i<websiteDataValues.beforeLoginButton.length ;i++){
                if(document.querySelector(websiteDataValues.beforeLoginButton[i])){
                    triggerEvent(document.querySelector(websiteDataValues.beforeLoginButton[i]), 'mousedown');
                    triggerEvent(document.querySelector(websiteDataValues.beforeLoginButton[i]), 'mouseup');
                    document.querySelector(websiteDataValues.beforeLoginButton[i]).click();
                    break;
                }
            }
        }
        checkLoginSelectors();

        if(websiteDataValues.additionalFunctions){
            websiteDataValues.additionalFunctions();
        }

        if(websiteDataValues.withdrawEnabled){
            if(websiteDataValues.balanceSelector && document.querySelector(websiteDataValues.balanceSelector)){
                var currentBalance = document.querySelector(websiteDataValues.balanceSelector).innerText;
                if(currentBalance > websiteDataValues.withdrawMinAmount && !window.location.href.includes(websiteDataValues.withdrawPageUrl)) {
                    goToWithdrawPage();
                }

            }else{
                if(successMessageSelectorsPresent()){
                    goToWithdrawPage();
                }
            }
        }

        //Look for all the default messages or errors before proceeding to next url
        //For other languages difference in the length of the strings can be compared or visibility of the style element
        if(!movingToNextUrl && messageSelectorsPresent()){
            goToNextUrl();
        }
        //Check for all the default button selectors and click
        //This will only click the first selector found, so mention the selectors with parent element wherever required
        if(!movingToNextUrl && websiteDataValues.defaultButtonSelectors){
            for(let i=0;i<websiteDataValues.defaultButtonSelectors.length ;i++){
                if(document.querySelector(websiteDataValues.defaultButtonSelectors[i])){
                    console.log("Clicking button");
                    triggerEvent(document.querySelector(websiteDataValues.defaultButtonSelectors[i]), 'mousedown');
                    triggerEvent(document.querySelector(websiteDataValues.defaultButtonSelectors[i]), 'mouseup');
                    document.querySelector(websiteDataValues.defaultButtonSelectors[i])?.click();
                    break;
                }
            }
        }

        if(!movingToNextUrl && websiteDataValues.toggleCaptchaSelector && Number.isInteger(websiteDataValues.toggleCaptchaSelectorIndex)){
            toggleCaptcha(websiteDataValues.toggleCaptchaSelector,websiteDataValues.toggleCaptchaSelectorIndex);
        }


        //Input the address and click the login button
        if(!movingToNextUrl && document.querySelector(websiteDataValues.inputTextSelector)){
            document.querySelector(websiteDataValues.inputTextSelector).value = websiteDataValues.address;
            setTimeout(function(){
                if(websiteDataValues.inputTextSelectorButton && document.querySelector(websiteDataValues.inputTextSelectorButton)){
                    document.querySelector(websiteDataValues.inputTextSelectorButton).click();
                }

            },5000);
        }

        //Click the form button after solving captcha
        //Works for both recaptcha and hcaptcha
        var clicked = false;
        var captchaInterval = setInterval(function(){
            try{
                if(!clicked && grecaptcha && grecaptcha.getResponse().length > 0 || document.querySelector(".g-recaptcha").getAttribute("value").length > 0){
                    if(websiteDataValues.captchaButtonSubmitSelectors){
                        for(let i=0;i< websiteDataValues.captchaButtonSubmitSelectors.length;i++){
                            if(document.querySelector(websiteDataValues.captchaButtonSubmitSelectors[i])){
                                document.querySelector(websiteDataValues.captchaButtonSubmitSelectors[i]).click();
                            }
                        }
                    }
                    clicked = true;

                    clearInterval(captchaInterval);
                    setTimeout(function(){
                        //  if(messageSelectorsPresent()){
                        goToNextUrl();
                        //   }
                    },10000);
                }
            }catch(e){

            }

            for(var hc=0; hc < document.querySelectorAll("iframe").length; hc++){
                if(! clicked && document.querySelectorAll("iframe")[hc] &&
                   document.querySelectorAll("iframe")[hc].getAttribute("data-hcaptcha-response") &&
                   document.querySelectorAll("iframe")[hc].getAttribute("data-hcaptcha-response").length > 0) {

                    if(websiteDataValues.captchaButtonSubmitSelectors){
                        for(let i=0;i< websiteDataValues.captchaButtonSubmitSelectors.length;i++){
                            if(document.querySelector(websiteDataValues.captchaButtonSubmitSelectors[i])){
                                document.querySelector(websiteDataValues.captchaButtonSubmitSelectors[i]).click();
                            }
                        }
                    }
                    clicked = true;

                    clearInterval(captchaInterval);
                    setTimeout(function(){
                        if(messageSelectorsPresent()){
                            goToNextUrl();
                        }
                    },10000);
                }
            }

        },5000);


    },10000);

})();