102 lines
4.1 KiB
JavaScript
102 lines
4.1 KiB
JavaScript
import pkg from "whatsapp-web.js";
|
||
import qrcode from "qrcode-terminal";
|
||
import { exec } from "child_process";
|
||
import { CLIENT_ID } from "../config.js";
|
||
import os from "os";
|
||
|
||
export const { Client, LocalAuth, MessageMedia } = pkg;
|
||
|
||
// ── Logger ──────────────────────────────────────────────────
|
||
const c = {
|
||
reset: "\x1b[0m", bold: "\x1b[1m", dim: "\x1b[2m",
|
||
green: "\x1b[32m", yellow: "\x1b[33m", cyan: "\x1b[36m",
|
||
red: "\x1b[31m", gray: "\x1b[90m", white: "\x1b[37m",
|
||
blue: "\x1b[34m", magenta: "\x1b[35m",
|
||
};
|
||
|
||
const now = () =>
|
||
new Date().toLocaleString("pt-BR", { dateStyle: "short", timeStyle: "short" });
|
||
|
||
export const logger = {
|
||
info: (...a) => console.log(`${c.gray}${now()}${c.reset} ℹ️ `, ...a),
|
||
success: (...a) => console.log(`${c.gray}${now()}${c.reset} ${c.green}✅${c.reset}`, ...a),
|
||
warn: (...a) => console.log(`${c.gray}${now()}${c.reset} ${c.yellow}⚠️ ${c.reset}`, ...a),
|
||
error: (...a) => console.log(`${c.gray}${now()}${c.reset} ${c.red}❌${c.reset}`, ...a),
|
||
bot: (...a) => console.log(`${c.gray}${now()}${c.reset} ${c.magenta}🤖${c.reset}`, ...a),
|
||
};
|
||
|
||
// ── Banner ───────────────────────────────────────────────────
|
||
function printBanner() {
|
||
console.log(`${c.blue}${c.bold}`);
|
||
console.log(` _____ _____ _ `);
|
||
console.log(`| |___ ___ _ _| __ |___| |_ `);
|
||
console.log(`| | | | .'| | | | __ -| . | _|`);
|
||
console.log(`|_|_|_|__,|_|_|_ |_____|___|_| `);
|
||
console.log(` |___| `);
|
||
console.log();
|
||
console.log(` website : ${c.reset}${c.cyan}www.mlplovers.com.br/manybot${c.reset}`);
|
||
console.log(` repo : ${c.reset}${c.cyan}github.com/synt-xerror/manybot${c.reset}`);
|
||
console.log();
|
||
console.log(` ${c.bold}✨ A Amizade é Mágica!${c.reset}`);
|
||
console.log();
|
||
}
|
||
|
||
// ── Ambiente ─────────────────────────────────────────────────
|
||
const isTermux =
|
||
(os.platform() === "linux" || os.platform() === "android") &&
|
||
process.env.PREFIX?.startsWith("/data/data/com.termux");
|
||
|
||
logger.info(isTermux
|
||
? `Ambiente: ${c.yellow}${c.bold}Termux${c.reset} — usando Chromium do sistema`
|
||
: `Ambiente: ${c.blue}${c.bold}${os.platform()}${c.reset} — usando Puppeteer padrão`
|
||
);
|
||
|
||
const puppeteerConfig = isTermux
|
||
? {
|
||
executablePath: "/data/data/com.termux/files/usr/bin/chromium-browser",
|
||
args: [
|
||
"--headless=new", "--no-sandbox", "--disable-setuid-sandbox",
|
||
"--disable-dev-shm-usage", "--disable-gpu", "--single-process",
|
||
"--no-zygote", "--disable-software-rasterizer",
|
||
],
|
||
}
|
||
: {};
|
||
|
||
// ── Cliente ──────────────────────────────────────────────────
|
||
export const client = new Client({
|
||
authStrategy: new LocalAuth({ clientId: CLIENT_ID }),
|
||
puppeteer: { headless: true, ...puppeteerConfig },
|
||
});
|
||
|
||
client.on("qr", async qr => {
|
||
if (isTermux) {
|
||
try {
|
||
await QRCode.toFile(QR_PATH, qr, { width: 400 });
|
||
logger.bot(`QR Code salvo em: ${c.cyan}${c.bold}${QR_PATH}${c.reset}`);
|
||
logger.bot(`Abra com: ${c.yellow}termux-open qr.png${c.reset}`);
|
||
} catch (err) {
|
||
logger.error("Falha ao salvar QR Code:", err.message);
|
||
}
|
||
} else {
|
||
logger.bot(`Escaneie o ${c.yellow}${c.bold}QR Code${c.reset} abaixo:`);
|
||
qrcode.generate(qr, { small: true });
|
||
}
|
||
});
|
||
|
||
client.on("ready", () => {
|
||
exec("clear");
|
||
printBanner();
|
||
logger.success(`${c.green}${c.bold}WhatsApp conectado e pronto!${c.reset}`);
|
||
logger.info(`Client ID: ${c.cyan}${CLIENT_ID}${c.reset}`);
|
||
});
|
||
|
||
client.on("disconnected", reason => {
|
||
logger.warn(`Desconectado — motivo: ${c.yellow}${reason}${c.reset}`);
|
||
logger.info(`Reconectando em ${c.cyan}5s${c.reset}...`);
|
||
setTimeout(() => {
|
||
logger.bot("Reinicializando cliente...");
|
||
client.initialize();
|
||
}, 5000);
|
||
});
|
||
|
||
export default client; |