/* * 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 . */ import { EditMessageOptions } from '@wppconnect/wa-js/dist/chat/functions/editMessage'; import { MsgKey } from '@wppconnect/wa-js/dist/whatsapp'; import { Page } from 'puppeteer'; import { CreateConfig } from '../../config/create-config'; import { evaluateAndReturn } from '../helpers'; import { UILayer } from './ui.layer'; import { Message } from '../model'; export class ControlsLayer extends UILayer { constructor(public page: Page, session?: string, options?: CreateConfig) { super(page, session, options); } /** * Unblock contact * @category Blocklist * @param contactId {string} id '000000000000@c.us' * @returns boolean */ public async unblockContact(contactId: string) { await evaluateAndReturn( this.page, (contactId) => WPP.blocklist.unblockContact(contactId), contactId ); return true; } /** * Block contact * @category Blocklist * @param contactId {string} id '000000000000@c.us' * @returns boolean */ public async blockContact(contactId: string) { await evaluateAndReturn( this.page, (contactId) => WPP.blocklist.blockContact(contactId), contactId ); return true; } /** * puts the chat as unread * @category Chat * @param contactId {string} id '000000000000@c.us' * @returns boolean */ public async markUnseenMessage(contactId: string) { await evaluateAndReturn( this.page, (contactId) => WPP.chat.markIsUnread(contactId), contactId ); return true; } /** * Deletes the given chat * @category Chat * @param chatId {string} id '000000000000@c.us' * @returns boolean */ public async deleteChat(chatId: string) { const result = await evaluateAndReturn( this.page, (chatId) => WPP.chat.delete(chatId), chatId ); return result.status === 200; } /** * Archive and unarchive chat messages with true or false * @category Chat * @param chatId {string} id '000000000000@c.us' * @param option {boolean} true or false * @returns boolean */ public async archiveChat(chatId: string, option: boolean = true) { return evaluateAndReturn( this.page, ({ chatId, option }) => WPP.chat.archive(chatId, option), { chatId, option } ); } /** * Pin and Unpin chat messages with true or false * @category Chat * @param chatId {string} id '000000000000@c.us' * @param option {boolean} true or false * @param nonExistent {boolean} Pin chat, non-existent (optional) * @returns object */ public async pinChat(chatId: string, option: boolean, nonExistent?: boolean) { if (nonExistent) { await evaluateAndReturn( this.page, ({ chatId }) => WPP.chat.find(chatId), { chatId } ); } return await evaluateAndReturn( this.page, ({ chatId, option }) => WPP.chat.pin(chatId, option), { chatId, option } ); } /** * Deletes all messages of given chat * @category Chat * @param chatId * @param keepStarred Keep starred messages * @returns boolean */ public async clearChat(chatId: string, keepStarred = true) { const result = await evaluateAndReturn( this.page, ({ chatId, keepStarred }) => WPP.chat.clear(chatId, keepStarred), { chatId, keepStarred } ); return result.status === 200; } /** * Deletes message of given message id * @category Chat * @param chatId The chat id from which to delete the message. * @param messageId The specific message id of the message to be deleted * @param onlyLocal If it should only delete locally (message remains on the other recipienct's phone). Defaults to false. */ public async deleteMessage( chatId: string, messageId: string[] | string, onlyLocal = false, deleteMediaInDevice = true ) { await evaluateAndReturn( this.page, ({ chatId, messageId, onlyLocal, deleteMediaInDevice }) => WPP.chat.deleteMessage( chatId, messageId, deleteMediaInDevice, !onlyLocal ), { chatId, messageId, onlyLocal, deleteMediaInDevice } ); return true; } /** * Edits message of given message id * @category Chat * @param msgId The specific message id of the message to be edited * @param newText New content of specified message * @param options Common message options * * @example * ```javascript * // Simple message * client.editMessage('true_@c.us_messageId', 'new Text For Simple Message'); * ``` */ public async editMessage( msgId: string | MsgKey, newText: string, options: EditMessageOptions = {} ) { const editResult = await evaluateAndReturn( this.page, ({ msgId, newText, options }) => WPP.chat.editMessage(msgId, newText, options), { msgId, newText, options } ); const result = (await evaluateAndReturn( this.page, async ({ messageId }) => { return JSON.parse(JSON.stringify(await WAPI.getMessageById(messageId))); }, { messageId: editResult.id } )) as Message; if (result.body !== newText) throw editResult; return result; } /** * Stars message of given message id * @category Chat * @param messagesId The specific message id of the message to be starred * @param star Add or remove star of the message. Defaults to true. */ public async starMessage( messagesId: string[] | string, star = true ): Promise { return await evaluateAndReturn( this.page, ({ messagesId, star }) => WAPI.starMessages(messagesId, star), { messagesId, star } ); } /** * Allow only admin to send messages with true or false * @category Group * @param chatId {string} id '000000000000@c.us' * @param option {boolean} true or false * @returns boolean */ public async setMessagesAdminsOnly(chatId: string, option: boolean) { return evaluateAndReturn( this.page, ({ chatId, option }) => WAPI.setMessagesAdminsOnly(chatId, option), { chatId, option } ); } /** * Enable or disable temporary messages with true or false * @category Chat * @param chatOrGroupId id '000000000000@c.us' or '000000-000000@g.us' * @param value true or false * @returns boolean */ public async setTemporaryMessages(chatOrGroupId: string, value: boolean) { return await evaluateAndReturn( this.page, ({ chatOrGroupId, value }) => WAPI.setTemporaryMessages(chatOrGroupId, value), { chatOrGroupId, value } ); } /** * Change limits of whatsapp web * * @example * ```javascript * //Change the maximum size (bytes) for uploading media (max 70MB) * WPP.conn.setLimit('maxMediaSize',16777216); * * //Change the maximum size (bytes) for uploading files (max 1GB) * WPP.conn.setLimit('maxFileSize',104857600); * * //Change the maximum number of contacts that can be selected when sharing (Default 5) * WPP.conn.setLimit('maxShare',100); * * //Change the maximum time (seconds) of a video status * WPP.conn.setLimit('statusVideoMaxDuration',120); * * //Remove pinned conversation limit (only whatsapp web) (Default 3) * WPP.conn.setLimit('unlimitedPin',true); * ``` * @category Chat */ public async setLimit( key: | 'maxMediaSize' | 'maxFileSize' | 'maxShare' | 'statusVideoMaxDuration' | 'unlimitedPin', value: boolean | number ) { return await evaluateAndReturn( this.page, ({ key, value }) => WPP.conn.setLimit(key as any, value), { key, value } ); } }