MCPcopy Create free account
hub / github.com/GlobalTechInfo/MEGA-MD / handler

Function handler

plugins/stickercrop.js:63–180  ·  view source on GitHub ↗
(sock, message, args, context)

Source from the content-addressed store, hash-verified

61 description: 'Crop image/video/sticker to circle sticker',
62 usage: '.crop (reply to image/video/sticker)',
63 async handler(sock, message, args, context) {
64 const { chatId, channelInfo } = context;
65 const messageToQuote = message;
66 let targetMessage = message;
67 if (message.message?.extendedTextMessage?.contextInfo?.quotedMessage) {
68 const quotedInfo = message.message.extendedTextMessage.contextInfo;
69 targetMessage = {
70 key: {
71 remoteJid: chatId,
72 id: quotedInfo.stanzaId,
73 participant: quotedInfo.participant
74 },
75 message: quotedInfo.quotedMessage
76 };
77 }
78 const mediaMessage = targetMessage.message?.imageMessage || targetMessage.message?.videoMessage || targetMessage.message?.documentMessage || targetMessage.message?.stickerMessage;
79 if (!mediaMessage) {
80 await sock.sendMessage(chatId, {
81 text: 'Please reply to an image/video/sticker with .crop, or send an image/video/sticker with .crop as the caption.',
82 ...channelInfo
83 }, { quoted: messageToQuote });
84 return;
85 }
86 try {
87 const mediaBuffer = await downloadMediaMessage(targetMessage, 'buffer', {}, {
88 logger: undefined,
89 reuploadRequest: sock.updateMediaMessage
90 });
91 if (!mediaBuffer) {
92 await sock.sendMessage(chatId, {
93 text: 'Failed to download media. Please try again.',
94 ...channelInfo
95 }, { quoted: messageToQuote });
96 return;
97 }
98 const tmpDir = path.join(process.cwd(), 'temp');
99 if (!fs.existsSync(tmpDir)) {
100 fs.mkdirSync(tmpDir, { recursive: true });
101 }
102 const tempInput = path.join(tmpDir, `temp_${Date.now()}`);
103 const tempOutput = path.join(tmpDir, `crop_${Date.now()}.webp`);
104 fs.writeFileSync(tempInput, mediaBuffer);
105 const isAnimated = mediaMessage.mimetype?.includes('gif') ||
106 mediaMessage.mimetype?.includes('video') ||
107 mediaMessage.seconds > 0;
108 const fileSizeKB = mediaBuffer.length / 1024;
109 const isLargeFile = fileSizeKB > 5000;
110 let ffmpegCommand;
111 if (isAnimated) {
112 if (isLargeFile) {
113 ffmpegCommand = `ffmpeg -i "${tempInput}" -t 2 -vf "crop=min(iw\\,ih):min(iw\\,ih),scale=512:512,fps=8" -c:v libwebp -preset default -loop 0 -vsync 0 -pix_fmt yuva420p -quality 30 -compression_level 6 -b:v 100k -max_muxing_queue_size 1024 "${tempOutput}"`;
114 }
115 else {
116 ffmpegCommand = `ffmpeg -i "${tempInput}" -t 3 -vf "crop=min(iw\\,ih):min(iw\\,ih),scale=512:512,fps=12" -c:v libwebp -preset default -loop 0 -vsync 0 -pix_fmt yuva420p -quality 50 -compression_level 6 -b:v 150k -max_muxing_queue_size 1024 "${tempOutput}"`;
117 }
118 }
119 else {
120 ffmpegCommand = `ffmpeg -i "${tempInput}" -vf "crop=min(iw\\,ih):min(iw\\,ih),scale=512:512,format=rgba" -c:v libwebp -preset default -loop 0 -vsync 0 -pix_fmt yuva420p -quality 75 -compression_level 6 "${tempOutput}"`;

Callers

nothing calls this directly

Calls 1

downloadMediaMessageFunction · 0.70

Tested by

no test coverage detected