const fs = require('fs'); const { Client, Location } = require('./index'); const SESSION_FILE_PATH = './session.json'; let sessionCfg; if (fs.existsSync(SESSION_FILE_PATH)) { sessionCfg = require(SESSION_FILE_PATH); } const client = new Client({ puppeteer: { headless: false }, session: sessionCfg }); // You can use an existing session and avoid scanning a QR code by adding a "session" object to the client options. // This object must include WABrowserId, WASecretBundle, WAToken1 and WAToken2. client.initialize(); client.on('qr', (qr) => { // NOTE: This event will not be fired if a session is specified. console.log('QR RECEIVED', qr); }); client.on('authenticated', (session) => { console.log('AUTHENTICATED', session); if (!fs.existsSync(SESSION_FILE_PATH)) { fs.writeFile(SESSION_FILE_PATH, JSON.stringify(session), function (err) { if (err) { console.error(err); } }); } }); client.on('auth_failure', msg => { // Fired if session restore was unsuccessfull console.error('AUTHENTICATION FAILURE', msg); }); client.on('ready', () => { console.log('READY'); }); client.on('message', async msg => { console.log('MESSAGE RECEIVED', msg); if (msg.body == '!ping reply') { // Send a new message as a reply to the current one msg.reply('pong'); } else if (msg.body == '!ping') { // Send a new message to the same chat client.sendMessage(msg.from, 'pong'); } else if (msg.body.startsWith('!sendto ')) { // Direct send a new message to specific id let number = msg.body.split(' ')[1]; let messageIndex = msg.body.indexOf(number) + number.length; let message = msg.body.slice(messageIndex, msg.body.length); number = number.includes('@c.us') ? number : `${number}@c.us`; client.sendMessage(number, message); } else if (msg.body.startsWith('!subject ')) { // Change the group subject let chat = await msg.getChat(); if (chat.isGroup) { let newSubject = msg.body.slice(9); chat.setSubject(newSubject); } else { msg.reply('This command can only be used in a group!'); } } else if (msg.body.startsWith('!echo ')) { // Replies with the same message msg.reply(msg.body.slice(6)); } else if (msg.body.startsWith('!desc ')) { // Change the group description let chat = await msg.getChat(); if (chat.isGroup) { let newDescription = msg.body.slice(6); chat.setDescription(newDescription); } else { msg.reply('This command can only be used in a group!'); } } else if (msg.body == '!leave') { // Leave the group let chat = await msg.getChat(); if (chat.isGroup) { chat.leave(); } else { msg.reply('This command can only be used in a group!'); } } else if (msg.body.startsWith('!join ')) { const inviteCode = msg.body.split(' ')[1]; try { await client.acceptInvite(inviteCode); msg.reply('Joined the group!'); } catch (e) { msg.reply('That invite code seems to be invalid.'); } } else if (msg.body == '!groupinfo') { let chat = await msg.getChat(); if (chat.isGroup) { msg.reply(` *Group Details* Name: ${chat.name} Description: ${chat.description} Created At: ${chat.createdAt.toString()} Created By: ${chat.owner.user} Participant count: ${chat.participants.length} `); } else { msg.reply('This command can only be used in a group!'); } } else if (msg.body == '!chats') { const chats = await client.getChats(); client.sendMessage(msg.from, `The bot has ${chats.length} chats open.`); } else if (msg.body == '!info') { let info = client.info; client.sendMessage(msg.from, ` *Connection info* User name: ${info.pushname} My number: ${info.me.user} Platform: ${info.platform} WhatsApp version: ${info.phone.wa_version} `); } else if (msg.body == '!mediainfo' && msg.hasMedia) { const attachmentData = await msg.downloadMedia(); msg.reply(` *Media info* MimeType: ${attachmentData.mimetype} Filename: ${attachmentData.filename} Data (length): ${attachmentData.data.length} `); } else if (msg.body == '!quoteinfo' && msg.hasQuotedMsg) { const quotedMsg = await msg.getQuotedMessage(); quotedMsg.reply(` ID: ${quotedMsg.id._serialized} Type: ${quotedMsg.type} Author: ${quotedMsg.author || quotedMsg.from} Timestamp: ${quotedMsg.timestamp} Has Media? ${quotedMsg.hasMedia} `); } else if (msg.body == '!resendmedia' && msg.hasQuotedMsg) { const quotedMsg = await msg.getQuotedMessage(); if (quotedMsg.hasMedia) { 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) { msg.reply(msg.location); } else if (msg.body.startsWith('!status ')) { const newStatus = msg.body.split(' ')[1]; await client.setStatus(newStatus); msg.reply(`Status was updated to *${newStatus}*`); } else if (msg.body == '!mention') { const contact = await msg.getContact(); const chat = await msg.getChat(); chat.sendMessage(`Hi @${contact.number}!`, { mentions: [contact] }); } }); client.on('message_create', (msg) => { // Fired on all message creations, including your own if (msg.fromMe) { // do stuff here } }); client.on('message_revoke_everyone', async (after, before) => { // Fired whenever a message is deleted by anyone (including you) console.log(after); // message after it was deleted. if (before) { console.log(before); // message before it was deleted. } }); client.on('message_revoke_me', async (msg) => { // Fired whenever a message is only deleted in your own view. console.log(msg.body); // message before it was deleted. }); client.on('disconnected', (reason) => { console.log('Client was logged out', reason); });