whatsauto.js
Version:
Easy WhatsApp Automation with Session
92 lines (91 loc) • 4.19 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.generateStickerID = exports.makeWebpBuffer = void 0;
const fs_1 = __importDefault(require("fs"));
const crypto_1 = require("crypto");
const file_type_1 = require("file-type");
const node_webpmux_1 = require("node-webpmux");
const os_1 = require("os");
const fs_extra_1 = require("fs-extra");
const path_1 = require("path");
const fluent_ffmpeg_1 = __importDefault(require("fluent-ffmpeg"));
const makeWebpBuffer = (options) => __awaiter(void 0, void 0, void 0, function* () {
const getRandomName = () => `${Math.random().toString(36).slice(2)}.webp`;
let buffer = null;
let { media, pack = "", author = "" } = options;
if (!media)
return buffer;
const tempDir = (0, path_1.join)((0, os_1.tmpdir)(), `webp_${Math.random().toString(36).slice(2)}`);
yield (0, fs_extra_1.ensureDir)(tempDir);
const inputName = (0, path_1.join)(tempDir, typeof media == "string" ? media : getRandomName());
const webpName = (0, path_1.join)(tempDir, getRandomName());
const data = JSON.stringify({
"sticker-pack-id": (0, exports.generateStickerID)(),
"sticker-pack-name": pack,
"sticker-pack-publisher": author,
emojis: ["🐾"],
});
const exif = Buffer.concat([
Buffer.from([
0x49, 0x49, 0x2a, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x41, 0x57, 0x07, 0x00, 0x00,
0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00,
]),
Buffer.from(data, "utf-8"),
]);
exif.writeUIntLE(new TextEncoder().encode(data).length, 14, 4);
const getStickerBuffer = (buffer) => __awaiter(void 0, void 0, void 0, function* () {
const img = new node_webpmux_1.Image();
yield img.load(buffer);
img.exif = exif;
return yield img.save(null);
});
if (Buffer.isBuffer(media)) {
fs_1.default.writeFileSync(inputName, media);
}
else if (typeof media == "string") {
media = fs_1.default.readFileSync(media);
}
else {
return buffer;
}
const { mime } = yield (0, file_type_1.fromBuffer)(media);
if (mime.includes("webp")) {
return yield getStickerBuffer(media);
}
return new Promise((resolve) => {
(0, fluent_ffmpeg_1.default)(inputName)
.input(inputName)
.on("error", () => __awaiter(void 0, void 0, void 0, function* () {
yield (0, fs_extra_1.remove)(tempDir);
resolve(buffer);
}))
.on("end", () => __awaiter(void 0, void 0, void 0, function* () {
buffer = yield getStickerBuffer(fs_1.default.readFileSync(webpName));
yield (0, fs_extra_1.remove)(tempDir);
resolve(buffer);
}))
.addOutputOptions([
`-vcodec`,
`libwebp`,
`-lavfi`,
`scale='min(512,iw)':'min(512,ih)':force_original_aspect_ratio=decrease,fps=15, pad=512:512:-1:-1:color=white@0.0, split [a][b]; [a] palettegen=reserve_transparent=on:transparency_color=ffffff [p]; [b][p] paletteuse`,
])
.toFormat("webp")
.save(webpName);
});
});
exports.makeWebpBuffer = makeWebpBuffer;
const generateStickerID = () => `whatsauto.js|${(0, crypto_1.randomBytes)(16).toString("hex")}`;
exports.generateStickerID = generateStickerID;