File size: 4,903 Bytes
4d3d726
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
import makeWASocket, {
  useMultiFileAuthState,
  DisconnectReason,
  WAMessage,
  ConnectionState,
  downloadMediaMessage,
} from '@whiskeysockets/baileys'
import * as qrcode from 'qrcode-terminal'
import { Boom } from '@hapi/boom'

// The session ID to use, you can change this
const SESSION_ID = 'my-bot-session'

async function startBot(sessionId: string): Promise<void> {
  console.log(`🔄 Starting bot for session: ${sessionId}`)

  const { state, saveCreds } = await useMultiFileAuthState(`./sessions/${sessionId}`)

  const sock = makeWASocket({
    auth: state,
    printQRInTerminal: false,
  })

  // Save credentials on update
  sock.ev.on('creds.update', saveCreds)

  // Handle connection logic
  sock.ev.on('connection.update', (update: Partial<ConnectionState>) => {
    const { connection, lastDisconnect, qr } = update

    if (qr) {
      console.log('📱 Scan this QR code with your phone:')
      qrcode.generate(qr, { small: true })
    }

    if (connection === 'open') {
      console.log('✅ Connection opened! Bot is ready.')
    }

    if (connection === 'close') {
      const shouldReconnect = (lastDisconnect?.error as Boom)?.output?.statusCode !== DisconnectReason.loggedOut
      console.log(
        `🔌 Connection closed. Reason: ${lastDisconnect?.error?.message}. Reconnecting: ${shouldReconnect}`
      )
      
      if (shouldReconnect) {
        startBot(sessionId)
      } else {
        console.log('🔴 Not reconnecting, you were logged out.')
      }
    }
  })

  // Handle incoming messages
  sock.ev.on('messages.upsert', async ({ messages }) => {
    const msg: WAMessage | undefined = messages[0];

    if (!msg?.message || msg.key.fromMe) {
      return;
    }

    const sender = msg.key.remoteJid;

    // --- YOUR BOT LOGIC GOES HERE ---

    // Handle TEXT messages
    if (msg.message.conversation || msg.message.extendedTextMessage) {
      console.log(`📩 Received a [Text Message] from [${sender}]`);
      const messageText = msg.message.conversation || msg.message.extendedTextMessage?.text || '';
      console.log(`💬 Text: "${messageText}"`);

      if (messageText.toLowerCase() === 'hello' && sender) {
        const replyText = 'Hello there!';
        await sock.sendMessage(sender, { text: replyText });
        console.log(`📤 Sent message to [${sender}]: "${replyText}"`);
      }
    }
    // Handle IMAGE messages (without downloading)
    else if (msg.message.imageMessage) {
      console.log(`📩 Received an [Image Message] from [${sender}]`);
      const caption = msg.message.imageMessage.caption || '';
      console.log(`🖼️ Caption: "${caption}"`);
    }
    // Handle VIDEO messages (without downloading)
    else if (msg.message.videoMessage) {
      console.log(`📩 Received a [Video Message] from [${sender}]`);
      const caption = msg.message.videoMessage.caption || '';
      console.log(`🎥 Video message received. Caption: "${caption}"`);
    }
     // Handle DOCUMENT messages (without downloading)
    else if (msg.message.documentMessage) {
      console.log(`📩 Received a [Document Message] from [${sender}]`);
      const caption = msg.message.documentMessage.caption || '';
      const fileName = msg.message.documentMessage.fileName || 'file';
      console.log(`📄 Document: "${fileName}", Caption: "${caption}"`);
    }
    // Handle CONTACT messages
    else if (msg.message.contactMessage) {
        console.log(`📩 Received a [Contact Message] from [${sender}]`);
        const name = msg.message.contactMessage.displayName || "No Name";
        const vcard = msg.message.contactMessage.vcard || "";
        const number = vcard.match(/waid=(\d+):/)?.[1] || "Not Found";
        console.log(`🙋 Contact: Name="${name}", Number="${number}"`);
    }
    // Handle POLL CREATION messages
    else if (msg.message.pollCreationMessageV2) {
      console.log(`📩 Received a [Poll Creation] from [${sender}]`);
      const poll = msg.message.pollCreationMessageV2;
      const pollQuestion = poll.name || 'No Question';
      const pollOptions = (poll.options?.map(opt => opt.optionName) || []).join(', ') || 'No Options';
      console.log(`📊 Poll created. Question: "${pollQuestion}", Options: [${pollOptions}]`);
    }
    // Handle POLL VOTE messages
    else if (msg.message.pollUpdateMessage) {
        console.log(`📩 Received a [Poll Vote] from [${sender}]`);
        // You can add more logic here to see which option was voted for
        console.log('🗳️ A vote was cast on a poll.');
    }
    // Handle other message types
    else {
        const messageType = Object.keys(msg.message)[0];
        console.log(`📩 Received an unhandled message type [${messageType}] from [${sender}]`);
    }
  });
}

// Start the bot
startBot(SESSION_ID)