OGame - Enviar recursos al planeta principal

Enviar recursos al planeta principal

// ==UserScript==
// @name         OGame - Enviar recursos al planeta principal
// @namespace    https://github.com/Sri7ach1
// @version      1.0
// @description  Enviar recursos al planeta principal
// @author       Sri7ach1
// @match        https://*.ogame.gameforge.com/game/index.php?page=*
// @license      GNU
// ==/UserScript==

(function() {
    'use strict';

    function goToFleetPage(colonyId) {
        window.location.href = `https://${window.location.host}/game/index.php?page=ingame&component=fleetdispatch&cp=${colonyId}`;
    }

    function getMainPlanetName() {
        return localStorage.getItem('ogameMainPlanet') || '';
    }

    function setMainPlanetName(name) {
        localStorage.setItem('ogameMainPlanet', name);
    }

    function getShipsToSend() {
        return parseInt(localStorage.getItem('ogameShipsToSend')) || 25;
    }

    function setShipsToSend(amount) {
        localStorage.setItem('ogameShipsToSend', amount);
    }

    function identifyPlanets() {
        const planets = Array.from(document.querySelectorAll('#planetList .smallplanet'));
        const mainPlanetName = getMainPlanetName();

        const mainPlanet = mainPlanetName ?
            planets.find(planet => planet.querySelector('.planet-name')?.innerText.includes(mainPlanetName)) :
            planets[0];

        if (!mainPlanet) {
            console.error('No se encontró el planeta principal');
            return null;
        }

        const colonies = planets.filter(planet => planet !== mainPlanet);

        const result = {
            mainPlanet: {
                id: mainPlanet.id.replace('planet-', ''),
                coords: mainPlanet.querySelector('.planet-koords').innerText.replace('[','').replace(']',''),
                name: mainPlanet.querySelector('.planet-name').innerText
            },
            colonies: colonies.map(colony => ({
                id: colony.id.replace('planet-', ''),
                coords: colony.querySelector('.planet-koords').innerText.replace('[','').replace(']',''),
                name: colony.querySelector('.planet-name').innerText
            }))
        };

        console.log('Planeta principal:', result.mainPlanet);
        console.log('Colonias:', result.colonies);

        return result;
    }

    async function processColony(colonyId, mainPlanetCoords, shipsToSend) {
        const state = getState();
        const lastReload = parseInt(localStorage.getItem('lastReload') || '0');
        if (Date.now() - lastReload < 1000) {
            console.log('Detectada recarga múltiple, esperando...');
            await new Promise(r => setTimeout(r, 1000));
        }

        if (state?.waitingForNextColony) {
            console.log('Preparando siguiente colonia...');
            const nextIndex = state.currentColonyIndex + 1;
            if (nextIndex < state.colonies.length) {
                saveState(nextIndex, state.colonies, state.mainPlanet, state.shipsToSend, false);
                await new Promise(r => setTimeout(r, 1000));
                goToFleetPage(state.colonies[nextIndex].id);
            } else {
                console.log('¡Proceso completado para todas las colonias!');
                clearState();
            }
            return;
        }

        console.log('Procesando colonia:', colonyId);

        await new Promise(r => setTimeout(r, 1500));

        const cargoShips = document.querySelector('input[name="transporterLarge"]');
        if (cargoShips) {
            console.log('Seleccionando', shipsToSend, 'naves de carga grandes');
            cargoShips.value = '';
            cargoShips.dispatchEvent(new Event('change', { bubbles: true }));
            await new Promise(r => setTimeout(r, 300));

            cargoShips.value = String(shipsToSend);
            cargoShips.dispatchEvent(new Event('change', { bubbles: true }));
            cargoShips.dispatchEvent(new Event('blur', { bubbles: true }));
            await new Promise(r => setTimeout(r, 500));

            console.log('Naves seleccionadas:', cargoShips.value);
        } else {
            console.error('No se encontró el input de naves de carga grandes');
            return;
        }

        const continueBtn = document.querySelector('#continueToFleet2');
        if (continueBtn) {
            continueBtn.click();
            await new Promise(r => setTimeout(r, 1000));
        }

        console.log('Cargando recursos...');
        const allResourcesBtn = document.querySelector('#allresources');
        if (allResourcesBtn) {
            allResourcesBtn.click();
            await new Promise(r => setTimeout(r, 1500));
        }

        console.log('Seleccionando misión de transporte...');
        const missionSelect = document.querySelector('#missions .transportIcon');
        if (missionSelect) {
            missionSelect.click();
            console.log('Misión de transporte seleccionada');
            await new Promise(r => setTimeout(r, 1000));
        }

        console.log('Estableciendo coordenadas destino:', mainPlanetCoords);
        const [galaxy, system, position] = mainPlanetCoords.split(':');

        const galaxyInput = document.querySelector('input[name="galaxy"]');
        const systemInput = document.querySelector('input[name="system"]');
        const positionInput = document.querySelector('input[name="position"]');

        if (galaxyInput && systemInput && positionInput) {
            galaxyInput.value = galaxy;
            galaxyInput.dispatchEvent(new Event('change', { bubbles: true }));
            galaxyInput.dispatchEvent(new Event('keyup', { bubbles: true }));
            await new Promise(r => setTimeout(r, 500));

            systemInput.value = system;
            systemInput.dispatchEvent(new Event('change', { bubbles: true }));
            systemInput.dispatchEvent(new Event('keyup', { bubbles: true }));
            await new Promise(r => setTimeout(r, 500));

            positionInput.value = position;
            positionInput.dispatchEvent(new Event('change', { bubbles: true }));
            positionInput.dispatchEvent(new Event('keyup', { bubbles: true }));
            await new Promise(r => setTimeout(r, 500));
        }

        const planetTargetBtn = document.querySelector('.targetIcon.planet');
        if (planetTargetBtn) {
            planetTargetBtn.click();
            await new Promise(r => setTimeout(r, 500));
        }

        let attempts = 0;
        const maxAttempts = 5;
        let destinationVerified = false;

        while (attempts < maxAttempts && !destinationVerified) {
            await new Promise(r => setTimeout(r, 1000));
            const targetName = document.querySelector('#targetPlanetName');
            if (targetName) {
                console.log('Planeta destino actual:', targetName.textContent);
                if (targetName.textContent.includes('Mydoom')) {
                    console.log('Destino verificado correctamente');
                    destinationVerified = true;
                } else {
                    console.log('El destino aún no es correcto, reintentando...');
                    attempts++;
                }
            }
        }

        if (!destinationVerified) {
            console.error('No se pudo verificar el destino correcto');
            return;
        }

        console.log('Intentando enviar flota...');
        const sendFleetBtn = Array.from(document.querySelectorAll('a span'))
            .find(span => span.textContent === 'Enviar flota')?.parentElement;

        if (sendFleetBtn) {
            console.log('Botón de envío encontrado, enviando flota...');
            saveState(state.currentColonyIndex, state.colonies, state.mainPlanet, state.shipsToSend, true);
            await new Promise(r => setTimeout(r, 500));
            sendFleetBtn.click();
        } else {
            console.error('No se encontró el enlace de envío de flota');
        }
    }

    function saveState(currentColonyIndex, colonies, mainPlanet, shipsToSend, waitingForNextColony = false) {
        const timestamp = Date.now();
        const lastReload = localStorage.getItem('lastReload') || '0';

        if (timestamp - parseInt(lastReload) < 2000) {
            console.log('Evitando recarga múltiple');
            return;
        }

        localStorage.setItem('lastReload', timestamp.toString());
        localStorage.setItem('ogameAutoTransport', JSON.stringify({
            currentColonyIndex,
            colonies,
            mainPlanet,
            shipsToSend,
            inProgress: true,
            waitingForNextColony,
            lastProcessedTime: timestamp
        }));
    }

    function clearState() {
        localStorage.removeItem('ogameAutoTransport');
    }

    function getState() {
        const state = localStorage.getItem('ogameAutoTransport');
        return state ? JSON.parse(state) : null;
    }

    function createButton() {
        const container = document.createElement('div');
        container.style = `
            position: fixed;
            top: 50px;
            right: 10px;
            z-index: 9999;
            background: rgba(0,0,0,0.8);
            padding: 10px;
            border-radius: 5px;
        `;

        const selectContainer = document.createElement('div');
        selectContainer.style.marginBottom = '10px';

        const select = document.createElement('select');
        select.style = `
            width: 100%;
            margin-bottom: 5px;
            padding: 5px;
            background: #1b1b1b;
            color: white;
            border: 1px solid #3e3e3e;
        `;

        const planets = Array.from(document.querySelectorAll('#planetList .smallplanet'));
        planets.forEach(planet => {
            const name = planet.querySelector('.planet-name').innerText;
            const option = document.createElement('option');
            option.value = name;
            option.text = name;
            if (name === getMainPlanetName()) {
                option.selected = true;
            }
            select.appendChild(option);
        });

        select.onchange = () => {
            setMainPlanetName(select.value);
        };

        const label = document.createElement('div');
        label.textContent = 'Planeta Principal:';
        label.style.marginBottom = '5px';
        label.style.color = 'white';

        selectContainer.appendChild(label);
        selectContainer.appendChild(select);

        const inputContainer = document.createElement('div');
        inputContainer.style = `
            display: flex;
            align-items: center;
            gap: 10px;
            margin-bottom: 5px;
        `;

        const input = document.createElement('input');
        input.type = 'number';
        input.value = getShipsToSend().toString();
        input.min = '1';
        input.style = `
            width: 60px;
            padding: 5px;
        `;
        input.title = 'Número de naves de carga grandes a enviar';
        
        input.onchange = () => {
            setShipsToSend(parseInt(input.value) || 25);
        };

        const inputLabel = document.createElement('span');
        inputLabel.textContent = 'Naves de Carga Grande';
        inputLabel.style = `
            color: white;
            font-size: 12px;
        `;

        inputContainer.appendChild(input);
        inputContainer.appendChild(inputLabel);

        const btn = document.createElement('button');
        btn.innerHTML = '📦 Enviar a Principal';
        btn.style = `
            display: block;
            padding: 10px;
            background: #4CAF50;
            color: white;
            border: none;
            cursor: pointer;
            width: 100%;
        `;

        btn.onclick = async () => {
            const shipsToSend = getShipsToSend();
            const { mainPlanet, colonies } = identifyPlanets();

            if (confirm(`¿Enviar recursos usando ${shipsToSend} naves desde ${colonies.length} colonias al planeta principal?`)) {
                saveState(0, colonies, mainPlanet, shipsToSend);
                goToFleetPage(colonies[0].id);
            }
        };

        container.appendChild(selectContainer);
        container.appendChild(inputContainer);
        container.appendChild(btn);
        document.body.appendChild(container);
    }

    async function init() {
        if (!window.location.href.includes('component=fleetdispatch')) {
            setTimeout(createButton, 2000);
        } else {
            const state = getState();
            if (state && state.inProgress) {
                const lastReload = parseInt(localStorage.getItem('lastReload') || '0');

                if (Date.now() - state.lastProcessedTime > 5 * 60 * 1000) {
                    console.log('Estado expirado, reiniciando proceso...');
                    clearState();
                    return;
                }

                if (Date.now() - lastReload < 2000) {
                    console.log('Recarga detectada muy cercana, esperando...');
                    await new Promise(r => setTimeout(r, 2000));
                }

                console.log(`Continuando proceso: Colonia ${state.currentColonyIndex + 1} de ${state.colonies.length}`);
                await processColony(state.colonies[state.currentColonyIndex].id, state.mainPlanet.coords, state.shipsToSend);
            }
        }
    }

    init().catch(console.error);

})();