// ========================================== // CRIADO POR ANTONIO PEDRO - 2025 // ========================================== (async function() { // CONFIGURAÇÃO INICIAL let prefix = prompt('Qual prefixo você quer usar para os nomes? (ex: XSS)', 'XSS') || 'XSS'; prefix = prefix.toUpperCase().trim(); const mode = confirm('Clique OK para renomear TODOS os aviões (sobrescreve existentes).\nClique Cancelar para renomear SÓ os não nomeados (continua a numeração).'); const renameAll = mode; console.log(`🚀 Iniciando rename com prefixo: ${prefix}`); console.log(`Modo: ${renameAll ? 'Renomear TODOS' : 'Só não nomeados (continuar numeração)'}`); // Função para aguardar elemento function waitForElement(selector, timeout = 5000) { return new Promise((resolve, reject) => { if (document.querySelector(selector)) { return resolve(document.querySelector(selector)); } const observer = new MutationObserver(() => { if (document.querySelector(selector)) { resolve(document.querySelector(selector)); observer.disconnect(); } }); observer.observe(document.body, { childList: true, subtree: true }); setTimeout(() => { observer.disconnect(); reject(new Error(`Timeout waiting for ${selector}`)); }, timeout); }); } // Função para encontrar botão "Frota" (CORRIGIDA) function findFleetButton() { console.log('🔍 Procurando botão "Frota"...'); // Buscar todos os botões const allButtons = document.querySelectorAll('button, [class*="btn"], .listBtns'); console.log(`📊 Total de botões encontrados: ${allButtons.length}`); for (let btn of allButtons) { const text = (btn.textContent || btn.innerText || '').trim(); const onclick = btn.getAttribute('onclick') || ''; console.log(`🔍 Verificando botão: "${text.substring(0, 30)}..." | onclick: ${onclick.substring(0, 50)}...`); // Verificar texto if (text.toLowerCase().includes('frota') || text.includes('Fleet')) { console.log(`🎯 BOTÃO FROTA ENCONTRADO! Texto: "${text}"`); return btn; } // Verificar onclick if (onclick.includes('fleet.php') && !onclick.includes('parked')) { console.log(`🎯 BOTÃO FROTA ENCONTRADO! onclick: ${onclick}`); return btn; } } console.log('❌ Botão "Frota" não encontrado automaticamente.'); return null; } // Verificar se já está na lista de frota console.log('🔍 Verificando se a lista de frota está carregada...'); let fleetDetailList = document.querySelector('#fleetDetailList'); if (!fleetDetailList) { console.log('📂 Lista não carregada. Tentando clicar no botão "Frota"...'); const fleetButton = findFleetButton(); if (fleetButton) { console.log('🎯 Clicando no botão "Frota"...'); fleetButton.click(); // Aguardar o #fleetDetailList aparecer try { await waitForElement('#fleetDetailList', 10000); console.log('✅ Lista de frota carregada com sucesso!'); fleetDetailList = document.querySelector('#fleetDetailList'); } catch (e) { console.error('❌ Erro ao aguardar lista: ', e); alert('❌ Não conseguiu carregar a lista de frota. Clique manualmente no botão "Frota" e execute o script novamente.'); return; } } else { console.error('❌ Botão "Frota" não encontrado!'); alert('❌ Botão "Frota" não encontrado. Execute o script de diagnóstico para encontrar o botão correto.'); return; } } else { console.log('✅ Lista de frota já carregada.'); } // Extrair aviões const rows = document.querySelectorAll('#fleetDetailList .row.border'); console.log(`📊 Número de aviões encontrados: ${rows.length}`); if (rows.length === 0) { console.error('❌ Nenhum avião encontrado na lista!'); console.log('💡 Execute o diagnóstico para ver a estrutura:'); console.log('document.querySelectorAll("#fleetDetailList > div").length'); alert('❌ Nenhum avião na lista. Compre aviões ou clique em "Frota" primeiro.'); return; } const planes = []; let maxNumber = 0; rows.forEach((row, index) => { const a = row.querySelector('a[href="#"]'); if (a) { const onclick = a.getAttribute('onclick'); if (!onclick) return; const idMatch = onclick.match(/id=(\d+)/); if (!idMatch) return; const planeId = idMatch[1]; const currentName = a.textContent.trim(); // Verificar se já tem o formato correto const match = currentName.match(new RegExp(`^${prefix}-(\\d{4})$`)); if (match) { const num = parseInt(match[1], 10); if (num > maxNumber) maxNumber = num; } planes.push({ planeId, currentName, row, a }); console.log(`✈️ Avião ${index + 1}: ID=${planeId}, Nome="${currentName}"`); } }); console.log(`🔍 Aviões válidos extraídos: ${planes.length}`); if (planes.length === 0) { console.error('❌ Nenhum avião válido encontrado!'); return; } let nextNumber = renameAll ? 1 : (maxNumber + 1); console.log(`📊 Iniciando numeração a partir de: ${prefix}-${String(nextNumber).padStart(4, '0')}`); const toRename = renameAll ? planes : planes.filter(p => !p.currentName.match(new RegExp(`^${prefix}-\\d{4}$`))); console.log(`✈️ Aviões a renomear: ${toRename.length}`); if (toRename.length === 0) { console.log('✅ Nada para renomear! Todos já estão no formato correto.'); return; } // Confirmar antes de começar const confirmStart = confirm(`🚀 Preparado para renomear ${toRename.length} aviões?\nPrefixo: ${prefix}\nIniciando de: ${prefix}-${String(nextNumber).padStart(4, '0')}`); if (!confirmStart) { console.log('❌ Rename cancelado pelo usuário.'); return; } // Função de rename individual async function renameOne(plane, newName) { const timestamp = Date.now(); const planeId = plane.planeId; // Tentar encontrar routeId let routeId = null; try { if (typeof flightData !== 'undefined' && Array.isArray(flightData)) { const flight = flightData.find(f => f.id == planeId); routeId = flight ? flight.routeId : null; } } catch (e) { console.warn('⚠️ flightData não disponível, pulando rename de rotas.'); } console.log(`🔄 Renomeando ${planeId} de "${plane.currentName}" → "${newName}"`); // Rename do avião const regUrl = `https://www.airlinemanager.com/fleet_details.php?id=${planeId}&mode=reg®=${encodeURIComponent(newName)}&fbSig=false&_${timestamp}`; try { const response = await fetch(regUrl); if (!response.ok) throw new Error(`HTTP ${response.status}`); console.log(`✅ Registro renomeado: ${newName}`); } catch (e) { console.error(`❌ Erro no registro ${newName}: ${e.message}`); } // Rename da rota (se existir) if (routeId) { const routeUrl = `https://www.airlinemanager.com/fleet_details.php?id=${routeId}&mode=routeReg®=${encodeURIComponent(newName)}&fbSig=false&_${timestamp + 1}`; try { const response = await fetch(routeUrl); if (!response.ok) throw new Error(`HTTP ${response.status}`); console.log(`✅ Rota renomeada: ${newName}`); } catch (e) { console.error(`❌ Erro na rota ${newName}: ${e.message}`); } } else { console.log(`ℹ️ Sem rota para ${newName}`); } // Atualizar interface plane.a.textContent = newName; // Atualizar flightData se existir if (typeof flightData !== 'undefined' && Array.isArray(flightData)) { const flight = flightData.find(f => f.id == planeId); if (flight) flight.routeReg = newName; } // Delay de 1 segundo await new Promise(resolve => setTimeout(resolve, 1000)); } // Executar renames console.log('🚀 === INICIANDO PROCESSO DE RENAME ==='); for (let i = 0; i < toRename.length; i++) { const plane = toRename[i]; const newName = `${prefix}-${String(nextNumber).padStart(4, '0')}`; nextNumber++; console.log(`📊 Progresso: ${i + 1}/${toRename.length} (${Math.round((i + 1) / toRename.length * 100)}%)`); console.log(` ${plane.currentName} → ${newName}`); await renameOne(plane, newName); } console.log(`🎉 === CONCLUÍDO! ===`); console.log(`✅ Sua frota agora usa "${prefix}-XXXX" de ${prefix}-0001 até ${prefix}-${String(nextNumber - 1).padStart(4, '0')}`); alert(`✅ Rename concluído! ${toRename.length} aviões renomeados com sucesso!`); })();