diff --git a/example.js b/example.js index ceacdd6..0646253 100644 --- a/example.js +++ b/example.js @@ -146,7 +146,6 @@ client.on('message', async msg => { const attachmentData = await quotedMsg.downloadMedia(); client.sendMessage(msg.from, attachmentData, { caption: 'Here\'s your requested media.' }); } - } else if (msg.body == '!location') { msg.reply(new Location(37.422, -122.084, 'Googleplex\nGoogle Headquarters')); } else if (msg.location) { @@ -168,6 +167,9 @@ client.on('message', async msg => { } else { msg.reply('I can only delete my own messages'); } + } else if (msg.body === '!archive') { + const chat = await msg.getChat(); + chat.archive(); } }); diff --git a/src/Client.js b/src/Client.js index 9223ae6..1173aaa 100644 --- a/src/Client.js +++ b/src/Client.js @@ -83,21 +83,34 @@ class Client extends EventEmitter { } } else { - // Wait for QR Code - const QR_CANVAS_SELECTOR = 'canvas'; - await page.waitForSelector(QR_CANVAS_SELECTOR); - const qrImgData = await page.$eval(QR_CANVAS_SELECTOR, canvas => [].slice.call(canvas.getContext('2d').getImageData(0, 0, 264, 264).data)); - const qr = jsQR(qrImgData, 264, 264).data; + const getQrCode = async () => { + // Check if retry button is present + var QR_RETRY_SELECTOR = 'div[data-ref] > span > div'; + var qrRetry = await page.$(QR_RETRY_SELECTOR); + if (qrRetry) { + await qrRetry.click(); + } - /** - * Emitted when the QR code is received - * @event Client#qr - * @param {string} qr QR Code - */ - this.emit(Events.QR_RECEIVED, qr); + // Wait for QR Code + + const QR_CANVAS_SELECTOR = 'canvas'; + await page.waitForSelector(QR_CANVAS_SELECTOR); + const qrImgData = await page.$eval(QR_CANVAS_SELECTOR, canvas => [].slice.call(canvas.getContext('2d').getImageData(0, 0, 264, 264).data)); + const qr = jsQR(qrImgData, 264, 264).data; + /** + * Emitted when the QR code is received + * @event Client#qr + * @param {string} qr QR Code + */ + this.emit(Events.QR_RECEIVED, qr); + }; + getQrCode(); + let retryInterval = setInterval(getQrCode, 20000); // check for qr code every 20 seconds // Wait for code scan await page.waitForSelector(KEEP_PHONE_CONNECTED_IMG_SELECTOR, { timeout: 0 }); + clearInterval(retryInterval); + } await page.evaluate(ExposeStore, moduleRaid.toString()); @@ -281,7 +294,7 @@ class Client extends EventEmitter { if (newChatId) { //get the topmost chat object and assign the new chatId to it . //This is just a workaround.May cause problem if there are no chats at all. Need to dig in and emulate how whatsapp web does - let chat = window.Store.Chat.models[0]; + let chat = window.Store.Chat.models[0]; let originalChatObjId = chat.id; chat.id = newChatId; msg = await window.WWebJS.sendMessage(chat, message, options); @@ -296,7 +309,6 @@ class Client extends EventEmitter { return new Message(this, newMessage); } - /** * Get all current chat instances * @returns {Promise>} @@ -379,6 +391,30 @@ class Client extends EventEmitter { }); } + /** + * Enables and returns the archive state of the Chat + * @returns {boolean} + */ + async archiveChat(chatId) { + return await this.pupPage.evaluate(async chatId => { + let chat = await window.Store.Chat.get(chatId); + await window.Store.Cmd.archiveChat(chat, true); + return chat.archive; + }, chatId); + } + + /** + * Changes and returns the archive state of the Chat + * @returns {boolean} + */ + async unarchiveChat(chatId) { + return await this.pupPage.evaluate(async chatId => { + let chat = await window.Store.Chat.get(chatId); + await window.Store.Cmd.archiveChat(chat, false); + return chat.archive; + }, chatId); + } + } module.exports = Client; diff --git a/src/structures/Chat.js b/src/structures/Chat.js index e82101d..00a87f0 100644 --- a/src/structures/Chat.js +++ b/src/structures/Chat.js @@ -50,6 +50,12 @@ class Chat extends Base { */ this.timestamp = data.t; + /** + * Indicates if the Chat is archived + * @type {boolean} + */ + this.archived = data.archive; + return super._patch(data); } @@ -82,6 +88,21 @@ class Chat extends Base { return window.WWebJS.sendDeleteChat(chatId); }, this.id._serialized); } + + /** + * Archives this chat + */ + async archive() { + return this.client.archiveChat(this.id._serialized); + } + + /** + * un-archives this chat + */ + async unarchive() { + return this.client.unarchiveChat(this.id._serialized); + } + } module.exports = Chat; \ No newline at end of file