Examples

Code examples for common use cases

Basic Bot

javascript
const { makeWASocket, useMultiFileAuthState, DisconnectReason } = require('socketon');
const pino = require('pino');

async function startBot() {
    const { state, saveCreds } = await useMultiFileAuthState('./auth');
    
    const sock = makeWASocket({
        logger: pino({ level: 'silent' }),
        auth: state,
        printQRInTerminal: true
    });

    sock.ev.on('connection.update', async (update) => {
        const { connection, lastDisconnect } = update;
        if (connection === 'close') {
            const shouldReconnect = lastDisconnect?.error?.output?.statusCode !== DisconnectReason.loggedOut;
            if (shouldReconnect) startBot();
        } else if (connection === 'open') {
            console.log('Connected!');
        }
    });

    sock.ev.on('messages.upsert', async ({ messages }) => {
        const msg = messages[0];
        if (!msg.key.fromMe && msg.message) {
            const text = msg.message.conversation || msg.message.extendedTextMessage?.text;
            console.log('Message:', text);
        }
    });

    sock.ev.on('creds.update', saveCreds);
}

startBot();

Auto Reply

javascript
const responses = {
    'hello': 'Hi there!',
    'hi': 'Hello!',
    'help': 'Available commands: help, info',
    'info': 'Socketon Bot v1.8.26'
};

sock.ev.on('messages.upsert', async ({ messages }) => {
    const msg = messages[0];
    if (!msg.key.fromMe && msg.message) {
        const text = msg.message.conversation || msg.message.extendedTextMessage?.text;
        const reply = responses[text.toLowerCase()];
        
        if (reply) {
            await sock.sendMessage(msg.key.remoteJid, { text: reply }, { quoted: msg });
        }
    }
});

Simple Calculator

javascript
sock.ev.on('messages.upsert', async ({ messages }) => {
    const msg = messages[0];
    if (!msg.key.fromMe && msg.message) {
        const text = msg.message.conversation || msg.message.extendedTextMessage?.text;
        const match = text.match(/^(\d+)\s*([+\-*/])\s*(\d+)$/);
        
        if (match) {
            const [, a, op, b] = match;
            let result;
            switch (op) {
                case '+': result = parseInt(a) + parseInt(b); break;
                case '-': result = parseInt(a) - parseInt(b); break;
                case '*': result = parseInt(a) * parseInt(b); break;
                case '/': result = parseInt(a) / parseInt(b); break;
            }
            await sock.sendMessage(msg.key.remoteJid, { text: `${a} ${op} ${b} = ${result}` }, { quoted: msg });
        }
    }
});

Message Forwarder

javascript
const forwardTo = '628xxxx@s.whatsapp.net';

sock.ev.on('messages.upsert', async ({ messages }) => {
    const msg = messages[0];
    if (!msg.key.fromMe && msg.message) {
        await sock.sendMessage(forwardTo, {
            forward: msg
        });
        console.log('Message forwarded');
    }
});

Media Downloader

javascript
const { downloadMediaMessage } = require('socketon').WAProto;
const fs = require('fs');

sock.ev.on('messages.upsert', async ({ messages }) => {
    const msg = messages[0];
    if (!msg.key.fromMe && msg.message) {
        // Image
        if (msg.message.imageMessage) {
            const buffer = await downloadMediaMessage(msg);
            fs.writeFileSync('image.jpg', buffer);
        }
        
        // Video
        if (msg.message.videoMessage) {
            const buffer = await downloadMediaMessage(msg);
            fs.writeFileSync('video.mp4', buffer);
        }
        
        // Audio
        if (msg.message.audioMessage) {
            const buffer = await downloadMediaMessage(msg);
            fs.writeFileSync('audio.ogg', buffer);
        }
        
        // Document
        if (msg.message.documentMessage) {
            const buffer = await downloadMediaMessage(msg);
            const fileName = msg.message.documentMessage.fileName || 'file';
            fs.writeFileSync(fileName, buffer);
        }
    }
});

