Spaces:
Paused
Paused
| ; | |
| /* | |
| * This file is part of WPPConnect. | |
| * | |
| * WPPConnect is free software: you can redistribute it and/or modify | |
| * it under the terms of the GNU Lesser General Public License as published by | |
| * the Free Software Foundation, either version 3 of the License, or | |
| * (at your option) any later version. | |
| * | |
| * WPPConnect is distributed in the hope that it will be useful, | |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| * GNU Lesser General Public License for more details. | |
| * | |
| * You should have received a copy of the GNU Lesser General Public License | |
| * along with WPPConnect. If not, see <https://www.gnu.org/licenses/>. | |
| */ | |
| var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { | |
| if (k2 === undefined) k2 = k; | |
| var desc = Object.getOwnPropertyDescriptor(m, k); | |
| if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { | |
| desc = { enumerable: true, get: function() { return m[k]; } }; | |
| } | |
| Object.defineProperty(o, k2, desc); | |
| }) : (function(o, m, k, k2) { | |
| if (k2 === undefined) k2 = k; | |
| o[k2] = m[k]; | |
| })); | |
| var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { | |
| Object.defineProperty(o, "default", { enumerable: true, value: v }); | |
| }) : function(o, v) { | |
| o["default"] = v; | |
| }); | |
| var __importStar = (this && this.__importStar) || (function () { | |
| var ownKeys = function(o) { | |
| ownKeys = Object.getOwnPropertyNames || function (o) { | |
| var ar = []; | |
| for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; | |
| return ar; | |
| }; | |
| return ownKeys(o); | |
| }; | |
| return function (mod) { | |
| if (mod && mod.__esModule) return mod; | |
| var result = {}; | |
| if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); | |
| __setModuleDefault(result, mod); | |
| return result; | |
| }; | |
| })(); | |
| Object.defineProperty(exports, "__esModule", { value: true }); | |
| exports.SenderLayer = void 0; | |
| const path = __importStar(require("path")); | |
| const ffmpeg_1 = require("../../utils/ffmpeg"); | |
| const helpers_1 = require("../helpers"); | |
| const filename_from_mimetype_1 = require("../helpers/filename-from-mimetype"); | |
| const listener_layer_1 = require("./listener.layer"); | |
| class SenderLayer extends listener_layer_1.ListenerLayer { | |
| constructor(page, session, options) { | |
| super(page, session, options); | |
| this.page = page; | |
| } | |
| /** | |
| * Automatically sends a link with the auto generated link preview. You can also add a custom message to be added. | |
| * | |
| * Deprecated: please use {@link sendText} | |
| * | |
| * @category Chat | |
| * @deprecated | |
| * @param chatId | |
| * @param url string A link, for example for youtube. e.g https://www.youtube.com/watch?v=Zi_XLOBDo_Y&list=RDEMe12_MlgO8mGFdeeftZ2nOQ&start_radio=1 | |
| * @param text custom text as the message body, this includes the link or will be attached after the link | |
| */ | |
| async sendLinkPreview(chatId, url, text = '') { | |
| const message = text.includes(url) ? text : `${url}\n${text}`; | |
| const result = await (0, helpers_1.evaluateAndReturn)(this.page, ({ chatId, message }) => { | |
| return WPP.chat.sendTextMessage(chatId, message, { linkPreview: true }); | |
| }, { chatId, message }); | |
| return result; | |
| } | |
| /** | |
| * Sends a text message to given chat | |
| * @category Chat | |
| * @param to chat id: xxxxx@us.c | |
| * @param content text message | |
| * | |
| * @example | |
| * ```javascript | |
| * // Simple message | |
| * client.sendText('<number>@c.us', 'A simple message'); | |
| * | |
| * // A message with reply | |
| * client.sendText('<number>@c.us', 'A simple message', { | |
| * quotedMsg: 'true_...@c.us_3EB01DE65ACC6_out' | |
| * }); | |
| * | |
| * // With buttons | |
| * client.sendText('<number>@c.us', 'WPPConnect message with buttons', { | |
| * useTemplateButtons: true, // False for legacy | |
| * buttons: [ | |
| * { | |
| * url: 'https://wppconnect.io/', | |
| * text: 'WPPConnect Site' | |
| * }, | |
| * { | |
| * phoneNumber: '+55 11 22334455', | |
| * text: 'Call me' | |
| * }, | |
| * { | |
| * id: 'your custom id 1', | |
| * text: 'Some text' | |
| * }, | |
| * { | |
| * id: 'another id 2', | |
| * text: 'Another text' | |
| * } | |
| * ], | |
| * title: 'Title text' // Optional | |
| * footer: 'Footer text' // Optional | |
| * }); | |
| * ``` | |
| */ | |
| async sendText(to, content, options) { | |
| const sendResult = await (0, helpers_1.evaluateAndReturn)(this.page, ({ to, content, options }) => WPP.chat.sendTextMessage(to, content, { | |
| ...options, | |
| waitForAck: true, | |
| }), { to, content, options: options }); | |
| // I don't know why the evaluate is returning undefined for direct call | |
| // To solve that, I added `JSON.parse(JSON.stringify(<message>))` to solve that | |
| const result = (await (0, helpers_1.evaluateAndReturn)(this.page, async ({ messageId }) => { | |
| return JSON.parse(JSON.stringify(await WAPI.getMessageById(messageId))); | |
| }, { messageId: sendResult.id })); | |
| if (result['erro'] == true) { | |
| throw result; | |
| } | |
| return result; | |
| } | |
| /** | |
| * Sends a pix message to given chat | |
| * @category Chat | |
| * @param to chat id: xxxxx@us.c | |
| * @param content pix message | |
| * | |
| * @example | |
| * ```javascript | |
| * // Simple message | |
| * client.sendPix('<number>@c.us', { | |
| keyType: 'PHONE', | |
| name: 'WPPCONNECT-TEAM', | |
| key: '+5567123456789', | |
| instructions: 'teste', | |
| }); | |
| * ``` | |
| */ | |
| async sendPixKey(to, params, options) { | |
| const sendResult = await (0, helpers_1.evaluateAndReturn)(this.page, ({ to, params, options }) => WPP.chat.sendPixKeyMessage(to, params, { | |
| ...options, | |
| waitForAck: true, | |
| }), { to, params, options: options }); | |
| // I don't know why the evaluate is returning undefined for direct call | |
| // To solve that, I added `JSON.parse(JSON.stringify(<message>))` to solve that | |
| const result = (await (0, helpers_1.evaluateAndReturn)(this.page, async ({ messageId }) => { | |
| return JSON.parse(JSON.stringify(await WAPI.getMessageById(messageId))); | |
| }, { messageId: sendResult.id })); | |
| if (result['erro'] == true) { | |
| throw result; | |
| } | |
| return result; | |
| } | |
| /** | |
| * | |
| * @category Chat | |
| * @param chat | |
| * @param content | |
| * @param options | |
| * @returns | |
| */ | |
| async sendMessageOptions(chat, content, options) { | |
| const messageId = await (0, helpers_1.evaluateAndReturn)(this.page, ({ chat, content, options }) => { | |
| return WAPI.sendMessageOptions(chat, content, options); | |
| }, { chat, content, options }); | |
| const result = (await (0, helpers_1.evaluateAndReturn)(this.page, (messageId) => WAPI.getMessageById(messageId), messageId)); | |
| return result; | |
| } | |
| /** | |
| * Sends image message | |
| * @category Chat | |
| * @param to Chat id | |
| * @param filePath File path or http link | |
| * @param filename | |
| * @param caption | |
| * @param quotedMessageId Quoted message id | |
| * @param isViewOnce Enable single view | |
| */ | |
| async sendImage(to, filePath, filename, caption, quotedMessageId, isViewOnce, options) { | |
| let base64 = await (0, helpers_1.downloadFileToBase64)(filePath, [ | |
| 'image/gif', | |
| 'image/png', | |
| 'image/jpg', | |
| 'image/jpeg', | |
| 'image/webp', | |
| ]); | |
| if (!base64) { | |
| base64 = await (0, helpers_1.fileToBase64)(filePath); | |
| } | |
| if (!base64) { | |
| const obj = { | |
| erro: true, | |
| to: to, | |
| text: 'No such file or directory, open "' + filePath + '"', | |
| }; | |
| throw obj; | |
| } | |
| if (!filename) { | |
| filename = path.basename(filePath); | |
| } | |
| return await this.sendImageFromBase64(to, base64, filename, caption, quotedMessageId, isViewOnce, options === null || options === void 0 ? void 0 : options.mentionedList, options || {}); | |
| } | |
| /** | |
| * Sends image message | |
| * @category Chat | |
| * @param to ID of the chat to send the image to | |
| * @param base64 A base64-encoded data URI (with mime type) | |
| * @param filename | |
| * @param caption | |
| * @param quotedMessageId Quoted message id | |
| * @param isViewOnce Enable single view | |
| * @param mentionedList | |
| * @example | |
| * ```javascript | |
| * const base64picture = "/9j/4AA[...]VZoCn9Lp//Z" | |
| * await client.sendImageFromBase64("120[...]381@g.us'", "data:image/png;base64," + base64picture, "picture.png") | |
| * ``` | |
| */ | |
| async sendImageFromBase64(to, base64, filename, caption, quotedMessageId, isViewOnce, mentionedList, options) { | |
| let mimeType = (0, helpers_1.base64MimeType)(base64); | |
| if (!mimeType) { | |
| const obj = { | |
| erro: true, | |
| to: to, | |
| text: 'Invalid base64!', | |
| }; | |
| throw obj; | |
| } | |
| if (!mimeType.includes('image')) { | |
| const obj = { | |
| erro: true, | |
| to: to, | |
| text: 'Not an image, allowed formats png, jpeg and webp', | |
| }; | |
| throw obj; | |
| } | |
| filename = (0, filename_from_mimetype_1.filenameFromMimeType)(filename, mimeType); | |
| const result = await (0, helpers_1.evaluateAndReturn)(this.page, async ({ to, base64, filename, caption, quotedMessageId, isViewOnce, mentionedList, options, }) => { | |
| const result = await WPP.chat.sendFileMessage(to, base64, { | |
| type: 'image', | |
| isViewOnce, | |
| messageId: options === null || options === void 0 ? void 0 : options.msgId, | |
| filename, | |
| caption, | |
| quotedMsg: quotedMessageId, | |
| waitForAck: true, | |
| detectMentioned: true, | |
| mentionedList: mentionedList, | |
| }); | |
| return { | |
| ack: result.ack, | |
| id: result.id, | |
| sendMsgResult: await result.sendMsgResult, | |
| }; | |
| }, { | |
| to, | |
| base64, | |
| filename, | |
| caption, | |
| quotedMessageId, | |
| isViewOnce, | |
| mentionedList, | |
| options, | |
| }); | |
| return result; | |
| } | |
| /** | |
| * Sends message with thumbnail | |
| * | |
| * @deprecated: please use {@link sendText} with options | |
| * | |
| * @deprecated | |
| * @category Chat | |
| * @param pathOrBase64 | |
| * @param url | |
| * @param title | |
| * @param description | |
| * @param chatId | |
| */ | |
| async sendMessageWithThumb(pathOrBase64, url, title, description, chatId) { | |
| let base64 = ''; | |
| if (pathOrBase64.startsWith('data:')) { | |
| base64 = pathOrBase64; | |
| } | |
| else { | |
| let fileContent = await (0, helpers_1.downloadFileToBase64)(pathOrBase64, [ | |
| 'image/gif', | |
| 'image/png', | |
| 'image/jpg', | |
| 'image/jpeg', | |
| 'image/webp', | |
| ]); | |
| if (!fileContent) { | |
| fileContent = await (0, helpers_1.fileToBase64)(pathOrBase64); | |
| } | |
| if (fileContent) { | |
| base64 = fileContent; | |
| } | |
| } | |
| if (!base64) { | |
| const error = new Error('Empty or invalid file or base64'); | |
| Object.assign(error, { | |
| code: 'empty_file', | |
| }); | |
| throw error; | |
| } | |
| const mimeInfo = (0, helpers_1.base64MimeType)(base64); | |
| if (!mimeInfo || !mimeInfo.includes('image')) { | |
| const error = new Error('Not an image, allowed formats png, jpeg, webp and gif'); | |
| Object.assign(error, { | |
| code: 'invalid_image', | |
| }); | |
| throw error; | |
| } | |
| const thumbnail = base64.replace(/^data:image\/(png|jpe?g|webp|gif);base64,/, ''); | |
| return (0, helpers_1.evaluateAndReturn)(this.page, ({ thumbnail, url, title, description, chatId }) => WPP.chat.sendTextMessage(chatId, url, { | |
| linkPreview: { | |
| thumbnail: thumbnail, | |
| canonicalUrl: url, | |
| description: description, | |
| matchedText: url, | |
| title: title, | |
| richPreviewType: 0, | |
| doNotPlayInline: true, | |
| }, | |
| }), { | |
| thumbnail, | |
| url, | |
| title, | |
| description, | |
| chatId, | |
| }); | |
| } | |
| /** | |
| * Replies to given mesage id of given chat id | |
| * | |
| * Deprecated: Please, use sendText with quotedMsg option | |
| * | |
| * @deprecated | |
| * | |
| * @category Chat | |
| * @param to Chat id | |
| * @param content Message body | |
| * @param quotedMsg Message id to reply to. | |
| */ | |
| async reply(to, content, quotedMsg) { | |
| const result = await (0, helpers_1.evaluateAndReturn)(this.page, ({ to, content, quotedMsg }) => { | |
| return WPP.chat.sendTextMessage(to, content, { quotedMsg }); | |
| }, { to, content, quotedMsg }); | |
| const message = (await (0, helpers_1.evaluateAndReturn)(this.page, (messageId) => WAPI.getMessageById(messageId), result.id)); | |
| if (message['erro'] == true) { | |
| throw message; | |
| } | |
| return message; | |
| } | |
| /** | |
| * Sends ptt audio | |
| * base64 parameter should have mime type already defined | |
| * @category Chat | |
| * @param to Chat id | |
| * @param base64 base64 data | |
| * @param filename | |
| * @param caption | |
| * @param quotedMessageId Quoted message id | |
| * @param messageId Set the id for this message | |
| * @param isPtt Set as ptt audio | |
| */ | |
| async sendPttFromBase64(to, base64, filename, caption, quotedMessageId, messageId, isPtt = true) { | |
| const result = await (0, helpers_1.evaluateAndReturn)(this.page, async ({ to, base64, filename, caption, quotedMessageId, messageId, isPtt, }) => { | |
| const result = await WPP.chat.sendFileMessage(to, base64, { | |
| type: 'audio', | |
| isPtt: isPtt, | |
| filename, | |
| caption, | |
| quotedMsg: quotedMessageId, | |
| waitForAck: true, | |
| messageId: messageId, | |
| }); | |
| return { | |
| ack: result.ack, | |
| id: result.id, | |
| sendMsgResult: await result.sendMsgResult, | |
| }; | |
| }, { to, base64, filename, caption, quotedMessageId, messageId, isPtt }); | |
| return result; | |
| } | |
| /** | |
| * Sends ptt audio from path | |
| * @category Chat | |
| * @param to Chat id | |
| * @param filePath File path | |
| * @param filename | |
| * @param caption | |
| * @param quotedMessageId Quoted message id | |
| * @param messageId Set the id for this message | |
| * @param isPtt Set as ptt audio | |
| */ | |
| async sendPtt(to, filePath, filename, caption, quotedMessageId, messageId, isPtt = true) { | |
| return new Promise(async (resolve, reject) => { | |
| let base64 = await (0, helpers_1.downloadFileToBase64)(filePath, [/^audio/]), obj; | |
| if (!base64) { | |
| base64 = await (0, helpers_1.fileToBase64)(filePath); | |
| } | |
| if (!base64) { | |
| obj = { | |
| erro: true, | |
| to: to, | |
| text: 'No such file or directory, open "' + filePath + '"', | |
| }; | |
| return reject(obj); | |
| } | |
| if (!filename) { | |
| filename = path.basename(filePath); | |
| } | |
| return this.sendPttFromBase64(to, base64, filename, caption, quotedMessageId, messageId, isPtt) | |
| .then(resolve) | |
| .catch(reject); | |
| }); | |
| } | |
| /** | |
| * Sends file | |
| * base64 parameter should have mime type already defined | |
| * | |
| * Deprecated: please use sendFile with options: sendFile(to, content, options) | |
| * | |
| * @deprecated | |
| * | |
| * @category Chat | |
| * @param chatId Chat id | |
| * @param base64 base64 data | |
| * @param filename | |
| * @param caption | |
| */ | |
| async sendFileFromBase64(chatId, base64, filename, caption) { | |
| return this.sendFile(chatId, base64, filename, caption); | |
| } | |
| async sendFile(to, pathOrBase64, nameOrOptions, caption) { | |
| let options = { type: 'auto-detect' }; | |
| if (typeof nameOrOptions === 'string') { | |
| options.filename = nameOrOptions; | |
| options.caption = caption; | |
| } | |
| else if (typeof nameOrOptions === 'object') { | |
| options = nameOrOptions; | |
| } | |
| let base64 = ''; | |
| if (pathOrBase64.startsWith('data:')) { | |
| base64 = pathOrBase64; | |
| } | |
| else { | |
| let fileContent = await (0, helpers_1.downloadFileToBase64)(pathOrBase64); | |
| if (!fileContent) { | |
| fileContent = await (0, helpers_1.fileToBase64)(pathOrBase64); | |
| } | |
| if (fileContent) { | |
| base64 = fileContent; | |
| } | |
| if (!options.filename) { | |
| options.filename = path.basename(pathOrBase64); | |
| } | |
| } | |
| if (!base64) { | |
| const error = new Error('Empty or invalid file or base64'); | |
| Object.assign(error, { | |
| code: 'empty_file', | |
| }); | |
| throw error; | |
| } | |
| return (0, helpers_1.evaluateAndReturn)(this.page, async ({ to, base64, options }) => { | |
| const result = await WPP.chat.sendFileMessage(to, base64, options); | |
| return { | |
| ack: result.ack, | |
| id: result.id, | |
| sendMsgResult: await result.sendMsgResult, | |
| }; | |
| }, { to, base64, options: options }); | |
| } | |
| /** | |
| * Sends a video to given chat as a gif, with caption or not | |
| * @category Chat | |
| * @param to Chat id | |
| * @param filePath File path | |
| * @param filename | |
| * @param caption | |
| */ | |
| async sendVideoAsGif(to, filePath, filename, caption) { | |
| let base64 = await (0, helpers_1.downloadFileToBase64)(filePath), obj; | |
| if (!base64) { | |
| base64 = await (0, helpers_1.fileToBase64)(filePath); | |
| } | |
| if (!base64) { | |
| obj = { | |
| erro: true, | |
| to: to, | |
| text: 'No such file or directory, open "' + filePath + '"', | |
| }; | |
| throw obj; | |
| } | |
| if (!filename) { | |
| filename = path.basename(filePath); | |
| } | |
| return this.sendVideoAsGifFromBase64(to, base64, filename, caption); | |
| } | |
| /** | |
| * Sends a video to given chat as a gif, with caption or not, using base64 | |
| * @category Chat | |
| * @param to chat id xxxxx@us.c | |
| * @param base64 base64 data:video/xxx;base64,xxx | |
| * @param filename string xxxxx | |
| * @param caption string xxxxx | |
| */ | |
| async sendVideoAsGifFromBase64(to, base64, filename, caption, quotedMessageId) { | |
| const result = await (0, helpers_1.evaluateAndReturn)(this.page, async ({ to, base64, filename, caption, quotedMessageId }) => { | |
| const result = await WPP.chat.sendFileMessage(to, base64, { | |
| type: 'video', | |
| isGif: true, | |
| filename, | |
| caption, | |
| quotedMsg: quotedMessageId, | |
| waitForAck: true, | |
| }); | |
| return { | |
| ack: result.ack, | |
| id: result.id, | |
| sendMsgResult: await result.sendMsgResult, | |
| }; | |
| }, { to, base64, filename, caption, quotedMessageId }); | |
| return result; | |
| } | |
| /** | |
| * Sends a video to given chat as a gif, with caption or not, using base64 | |
| * @category Chat | |
| * @param to Chat id | |
| * @param filePath File path | |
| * @param filename | |
| * @param caption | |
| */ | |
| async sendGif(to, filePath, filename, caption) { | |
| let base64 = await (0, helpers_1.downloadFileToBase64)(filePath), obj; | |
| if (!base64) { | |
| base64 = await (0, helpers_1.fileToBase64)(filePath); | |
| } | |
| if (!base64) { | |
| obj = { | |
| erro: true, | |
| to: to, | |
| text: 'No such file or directory, open "' + filePath + '"', | |
| }; | |
| throw obj; | |
| } | |
| if (!filename) { | |
| filename = path.basename(filePath); | |
| } | |
| return this.sendGifFromBase64(to, base64, filename, caption); | |
| } | |
| /** | |
| * Sends a video to given chat as a gif, with caption or not, using base64 | |
| * @category Chat | |
| * @param to chat id xxxxx@us.c | |
| * @param base64 base64 data:video/xxx;base64,xxx | |
| * @param filename string xxxxx | |
| * @param caption string xxxxx | |
| */ | |
| async sendGifFromBase64(to, base64, filename, caption) { | |
| base64 = await (0, ffmpeg_1.convertToMP4GIF)(base64); | |
| return await this.sendVideoAsGifFromBase64(to, base64, filename, caption); | |
| } | |
| /** | |
| * Sends contact card to iven chat id | |
| * @category Chat | |
| * @param to Chat id | |
| * @param contactsId Example: 0000@c.us | [000@c.us, 1111@c.us] | |
| */ | |
| async sendContactVcard(to, contactsId, name) { | |
| const result = await (0, helpers_1.evaluateAndReturn)(this.page, ({ to, contactsId, name }) => { | |
| return WPP.chat.sendVCardContactMessage(to, { | |
| id: contactsId, | |
| name: name, | |
| }); | |
| }, { to, contactsId, name }); | |
| return result; | |
| } | |
| /** | |
| * Send a list of contact cards | |
| * @category Chat | |
| * @param to Chat id | |
| * @param contacts Example: | ['000@c.us', '1111@c.us', {id: '2222@c.us', name: 'Test'}] | |
| */ | |
| async sendContactVcardList(to, contacts) { | |
| const result = await (0, helpers_1.evaluateAndReturn)(this.page, ({ to, contacts }) => { | |
| return WPP.chat.sendVCardContactMessage(to, contacts); | |
| }, { to, contacts }); | |
| return result; | |
| } | |
| /** | |
| * Forwards array of messages (could be ids or message objects) | |
| * @deprecated please use {@link forwardMessagesV2} | |
| * @category Chat | |
| * @param to Chat id | |
| * @param messages Array of messages ids to be forwarded | |
| * @param skipMyMessages | |
| * @returns array of messages ID | |
| */ | |
| async forwardMessage(toChatId, msgId, options) { | |
| return (0, helpers_1.evaluateAndReturn)(this.page, ({ toChatId, msgId, options }) => WPP.chat.forwardMessage(toChatId, msgId, options), { toChatId, msgId, options }); | |
| } | |
| /** | |
| * Forwards array of messages (could be ids or message objects) | |
| * What is the difference between forwardMessage and forwardMessagesV2? | |
| * forwardMessage was used to forward a single message | |
| * forwardMessagesV2 is used to forward multiple messages | |
| * Also, it fixes how we pass the arguments to the whatsapp original function | |
| * From positional args to named args (object) | |
| * @category Chat | |
| * @param to Chat id | |
| * @param messages Array of messages ids to be forwarded | |
| * @param options | |
| * @returns array of messages ID | |
| */ | |
| async forwardMessagesV2(toChatId, messages, options) { | |
| return (0, helpers_1.evaluateAndReturn)(this.page, ({ toChatId, messages, options }) => WPP.chat.forwardMessages(toChatId, messages, options), { toChatId, messages, options }); | |
| } | |
| /** | |
| * Generates sticker from the provided animated gif image and sends it (Send image as animated sticker) | |
| * | |
| * @example | |
| * ```javascript | |
| * client.sendImageAsStickerGif('000000000000@c.us', 'base64....'); | |
| * ``` | |
| * | |
| * @example | |
| * Send Sticker with reply | |
| * ```javascript | |
| * client.sendImageAsStickerGif('000000000000@c.us', 'base64....', { | |
| * quotedMsg: 'msgId', | |
| * }); | |
| * ``` | |
| * @category Chat | |
| * @param pathOrBase64 image path imageBase64 A valid gif image is required. You can also send via http/https (http://www.website.com/img.gif) | |
| * @param to chatId '000000000000@c.us' | |
| */ | |
| async sendImageAsStickerGif(to, pathOrBase64, options) { | |
| let base64 = ''; | |
| if (pathOrBase64.startsWith('data:')) { | |
| base64 = pathOrBase64; | |
| } | |
| else { | |
| let fileContent = await (0, helpers_1.downloadFileToBase64)(pathOrBase64, [ | |
| 'image/gif', | |
| 'image/webp', | |
| ]); | |
| if (!fileContent) { | |
| fileContent = await (0, helpers_1.fileToBase64)(pathOrBase64); | |
| } | |
| if (fileContent) { | |
| base64 = fileContent; | |
| } | |
| } | |
| if (!base64) { | |
| const error = new Error('Empty or invalid file or base64'); | |
| Object.assign(error, { | |
| code: 'empty_file', | |
| }); | |
| throw error; | |
| } | |
| const mimeInfo = (0, helpers_1.base64MimeType)(base64); | |
| if (!mimeInfo || !mimeInfo.includes('image')) { | |
| const error = new Error('Not an image, allowed formats gig and webp'); | |
| Object.assign(error, { | |
| code: 'invalid_image', | |
| }); | |
| throw error; | |
| } | |
| const buff = Buffer.from(base64.replace(/^data:image\/(gif|webp);base64,/, ''), 'base64'); | |
| let obj = await (0, helpers_1.stickerSelect)(buff, 1); | |
| if (!obj) { | |
| const error = new Error('Error with sharp library, check the console log'); | |
| Object.assign(error, { | |
| code: 'sharp_error', | |
| }); | |
| throw error; | |
| } | |
| const { webpBase64 } = obj; | |
| return await (0, helpers_1.evaluateAndReturn)(this.page, ({ to, webpBase64, options }) => { | |
| return WPP.chat.sendFileMessage(to, webpBase64, { | |
| type: 'sticker', | |
| ...options, | |
| }); | |
| }, { to, webpBase64, options }); | |
| } | |
| /** | |
| * Generates sticker from given image and sends it (Send Image As Sticker) | |
| * | |
| * @example | |
| * ```javascript | |
| * client.sendImageAsSticker('000000000000@c.us', 'base64....'); | |
| * ``` | |
| * | |
| * @example | |
| * Send Sticker with reply | |
| * ```javascript | |
| * client.sendImageAsSticker('000000000000@c.us', 'base64....', { | |
| * quotedMsg: 'msgId', | |
| * }); | |
| * ``` | |
| * | |
| * @category Chat | |
| * @param pathOrBase64 image path imageBase64 A valid png, jpg and webp image is required. You can also send via http/https (http://www.website.com/img.gif) | |
| * @param to chatId '000000000000@c.us' | |
| */ | |
| async sendImageAsSticker(to, pathOrBase64, options) { | |
| let base64 = ''; | |
| if (pathOrBase64.startsWith('data:')) { | |
| base64 = pathOrBase64; | |
| } | |
| else { | |
| let fileContent = await (0, helpers_1.downloadFileToBase64)(pathOrBase64, [ | |
| 'image/gif', | |
| 'image/png', | |
| 'image/jpg', | |
| 'image/jpeg', | |
| 'image/webp', | |
| ]); | |
| if (!fileContent) { | |
| fileContent = await (0, helpers_1.fileToBase64)(pathOrBase64); | |
| } | |
| if (fileContent) { | |
| base64 = fileContent; | |
| } | |
| } | |
| if (!base64) { | |
| const error = new Error('Empty or invalid file or base64'); | |
| Object.assign(error, { | |
| code: 'empty_file', | |
| }); | |
| throw error; | |
| } | |
| const mimeInfo = (0, helpers_1.base64MimeType)(base64); | |
| if (!mimeInfo || !mimeInfo.includes('image')) { | |
| const error = new Error('Not an image, allowed formats png, jpeg, webp and gif'); | |
| Object.assign(error, { | |
| code: 'invalid_image', | |
| }); | |
| throw error; | |
| } | |
| const buff = Buffer.from(base64.replace(/^data:image\/(png|jpe?g|webp|gif);base64,/, ''), 'base64'); | |
| let obj = await (0, helpers_1.stickerSelect)(buff, 0); | |
| if (!obj) { | |
| const error = new Error('Error with sharp library, check the console log'); | |
| Object.assign(error, { | |
| code: 'sharp_error', | |
| }); | |
| throw error; | |
| } | |
| const { webpBase64 } = obj; | |
| return await (0, helpers_1.evaluateAndReturn)(this.page, ({ to, webpBase64, options }) => { | |
| return WPP.chat.sendFileMessage(to, webpBase64, { | |
| type: 'sticker', | |
| ...options, | |
| }); | |
| }, { to, webpBase64, options }); | |
| } | |
| async sendLocation(to, latitudeOrOptions, longitude, title) { | |
| const options = typeof latitudeOrOptions === 'string' | |
| ? { | |
| lat: latitudeOrOptions, | |
| lng: longitude, | |
| title: title, | |
| } | |
| : latitudeOrOptions; | |
| return await (0, helpers_1.evaluateAndReturn)(this.page, async ({ to, options }) => { | |
| const result = await WPP.chat.sendLocationMessage(to, options); | |
| return { | |
| ack: result.ack, | |
| id: result.id, | |
| sendMsgResult: await result.sendMsgResult, | |
| }; | |
| }, { to, options: options }); | |
| } | |
| /** | |
| * Sets a chat status to seen. Marks all messages as ack: 3 | |
| * @category Chat | |
| * @param chatId chat id: xxxxx@us.c | |
| */ | |
| async sendSeen(chatId) { | |
| return (0, helpers_1.evaluateAndReturn)(this.page, (chatId) => WPP.chat.markIsRead(chatId), chatId); | |
| } | |
| /** | |
| * Sets an audio or image view once. Marks message as played | |
| * @category Chat | |
| * @param msgId Message id: xxxxx@us.c | |
| */ | |
| async markPlayed(msgId) { | |
| return (0, helpers_1.evaluateAndReturn)(this.page, (msgId) => WPP.chat.markPlayed(msgId), msgId); | |
| } | |
| /** | |
| * Starts typing ('Typing...' state) | |
| * | |
| * @example | |
| * ```javascript | |
| * // Keep sending typing state, use stopTyping to finish | |
| * await client.startTyping('[number]@c.us'); | |
| * | |
| * // Keep sending typing state for 5 seconds | |
| * await client.startTyping('[number]@c.us', 5000); | |
| * ``` | |
| * @category Chat | |
| * @param to Chat Id | |
| * @param duration Duration in milliseconds | |
| */ | |
| async startTyping(to, duration) { | |
| return (0, helpers_1.evaluateAndReturn)(this.page, ({ to, duration }) => WPP.chat.markIsComposing(to, duration), { | |
| to, | |
| duration, | |
| }); | |
| } | |
| /** | |
| * Stops typing ('Typing...' state) | |
| * @category Chat | |
| * @param to Chat Id | |
| */ | |
| async stopTyping(to) { | |
| return (0, helpers_1.evaluateAndReturn)(this.page, ({ to }) => WPP.chat.markIsPaused(to), { | |
| to, | |
| }); | |
| } | |
| /** | |
| * Starts recording ('Recording...' state) | |
| * @example | |
| * ```javascript | |
| * // Keep sending recording state, use `stopRecording` to finish | |
| * await client.startRecording('[number]@c.us'); | |
| * | |
| * // Keep sending typing state for 5 seconds | |
| * await client.startRecording('[number]@c.us', 5000); | |
| * ``` | |
| * @category Chat | |
| * @param to Chat Id | |
| * @param duration Duration in milliseconds | |
| */ | |
| async startRecording(to, duration) { | |
| return (0, helpers_1.evaluateAndReturn)(this.page, ({ to, duration }) => WPP.chat.markIsRecording(to, duration), { | |
| to, | |
| duration, | |
| }); | |
| } | |
| /** | |
| * Stops recording ('Recording...' state) | |
| * @deprecated please use {@link stopRecording} this function will be removed in future releases | |
| * @category Chat | |
| * @param to Chat Id | |
| */ | |
| async stopRecoring(to) { | |
| return (0, helpers_1.evaluateAndReturn)(this.page, ({ to }) => WPP.chat.markIsPaused(to), { | |
| to, | |
| }); | |
| } | |
| /** | |
| * Stops recording ('Recording...' state) | |
| * @category Chat | |
| * @param to Chat Id | |
| */ | |
| async stopRecording(to) { | |
| return (0, helpers_1.evaluateAndReturn)(this.page, ({ to }) => WPP.chat.markIsPaused(to), { | |
| to, | |
| }); | |
| } | |
| /** | |
| * Update your online presence | |
| * @category Chat | |
| * @param online true for available presence and false for unavailable | |
| */ | |
| async setOnlinePresence(online = true) { | |
| return (0, helpers_1.evaluateAndReturn)(this.page, ({ online }) => WPP.conn.markAvailable(online), { | |
| online, | |
| }); | |
| } | |
| /** | |
| * Sends text with tags | |
| * @category Chat | |
| */ | |
| async sendMentioned(to, message, mentioned) { | |
| return await (0, helpers_1.evaluateAndReturn)(this.page, ({ to, message, mentioned }) => WPP.chat.sendTextMessage(to, message, { | |
| detectMentioned: true, | |
| mentionedList: mentioned, | |
| }), { to, message, mentioned }); | |
| } | |
| /** | |
| * Sends a list message | |
| * | |
| * ```typescript | |
| * // Example | |
| * client.sendListMessage('<number>@c.us', { | |
| * buttonText: 'Click here', | |
| * description: 'Choose one option', | |
| * sections: [ | |
| * { | |
| * title: 'Section 1', | |
| * rows: [ | |
| * { | |
| * rowId: 'my_custom_id', | |
| * title: 'Test 1', | |
| * description: 'Description 1', | |
| * }, | |
| * { | |
| * rowId: '2', | |
| * title: 'Test 2', | |
| * description: 'Description 2', | |
| * }, | |
| * ], | |
| * }, | |
| * ], | |
| * }); | |
| * ``` | |
| * | |
| * @category Chat | |
| */ | |
| async sendListMessage(to, options) { | |
| const sendResult = await (0, helpers_1.evaluateAndReturn)(this.page, ({ to, options }) => WPP.chat.sendListMessage(to, options), { | |
| to, | |
| options: options, | |
| }); | |
| // I don't know why the evaluate is returning undefined for direct call | |
| // To solve that, I added `JSON.parse(JSON.stringify(<message>))` to solve that | |
| const result = (await (0, helpers_1.evaluateAndReturn)(this.page, async ({ messageId }) => { | |
| return JSON.parse(JSON.stringify(await WAPI.getMessageById(messageId))); | |
| }, { messageId: sendResult.id })); | |
| if (result['erro'] == true) { | |
| throw result; | |
| } | |
| return result; | |
| } | |
| /** | |
| * Send a create poll message | |
| * | |
| * @example | |
| * ```javascript | |
| * // Single pool | |
| * client.sendPollMessage( | |
| * '[number]@g.us', | |
| * 'A poll name', | |
| * ['Option 1', 'Option 2', 'Option 3'] | |
| * ); | |
| * ``` | |
| * // Selectable Count | |
| * ```javascript | |
| * // Single pool | |
| * client.sendPollMessage( | |
| * '[number]@g.us', | |
| * 'A poll name', | |
| * ['Option 1', 'Option 2', 'Option 3'], | |
| * { | |
| * selectableCount: 1, | |
| * } | |
| * ); | |
| * ``` | |
| * | |
| * @category Chat | |
| */ | |
| async sendPollMessage(chatId, name, choices, options) { | |
| const sendResult = await (0, helpers_1.evaluateAndReturn)(this.page, ({ chatId, name, choices, options }) => WPP.chat.sendCreatePollMessage(chatId, name, choices, options), { | |
| chatId, | |
| name, | |
| choices, | |
| options: options, | |
| }); | |
| // I don't know why the evaluate is returning undefined for direct call | |
| // To solve that, I added `JSON.parse(JSON.stringify(<message>))` to solve that | |
| const result = (await (0, helpers_1.evaluateAndReturn)(this.page, async ({ messageId }) => { | |
| return JSON.parse(JSON.stringify(await WAPI.getMessageById(messageId))); | |
| }, { messageId: sendResult.id })); | |
| if (result['erro'] == true) { | |
| throw result; | |
| } | |
| return result; | |
| } | |
| /** | |
| * Sets the chat state | |
| * Deprecated in favor of Use startTyping or startRecording functions | |
| * @category Chat | |
| * @param chatState | |
| * @param chatId | |
| * @deprecated Deprecated in favor of Use startTyping or startRecording functions | |
| */ | |
| async setChatState(chatId, chatState) { | |
| return await (0, helpers_1.evaluateAndReturn)(this.page, ({ chatState, chatId }) => { | |
| WAPI.sendChatstate(chatState, chatId); | |
| }, { chatState, chatId }); | |
| } | |
| /** | |
| * Send reaction to message | |
| * @example | |
| * ```javascript | |
| * // For send Reaction, just to send emoji | |
| * await client.sendReactionToMessage('[number]@c.us', '🤯'); | |
| * | |
| * // to remove reacition | |
| * await client.startRecording('[number]@c.us', false); | |
| * ``` | |
| * @category Chat | |
| * @param to Chat Id | |
| * @param duration Duration in milliseconds | |
| */ | |
| async sendReactionToMessage(msgId, reaction) { | |
| return (0, helpers_1.evaluateAndReturn)(this.page, ({ msgId, reaction }) => WPP.chat.sendReactionToMessage(msgId, reaction), { | |
| msgId, | |
| reaction, | |
| }); | |
| } | |
| /** | |
| * Send an order message | |
| * To send (prices, tax, shipping or discount), for example: USD 12.90, send them without dots or commas, like: 12900 | |
| * | |
| * @example | |
| * ```javascript | |
| * // Send an order with a product | |
| * client.sendOrderMessage('[number]@c.us', [ | |
| * { type: 'product', id: '67689897878', qnt: 2 }, | |
| * { type: 'product', id: '37878774457', qnt: 1 }, | |
| * ] | |
| * | |
| * // Send Order with a custom item | |
| * client.sendOrderMessage('[number]@c.us', [ | |
| * { type: 'custom', name: 'Item de cost test', price: 120000, qnt: 2 }, | |
| * ] | |
| * | |
| * // Send Order with custom options | |
| * client.sendOrderMessage('[number]@c.us', [ | |
| * { type: 'product', id: '37878774457', qnt: 1 }, | |
| * { type: 'custom', name: 'Item de cost test', price: 120000, qnt: 2 }, | |
| * ], | |
| * { tax: 10000, shipping: 4000, discount: 10000 } | |
| * ``` | |
| * | |
| * @category Chat | |
| */ | |
| async sendOrderMessage(to, items, options) { | |
| const sendResult = await (0, helpers_1.evaluateAndReturn)(this.page, ({ to, items, options }) => WPP.chat.sendChargeMessage(to, items, options), { | |
| to, | |
| items, | |
| options, | |
| }); | |
| // I don't know why the evaluate is returning undefined for direct call | |
| // To solve that, I added `JSON.parse(JSON.stringify(<message>))` to solve that | |
| const result = (await (0, helpers_1.evaluateAndReturn)(this.page, async ({ messageId }) => { | |
| return JSON.parse(JSON.stringify(await WAPI.getMessageById(messageId))); | |
| }, { messageId: sendResult.id })); | |
| if (result['erro'] == true) { | |
| throw result; | |
| } | |
| return result; | |
| } | |
| } | |
| exports.SenderLayer = SenderLayer; | |