antonio_pedro

AM4 Rename Plane

Sep 22nd, 2025
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
JavaScript 8.86 KB | Source Code | 0 0
  1. // ==========================================
  2. //  CRIADO POR ANTONIO PEDRO - 2025
  3. // ==========================================
  4.  
  5. (async function() {
  6.   // CONFIGURAÇÃO INICIAL
  7.   let prefix = prompt('Qual prefixo você quer usar para os nomes? (ex: XSS)', 'XSS') || 'XSS';
  8.   prefix = prefix.toUpperCase().trim();
  9.  
  10.   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).');
  11.   const renameAll = mode;
  12.  
  13.   console.log(`🚀 Iniciando rename com prefixo: ${prefix}`);
  14.   console.log(`Modo: ${renameAll ? 'Renomear TODOS' : 'Só não nomeados (continuar numeração)'}`);
  15.  
  16.   // Função para aguardar elemento
  17.   function waitForElement(selector, timeout = 5000) {
  18.     return new Promise((resolve, reject) => {
  19.       if (document.querySelector(selector)) {
  20.         return resolve(document.querySelector(selector));
  21.       }
  22.       const observer = new MutationObserver(() => {
  23.         if (document.querySelector(selector)) {
  24.           resolve(document.querySelector(selector));
  25.           observer.disconnect();
  26.         }
  27.       });
  28.       observer.observe(document.body, { childList: true, subtree: true });
  29.       setTimeout(() => {
  30.         observer.disconnect();
  31.         reject(new Error(`Timeout waiting for ${selector}`));
  32.       }, timeout);
  33.     });
  34.   }
  35.  
  36.   // Função para encontrar botão "Frota" (CORRIGIDA)
  37.   function findFleetButton() {
  38.     console.log('🔍 Procurando botão "Frota"...');
  39.    
  40.     // Buscar todos os botões
  41.     const allButtons = document.querySelectorAll('button, [class*="btn"], .listBtns');
  42.     console.log(`📊 Total de botões encontrados: ${allButtons.length}`);
  43.    
  44.     for (let btn of allButtons) {
  45.       const text = (btn.textContent || btn.innerText || '').trim();
  46.       const onclick = btn.getAttribute('onclick') || '';
  47.      
  48.       console.log(`🔍 Verificando botão: "${text.substring(0, 30)}..." | onclick: ${onclick.substring(0, 50)}...`);
  49.      
  50.       // Verificar texto
  51.       if (text.toLowerCase().includes('frota') || text.includes('Fleet')) {
  52.         console.log(`🎯 BOTÃO FROTA ENCONTRADO! Texto: "${text}"`);
  53.         return btn;
  54.       }
  55.      
  56.       // Verificar onclick
  57.       if (onclick.includes('fleet.php') && !onclick.includes('parked')) {
  58.         console.log(`🎯 BOTÃO FROTA ENCONTRADO! onclick: ${onclick}`);
  59.         return btn;
  60.       }
  61.     }
  62.    
  63.     console.log('❌ Botão "Frota" não encontrado automaticamente.');
  64.     return null;
  65.   }
  66.  
  67.   // Verificar se já está na lista de frota
  68.   console.log('🔍 Verificando se a lista de frota está carregada...');
  69.   let fleetDetailList = document.querySelector('#fleetDetailList');
  70.  
  71.   if (!fleetDetailList) {
  72.     console.log('📂 Lista não carregada. Tentando clicar no botão "Frota"...');
  73.    
  74.     const fleetButton = findFleetButton();
  75.    
  76.     if (fleetButton) {
  77.       console.log('🎯 Clicando no botão "Frota"...');
  78.       fleetButton.click();
  79.      
  80.       // Aguardar o #fleetDetailList aparecer
  81.       try {
  82.         await waitForElement('#fleetDetailList', 10000);
  83.         console.log('✅ Lista de frota carregada com sucesso!');
  84.         fleetDetailList = document.querySelector('#fleetDetailList');
  85.       } catch (e) {
  86.         console.error('❌ Erro ao aguardar lista: ', e);
  87.         alert('❌ Não conseguiu carregar a lista de frota. Clique manualmente no botão "Frota" e execute o script novamente.');
  88.         return;
  89.       }
  90.     } else {
  91.       console.error('❌ Botão "Frota" não encontrado!');
  92.       alert('❌ Botão "Frota" não encontrado. Execute o script de diagnóstico para encontrar o botão correto.');
  93.       return;
  94.     }
  95.   } else {
  96.     console.log('✅ Lista de frota já carregada.');
  97.   }
  98.  
  99.   // Extrair aviões
  100.   const rows = document.querySelectorAll('#fleetDetailList .row.border');
  101.   console.log(`📊 Número de aviões encontrados: ${rows.length}`);
  102.  
  103.   if (rows.length === 0) {
  104.     console.error('❌ Nenhum avião encontrado na lista!');
  105.     console.log('💡 Execute o diagnóstico para ver a estrutura:');
  106.     console.log('document.querySelectorAll("#fleetDetailList > div").length');
  107.     alert('❌ Nenhum avião na lista. Compre aviões ou clique em "Frota" primeiro.');
  108.     return;
  109.   }
  110.  
  111.   const planes = [];
  112.   let maxNumber = 0;
  113.  
  114.   rows.forEach((row, index) => {
  115.     const a = row.querySelector('a[href="#"]');
  116.     if (a) {
  117.       const onclick = a.getAttribute('onclick');
  118.       if (!onclick) return;
  119.      
  120.       const idMatch = onclick.match(/id=(\d+)/);
  121.       if (!idMatch) return;
  122.      
  123.       const planeId = idMatch[1];
  124.       const currentName = a.textContent.trim();
  125.      
  126.       // Verificar se já tem o formato correto
  127.       const match = currentName.match(new RegExp(`^${prefix}-(\\d{4})$`));
  128.       if (match) {
  129.         const num = parseInt(match[1], 10);
  130.         if (num > maxNumber) maxNumber = num;
  131.       }
  132.      
  133.       planes.push({ planeId, currentName, row, a });
  134.       console.log(`✈️ Avião ${index + 1}: ID=${planeId}, Nome="${currentName}"`);
  135.     }
  136.   });
  137.  
  138.   console.log(`🔍 Aviões válidos extraídos: ${planes.length}`);
  139.  
  140.   if (planes.length === 0) {
  141.     console.error('❌ Nenhum avião válido encontrado!');
  142.     return;
  143.   }
  144.  
  145.   let nextNumber = renameAll ? 1 : (maxNumber + 1);
  146.   console.log(`📊 Iniciando numeração a partir de: ${prefix}-${String(nextNumber).padStart(4, '0')}`);
  147.  
  148.   const toRename = renameAll
  149.     ? planes
  150.     : planes.filter(p => !p.currentName.match(new RegExp(`^${prefix}-\\d{4}$`)));
  151.  
  152.   console.log(`✈️ Aviões a renomear: ${toRename.length}`);
  153.  
  154.   if (toRename.length === 0) {
  155.     console.log('✅ Nada para renomear! Todos já estão no formato correto.');
  156.     return;
  157.   }
  158.  
  159.   // Confirmar antes de começar
  160.   const confirmStart = confirm(`🚀 Preparado para renomear ${toRename.length} aviões?\nPrefixo: ${prefix}\nIniciando de: ${prefix}-${String(nextNumber).padStart(4, '0')}`);
  161.   if (!confirmStart) {
  162.     console.log('❌ Rename cancelado pelo usuário.');
  163.     return;
  164.   }
  165.  
  166.   // Função de rename individual
  167.   async function renameOne(plane, newName) {
  168.     const timestamp = Date.now();
  169.     const planeId = plane.planeId;
  170.    
  171.     // Tentar encontrar routeId
  172.     let routeId = null;
  173.     try {
  174.       if (typeof flightData !== 'undefined' && Array.isArray(flightData)) {
  175.         const flight = flightData.find(f => f.id == planeId);
  176.         routeId = flight ? flight.routeId : null;
  177.       }
  178.     } catch (e) {
  179.       console.warn('⚠️ flightData não disponível, pulando rename de rotas.');
  180.     }
  181.    
  182.     console.log(`🔄 Renomeando ${planeId} de "${plane.currentName}""${newName}"`);
  183.    
  184.     // Rename do avião
  185.     const regUrl = `https://www.airlinemanager.com/fleet_details.php?id=${planeId}&mode=reg&reg=${encodeURIComponent(newName)}&fbSig=false&_${timestamp}`;
  186.     try {
  187.       const response = await fetch(regUrl);
  188.       if (!response.ok) throw new Error(`HTTP ${response.status}`);
  189.       console.log(`✅ Registro renomeado: ${newName}`);
  190.     } catch (e) {
  191.       console.error(`❌ Erro no registro ${newName}: ${e.message}`);
  192.     }
  193.    
  194.     // Rename da rota (se existir)
  195.     if (routeId) {
  196.       const routeUrl = `https://www.airlinemanager.com/fleet_details.php?id=${routeId}&mode=routeReg&reg=${encodeURIComponent(newName)}&fbSig=false&_${timestamp + 1}`;
  197.       try {
  198.         const response = await fetch(routeUrl);
  199.         if (!response.ok) throw new Error(`HTTP ${response.status}`);
  200.         console.log(`✅ Rota renomeada: ${newName}`);
  201.       } catch (e) {
  202.         console.error(`❌ Erro na rota ${newName}: ${e.message}`);
  203.       }
  204.     } else {
  205.       console.log(`ℹ️ Sem rota para ${newName}`);
  206.     }
  207.    
  208.     // Atualizar interface
  209.     plane.a.textContent = newName;
  210.    
  211.     // Atualizar flightData se existir
  212.     if (typeof flightData !== 'undefined' && Array.isArray(flightData)) {
  213.       const flight = flightData.find(f => f.id == planeId);
  214.       if (flight) flight.routeReg = newName;
  215.     }
  216.    
  217.     // Delay de 1 segundo
  218.     await new Promise(resolve => setTimeout(resolve, 1000));
  219.   }
  220.  
  221.   // Executar renames
  222.   console.log('🚀 === INICIANDO PROCESSO DE RENAME ===');
  223.   for (let i = 0; i < toRename.length; i++) {
  224.     const plane = toRename[i];
  225.     const newName = `${prefix}-${String(nextNumber).padStart(4, '0')}`;
  226.     nextNumber++;
  227.    
  228.     console.log(`📊 Progresso: ${i + 1}/${toRename.length} (${Math.round((i + 1) / toRename.length * 100)}%)`);
  229.     console.log(`   ${plane.currentName} → ${newName}`);
  230.    
  231.     await renameOne(plane, newName);
  232.   }
  233.  
  234.   console.log(`🎉 === CONCLUÍDO! ===`);
  235.   console.log(`✅ Sua frota agora usa "${prefix}-XXXX" de ${prefix}-0001 até ${prefix}-${String(nextNumber - 1).padStart(4, '0')}`);
  236.   alert(`✅ Rename concluído! ${toRename.length} aviões renomeados com sucesso!`);
  237. })();
Advertisement
Add Comment
Please, Sign In to add comment