Marmennz / Auto Makers

// ==UserScript==
// @name         Auto Makers
// @namespace    http://tampermonkey.net/
// @version      2.0
// @description  Searches and clicks the "Apply" button globally without delays after inserting wallet address.
// @author       Your Name
// @match        https://photon-sol.tinyastro.io/en/lp/*
// @grant        none
// @license      MIT
// ==/UserScript==

(function () {
    'use strict';

    const walletAddress = "MarNJnsu4JEc8in6MjL6XFEgQYW8rbErpostY1AVSEL"; // Ваш кошелёк

    // Основная функция автоматизации
    async function automateSteps() {
        console.log("[DEBUG] Начинаем автоматизацию...");

        // 1. Поиск колонки "Makers" и нажатие на кнопку "Фильтр"
        const makersColumn = await waitForMakersColumn();

        if (!makersColumn) {
            console.error("[DEBUG] Колонка 'Makers' не найдена.");
            return;
        }

        console.log("[DEBUG] Колонка 'Makers' найдена:", makersColumn);

        const filterButton = makersColumn.querySelector('button') || makersColumn.nextElementSibling?.querySelector('button');
        if (filterButton) {
            console.log("[DEBUG] Кнопка фильтра найдена:", filterButton);
            filterButton.click();
        } else {
            console.error("[DEBUG] Кнопка фильтра не найдена.");
            return;
        }

        // 2. Ждём появления поля ввода
        const inputField = await waitForElement(() => {
            return document.querySelector('input.c-field__input[placeholder="Enter wallet address"]');
        }, 10000);

        if (!inputField) {
            console.error("[DEBUG] Поле ввода не найдено.");
            return;
        }

        console.log("[DEBUG] Поле ввода найдено, вставляем кошелек...");
        setNativeInputValue(inputField, walletAddress);

        // 3. Ждём появления кнопки "Apply" в любом месте
        const applyButton = await waitForElement(() => {
            return [...document.querySelectorAll('button')].find(
                button => button.textContent.trim().toLowerCase() === 'apply'
            );
        }, 10000);

        if (applyButton) {
            console.log("[DEBUG] Кнопка 'Apply' найдена, нажимаем...");
            applyButton.focus(); // Фокусируемся
            applyButton.click(); // Нажимаем
            console.log("[DEBUG] Кнопка 'Apply' успешно нажата.");
        } else {
            console.error("[DEBUG] Кнопка 'Apply' не найдена после ожидания.");
        }
    }

    // Утилита: Ожидание элемента
    function waitForElement(selectorFn, timeout = 10000, interval = 500) {
        return new Promise((resolve) => {
            const startTime = Date.now();

            function check() {
                const element = selectorFn();
                if (element) {
                    resolve(element);
                } else if (Date.now() - startTime > timeout) {
                    resolve(null); // Таймаут
                } else {
                    setTimeout(check, interval);
                }
            }

            check();
        });
    }

    // Утилита: Установка значения в input и уведомление React/Vue/Angular
    function setNativeInputValue(input, value) {
        const nativeInputValueSetter = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, "value").set;
        nativeInputValueSetter.call(input, value);
        input.dispatchEvent(new Event('input', { bubbles: true }));
    }

    // Функция для поиска колонки "Makers" с повторным зацикленным поиском
    async function waitForMakersColumn() {
        let makersColumn = null;
        while (!makersColumn) {
            makersColumn = await waitForElement(() => {
                return [...document.querySelectorAll('.c-grid-table__th')].find(column =>
                    column.textContent.trim().includes("Makers")
                );
            }, 10000); // время ожидания до 10 секунд на каждую попытку

            if (!makersColumn) {
                console.log("[DEBUG] Колонка 'Makers' не найдена, пробуем снова через 3 секунды...");
                await new Promise(resolve => setTimeout(resolve, 3000)); // ждем 3 секунды перед следующей попыткой
            }
        }
        return makersColumn;
    }

    // Периодическая проверка загрузки страницы
    function waitForPageToLoad() {
        const interval = setInterval(() => {
            if (isPageLoaded()) {
                clearInterval(interval); // Останавливаем проверку
                console.log("[DEBUG] Страница загружена, начинаем автоматизацию...");
                automateSteps(); // Запуск автоматизации
            }
        }, 1000); // Проверка каждую секунду
    }

    // Функция проверки наличия индикатора загрузки (замените на свой индикатор)
    function isPageLoaded() {
        // Пример: проверяем наличие спиннера или другого индикатора загрузки
        return !document.querySelector('.loading-indicator'); // Замените на подходящий селектор для вашего сайта
    }

    // Запускаем проверку загрузки страницы
    waitForPageToLoad();
})();