const { Client, LocalAuth } = require('whatsapp-web.js'); const express = require('express'); const qrcode = require('qrcode'); const fs = require('fs-extra'); const path = require('path'); const app = express(); app.use(express.json()); // Statische Dateien aus dem "ui" Ordner servieren app.use(express.static(path.join(__dirname, 'ui'))); let lastQr = ""; let isReady = false; const SESSION_DATA = '/data/auth'; const client = new Client({ authStrategy: new LocalAuth({ dataPath: SESSION_DATA }), puppeteer: { executablePath: '/usr/bin/chromium-browser', args: [ '--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage', '--disable-gpu' ] } }); // QR Code Handling client.on('qr', (qr) => { lastQr = qr; isReady = false; console.log('Neuer QR Code generiert.'); }); client.on('ready', () => { isReady = true; lastQr = ""; console.log('WhatsApp ist bereit!'); }); // --- ROUTES --- // Hauptseite für Ingress app.get('/', (req, res) => { res.sendFile(path.join(__dirname, 'ui', 'index.html')); }); // Status API app.get('/api/status', async (req, res) => { try { let qrData = null; if (lastQr) { qrData = await qrcode.toDataURL(lastQr); } res.json({ isReady: isReady, hasQr: lastQr !== "", qrCode: qrData }); } catch (e) { res.status(500).json({ error: e.message }); } }); // Logout app.post('/auth/logout', async (req, res) => { try { await client.logout(); await fs.remove(SESSION_DATA); res.json({ success: true, message: "Erfolgreich abgemeldet. Addon startet neu..." }); setTimeout(() => process.exit(0), 2000); } catch (err) { res.status(500).json({ error: err.message }); } }); // Reset app.delete('/system/reset', async (req, res) => { try { await client.destroy(); await fs.emptyDir('/data'); res.json({ success: true, message: "Werkseinstellungen wiederhergestellt. Addon startet neu..." }); setTimeout(() => process.exit(0), 2000); } catch (err) { res.status(500).json({ error: err.message }); } }); // Sende-Schnittstelle app.post('/send', async (req, res) => { const { number, message } = req.body; if (!isReady) return res.status(503).json({ error: 'Client nicht bereit' }); try { const chatId = number.includes('@c.us') ? number : `${number}@c.us`; await client.sendMessage(chatId, message); res.json({ success: true }); } catch (err) { res.status(500).json({ error: err.message }); } }); client.initialize(); app.listen(3000, () => console.log('WhatsApp Bridge Server läuft auf Port 3000'));