| const { imageToWebp, videoToWebp, writeExifImg, writeExifVid } = require('../lib/exif') |
| const { |
| default: makeWASocket, |
| makeWALegacySocket, |
| extractMessageContent, |
| makeInMemoryStore, |
| proto, |
| prepareWAMessageMedia, |
| downloadContentFromMessage, |
| getBinaryNodeChild, |
| jidDecode, |
| areJidsSameUser, |
| generateForwardMessageContent, |
| generateWAMessageFromContent, |
| WAMessageStubType, |
| WA_DEFAULT_EPHEMERAL, |
| } = require('@adiwajshing/baileys') |
| const { toAudio, toPTT, toVideo } = require('./converter') |
| const chalk = require('chalk') |
| const fetch = require('node-fetch') |
| const FileType = require('file-type') |
| const PhoneNumber = require('awesome-phonenumber') |
| const fs = require('fs') |
| const path = require('path') |
| const jimp = require('jimp') |
| const pino = require('pino') |
| const util = require('util') |
| const store = makeInMemoryStore({ logger: pino().child({ level: 'silent', stream: 'store' }) }) |
|
|
|
|
| exports.makeWASocket = (connectionOptions, options = {}) => { |
| let conn = (opts['legacy'] ? makeWALegacySocket : makeWASocket)(connectionOptions) |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| conn.decodeJid = (jid) => { |
| if (!jid) return jid |
| if (/:\d+@/gi.test(jid)) { |
| const decode = jidDecode(jid) || {} |
| return decode.user && decode.server && decode.user + '@' + decode.server || jid |
| } else return jid |
| } |
| if (conn.user && conn.user.id) conn.user.jid = conn.decodeJid(conn.user.id) |
| if (!conn.chats) conn.chats = {} |
|
|
| function updateNameToDb(contacts) { |
| if (!contacts) return |
| for (const contact of contacts) { |
| const id = conn.decodeJid(contact.id) |
| if (!id) continue |
| let chats = conn.chats[id] |
| if (!chats) chats = conn.chats[id] = { id } |
| conn.chats[id] = { |
| ...chats, |
| ...({ |
| ...contact, id, ...(id.endsWith('@g.us') ? |
| { subject: contact.subject || chats.subject || '' } : |
| { name: contact.notify || chats.name || chats.notify || '' }) |
| } || {}) |
| } |
| } |
| } |
| |
| |
| conn.ev.on('contacts.upsert', updateNameToDb) |
| conn.ev.on('groups.update', updateNameToDb) |
| conn.ev.on('chats.set', async ({ chats }) => { |
| for (const { id, name, readOnly } of chats) { |
| id = conn.decodeJid(id) |
| if (!id) continue |
| const isGroup = id.endsWith('@g.us') |
| let chats = conn.chats[id] |
| if (!chats) chats = conn.chats[id] = { id } |
| chats.isChats = !readOnly |
| if (name) chats[isGroup ? 'subject' : 'name'] = name |
| if (isGroup) { |
| const metadata = await conn.groupMetadata(id).catch(_ => null) |
| if (!metadata) continue |
| chats.subject = name || metadata.subject |
| chats.metadata = metadata |
| } |
| } |
| }) |
| conn.ev.on('group-participants.update', async function updateParticipantsToDb({ id, participants, action }) { |
| id = conn.decodeJid(id) |
| if (!(id in conn.chats)) conn.chats[id] = { id } |
| conn.chats[id].isChats = true |
| const groupMetadata = await conn.groupMetadata(id).catch(_ => null) |
| if (!groupMetadata) return |
| conn.chats[id] = { |
| ...conn.chats[id], |
| subject: groupMetadata.subject, |
| metadata: groupMetadata |
| } |
| }) |
|
|
| conn.ev.on('groups.update', async function groupUpdatePushToDb(groupsUpdates) { |
| for (const update of groupsUpdates) { |
| const id = conn.decodeJid(update.id) |
| if (!id) continue |
| const isGroup = id.endsWith('@g.us') |
| if (!isGroup) continue |
| let chats = conn.chats[id] |
| if (!chats) chats = conn.chats[id] = { id } |
| chats.isChats = true |
| const metadata = await conn.groupMetadata(id).catch(_ => null) |
| if (!metadata) continue |
| chats.subject = metadata.subject |
| chats.metadata = metadata |
| } |
| }) |
| conn.ev.on('chats.upsert', async function chatsUpsertPushToDb(chatsUpsert) { |
| console.log({ chatsUpsert }) |
| const { id, name } = chatsUpsert |
| if (!id) return |
| let chats = conn.chats[id] = { ...conn.chats[id], ...chatsUpsert, isChats: true } |
| const isGroup = id.endsWith('@g.us') |
| if (isGroup) { |
| const metadata = await conn.groupMetadata(id).catch(_ => null) |
| if (metadata) { |
| chats.subject = name || metadata.subject |
| chats.metadata = metadata |
| } |
| const groups = await conn.groupFetchAllParticipating().catch(_ => ({})) || {} |
| for (const group in groups) conn.chats[group] = { id: group, subject: groups[group].subject, isChats: true, metadata: groups[group] } |
| } |
| }) |
| conn.ev.on('presence.update', async function presenceUpdatePushToDb({ id, presences }) { |
| const sender = Object.keys(presences)[0] || id |
| const _sender = conn.decodeJid(sender) |
| const presence = presences[sender]['lastKnownPresence'] || 'composing' |
| let chats = conn.chats[_sender] |
| if (!chats) chats = conn.chats[_sender] = { id: sender } |
| chats.presences = presence |
| if (id.endsWith('@g.us')) { |
| let chats = conn.chats[id] |
| if (!chats) { |
| const metadata = await conn.groupMetadata(id).catch(_ => null) |
| if (metadata) chats = conn.chats[id] = { id, subject: metadata.subject, metadata } |
| } |
| chats.isChats = true |
| } |
| }) |
|
|
| conn.logger = { |
| ...conn.logger, |
| info(...args) { console.log(chalk.bold.rgb(57, 183, 16)(`INFO [${chalk.rgb(255, 255, 255)(new Date())}]:`), chalk.cyan(util.format(...args))) }, |
| error(...args) { console.log(chalk.bold.rgb(247, 38, 33)(`ERROR [${chalk.rgb(255, 255, 255)(new Date())}]:`), chalk.rgb(255, 38, 0)(util.format(...args))) }, |
| warn(...args) { console.log(chalk.bold.rgb(239, 225, 3)(`WARNING [${chalk.rgb(255, 255, 255)(new Date())}]:`), chalk.keyword('orange')(util.format(...args))) } |
| } |
|
|
|
|
| |
| |
| |
| |
| |
| conn.getFile = async (PATH, returnAsFilename) => { |
| let res, filename |
| let data = Buffer.isBuffer(PATH) ? PATH : /^data:.*?\/.*?;base64,/i.test(PATH) ? Buffer.from(PATH.split`,`[1], 'base64') : /^https?:\/\//.test(PATH) ? await (res = await fetch(PATH)).buffer() : fs.existsSync(PATH) ? (filename = PATH, fs.readFileSync(PATH)) : typeof PATH === 'string' ? PATH : Buffer.alloc(0) |
| if (!Buffer.isBuffer(data)) throw new TypeError('Result is not a buffer') |
| let type = await FileType.fromBuffer(data) || { |
| mime: 'application/octet-stream', |
| ext: '.bin' |
| } |
| if (data && returnAsFilename && !filename) (filename = path.join(__dirname, '../tmp/' + new Date * 1 + '.' + type.ext), await fs.promises.writeFile(filename, data)) |
| return { |
| res, |
| filename, |
| ...type, |
| data |
| } |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| conn.waitEvent = (eventName, is = () => true, maxTries = 25) => { |
| return new Promise((resolve, reject) => { |
| let tries = 0 |
| let on = (...args) => { |
| if (++tries > maxTries) reject('Max tries reached') |
| else if (is()) { |
| conn.ev.off(eventName, on) |
| resolve(...args) |
| } |
| } |
| conn.ev.on(eventName, on) |
| }) |
| } |
| |
| conn.delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms)) |
| |
| |
| |
| |
| |
| |
| conn.filter = (text) => { |
| let mati = ["q", "w", "r", "t", "y", "p", "s", "d", "f", "g", "h", "j", "k", "l", "z", "x", "c", "v", "b", "n", "m"] |
| if (/[aiueo][aiueo]([qwrtypsdfghjklzxcvbnm])?$/i.test(text)) return text.substring(text.length - 1) |
| else { |
| let res = Array.from(text).filter(v => mati.includes(v)) |
| let resu = res[res.length - 1] |
| for (let huruf of mati) { |
| if (text.endsWith(huruf)) { |
| resu = res[res.length - 2] |
| } |
| } |
| let misah = text.split(resu) |
| return resu + misah[misah.length - 1] |
| } |
| } |
| |
| |
| |
| |
| |
| conn.msToDate = (ms) => { |
| let days = Math.floor(ms / (24 * 60 * 60 * 1000)); |
| let daysms = ms % (24 * 60 * 60 * 1000); |
| let hours = Math.floor((daysms) / (60 * 60 * 1000)); |
| let hoursms = ms % (60 * 60 * 1000); |
| let minutes = Math.floor((hoursms) / (60 * 1000)); |
| let minutesms = ms % (60 * 1000); |
| let sec = Math.floor((minutesms) / (1000)); |
| return days + " Hari " + hours + " Jam " + minutes + " Menit"; |
| |
| } |
| |
| |
| |
| |
| conn.rand = async (isi) => { |
| return isi[Math.floor(Math.random() * isi.length)] |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| conn.resize = async (buffer, uk1, uk2) => { |
| return new Promise(async(resolve, reject) => { |
| var baper = await jimp.read(buffer); |
| var ab = await baper.resize(uk1, uk2).getBufferAsync(jimp.MIME_JPEG) |
| resolve(ab) |
| }) |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| conn.sendMedia = async (jid, path, quoted, options = {}) => { |
| let { ext, mime, data } = await conn.getFile(path) |
| messageType = mime.split("/")[0] |
| pase = messageType.replace('application', 'document') || messageType |
| return await conn.sendMessage(jid, { [`${pase}`]: data, mimetype: mime, ...options }, { quoted }) |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| conn.getFile = async (PATH, returnAsFilename) => { |
| let res, filename |
| let data = Buffer.isBuffer(PATH) ? PATH : /^data:.*?\/.*?;base64,/i.test(PATH) ? Buffer.from(PATH.split`,`[1], 'base64') : /^https?:\/\//.test(PATH) ? await (res = await fetch(PATH)).buffer() : fs.existsSync(PATH) ? (filename = PATH, fs.readFileSync(PATH)) : typeof PATH === 'string' ? PATH : Buffer.alloc(0) |
| if (!Buffer.isBuffer(data)) throw new TypeError('Result is not a buffer') |
| let type = await FileType.fromBuffer(data) || { |
| mime: 'application/octet-stream', |
| ext: '.bin' |
| } |
| if (data && returnAsFilename && !filename) (filename = path.join(__dirname, '../tmp/' + new Date * 1 + '.' + type.ext), await fs.promises.writeFile(filename, data)) |
| return { |
| res, |
| filename, |
| ...type, |
| data |
| } |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| conn.sendFile = async (jid, path, filename = '', caption = '', quoted, ptt = false, options = {}) => { |
| let type = await conn.getFile(path, true) |
| let { res, data: file, filename: pathFile } = type |
| if (res && res.status !== 200 || file.length <= 65536) { |
| try { throw { json: JSON.parse(file.toString()) } } |
| catch (e) { if (e.json) throw e.json } |
| } |
| let opt = { filename } |
| if (quoted) opt.quoted = quoted |
| if (!type) if (options.asDocument) options.asDocument = true |
| let mtype = '', mimetype = type.mime |
| if (/webp/.test(type.mime)) mtype = 'sticker' |
| else if (/image/.test(type.mime)) mtype = 'image' |
| else if (/video/.test(type.mime)) mtype = 'video' |
| else if (/audio/.test(type.mime)) ( |
| convert = await (ptt ? toPTT : toAudio)(file, type.ext), |
| file = convert.data, |
| pathFile = convert.filename, |
| mtype = 'audio', |
| mimetype = 'audio/ogg; codecs=opus' |
| ) |
| else mtype = 'document' |
| return await conn.sendMessage(jid, { |
| ...options, |
| caption, |
| ptt, |
| [mtype]: { url: pathFile }, |
| mimetype |
| }, { |
| ...opt, |
| ...options |
| }) |
| } |
| |
| conn.sendImageAsSticker = async (jid, path, quoted, options = {}) => { |
| let buff = Buffer.isBuffer(path) ? path : /^data:.*?\/.*?;base64,/i.test(path) ? Buffer.from(path.split`,`[1], 'base64') : /^https?:\/\//.test(path) ? await (await fetch(path)).buffer() : fs.existsSync(path) ? fs.readFileSync(path) : Buffer.alloc(0) |
| let buffer |
| if (options && (options.packname || options.author)) { |
| buffer = await writeExifImg(buff, options) |
| } else { |
| buffer = await imageToWebp(buff) |
| } |
|
|
| await conn.sendMessage(jid, { sticker: { url: buffer }, ...options }, { quoted }) |
| return buffer |
| } |
| conn.sendVideoAsSticker = async (jid, path, quoted, options = {}) => { |
| let buff = Buffer.isBuffer(path) ? path : /^data:.*?\/.*?;base64,/i.test(path) ? Buffer.from(path.split`,`[1], 'base64') : /^https?:\/\//.test(path) ? await (await fetch(path)).buffer() : fs.existsSync(path) ? fs.readFileSync(path) : Buffer.alloc(0) |
| let buffer |
| if (options && (options.packname || options.author)) { |
| buffer = await writeExifVid(buff, options) |
| } else { |
| buffer = await videoToWebp(buff) |
| } |
|
|
| await conn.sendMessage(jid, { sticker: { url: buffer }, ...options }, { quoted }) |
| return buffer |
| } |
| |
| |
| |
| |
| |
| |
| |
| conn.sendContact = async (jid, data, quoted, options) => { |
| let contacts = [] |
| for (let [number, name] of data) { |
| number = number.replace(/[^0-9]/g, '') |
| let njid = number + '@s.whatsapp.net' |
| let biz = await conn.getBusinessProfile(njid) || {} |
| |
| let vcard = ` |
| BEGIN:VCARD |
| VERSION:3.0 |
| FN:${name.replace(/\n/g, '\\n')} |
| item1.TEL;waid=${number}:${PhoneNumber('+' + number).getNumber('international')} |
| item1.X-ABLabel:Ponsel${biz.description ? ` |
| PHOTO;BASE64:${(await conn.getFile(await conn.profilePictureUrl(njid)).catch(_ => ({})) || {}).data?.toString('base64')} |
| X-WA-BIZ-DESCRIPTION:${(biz.description || '').replace(/\n/g, '\\n')} |
| X-WA-BIZ-NAME:${(((conn.chats[njid] || {}) || { vname: conn.chats[njid]?.name }).vname || conn.getName(njid) || name).replace(/\n/, '\\n')} |
| `.trim() : ''} |
| END:VCARD |
| `.trim() |
| contacts.push({ vcard, displayName: name }) |
|
|
| } |
| return await conn.sendMessage(jid, { |
| contacts: { |
| ...options, |
| displayName: (contacts.length > 1 ? `${contacts.length} kontak` : contacts[0].displayName) || null, |
| contacts, |
| }, |
| quoted, ...options |
| }) |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| conn.reply = (jid, text = '', quoted, options) => { |
| return Buffer.isBuffer(text) ? this.sendFile(jid, text, 'file', '', quoted, false, options) : conn.sendMessage(jid, { ...options, text, mentions: conn.parseMention(text) }, { quoted, ...options, mentions: conn.parseMention(text) }) |
| } |
| |
| conn.decodeJid = (jid) => { |
| if (!jid) return jid |
| if (/:\d+@/gi.test(jid)) { |
| let decode = jidDecode(jid) || {} |
| return decode.user && decode.server && decode.user + '@' + decode.server || jid |
| } else return jid |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| conn.sendText = (jid, text, quoted = '', options) => conn.sendMessage(jid, { text: text, ...options }, { quoted }) |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| conn.sendGroupV4Invite = async (jid, participant, inviteCode, inviteExpiration, groupName = 'unknown subject', caption = 'Invitation to join my WhatsApp group', options = {}) => { |
| let msg = proto.Message.fromObject({ |
| groupInviteMessage: proto.GroupInviteMessage.fromObject({ |
| inviteCode, |
| inviteExpiration: parseInt(inviteExpiration) || + new Date(new Date + (3 * 86400000)), |
| groupJid: jid, |
| groupName: groupName ? groupName : this.getName(jid), |
| caption |
| }) |
| }) |
| let message = await this.prepareMessageFromContent(participant, msg, options) |
| await this.relayWAMessage(message) |
| return message |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| conn.sendButton = async (jid, contentText, footer, buffer, buttons, quoted, options) => { |
| if (buffer) try { buffer = (await conn.getFile(buffer)).data } catch { buffer = null } |
| let message = { |
| ...options, |
| ...(buffer ? { caption: contentText || '' } : { text: contentText || '' }), |
| footer, |
| buttons: buttons.map(btn => { |
| return { |
| buttonId: btn[1] || btn[0] || '', |
| buttonText: { |
| displayText: btn[0] || btn[1] || '' |
| } |
| } |
| }), |
| ...(buffer ? { image: buffer } : {}) |
| } |
| return await conn.sendMessage(jid, message, { |
| quoted, |
| upload: conn.waUploadToServer, |
| ...options |
| }) |
| } |
| |
| conn.sendBut = async(jid, content, footer, button1, row1, quoted) => { |
| const buttons = [ |
| {buttonId: row1, buttonText: {displayText: button1}, type: 1} |
| ] |
| const buttonMessage = { |
| text: content, |
| footer: footer, |
| buttons: buttons, |
| headerType: 1, |
| mentions: conn.parseMention(footer+content) |
| } |
| return await conn.sendMessage(jid, buttonMessage, {quoted}) |
| } |
| |
| conn.send2But = async(jid, content, footer, button1, row1, button2, row2, quoted) => { |
| const buttons = [ |
| { buttonId: row1, buttonText: { displayText: button1 }, type: 1 }, |
| { buttonId: row2, buttonText: { displayText: button2 }, type: 1 } |
| ] |
| const buttonMessage = { |
| text: content, |
| footer: footer, |
| buttons: buttons, |
| headerType: 1 |
| } |
| return await conn.sendMessage(jid, buttonMessage, {quoted}) |
| } |
| |
| conn.send3But = async(jid, content, footer,button1, row1, button2, row2, button3, row3, quoted) => { |
| const buttons = [ |
| { buttonId: row1, buttonText: { displayText: button1 }, type: 1 }, |
| { buttonId: row2, buttonText: { displayText: button2 }, type: 1 }, |
| { buttonId: row3, buttonText: { displayText: button3 }, type: 1 } |
| ] |
| const buttonMessage = { |
| text: content, |
| footer: footer, |
| buttons: buttons, |
| headerType: 1 |
| } |
| return await conn.sendMessage(jid, buttonMessage, {quoted}) |
| } |
| conn.send4But = async(jid, content, footer,button1, row1, button2, row2, button3, row3, button4, row4, quoted) => { |
| const buttons = [ |
| { buttonId: row1, buttonText: { displayText: button1 }, type: 1 }, |
| { buttonId: row2, buttonText: { displayText: button2 }, type: 1 }, |
| { buttonId: row3, buttonText: { displayText: button3 }, type: 1 }, |
| { buttonId: row4, buttonText: { displayText: button4 }, type: 1 } |
| ] |
| const buttonMessage = { |
| text: content, |
| footer: footer, |
| buttons: buttons, |
| headerType: 1 |
| } |
| return await conn.sendMessage(jid, buttonMessage, {quoted}) |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| conn.sendButtonImg = async (jid, buffer, contentText, footerText, button1, id1, quoted, options) => { |
| let type = await conn.getFile(buffer) |
| let { res, data: file } = type |
| if (res && res.status !== 200 || file.length <= 65536) { |
| try { throw { json: JSON.parse(file.toString()) } } |
| catch (e) { if (e.json) throw e.json } |
| } |
| const buttons = [ |
| { buttonId: id1, buttonText: { displayText: button1 }, type: 1 } |
| ] |
|
|
| const buttonMessage = { |
| image: file, |
| fileLength: 887890909999999, |
| caption: contentText, |
| footer: footerText, |
| mentions: await conn.parseMention(contentText + footerText), |
| ...options, |
| buttons: buttons, |
| headerType: 4 |
| } |
|
|
| return await conn.sendMessage(jid, buttonMessage, { quoted, ephemeralExpiration: 86400, contextInfo: { mentionedJid: conn.parseMention(contentText + footerText) }, ...options }) |
| } |
| conn.send2ButtonImg = async (jid, buffer, contentText, footerText, button1, id1, button2, id2, quoted, options) => { |
| let type = await conn.getFile(buffer) |
| let { res, data: file } = type |
| if (res && res.status !== 200 || file.length <= 65536) { |
| try { throw { json: JSON.parse(file.toString()) } } |
| catch (e) { if (e.json) throw e.json } |
| } |
| const buttons = [ |
| { buttonId: id1, buttonText: { displayText: button1 }, type: 1 }, |
| { buttonId: id2, buttonText: { displayText: button2 }, type: 1 } |
| ] |
|
|
| const buttonMessage = { |
| image: file, |
| fileLength: 887890909999999, |
| caption: contentText, |
| footer: footerText, |
| mentions: await conn.parseMention(contentText + footerText), |
| ...options, |
| buttons: buttons, |
| headerType: 4 |
| } |
|
|
| return await conn.sendMessage(jid, buttonMessage, { quoted, ephemeralExpiration: 86400, contextInfo: { mentionedJid: conn.parseMention(contentText + footerText) }, ...options }) |
| } |
| conn.send3ButtonImg = async (jid, buffer, contentText, footerText, button1, id1, button2, id2, button3, id3, quoted, options) => { |
| let type = await conn.getFile(buffer) |
| let { res, data: file } = type |
| if (res && res.status !== 200 || file.length <= 65536) { |
| try { throw { json: JSON.parse(file.toString()) } } |
| catch (e) { if (e.json) throw e.json } |
| } |
| const buttons = [ |
| { buttonId: id1, buttonText: { displayText: button1 }, type: 1 }, |
| { buttonId: id2, buttonText: { displayText: button2 }, type: 1 }, |
| { buttonId: id3, buttonText: { displayText: button3 }, type: 1 } |
| ] |
|
|
| const buttonMessage = { |
| image: file, |
| fileLength: 887890909999999, |
| caption: contentText, |
| footer: footerText, |
| mentions: await conn.parseMention(contentText + footerText), |
| ...options, |
| buttons: buttons, |
| headerType: 4 |
| } |
|
|
| return await conn.sendMessage(jid, buttonMessage, { quoted, ephemeralExpiration: 86400, contextInfo: { mentionedJid: conn.parseMention(contentText + footerText) }, ...options }) |
| } |
| |
| conn.sendH3Button = async (jid, content, displayText, link, displayCall, number, quickReplyText, id, quickReplyText2, id2, quickReplyText3, id3, quoted) => { |
| let template = generateWAMessageFromContent(jid, proto.Message.fromObject({ |
| templateMessage: { |
| hydratedTemplate: { |
| hydratedContentText: content, |
| hydratedButtons: [{ |
| urlButton: { |
| displayText: displayText, |
| url: link |
| } |
| }, { |
| callButton: { |
| displayText: displayCall, |
| phoneNumber: number |
| } |
| }, |
| { |
| quickReplyButton: { |
| displayText: quickReplyText, |
| id: id, |
| } |
|
|
| }, |
| { |
| quickReplyButton: { |
| displayText: quickReplyText2, |
| id: id2, |
| } |
| }, |
| { |
| quickReplyButton: { |
| displayText: quickReplyText3, |
| id: id3, |
| } |
| }] |
| } |
| } |
| }), { userJid: conn.user.jid, quoted: quoted}); |
| return await conn.relayMessage( |
| jid, |
| template.message, |
| { messageId: template.key.id } |
| ) |
| } |
| |
| conn.cMod = (jid, message, text = '', sender = conn.user.jid, options = {}) => { |
| let copy = message.toJSON() |
| let mtype = Object.keys(copy.message)[0] |
| let isEphemeral = false |
| if (isEphemeral) { |
| mtype = Object.keys(copy.message.ephemeralMessage.message)[0] |
| } |
| let msg = isEphemeral ? copy.message.ephemeralMessage.message : copy.message |
| let content = msg[mtype] |
| if (typeof content === 'string') msg[mtype] = text || content |
| else if (content.caption) content.caption = text || content.caption |
| else if (content.text) content.text = text || content.text |
| if (typeof content !== 'string') msg[mtype] = { ...content, ...options } |
| if (copy.participant) sender = copy.participant = sender || copy.participant |
| else if (copy.key.participant) sender = copy.key.participant = sender || copy.key.participant |
| if (copy.key.remoteJid.includes('@s.whatsapp.net')) sender = sender || copy.key.remoteJid |
| else if (copy.key.remoteJid.includes('@broadcast')) sender = sender || copy.key.remoteJid |
| copy.key.remoteJid = jid |
| copy.key.fromMe = areJidsSameUser(sender, conn.user.id) || false |
| return proto.WebMessageInfo.fromObject(copy) |
| } |
| conn.sendHButtonLoc = async (jid, buffer, content, footer, distek, link1, quick1, id1,quoted) => { |
| let template = generateWAMessageFromContent(jid, proto.Message.fromObject({ |
| templateMessage: { |
| hydratedTemplate: { |
| hydratedContentText: content, |
| mentions: conn.parseMention(content + footer), |
| locationMessage: { |
| jpegThumbnail: buffer }, |
| hydratedFooterText: footer, |
| mentions: conn.parseMention(content + footer), |
| hydratedButtons: [{ |
| urlButton: { |
| displayText: distek, |
| url: link1 |
| } |
| }, { |
| quickReplyButton: { |
| displayText:quick1, |
| id: id1 |
| } |
| }], mentions: conn.parseMention(content + footer) |
| } |
| } |
| }), { userJid: conn.user.jid, quoted: quoted, mentions: conn.parseMention(content + footer)}); |
| return await conn.relayMessage( |
| jid, |
| template.message, |
| { messageId: template.key.id } |
| ) |
| } |
|
|
| conn.sendHButt = async (jid, content, distek, link, discall, number, retek, id,quoted) => { |
| let template = generateWAMessageFromContent(jid, proto.Message.fromObject({ |
| templateMessage: { |
| hydratedTemplate: { |
| hydratedContentText: content, |
| hydratedButtons: [{ |
| urlButton: { |
| displayText: distek, |
| url: link |
| } |
| }, { |
| callButton: { |
| displayText: discall, |
| phoneNumber: number |
| } |
| }, |
| { |
| quickReplyButton: { |
| displayText:retek, |
| id: id |
| } |
| } |
| ] |
| } |
| } |
| }), { userJid: conn.user.jid, quoted: quoted}); |
| return await conn.relayMessage( |
| jid, |
| template.message, |
| { messageId: template.key.id } |
| ) |
| } |
| conn.sendButtonLoc= async (jid, buffer, content, footer, button1, row1, quoted, options = {}) => { |
| let buttons = [{buttonId: row1, buttonText: {displayText: button1}, type: 1}] |
| let buttonMessage = { |
| location: { jpegThumbnail: buffer }, |
| caption: content, |
| footer: footer, |
| buttons: buttons, |
| headerType: 6 |
| } |
| return await conn.sendMessage(jid, buttonMessage, { |
| quoted, |
| upload: conn.waUploadToServer, |
| ...options |
| }) |
| } |
| conn.send2ButtonLoc= async (jid, buffer, content, footer, button1, row1, button2, row2, quoted, options = {}) => { |
| let buttons = [{buttonId: row1, buttonText: {displayText: button1}, type: 1}, |
| { buttonId: row2, buttonText: { displayText: button2 }, type: 1 }] |
| let buttonMessage = { |
| location: { jpegThumbnail: buffer }, |
| caption: content, |
| footer: footer, |
| buttons: buttons, |
| headerType: 6 |
| } |
| return await conn.sendMessage(jid, buttonMessage, { |
| quoted, |
| upload: conn.waUploadToServer, |
| ...options |
| }) |
| } |
| conn.send3ButtonLoc= async (jid, buffer, content, footer, button1, row1, button2, row2, quoted, options = {}) => { |
| let buttons = [{buttonId: row1, buttonText: {displayText: button1}, type: 1}, |
| { buttonId: row2, buttonText: { displayText: button2 }, type: 1 }, |
| { buttonId: row3, buttonText: { displayText: button3 }, type: 1 } |
| ] |
| let buttonMessage = { |
| location: { jpegThumbnail: buffer }, |
| caption: content, |
| footer: footer, |
| buttons: buttons, |
| headerType: 6 |
| } |
| return await conn.sendMessage(jid, buttonMessage, { |
| quoted, |
| upload: conn.waUploadToServer, |
| ...options |
| }) |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| conn.sendButtonVid = async (jid, buffer, contentText, footerText, button1, id1, quoted, options) => { |
| let type = await conn.getFile(buffer) |
| let { res, data: file } = type |
| if (res && res.status !== 200 || file.length <= 65536) { |
| try { throw { json: JSON.parse(file.toString()) } } |
| catch (e) { if (e.json) throw e.json } |
| } |
| let buttons = [ |
| { buttonId: id1, buttonText: { displayText: button1 }, type: 1 } |
| ] |
| const buttonMessage = { |
| video: file, |
| fileLength: 887890909999999, |
| caption: contentText, |
| footer: footerText, |
| mentions: await conn.parseMention(contentText), |
| ...options, |
| buttons: buttons, |
| headerType: 4 |
| } |
| return await conn.sendMessage(jid, buttonMessage, { |
| quoted, |
| ephemeralExpiration: 86400, |
| ...options |
| }) |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| conn.cMod = async (jid, message, text = '', sender = conn.user.jid, options = {}) => { |
| if (options.mentions && !Array.isArray(options.mentions)) options.mentions = [options.mentions] |
| let copy = message.toJSON() |
| delete copy.message.messageContextInfo |
| delete copy.message.senderKeyDistributionMessage |
| let mtype = Object.keys(copy.message)[0] |
| let msg = copy.message |
| let content = msg[mtype] |
| if (typeof content === 'string') msg[mtype] = text || content |
| else if (content.caption) content.caption = text || content.caption |
| else if (content.text) content.text = text || content.text |
| if (typeof content !== 'string') { |
| msg[mtype] = { ...content, ...options } |
| msg[mtype].contextInfo = { |
| ...(content.contextInfo || {}), |
| mentionedJid: options.mentions || content.contextInfo?.mentionedJid || [] |
| } |
| } |
| if (copy.participant) sender = copy.participant = sender || copy.participant |
| else if (copy.key.participant) sender = copy.key.participant = sender || copy.key.participant |
| if (copy.key.remoteJid.includes('@s.whatsapp.net')) sender = sender || copy.key.remoteJid |
| else if (copy.key.remoteJid.includes('@broadcast')) sender = sender || copy.key.remoteJid |
| copy.key.remoteJid = jid |
| copy.key.fromMe = areJidsSameUser(sender, conn.user.id) || false |
| return proto.WebMessageInfo.fromObject(copy) |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| conn.cMods = (jid, message, text = '', sender = conn.user.jid, options = {}) => { |
| let copy = message.toJSON() |
| let mtype = Object.keys(copy.message)[0] |
| let isEphemeral = false |
| if (isEphemeral) { |
| mtype = Object.keys(copy.message.ephemeralMessage.message)[0] |
| } |
| let msg = isEphemeral ? copy.message.ephemeralMessage.message : copy.message |
| let content = msg[mtype] |
| if (typeof content === 'string') msg[mtype] = text || content |
| else if (content.caption) content.caption = text || content.caption |
| else if (content.text) content.text = text || content.text |
| if (typeof content !== 'string') msg[mtype] = { ...content, ...options } |
| if (copy.participant) sender = copy.participant = sender || copy.participant |
| else if (copy.key.participant) sender = copy.key.participant = sender || copy.key.participant |
| if (copy.key.remoteJid.includes('@s.whatsapp.net')) sender = sender || copy.key.remoteJid |
| else if (copy.key.remoteJid.includes('@broadcast')) sender = sender || copy.key.remoteJid |
| copy.key.remoteJid = jid |
| copy.key.fromMe = areJidsSameUser(sender, conn.user.id) || false |
| return proto.WebMessageInfo.fromObject(copy) |
| } |
|
|
|
|
|
|
| |
| |
| |
| |
| |
| |
| |
| conn.copyNForward = async (jid, message, forwardingScore = true, options = {}) => { |
| let m = generateForwardMessageContent(message, !!forwardingScore) |
| let mtype = Object.keys(m)[0] |
| if (forwardingScore && typeof forwardingScore == 'number' && forwardingScore > 1) m[mtype].contextInfo.forwardingScore += forwardingScore |
| m = generateWAMessageFromContent(jid, m, { ...options, userJid: conn.user.id }) |
| await conn.relayMessage(jid, m.message, { messageId: m.key.id, additionalAttributes: { ...options } }) |
| return m |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| conn.fakeReply = async (jid, text = '', fakeJid = this.user.jid, fakeText = '', fakeGroupJid, options) => { |
| return conn.reply(jid, text, { key: { fromMe: areJidsSameUser(fakeJid, conn.user.id), participant: fakeJid, ...(fakeGroupJid ? { remoteJid: fakeGroupJid } : {}) }, message: { conversation: fakeText }, ...options }) |
| } |
| |
| conn.loadMessage = conn.loadMessage || (async (messageID) => { |
| return Object.entries(conn.chats) |
| .filter(([_, { messages }]) => typeof messages === 'object') |
| .find(([_, { messages }]) => Object.entries(messages) |
| .find(([k, v]) => (k === messageID || v.key?.id === messageID))) |
| ?.[1].messages?.[messageID] |
| }) |
|
|
| |
| |
| |
| |
| |
| |
| |
| conn.downloadM = async (m, type, saveToFile) => { |
| if (!m || !(m.url || m.directPath)) return Buffer.alloc(0) |
| const stream = await downloadContentFromMessage(m, type) |
| let buffer = Buffer.from([]) |
| for await (const chunk of stream) { |
| buffer = Buffer.concat([buffer, chunk]) |
| } |
| if (saveToFile) var { filename } = await conn.getFile(buffer, true) |
| return saveToFile && fs.existsSync(filename) ? filename : buffer |
| } |
| |
| |
| conn.downloadAndSaveMediaMessage = async (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) |
| trueFileName = attachExtension ? (filename + '.' + type.ext) : filename |
| |
| await fs.writeFileSync(trueFileName, buffer) |
| return trueFileName |
| } |
|
|
|
|
| |
| |
| |
| |
| |
| conn.parseMention = (text = '') => { |
| return [...text.matchAll(/@([0-9]{5,16}|0)/g)].map(v => v[1] + '@s.whatsapp.net') |
| } |
| |
| |
| |
| |
| |
| |
| conn.chatRead = async (jid, participant = conn.user.jid, messageID) => { |
| return await conn.sendReadReceipt(jid, participant, [messageID]) |
| } |
|
|
| |
| |
| |
| |
| conn.parseMention = (text = '') => { |
| return [...text.matchAll(/@([0-9]{5,16}|0)/g)].map(v => v[1] + '@s.whatsapp.net') |
| } |
| |
| conn.sendTextWithMentions = async (jid, text, quoted, options = {}) => conn.sendMessage(jid, { text: text, contextInfo: { mentionedJid: [...text.matchAll(/@(\d{0,16})/g)].map(v => v[1] + '@s.whatsapp.net') }, ...options }, { quoted }) |
|
|
| |
| |
| |
| |
| |
| conn.getName = (jid = '', withoutContact = false) => { |
| jid = conn.decodeJid(jid) |
| withoutContact = this.withoutContact || withoutContact |
| let v |
| if (jid.endsWith('@g.us')) return new Promise(async (resolve) => { |
| v = conn.chats[jid] || {} |
| if (!(v.name || v.subject)) v = await conn.groupMetadata(jid) || {} |
| resolve(v.name || v.subject || PhoneNumber('+' + jid.replace('@s.whatsapp.net', '')).getNumber('international')) |
| }) |
| else v = jid === '0@s.whatsapp.net' ? { |
| jid, |
| vname: 'WhatsApp' |
| } : areJidsSameUser(jid, conn.user.id) ? |
| conn.user : |
| (conn.chats[jid] || {}) |
| return (withoutContact ? '' : v.name) || v.subject || v.vname || v.notify || v.verifiedName || PhoneNumber('+' + jid.replace('@s.whatsapp.net', '')).getNumber('international') |
| } |
|
|
| |
| |
| |
| |
| conn.processMessageStubType = async(m) => { |
| |
| |
| |
| |
| if (!m.messageStubType) return |
| const chat = conn.decodeJid(m.key.remoteJid || m.message?.senderKeyDistributionMessage?.groupId || '') |
| if (!chat || chat === 'status@broadcast') return |
| const emitGroupUpdate = (update) => { |
| conn.ev.emit('groups.update', [{ id: chat, ...update }]) |
| } |
| switch (m.messageStubType) { |
| case WAMessageStubType.REVOKE: |
| case WAMessageStubType.GROUP_CHANGE_INVITE_LINK: |
| emitGroupUpdate({ revoke: m.messageStubParameters[0] }) |
| break |
| case WAMessageStubType.GROUP_CHANGE_ICON: |
| emitGroupUpdate({ icon: m.messageStubParameters[0] }) |
| break |
| default: { |
| console.log({ |
| messageStubType: m.messageStubType, |
| messageStubParameters: m.messageStubParameters, |
| type: WAMessageStubType[m.messageStubType] |
| }) |
| break |
| } |
| } |
| const isGroup = chat.endsWith('@g.us') |
| if (!isGroup) return |
| let chats = conn.chats[chat] |
| if (!chats) chats = conn.chats[chat] = { id: chat } |
| chats.isChats = true |
| const metadata = await conn.groupMetadata(chat).catch(_ => null) |
| if (!metadata) return |
| chats.subject = metadata.subject |
| chats.metadata = metadata |
| } |
| conn.insertAllGroup = async() => { |
| const groups = await conn.groupFetchAllParticipating().catch(_ => null) || {} |
| for (const group in groups) conn.chats[group] = { ...(conn.chats[group] || {}), id: group, subject: groups[group].subject, isChats: true, metadata: groups[group] } |
| return conn.chats |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| |
| |
| |
| |
| conn.pushMessage = async(m) => { |
| |
| |
| |
| |
| if (!m) return |
| if (!Array.isArray(m)) m = [m] |
| for (const message of m) { |
| try { |
| |
| if (!message) continue |
| if (message.messageStubType && message.messageStubType != WAMessageStubType.CIPHERTEXT) conn.processMessageStubType(message).catch(console.error) |
| const _mtype = Object.keys(message.message || {}) |
| const mtype = (!['senderKeyDistributionMessage', 'messageContextInfo'].includes(_mtype[0]) && _mtype[0]) || |
| (_mtype.length >= 3 && _mtype[1] !== 'messageContextInfo' && _mtype[1]) || |
| _mtype[_mtype.length - 1] |
| const chat = conn.decodeJid(message.key.remoteJid || message.message?.senderKeyDistributionMessage?.groupId || '') |
| if (message.message?.[mtype]?.contextInfo?.quotedMessage) { |
| |
| |
| |
| let context = message.message[mtype].contextInfo |
| let participant = conn.decodeJid(context.participant) |
| const remoteJid = conn.decodeJid(context.remoteJid || participant) |
| |
| |
| |
| |
| let quoted = message.message[mtype].contextInfo.quotedMessage |
| if ((remoteJid && remoteJid !== 'status@broadcast') && quoted) { |
| let qMtype = Object.keys(quoted)[0] |
| if (qMtype == 'conversation') { |
| quoted.extendedTextMessage = { text: quoted[qMtype] } |
| delete quoted.conversation |
| qMtype = 'extendedTextMessage' |
| } |
|
|
| if (!quoted[qMtype].contextInfo) quoted[qMtype].contextInfo = {} |
| quoted[qMtype].contextInfo.mentionedJid = context.mentionedJid || quoted[qMtype].contextInfo.mentionedJid || [] |
| const isGroup = remoteJid.endsWith('g.us') |
| if (isGroup && !participant) participant = remoteJid |
| const qM = { |
| key: { |
| remoteJid, |
| fromMe: areJidsSameUser(conn.user.jid, remoteJid), |
| id: context.stanzaId, |
| participant, |
| }, |
| message: JSON.parse(JSON.stringify(quoted)), |
| ...(isGroup ? { participant } : {}) |
| } |
| let qChats = conn.chats[participant] |
| if (!qChats) qChats = conn.chats[participant] = { id: participant, isChats: !isGroup } |
| if (!qChats.messages) qChats.messages = {} |
| if (!qChats.messages[context.stanzaId] && !qM.key.fromMe) qChats.messages[context.stanzaId] = qM |
| let qChatsMessages |
| if ((qChatsMessages = Object.entries(qChats.messages)).length > 40) qChats.messages = Object.fromEntries(qChatsMessages.slice(30, qChatsMessages.length)) |
| } |
| } |
| if (!chat || chat === 'status@broadcast') continue |
| const isGroup = chat.endsWith('@g.us') |
| let chats = conn.chats[chat] |
| if (!chats) { |
| if (isGroup) await conn.insertAllGroup().catch(console.error) |
| chats = conn.chats[chat] = { id: chat, isChats: true, ...(conn.chats[chat] || {}) } |
| } |
| let metadata, sender |
| if (isGroup) { |
| if (!chats.subject || !chats.metadata) { |
| metadata = await conn.groupMetadata(chat).catch(_ => ({})) || {} |
| if (!chats.subject) chats.subject = metadata.subject || '' |
| if (!chats.metadata) chats.metadata = metadata |
| } |
| sender = conn.decodeJid(message.key?.fromMe && conn.user.id || message.participant || message.key?.participant || chat || '') |
| if (sender !== chat) { |
| let chats = conn.chats[sender] |
| if (!chats) chats = conn.chats[sender] = { id: sender } |
| if (!chats.name) chats.name = message.pushName || chats.name || '' |
| } |
| } else if (!chats.name) chats.name = message.pushName || chats.name || '' |
| if (['senderKeyDistributionMessage', 'messageContextInfo'].includes(mtype)) continue |
| chats.isChats = true |
| if (!chats.messages) chats.messages = {} |
| const fromMe = message.key.fromMe || areJidsSameUser(sender || chat, conn.user.id) |
| if (!['protocolMessage'].includes(mtype) && !fromMe && message.messageStubType != WAMessageStubType.CIPHERTEXT && message.message) { |
| delete message.message.messageContextInfo |
| delete message.message.senderKeyDistributionMessage |
| chats.messages[message.key.id] = JSON.parse(JSON.stringify(message, null, 2)) |
| let chatsMessages |
| if ((chatsMessages = Object.entries(chats.messages)).length > 40) chats.messages = Object.fromEntries(chatsMessages.slice(30, chatsMessages.length)) |
| } |
| } catch (e) { |
| console.error(e) |
| } |
| } |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| conn.format = (...args) => { |
| return util.format(...args) |
| } |
| |
| |
| |
| |
| |
| |
| |
| conn.getBuffer = async (url, options) => { |
| try { |
| options ? options : {} |
| const res = await axios({ |
| method: "get", |
| url, |
| headers: { |
| 'DNT': 1, |
| 'Upgrade-Insecure-Request': 1 |
| }, |
| ...options, |
| responseType: 'arraybuffer' |
| }) |
| return res.data |
| } catch (e) { |
| console.log(`Error : ${e}`) |
| } |
| } |
|
|
| |
| |
| |
| |
| conn.serializeM = (m) => { |
| return exports.smsg(conn, m) |
| } |
|
|
| Object.defineProperty(conn, 'name', { |
| value: 'WASocket', |
| configurable: true, |
| }) |
| return conn |
| } |
| |
| |
| |
| |
| |
| |
| exports.smsg = (conn, m, hasParent) => { |
| if (!m) return m |
| let M = proto.WebMessageInfo |
| m = M.fromObject(m) |
| if (m.key) { |
| m.id = m.key.id |
| m.isBaileys = m.id && m.id.length === 22 || m.id.startsWith('3EB0') && m.id.length === 22 || false |
| m.chat = conn.decodeJid(m.key.remoteJid || message.message?.senderKeyDistributionMessage?.groupId || '') |
| m.isGroup = m.chat.endsWith('@g.us') |
| m.sender = conn.decodeJid(m.key.fromMe && conn.user.id || m.participant || m.key.participant || m.chat || '') |
| m.fromMe = m.key.fromMe || areJidsSameUser(m.sender, conn.user.id) |
| } |
| if (m.message) { |
| let mtype = Object.keys(m.message) |
| m.mtype = (!['senderKeyDistributionMessage', 'messageContextInfo'].includes(mtype[0]) && mtype[0]) || |
| (mtype.length >= 3 && mtype[1] !== 'messageContextInfo' && mtype[1]) || |
| mtype[mtype.length - 1] |
| m.msg = m.message[m.mtype] |
| if (m.chat == 'status@broadcast' && ['protocolMessage', 'senderKeyDistributionMessage'].includes(m.mtype)) m.chat = (m.key.remoteJid !== 'status@broadcast' && m.key.remoteJid) || m.sender |
| if (m.mtype == 'protocolMessage' && m.msg.key) { |
| if (m.msg.key.remoteJid == 'status@broadcast') m.msg.key.remoteJid = m.chat |
| if (!m.msg.key.participant || m.msg.key.participant == 'status_me') m.msg.key.participant = m.sender |
| m.msg.key.fromMe = conn.decodeJid(m.msg.key.participant) === conn.decodeJid(conn.user.id) |
| if (!m.msg.key.fromMe && m.msg.key.remoteJid === conn.decodeJid(conn.user.id)) m.msg.key.remoteJid = m.sender |
| } |
| m.text = m.msg.text || m.msg.caption || m.msg.contentText || m.msg || '' |
| if (typeof m.text !== 'string') { |
| if ([ |
| 'protocolMessage', |
| 'messageContextInfo', |
| 'stickerMessage', |
| 'audioMessage', |
| 'senderKeyDistributionMessage' |
| ].includes(m.mtype)) m.text = '' |
| else m.text = m.text.selectedDisplayText || m.text.hydratedTemplate?.hydratedContentText || m.text |
| } |
| m.mentionedJid = m.msg?.contextInfo?.mentionedJid?.length && m.msg.contextInfo.mentionedJid || [] |
| let quoted = m.quoted = m.msg?.contextInfo?.quotedMessage ? m.msg.contextInfo.quotedMessage : null |
| if (m.quoted) { |
| let type = Object.keys(m.quoted)[0] |
| m.quoted = m.quoted[type] |
| if (typeof m.quoted === 'string') m.quoted = { text: m.quoted } |
| m.quoted.mtype = type |
| m.quoted.id = m.msg.contextInfo.stanzaId |
| m.quoted.chat = conn.decodeJid(m.msg.contextInfo.remoteJid || m.chat || m.sender) |
| m.quoted.isBaileys = m.quoted.id && m.quoted.id.length === 22 || false |
| m.quoted.sender = conn.decodeJid(m.msg.contextInfo.participant) |
| m.quoted.fromMe = m.quoted.sender === conn.user.jid |
| m.quoted.text = m.quoted.text || m.quoted.caption || m.quoted.contentText || '' |
| m.quoted.name = conn.getName(m.quoted.sender) |
| m.quoted.mentionedJid = m.quoted.contextInfo?.mentionedJid?.length && m.quoted.contextInfo.mentionedJid || [] |
| let vM = m.quoted.fakeObj = M.fromObject({ |
| key: { |
| fromMe: m.quoted.fromMe, |
| remoteJid: m.quoted.chat, |
| id: m.quoted.id |
| }, |
| message: quoted, |
| ...(m.isGroup ? { participant: m.quoted.sender } : {}) |
| }) |
| m.getQuotedObj = m.getQuotedMessage = async () => { |
| if (!m.quoted.id) return null |
| let q = M.fromObject(await conn.loadMessage(m.quoted.id) || vM) |
| return exports.smsg(conn, q) |
| } |
| if (m.quoted.url || m.quoted.directPath) m.quoted.download = (saveToFile = false) => conn.downloadM(m.quoted, m.quoted.mtype.replace(/message/i, ''), saveToFile) |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| |
| |
| |
| |
| |
| |
| m.quoted.reply = (text, chatId, options) => conn.reply(chatId ? chatId : m.chat, text, vM, options) |
|
|
| |
| |
| |
| m.quoted.copy = () => exports.smsg(conn, M.fromObject(M.toObject(vM))) |
|
|
| |
| |
| |
| |
| |
| m.quoted.forward = (jid, forceForward = false) => conn.forwardMessage(jid, vM, forceForward) |
|
|
| |
| |
| |
| |
| |
| |
| m.quoted.copyNForward = (jid, forceForward = true, options = {}) => conn.copyNForward(jid, vM, forceForward, options) |
|
|
| |
| |
| |
| |
| |
| |
| |
| m.quoted.cMod = (jid, text = '', sender = m.quoted.sender, options = {}) => conn.cMod(jid, vM, text, sender, options) |
|
|
| |
| |
| |
| m.quoted.delete = () => conn.sendMessage(m.quoted.chat, { delete: vM.key }) |
| } |
| } |
| m.name = m.pushName || conn.getName(m.sender) |
| if (m.msg && m.msg.url) m.download = (saveToFile = false) => conn.downloadM(m.msg, m.mtype.replace(/message/i, ''), saveToFile) |
| |
| |
| |
| |
| |
| |
| m.reply = (text, chatId, options) => conn.reply(chatId ? chatId : m.chat, text, m, options) |
|
|
| |
| |
| |
| m.copy = () => exports.smsg(conn, M.fromObject(M.toObject(m))) |
|
|
| |
| |
| |
| |
| |
| m.forward = (jid = m.chat, forceForward = false) => conn.copyNForward(jid, m, forceForward, options) |
|
|
| |
| |
| |
| |
| |
| |
| m.copyNForward = (jid = m.chat, forceForward = true, options = {}) => conn.copyNForward(jid, m, forceForward, options) |
|
|
| |
| |
| |
| |
| |
| |
| |
| m.cMod = (jid, text = '', sender = m.sender, options = {}) => conn.cMod(jid, m, text, sender, options) |
|
|
| |
| |
| |
| m.delete = () => conn.sendMessage(m.chat, { delete: m.key }) |
|
|
| try { |
| if (m.msg && m.mtype == 'protocolMessage') conn.ev.emit('message.delete', m.msg.key) |
| } catch (e) { |
| console.error(e) |
| } |
| return m |
| } |
|
|
| exports.logic = (check, inp, out) => { |
| if (inp.length !== out.length) throw new Error('Input and Output must have same length') |
| for (let i in inp) if (util.isDeepStrictEqual(check, inp[i])) return out[i] |
| return null |
| } |
|
|
| exports.protoType = () => { |
| Buffer.prototype.toArrayBuffer = function toArrayBufferV2() { |
| const ab = new ArrayBuffer(this.length); |
| const view = new Uint8Array(ab); |
| for (let i = 0; i < this.length; ++i) { |
| view[i] = this[i]; |
| } |
| return ab; |
| } |
| |
| |
| |
| Buffer.prototype.toArrayBufferV2 = function toArrayBuffer() { |
| return this.buffer.slice(this.byteOffset, this.byteOffset + this.byteLength) |
| } |
| |
| |
| |
| ArrayBuffer.prototype.toBuffer = function toBuffer() { |
| return Buffer.from(new Uint8Array(this)) |
| } |
| |
| |
| |
| |
| |
| |
| Uint8Array.prototype.getFileType = ArrayBuffer.prototype.getFileType = Buffer.prototype.getFileType = async function getFileType() { |
| return await fileTypeFromBuffer(this) |
| } |
| |
| |
| |
| String.prototype.isNumber = Number.prototype.isNumber = isNumber |
| |
| |
| |
| |
| String.prototype.capitalize = function capitalize() { |
| return this.charAt(0).toUpperCase() + this.slice(1, this.length) |
| } |
| |
| |
| |
| String.prototype.capitalizeV2 = function capitalizeV2() { |
| const str = this.split(' ') |
| return str.map(v => v.capitalize()).join(' ') |
| } |
| String.prototype.decodeJid = function decodeJid() { |
| if (/:\d+@/gi.test(this)) { |
| const decode = jidDecode(this) || {} |
| return (decode.user && decode.server && decode.user + '@' + decode.server || this).trim() |
| } else return this.trim() |
| } |
| |
| |
| |
| |
| Number.prototype.toTimeString = function toTimeString() { |
| |
| const seconds = Math.floor((this / 1000) % 60) |
| const minutes = Math.floor((this / (60 * 1000)) % 60) |
| const hours = Math.floor((this / (60 * 60 * 1000)) % 24) |
| const days = Math.floor((this / (24 * 60 * 60 * 1000))) |
| return ( |
| (days ? `${days} day(s) ` : '') + |
| (hours ? `${hours} hour(s) ` : '') + |
| (minutes ? `${minutes} minute(s) ` : '') + |
| (seconds ? `${seconds} second(s)` : '') |
| ).trim() |
| } |
| Number.prototype.getRandom = String.prototype.getRandom = Array.prototype.getRandom = getRandom |
| } |
|
|
| function isNumber() { |
| const int = parseInt(this) |
| return typeof int === 'number' && !isNaN(int) |
| } |
|
|
| function getRandom() { |
| if (Array.isArray(this) || this instanceof String) return this[Math.floor(Math.random() * this.length)] |
| return Math.floor(Math.random() * this) |
| } |
|
|
| function rand(isi) { |
| return isi[Math.floor(Math.random() * isi.length)] |
| } |
|
|