arabdullah's picture
sjwwehfiuwia
290c0c4 verified
import pkg, { prepareWAMessageMedia } from '@whiskeysockets/baileys';
const { generateWAMessageFromContent, proto } = pkg;
import getFBInfo from '@xaviabot/fb-downloader';
import config from '../../config.cjs';
const fbSearchResultsMap = new Map();
let fbSearchIndex = 1;
const facebookCommand = async (m, Matrix) => {
let selectedListId;
const selectedButtonId = m?.message?.templateButtonReplyMessage?.selectedId;
const interactiveResponseMessage = m?.message?.interactiveResponseMessage;
if (interactiveResponseMessage) {
const paramsJson = interactiveResponseMessage.nativeFlowResponseMessage?.paramsJson;
if (paramsJson) {
const params = JSON.parse(paramsJson);
selectedListId = params.id;
}
}
const selectedId = selectedListId || selectedButtonId;
const prefix = config.PREFIX;
const cmd = m.body.startsWith(prefix) ? m.body.slice(prefix.length).split(' ')[0].toLowerCase() : '';
const text = m.body.slice(prefix.length + cmd.length).trim();
const validCommands = ['facebook', 'fb', 'fbdl'];
if (validCommands.includes(cmd)) {
if (!text) {
return m.reply('Please provide a Facebook video URL.');
}
try {
await m.React("🕘");
const fbData = await getFBInfo(text);
console.log("fbData:", fbData); // Log the data structure
if (!fbData) {
await m.reply('No results found.');
await m.React("❌");
return;
}
fbSearchResultsMap.set(fbSearchIndex, fbData);
const videoQualities = [];
if (fbData.sd) {
videoQualities.push({ resolution: 'SD', url: fbData.sd });
}
if (fbData.hd) {
videoQualities.push({ resolution: 'HD', url: fbData.hd });
}
const buttons = videoQualities.map((video, index) => ({
"name": "quick_reply",
"buttonParamsJson": JSON.stringify({
display_text: `📥 Download ${video.resolution}`,
id: `fbmedia_${index}_${fbSearchIndex}`
})
}));
const sections = videoQualities.map((video) => ({
title: 'Video Qualities',
rows: [{
title: `📥 Download ${video.resolution}`,
description: `Resolution: ${video.resolution}`,
id: `fbmedia_${fbSearchIndex}_${video.resolution}`
}]
}));
const msg = generateWAMessageFromContent(m.from, {
viewOnceMessage: {
message: {
messageContextInfo: {
deviceListMetadata: {},
deviceListMetadataVersion: 2
},
interactiveMessage: proto.Message.InteractiveMessage.create({
body: proto.Message.InteractiveMessage.Body.create({
text: `*ETHIX-MD FACEBOOK POST DOWNLOADER*\n\n> *TITLE*: ${fbData.title}`
}),
footer: proto.Message.InteractiveMessage.Footer.create({
text: "© ᴘᴏᴡᴇʀᴇᴅ ʙʏ ᴇᴛʜɪx-ᴍᴅ"
}),
header: proto.Message.InteractiveMessage.Header.create({
...(await prepareWAMessageMedia({ image: { url: fbData.thumbnail } }, { upload: Matrix.waUploadToServer })),
title: "",
gifPlayback: true,
subtitle: "",
hasMediaAttachment: false
}),
nativeFlowMessage: proto.Message.InteractiveMessage.NativeFlowMessage.create({
buttons
}),
contextInfo: {
quotedMessage: m.message,
mentionedJid: [m.sender],
forwardingScore: 9999,
isForwarded: true,
}
}),
},
},
}, {});
await Matrix.relayMessage(msg.key.remoteJid, msg.message, {
messageId: msg.key.id
});
await m.React("✅");
fbSearchIndex += 1;
} catch (error) {
console.error("Error processing your request:", error);
await m.reply('Error processing your request.');
await m.React("❌");
}
} else if (selectedId) {
if (selectedId.startsWith('fbmedia_')) {
const parts = selectedId.split('_');
const qualityIndex = parseInt(parts[1]);
const key = parseInt(parts[2]);
const selectedMedia = fbSearchResultsMap.get(key);
if (selectedMedia) {
try {
const videoQualities = [];
if (selectedMedia.sd) {
videoQualities.push({ resolution: 'SD', url: selectedMedia.sd });
}
if (selectedMedia.hd) {
videoQualities.push({ resolution: 'HD', url: selectedMedia.hd });
}
const videoUrl = videoQualities[qualityIndex].url;
let finalMediaBuffer, mimeType, content;
finalMediaBuffer = await getStreamBuffer(videoUrl);
mimeType = 'video/mp4';
const fileSizeInMB = finalMediaBuffer.length / (1024 * 1024);
if (fileSizeInMB <= 300) {
content = {
video: finalMediaBuffer,
mimetype: 'video/mp4',
caption: '> © ᴘᴏᴡᴇʀᴇᴅ ʙʏ ᴇᴛʜɪx-ᴍᴅ',
};
await Matrix.sendMessage(m.from, content, { quoted: m });
} else {
await m.reply('The video file size exceeds 300MB.');
}
} catch (error) {
console.error("Error processing your request:", error);
await m.reply('Error processing your request.');
await m.React("❌");
}
}
}
}
};
const getStreamBuffer = async (url) => {
const response = await fetch(url);
const buffer = await response.arrayBuffer();
return Buffer.from(buffer);
};
export default facebookCommand;