// code from goatstore // api: https://store.agi.bd const axios = require("axios"); const fs = require("fs-extra"); const sharp = require("sharp"); const path = require("path"); const { execFile } = require("child_process"); const { promisify } = require("util"); const execFileAsync = promisify(execFile); module.exports = { config: { name: "slap", version: "2.0", author: "AshRedwan (Xe Mo)", countDown: 5, role: 0, shortDescription: "Anime slap GIF", longDescription: "Slap a tagged user using an animated anime GIF", category: "image", guide: { en: "{pn} @tag" } }, langs: { en: { noTag: "You must tag the person you want to slap.", error: "Failed to generate the slap GIF. Please try again." } }, onStart: async function ({ event, message, args, usersData, getLang }) { const uid1 = event.senderID; const uid2 = Object.keys(event.mentions || {})[0]; if (!uid2) return message.reply(getLang("noTag")); const gifUrl = "https://cdn.discordapp.com/attachments/1521542254068764779/1561417789565313255/slap_anime.gif?ex=6ad64722&is=6ad4f5a2&hm=ca7af4d6db98c1625a066109924db57a0f7acd4d5c4965594600074a98d5b273&"; const tempDir = path.join( __dirname, "tmp", `slap_${uid1}_${uid2}_${Date.now()}` ); const inputGif = path.join(tempDir, "input.gif"); const avatar1Path = path.join(tempDir, "girl.png"); const avatar2Path = path.join(tempDir, "boy.png"); const outputGif = path.join(tempDir, "slap.gif"); try { await fs.ensureDir(tempDir); const [avatarURL1, avatarURL2] = await Promise.all([ usersData.getAvatarUrl(uid1), usersData.getAvatarUrl(uid2) ]); const [gifResponse, avatarResponse1, avatarResponse2] = await Promise.all([ axios.get(gifUrl, { responseType: "arraybuffer", timeout: 30000 }), axios.get(avatarURL1, { responseType: "arraybuffer", timeout: 30000 }), axios.get(avatarURL2, { responseType: "arraybuffer", timeout: 30000 }) ]); await fs.writeFile(inputGif, Buffer.from(gifResponse.data)); const createAvatar = async (buffer, output) => { const size = 48; const circleMask = Buffer.from( `` ); await sharp(buffer) .resize(size, size, { fit: "cover" }) .composite([ { input: circleMask, blend: "dest-in" } ]) .png() .toFile(output); }; await Promise.all([ createAvatar(Buffer.from(avatarResponse1.data), avatar1Path), createAvatar(Buffer.from(avatarResponse2.data), avatar2Path) ]); const filter = [ "[0:v]fps=15[base]", "[base][1:v]overlay=197:71:eof_action=repeat[tmp1]", "[tmp1][2:v]overlay=268:68:eof_action=repeat,split[v][p]", "[p]palettegen[pal]", "[v][pal]paletteuse=dither=bayer" ].join(";"); await execFileAsync("ffmpeg", [ "-y", "-i", inputGif, "-i", avatar1Path, "-i", avatar2Path, "-filter_complex", filter, "-loop", "0", outputGif ], { timeout: 120000, maxBuffer: 10 * 1024 * 1024 }); const content = args .join(" ") .replace(/@\S+/g, "") .trim(); message.reply({ body: content || "SLAP! 💥", attachment: fs.createReadStream(outputGif) }, async () => { await fs.remove(tempDir).catch(() => {}); }); } catch (error) { await fs.remove(tempDir).catch(() => {}); return message.reply(getLang("error")); } } };