const { Client, LocalAuth } = require('whatsapp-web.js'); const qrcode = require('qrcode-terminal'); const axios = require('axios'); const client = new Client({ authStrategy: new LocalAuth(), puppeteer: { args: ['--no-sandbox', '--disable-setuid-sandbox'] } }); const botStartTime = Math.floor(Date.now() / 1000); // URL do novo endpoint no seu servidor Locaweb que vai receber o pedido const URL_API_RECEPCAO = 'https://flaviofreitas.com.br/grafica-rapida-online-mp/api_zap.php'; // Memória do Bot: Guarda o estado da conversa de cada cliente const sessoes = {}; client.on('qr', (qr) => { qrcode.generate(qr, { small: true }); console.log('👆 Escaneie o QR Code com o celular da GrafPaper.'); }); client.on('ready', () => { console.log('✅ Robô de Atendimento Express conectado e pronto!'); }); client.on('message', async msg => { if (msg.timestamp < botStartTime) return; if (msg.from === 'status@broadcast' || msg.from.includes('@g.us')) return; const from = msg.from; const text = msg.body.trim(); // 1. SE O CLIENTE MANDAR UM ARQUIVO (Início do Fluxo) if (msg.hasMedia) { const chat = await msg.getChat(); await chat.sendStateTyping(); const media = await msg.downloadMedia(); // Inicia uma nova sessão para este número sessoes[from] = { step: 'COPIAS', media: media, pedido: {} }; await msg.reply("📄 *Arquivo recebido com sucesso!*\n\nPara agilizar sua impressão, responda:\n\n*Quantas cópias você deseja imprimir?*\n_(Digite apenas o número. Ex: 1, 2, 5)_"); return; } // 2. MÁQUINA DE ESTADOS (Se o cliente já está em um fluxo de pedido) if (sessoes[from]) { let sessao = sessoes[from]; switch (sessao.step) { case 'COPIAS': if (isNaN(text) || parseInt(text) <= 0) { await msg.reply("⚠️ Por favor, digite um número válido para as cópias (ex: 1)."); return; } sessao.pedido.copias = parseInt(text); sessao.step = 'CORES'; await msg.reply("🎨 *Cores da Impressão:*\n\n*1* - Colorido\n*2* - Preto e Branco\n\n_(Digite 1 ou 2)_"); break; case 'CORES': if (text !== '1' && text !== '2') { await msg.reply("⚠️ Opção inválida. Digite *1* para Colorido ou *2* para Preto e Branco."); return; } sessao.pedido.cores = text === '1' ? 'colorido' : 'pb'; sessao.step = 'LADOS'; await msg.reply("📄 *Tipo de Impressão:*\n\n*1* - Apenas Frente\n*2* - Frente e Verso\n\n_(Digite 1 ou 2)_"); break; case 'LADOS': if (text !== '1' && text !== '2') { await msg.reply("⚠️ Opção inválida. Digite *1* para Frente ou *2* para Frente e Verso."); return; } sessao.pedido.lados = text === '1' ? 'frente' : 'frente_verso'; sessao.step = 'CONFIRMACAO'; // Resumo do pedido let corNome = sessao.pedido.cores === 'colorido' ? 'Colorido' : 'Preto e Branco'; let ladoNome = sessao.pedido.lados === 'frente' ? 'Frente' : 'Frente e Verso'; let resumo = `✅ *RESUMO DO PEDIDO*\n\n` + `- Cópias: ${sessao.pedido.copias}\n` + `- Cor: ${corNome}\n` + `- Tipo: ${ladoNome}\n\n` + `*Confirmar pedido?*\n*1* - Sim, gerar link de pagamento\n*2* - Refazer pedido`; await msg.reply(resumo); break; case 'CONFIRMACAO': if (text === '2') { delete sessoes[from]; await msg.reply("🔄 Pedido cancelado! Envie o arquivo novamente para recomeçar."); return; } if (text === '1') { const chat = await msg.getChat(); await chat.sendStateTyping(); await msg.reply("⏳ Processando seu arquivo e gerando o pedido de impressão segura... Aguarde um momento."); try { // Envia os dados e o arquivo Base64 para o seu PHP na Locaweb const payload = { telefone: from, copias: sessao.pedido.copias, cores: sessao.pedido.cores, lados: sessao.pedido.lados, arquivoBase64: sessao.media.data, mimeType: sessao.media.mimetype, nomeArquivo: sessao.media.filename || 'documento_whatsapp.pdf' }; const response = await axios.post(URL_API_RECEPCAO, payload); if (response.data && response.data.sucesso) { const linkPagamento = response.data.link; await msg.reply(`🎉 *Pedido Gerado com Sucesso!*\n\nPara liberar sua impressão imediatamente, realize o pagamento acessando o link abaixo:\n\n👉 ${linkPagamento}\n\n_Sua impressão sairá logo após a confirmação!_`); } else { await msg.reply("❌ Ocorreu um erro no servidor ao processar seu arquivo. Tente novamente."); console.error("Erro no PHP:", response.data); } } catch (error) { console.error("Erro Axios:", error.message); await msg.reply("❌ Erro de comunicação com o servidor. Tente novamente mais tarde."); } // Limpa a sessão após o envio delete sessoes[from]; } else { await msg.reply("⚠️ Digite *1* para Confirmar ou *2* para Refazer."); } break; } return; } // Se não for arquivo e não tiver sessão, pode integrar com Dialogflow ou IA depois // Por enquanto, ignora ou dá uma saudação padrão instruindo a enviar o PDF console.log(`Mensagem solta ignorada de ${from}: ${text}`); }); client.initialize();