UNPKG

zerotwomd

Version:

Multi device wa bot created by Team Zero Two.

454 lines (225 loc) 9.96 kB
const { extensionForMediaMessage, extractMessageContent, jidNormalizedUser, getContentType, normalizeMessageContent, proto, delay, downloadContentFromMessage, getBinaryNodeChild } = require("@adiwajshing/baileys") const baileys = require("@adiwajshing/baileys") const fs = require("fs") const chalk = require("chalk") const FileType = require("file-type") const moment = require("moment-timezone") const path = require("path") const { getRandom, fetchBuffer } = require("./Function") class WAConnection { constructor(conn) { for (let v in conn) { this[v] = conn[v] } } /** * * @param {*} m */ async serializeM(m) { return exports.serialize(this, m) } /** * * @param {*} text * @returns */ parseMention(text) { return [...text.matchAll(/@([0-9]{5,16}|0)/g)].map(v => v[1] + '@s.whatsapp.net') } /** * * @param {*} id * @param {*} text * @param {*} quoted * @param {*} options */ async sendText(id, text, quoted = {}, options = {}) { this.sendMessage(id, { text, ...options }, { quoted, ...options }) } /** * * @param {*} message * @param {*} fileName * @returns */ async downloadMediaMessage(message, fileName) { message = message?.msg ? message?.msg : message let mimetype = (message.msg || message).mimetype || '' let mtype = message.type ? message.type.replace(/Message/gi, "") : mimetype.split("/")[0] const stream = await downloadContentFromMessage(message, mtype) let buffer = Buffer.from([]) for await (const chunk of stream) { buffer = Buffer.concat([buffer, chunk]) } if (fileName) { let ftype = await FileType.fromBuffer(buffer) let trueFileName = fileName ? (fileName + "." + ftype.ext || mimetype.split("/")[1]) : getRandom(ftype.ext || mimetype.split("/")[1]) return fs.writeFileSync(trueFileName, buffer) } else { return buffer } } /** * * @param {*} message * @param {*} fileName * @param {*} attachExtension * @returns */ async downloadAndSaveMediaMessage(message, filename, attachExtension = true) { let quoted = message.msg ? message.msg : message let mime = (message.msg || message).mimetype || '' let messageType = message.mtype ? message.mtype.replace(/Message/gi, '') : mime.split('/')[0] const stream = await downloadContentFromMessage(quoted, messageType) let buffer = Buffer.from([]) for await(const chunk of stream) { buffer = Buffer.concat([buffer, chunk]) } let type = await FileType.fromBuffer(buffer) let trueFileName = attachExtension ? (filename + '.' + type.ext) : filename // save to file await fs.writeFileSync(trueFileName, buffer) return trueFileName } /** * * @param {*} PATH * @param {*} save * @returns */ async getFile(PATH, save) { let filename let data = Buffer.isBuffer(PATH) ? PATH : /^data:.*?\/.*?;base64,/i.test(PATH) ? Buffer.from(PATH.split`,`[1], 'base64') : /^https?:\/\//.test(PATH) ? await fetchBuffer(PATH) : fs.existsSync(PATH) ? (filename = PATH, fs.readFileSync(PATH)) : typeof PATH === 'string' ? PATH : Buffer.alloc(0) let type = await FileType.fromBuffer(data) || { mime: 'application/octet-stream', ext: '.bin' } filename = path.join(__dirname, '../tmp/' + new Date * 1 + '.' + type.ext) if (data && save) fs.promises.writeFile(filename, data) return { filename, size: await Buffer.byteLength(data), ...type, data } } /** * * @param {*} jid * @param {*} PATH * @param {*} fileName * @param {*} quoted * @param {*} options * @returns */ async sendFile(jid, PATH, fileName, quoted = {}, options = {}) { let types = await this.getFile(PATH, true) let { filename, size, ext, mime, data } = types let type = '', mimetype = mime, pathFile = filename if (options.asDocument) type = 'document' if (options.asSticker || /webp/.test(mime)) { let { writeExif } = require('./Sticker') let media = { mimetype: mime, data } pathFile = await writeExif(media, { packname: options.packname ? options.packname : global.packname, author: options.author ? options.author : global.author, categories: options.categories ? options.categories : [] }) await fs.promises.unlink(filename) type = 'sticker' mimetype = 'image/webp' } else if (/image/.test(mime)) type = 'image' else if (/video/.test(mime)) type = 'video' else if (/audio/.test(mime)) type = 'audio' else type = 'document' await this.sendMessage(jid, { [type]: { url: pathFile }, mimetype, fileName, ...options }, { quoted, ...options }) return fs.promises.unlink(pathFile) } /** * * @param {*} code * @returns */ async groupQueryInvite(code) { let result = await this.query({ tag: "iq", attrs: { type: "get", xmlns: "w:g2", to: "@g.us" }, content: [{ tag: "invite", attrs: { code } }] }) let group = getBinaryNodeChild(result, "group") let descRes = getBinaryNodeChild(group, "description") let desc, descId, descOwner, descTime if (descRes) { desc = getBinaryNodeChild(descRes, "body")?.content?.toString(), descId = descRes?.attrs?.id, descOwner = descRes?.attrs?.participant, descTime = descRes?.attrs?.t } const hasil = { id: group?.attrs?.id.includes("@") ? group?.attrs?.id : group?.attrs?.id + "@g.us", owner: group?.attrs?.creator, subject: group?.attrs?.subject, subjectOwner: group?.attrs?.s_o, subjectTime: group?.attrs?.s_t, size: group?.attrs?.size, creation: group?.attrs?.creation, participants: group?.content?.filter(v => v.tag == "participant").map(v => v.attrs), desc, descId, descOwner, descTime } return hasil } } exports.WAConnection = WAConnection exports.serialize = (conn, m, options = {}) => { if (!m) return m let M = proto.WebMessageInfo m = M.fromObject(m) if (m.key) { m.from = jidNormalizedUser(m.key.remoteJid || m.key.participant) m.fromMe = m.key.fromMe m.id = m.key.id m.isBot = m.id.startsWith("BAE5") && m.id.length == 16 m.isGroup = m.from.endsWith("@g.us") m.sender = jidNormalizedUser(m.fromMe && conn.user?.id || m.key.participant || m.from || "") } if (m.message) { m.type = getContentType(m.message) m.message = extractMessageContent(m.message) m.msg = m.message[m.type] m.mentions = m.msg?.contextInfo ? m.msg?.contextInfo.mentionedJid : [] m.quoted = m.msg?.contextInfo ? m.msg?.contextInfo.quotedMessage : null if (m.quoted) { m.quoted.type = getContentType(m.quoted) m.quoted.msg = m.quoted[m.quoted.type] m.quoted.mentions = m.msg.contextInfo.mentionedJid m.quoted.id = m.msg.contextInfo.stanzaId m.quoted.sender = jidNormalizedUser(m.msg.contextInfo.participant || m.sender) m.quoted.from = m.from m.quoted.isGroup = m.quoted.from.endsWith("@g.us") m.quoted.isBot = m.quoted.id.startsWith("BAE5") && m.quoted.id == 16 m.quoted.fromMe = (m.quoted.sender == jidNormalizedUser(conn.user && conn.user?.id)) m.quoted.text = m.quoted.msg?.text || m.quoted.msg?.caption || m.quoted.msg?.conversation || m.quoted.msg?.contentText || m.quoted.msg?.selectedDisplayText || m.quoted.msg?.title || "" let vM = m.quoted.fakeObj = M.fromObject({ key: { remoteJid: m.quoted.from, fromMe: m.quoted.fromMe, id: m.quoted.id }, message: m.quoted, ...(m.quoted.isGroup ? { participant: m.quoted.sender } : {}) }) m.quoted.delete = () => conn.sendMessage(m.quoted.from, { delete: vM.key }) m.quoted.download = (pathFile) => conn.downloadMediaMessage(m.quoted.msg, pathFile) } } m.download = (pathFile) => conn.downloadMediaMessage(m.msg, pathFile) m.body = m.text = m.message?.conversation || m.message?.[m.type]?.text || m.message?.[m.type]?.caption || m.message?.[m.type]?.contentText || m.message?.[m.type]?.selectedDisplayText || m.message?.[m.type]?.title || "" m.reply = (text, chatId = m.from, options = {}) => Buffer.isBuffer(text) ? conn.sendFile(chatId, text, 'file', '', m, { ...options }) : conn.sendText(chatId, text, m, { ...options }) return m } global.reloadFile(__filename)