Group Auto Welcome

javascript
sock.ev.on('messages.upsert', async ({ messages }) => {
    const msg = messages[0];
    if (!msg.message) return;
    
    const isGroup = msg.key.remoteJid.endsWith('@g.us');
    if (!isGroup) return;
    
    // Handle group creation
    if (msg.message.groupCreation) {
        await sock.sendMessage(msg.key.remoteJid, {
            text: 'Welcome to the group! 🎉'
        });
    }
    
    // Handle new member
    if (msg.message.groupParticipantChanged) {
        const participants = msg.message.groupParticipantChanged;
        const action = participants.action; // 'add', 'remove', 'promote', 'demote'
        const jid = participants.participants[0];
        
        if (action === 'add') {
            await sock.sendMessage(msg.key.remoteJid, {
                text: `Welcome @${jid.split('@')[0]}! 👋`
            }, { mentions: [jid] });
        }
    }
});

Newsletter Bot

javascript
// Get newsletter ID from URL
const nlId = await sock.newsletterId('https://newsletter.com/channel');

// Follow
await sock.newsletterFollow(nlId);

// Listen to messages
sock.ev.on('messages.upsert', async ({ messages, type }) => {
    if (type !== 'notify') return;
    
    for (const msg of messages) {
        if (msg.key.remoteJid.includes('@newsletter')) {
            console.log('Newsletter message:', msg.message);
            
            // React
            await sock.newsletterReactMessage(
                msg.key.remoteJid,
                msg.key.id,
                '👍'
            );
            
            // Reply
            await sock.sendMessage(msg.key.remoteJid, {
                text: 'Thanks for the update!'
            });
        }
    }
});

Command Handler

javascript
const prefix = '!';
const commands = {
    ping: async (msg) => {
        await sock.sendMessage(msg.key.remoteJid, { text: 'Pong!' }, { quoted: msg });
    },
    about: async (msg) => {
        await sock.sendMessage(msg.key.remoteJid, { 
            text: 'Socketon Bot\nVersion: 1.8.26\nDeveloper: Ibra Decode' 
        }, { quoted: msg });
    },
    broadcast: async (msg, args) => {
        // Broadcast to all contacts
        const text = args.join(' ');
        // ... implementation
    }
};

sock.ev.on('messages.upsert', async ({ messages }) => {
    const msg = messages[0];
    if (!msg.key.fromMe && msg.message) {
        const text = msg.message.conversation || msg.message.extendedTextMessage?.text;
        
        if (text.startsWith(prefix)) {
            const [cmd, ...args] = text.slice(1).split(' ');
            if (commands[cmd]) {
                await commands[cmd](msg, args);
            }
        }
    }
});

Download & Send

javascript
// Download from URL and send
const axios = require('axios');
const { downloadMediaMessage } = require('socketon').WAProto;

async function sendFromUrl(jid, url, type = 'image') {
    const response = await axios.get(url, { responseType: 'arraybuffer' });
    const buffer = Buffer.from(response.data);
    
    await sock.sendMessage(jid, {
        [type]: buffer
    });
}

// Usage
await sendFromUrl('628xxxx@s.whatsapp.net', 'https://example.com/image.jpg', 'image');
await sendFromUrl('628xxxx@s.whatsapp.net', 'https://example.com/video.mp4', 'video');

Presence Subscribe

javascript
// Subscribe to presence
sock.presenceSubscribe('628xxxx@s.whatsapp.net');

// Listen to presence updates
sock.ev.on('presence.update', ({ id, presences }) => {
    for (const [participant, data] of Object.entries(presences)) {
        console.log(`${participant}: ${data.lastKnownPresence}`);
        if (data.lastSeen) {
            console.log(`Last seen: ${new Date(data.lastSeen * 1000)}`);
        }
    }
});