TBD Auto Rep & Thanks

Automates adding reputation and thanking uploader on TorrentBD

// ==UserScript==
// @name         TBD Auto Rep & Thanks
// @icon         https://www.torrentbd.net/themes/material/static/favicon/favicon-32x32.png
// @namespace    https://www.torrentbd.com/account-details.php?id=228411
// @version      1.3
// @description  Automates adding reputation and thanking uploader on TorrentBD
// @license      MIT
// @match        https://www.torrentbd.com/torrents-details.php?id=*
// @match        https://www.torrentbd.net/torrents-details.php?id=*
// @match        https://www.torrentbd.me/torrents-details.php?id=*
// @match        https://www.torrentbd.org/torrents-details.php?id=*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // Configuration options
    var config = {
        waitTimeout: 10000, // Timeout for waiting for elements (in ms)
        clickDelay: 500 // Delay between actions (in ms)
    };

    // Function to wait for an element to appear
    function waitForElement(selector, callback) {
        var interval = 100;
        var elapsed = 0;
        var checkInterval = setInterval(function() {
            var element = document.querySelector(selector);
            if (element) {
                clearInterval(checkInterval);
                callback(null, element);
            } else if (elapsed >= config.waitTimeout) {
                clearInterval(checkInterval);
                callback(new Error('Element ' + selector + ' not found within ' + config.waitTimeout + 'ms'));
            }
            elapsed += interval;
        }, interval);
    }

    // Function to click an element with delay
    function clickElement(selector, callback) {
        waitForElement(selector, function(err, element) {
            if (err) {
                console.error('Error clicking ' + selector + ':', err);
                return callback(err);
            }
            element.click();
            console.log('Clicked ' + selector);
            setTimeout(function() {
                callback(null);
            }, config.clickDelay);
        });
    }

    // Function to perform all actions
    function performActions() {
        clickElement('#add-rep-button', function(err) {
            if (err) return;
            clickElement('#thanks-button', function(err) {
                if (err) return;
                console.log('All actions performed successfully');
            });
        });
    }

    // Event listener for page load to start actions
    window.addEventListener('load', performActions);

    // Global error handling
    window.addEventListener('error', function(e) {
        console.error('Global error occurred:', e.error);
    });
})();