const { Client, Location, List, Buttons, LocalAuth } = require('./index'); const client = new Client({ authStrategy: new LocalAuth(), puppeteer: { headless: false } }); client.initialize(); client.on('loading_screen', (percent, message) => { console.log('LOADING SCREEN', percent, message); }); client.on('qr', (qr) => { // NOTE: This event will not be fired if a session is specified. console.log('QR RECEIVED', qr); }); client.on('authenticated', () => { console.log('AUTHENTICATED'); }); client.on('auth_failure', msg => { // Fired if session restore was unsuccessful 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`; let chat = await msg.getChat(); chat.sendSeen(); 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.wid.user} Platform: ${info.platform} `); } 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] }); } else if (msg.body === '!delete') { if (msg.hasQuotedMsg) { const quotedMsg = await msg.getQuotedMessage(); if (quotedMsg.fromMe) { quotedMsg.delete(true); } else { msg.reply('I can only delete my own messages'); } } } else if (msg.body === '!pin') { const chat = await msg.getChat(); await chat.pin(); } else if (msg.body === '!archive') { const chat = await msg.getChat(); await chat.archive(); } else if (msg.body === '!mute') { const chat = await msg.getChat(); // mute the chat for 20 seconds const unmuteDate = new Date(); unmuteDate.setSeconds(unmuteDate.getSeconds() + 20); await chat.mute(unmuteDate); } else if (msg.body === '!typing') { const chat = await msg.getChat(); // simulates typing in the chat chat.sendStateTyping(); } else if (msg.body === '!recording') { const chat = await msg.getChat(); // simulates recording audio in the chat chat.sendStateRecording(); } else if (msg.body === '!clearstate') { const chat = await msg.getChat(); // stops typing or recording in the chat chat.clearState(); } else if (msg.body === '!jumpto') { if (msg.hasQuotedMsg) { const quotedMsg = await msg.getQuotedMessage(); client.interface.openChatWindowAt(quotedMsg.id._serialized); } } else if (msg.body === '!buttons') { let button = new Buttons('Button body', [{ body: 'bt1' }, { body: 'bt2' }, { body: 'bt3' }], 'title', 'footer'); client.sendMessage(msg.from, button); } else if (msg.body === '!list') { let sections = [{ title: 'sectionTitle', rows: [{ title: 'ListItem1', description: 'desc' }, { title: 'ListItem2' }] }]; let list = new List('List body', 'btnText', sections, 'Title', 'footer'); client.sendMessage(msg.from, list); } else if (msg.body === '!reaction') { msg.react('👍'); } }); 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('message_ack', (msg, ack) => { /* == ACK VALUES == ACK_ERROR: -1 ACK_PENDING: 0 ACK_SERVER: 1 ACK_DEVICE: 2 ACK_READ: 3 ACK_PLAYED: 4 */ if (ack == 3) { // The message was read } }); client.on('group_join', (notification) => { // User has joined or been added to the group. console.log('join', notification); notification.reply('User joined.'); }); client.on('group_leave', (notification) => { // User has left or been kicked from the group. console.log('leave', notification); notification.reply('User left.'); }); client.on('group_update', (notification) => { // Group picture, subject or description has been updated. console.log('update', notification); }); client.on('change_state', state => { console.log('CHANGE STATE', state); }); // Change to false if you don't want to reject incoming calls let rejectCalls = true; client.on('call', async (call) => { console.log('Call received, rejecting. GOTO Line 261 to disable', call); if (rejectCalls) await call.reject(); await client.sendMessage(call.from, `[${call.fromMe ? 'Outgoing' : 'Incoming'}] Phone call from ${call.from}, type ${call.isGroup ? 'group' : ''} ${call.isVideo ? 'video' : 'audio'} call. ${rejectCalls ? 'This call was automatically rejected by the script.' : ''}`); }); client.on('disconnected', (reason) => { console.log('Client was logged out', reason); }); client.on('contact_changed', async (message, oldId, newId, isContact) => { /** The time the event occurred. */ const eventTime = (new Date(message.timestamp * 1000)).toLocaleString(); console.log( `The contact ${oldId.slice(0, -5)}` + `${!isContact ? ' that participates in group ' + `${(await client.getChatById(message.to ?? message.from)).name} ` : ' '}` + `changed their phone number\nat ${eventTime}.\n` + `Their new phone number is ${newId.slice(0, -5)}.\n`); /** * Information about the {@name message}: * * 1. If a notification was emitted due to a group participant changing their phone number: * {@name message.author} is a participant's id before the change. * {@name message.recipients[0]} is a participant's id after the change (a new one). * * 1.1 If the contact who changed their number WAS in the current user's contact list at the time of the change: * {@name message.to} is a group chat id the event was emitted in. * {@name message.from} is a current user's id that got an notification message in the group. * Also the {@name message.fromMe} is TRUE. * * 1.2 Otherwise: * {@name message.from} is a group chat id the event was emitted in. * {@name message.to} is @type {undefined}. * Also {@name message.fromMe} is FALSE. * * 2. If a notification was emitted due to a contact changing their phone number: * {@name message.templateParams} is an array of two user's ids: * the old (before the change) and a new one, stored in alphabetical order. * {@name message.from} is a current user's id that has a chat with a user, * whos phone number was changed. * {@name message.to} is a user's id (after the change), the current user has a chat with. */ }); client.on('group_admin_changed', (notification) => { if (notification.type === 'promote') { /** * Emitted when a current user is promoted to an admin. * {@link notification.author} is a user who performs the action of promoting/demoting the current user. */ console.log(`You were promoted by ${notification.author}`); } else if (notification.type === 'demote') /** Emitted when a current user is demoted to a regular user. */ console.log(`You were demoted by ${notification.author}`); });