n4lyx 3.0.1 → 3.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.MD CHANGED
@@ -1,7 +1,5 @@
1
1
  <div align="center">
2
2
 
3
- <br/>
4
-
5
3
  ```
6
4
  ███╗ ██╗ ██╗ ██╗ ██╗ ██╗ ██╗ ██╗ ██╗
7
5
  ████╗ ██║ ██║ ██║ ██║ ╚██╗ ██╔╝ ╚██╗██╔╝
@@ -11,22 +9,27 @@
11
9
  ╚═╝ ╚═══╝ ╚═╝ ╚══════╝ ╚═╝ ╚═╝ ╚═╝
12
10
  ```
13
11
 
14
- **WhatsApp Web API. Multi-device. No bloat.**
12
+ **WhatsApp Web API · Multi-device · No bloat.**
15
13
 
16
- [![npm](https://img.shields.io/npm/v/n4lyx?style=flat-square&color=000&labelColor=111&label=npm)](https://npmjs.com/package/n4lyx)
17
- [![downloads](https://img.shields.io/npm/dm/n4lyx?style=flat-square&color=000&labelColor=111)](https://npmjs.com/package/n4lyx)
18
- [![license](https://img.shields.io/badge/license-MIT-000?style=flat-square&labelColor=111)](LICENSE)
19
- [![node](https://img.shields.io/badge/node-%3E%3D20-000?style=flat-square&labelColor=111)](package.json)
14
+ [![npm](https://img.shields.io/npm/v/n4lyx?style=flat-square&color=25D366&labelColor=111&label=npm)](https://npmjs.com/package/n4lyx)
15
+ [![downloads](https://img.shields.io/npm/dm/n4lyx?style=flat-square&color=25D366&labelColor=111)](https://npmjs.com/package/n4lyx)
16
+ [![license](https://img.shields.io/badge/license-MIT-25D366?style=flat-square&labelColor=111)](LICENSE)
17
+ [![node](https://img.shields.io/badge/node-%3E%3D20-25D366?style=flat-square&labelColor=111)](package.json)
20
18
 
21
19
  </div>
22
20
 
23
21
  ---
24
22
 
25
- ## What is this
23
+ ## Apa ini?
24
+
25
+ **n4lyx** adalah WhatsApp Web API library untuk Node.js — multi-device, proper `@lid → @pn` resolution, dan punya fitur-fitur eksklusif yang nggak ada di library lain.
26
26
 
27
- n4lyx adalah WhatsApp Web API library untuk Node.js. Multi-device, proper `@lid @pn` resolution, dan punya fitur eksklusif yang nggak ada di library lain tag all, group status v2, shorthand methods bawaan.
27
+ - **Tag all**mention semua member/admin/non-admin otomatis
28
+ - 📸 **Group Status V2** — post story langsung ke group
29
+ - 🎯 **Shorthand methods** — nggak perlu susun object manual
30
+ - 🔧 **Bug-fixed** — semua edge case umum udah dipatch
28
31
 
29
- > Bukan afiliasi dengan WhatsApp Inc. Jangan spam. Jangan abuse. Kamu yang tanggung jawab.
32
+ > **Disclaimer:** Bukan afiliasi dengan WhatsApp Inc. Jangan spam. Jangan abuse. Konsekuensi akun banned adalah tanggung jawab kamu sendiri.
30
33
 
31
34
  ---
32
35
 
@@ -48,6 +51,8 @@ import makeWASocket from 'n4lyx'
48
51
 
49
52
  ## Quick Start
50
53
 
54
+ Ini contoh bot paling minimal yang bisa jalan — terima pesan, balas "pong", auto-reconnect kalau putus.
55
+
51
56
  ```js
52
57
  const { default: makeWASocket, DisconnectReason, useMultiFileAuthState } = require('n4lyx')
53
58
  const { Boom } = require('@hapi/boom')
@@ -60,15 +65,19 @@ async function start() {
60
65
  printQRInTerminal: true
61
66
  })
62
67
 
68
+ // Handle koneksi
63
69
  sock.ev.on('connection.update', ({ connection, lastDisconnect }) => {
64
70
  if (connection === 'close') {
65
- const code = new Boom(lastDisconnect?.error)?.output?.statusCode
66
- if (code !== DisconnectReason.loggedOut) start()
71
+ const shouldReconnect =
72
+ new Boom(lastDisconnect?.error)?.output?.statusCode !== DisconnectReason.loggedOut
73
+ if (shouldReconnect) start()
67
74
  }
68
75
  })
69
76
 
77
+ // Simpan credentials
70
78
  sock.ev.on('creds.update', saveCreds)
71
79
 
80
+ // Terima pesan
72
81
  sock.ev.on('messages.upsert', async ({ messages }) => {
73
82
  const msg = messages[0]
74
83
  if (!msg.message) return
@@ -81,26 +90,30 @@ start()
81
90
 
82
91
  ---
83
92
 
84
- ## Auth
93
+ ## Login
85
94
 
86
95
  ### QR Code
87
96
 
97
+ Scan QR dari terminal — paling cepat untuk testing.
98
+
88
99
  ```js
89
100
  const sock = makeWASocket({ printQRInTerminal: true })
90
101
  ```
91
102
 
92
103
  ### Pairing Code
93
104
 
105
+ Cocok kalau nggak bisa scan QR (server headless, dll).
106
+
94
107
  ```js
95
108
  const sock = makeWASocket({ printQRInTerminal: false })
96
109
 
97
110
  if (!sock.authState.creds.registered) {
98
111
  const code = await sock.requestPairingCode('628XXXXXXXXX')
99
- console.log('Code:', code)
112
+ console.log('Kode pairing:', code) // → misalnya: N4LX-1234
100
113
  }
101
114
  ```
102
115
 
103
- Custom pairing code (tepat 8 karakter):
116
+ Custom kode (tepat 8 karakter):
104
117
 
105
118
  ```js
106
119
  const code = await sock.requestPairingCode('628XXXXXXXXX', 'N4LYX001')
@@ -108,21 +121,23 @@ const code = await sock.requestPairingCode('628XXXXXXXXX', 'N4LYX001')
108
121
 
109
122
  ### Simpan Session
110
123
 
124
+ Session disimpan ke folder `auth/`. Kalau file-nya ada, next run langsung connect tanpa QR lagi.
125
+
111
126
  ```js
112
127
  const { state, saveCreds } = await useMultiFileAuthState('auth')
113
128
  const sock = makeWASocket({ auth: state })
114
129
  sock.ev.on('creds.update', saveCreds)
115
130
  ```
116
131
 
117
- > Untuk production, simpan credentials ke database (PostgreSQL, MongoDB, Redis) bukan ke disk.
132
+ > **Untuk production:** simpan credentials ke database (PostgreSQL / MongoDB / Redis), bukan ke disk. Disk bisa corrupt, database tidak.
118
133
 
119
134
  ---
120
135
 
121
- ## Config
136
+ ## Config Penting
122
137
 
123
138
  ### Cache Group Metadata
124
139
 
125
- Wajib kalau bot kamu banyak handle group. Ngurangin API call berulang.
140
+ Wajib kalau bot kamu aktif di banyak group. Ini ngurangin request ke WA API secara signifikan.
126
141
 
127
142
  ```js
128
143
  const NodeCache = require('node-cache')
@@ -132,225 +147,197 @@ const sock = makeWASocket({
132
147
  cachedGroupMetadata: async (jid) => groupCache.get(jid)
133
148
  })
134
149
 
150
+ // Update cache kalau ada perubahan di group
135
151
  sock.ev.on('groups.update', async ([e]) => {
136
152
  groupCache.set(e.id, await sock.groupMetadata(e.id))
137
153
  })
138
-
139
154
  sock.ev.on('group-participants.update', async (e) => {
140
155
  groupCache.set(e.id, await sock.groupMetadata(e.id))
141
156
  })
142
157
  ```
143
158
 
144
- ### Message Store
145
-
146
- Dibutuhkan untuk message retry dan dekripsi poll vote.
147
-
148
- ```js
149
- const sock = makeWASocket({
150
- getMessage: async (key) => await getMessageFromDB(key)
151
- })
152
- ```
153
-
154
159
  ### Background Mode
155
160
 
156
- Terima pesan tanpa kelihatan online.
161
+ Bot nggak kelihatan online tapi tetap terima pesan.
157
162
 
158
163
  ```js
159
164
  const sock = makeWASocket({ markOnlineOnConnect: false })
160
165
  ```
161
166
 
162
- ### Full History Sync
167
+ ### Message Store (untuk Poll & Retry)
168
+
169
+ Diperlukan untuk dekripsi poll vote dan message retry.
163
170
 
164
171
  ```js
165
172
  const sock = makeWASocket({
166
- browser: ['Mac', 'Desktop', '1.0'],
167
- syncFullHistory: true
173
+ getMessage: async (key) => await getMessageFromDB(key)
174
+ // implementasi getMessageFromDB sesuai DB kamu
168
175
  })
169
176
  ```
170
177
 
171
178
  ---
172
179
 
173
- ## In-Memory Store
174
-
175
- n4lyx tidak ship store default. Ada basic in-memory store untuk dev/testing — jangan dipakai production.
176
-
177
- ```js
178
- const { makeInMemoryStore } = require('n4lyx')
179
-
180
- const store = makeInMemoryStore({})
181
- store.readFromFile('./store.json')
182
- setInterval(() => store.writeToFile('./store.json'), 10_000)
183
-
184
- const sock = makeWASocket({})
185
- store.bind(sock.ev)
186
- ```
187
-
188
- ---
189
-
190
180
  ## Kirim Pesan
191
181
 
192
- ```js
193
- await sock.sendMessage(jid, content, options?)
194
- ```
182
+ Semua pengiriman pesan lewat satu method: `sock.sendMessage(jid, content, options?)`.
195
183
 
196
- ### Teks
184
+ ### Teks biasa
197
185
 
198
186
  ```js
199
- await sock.sendMessage(jid, { text: 'halo' })
187
+ await sock.sendMessage(jid, { text: 'Halo!' })
200
188
  ```
201
189
 
202
190
  ### Reply / Quote
203
191
 
204
192
  ```js
205
- await sock.sendMessage(jid, { text: 'halo' }, { quoted: message })
193
+ await sock.sendMessage(jid, { text: 'Oke siap' }, { quoted: message })
206
194
  ```
207
195
 
208
- ### Mention
196
+ ### Mention user
209
197
 
210
198
  ```js
211
199
  await sock.sendMessage(jid, {
212
- text: '@628XXXXXXXXX',
200
+ text: 'Hei @628XXXXXXXXX, cek ini',
213
201
  mentions: ['628XXXXXXXXX@s.whatsapp.net']
214
202
  })
215
203
  ```
216
204
 
217
- ### Tag All ⚡ n4lyx exclusive
205
+ ### Tag All ⚡
218
206
 
219
- Auto-mention semua member group. Fetch participant list otomatis.
207
+ Fitur eksklusif n4lyx. Auto-fetch participant list lalu mention semua sekaligus.
220
208
 
221
209
  ```js
222
210
  // Tag semua member
223
211
  await sock.sendMessage(jid, {
224
- text: '@everyone dengerin dulu',
212
+ text: '📢 Pengumuman penting buat semua!',
225
213
  tagAll: true
226
214
  })
227
215
 
228
216
  // Tag admin aja
229
217
  await sock.sendMessage(jid, {
230
- text: 'khusus admin',
218
+ text: '🔔 Info untuk para admin',
231
219
  tagAll: true,
232
220
  tagAllScope: 'admins'
233
221
  })
234
222
 
235
223
  // Tag non-admin aja
236
224
  await sock.sendMessage(jid, {
237
- text: 'khusus member',
225
+ text: '👋 Hei member!',
238
226
  tagAll: true,
239
227
  tagAllScope: 'non_admins'
240
228
  })
241
229
  ```
242
230
 
243
- `tagAllScope`: `'all'` (default) · `'admins'` · `'non_admins'`
244
-
245
- Atau ambil list JID-nya langsung:
231
+ Atau ambil list JID-nya dulu kalau mau diproses manual:
246
232
 
247
233
  ```js
248
234
  const jids = await sock.groupTagAll(groupJid, 'all')
249
- // → ['628XXX@s.whatsapp.net', ...]
235
+ // → ['628xxx@s.whatsapp.net', '628yyy@s.whatsapp.net', ...]
250
236
  ```
251
237
 
252
238
  ### Media
253
239
 
254
- Support `Buffer`, `{ url: '...' }`, atau `{ stream: Stream }`.
240
+ Semua media support: `Buffer`, `{ url: '...' }`, atau `{ stream: Stream }`.
255
241
 
256
242
  ```js
257
243
  // Gambar
258
- await sock.sendMessage(jid, { image: { url: './foto.png' }, caption: 'caption' })
244
+ await sock.sendMessage(jid, {
245
+ image: { url: './foto.jpg' },
246
+ caption: 'Caption foto'
247
+ })
259
248
 
260
249
  // Video
261
- await sock.sendMessage(jid, { video: { url: './video.mp4' }, caption: 'caption' })
250
+ await sock.sendMessage(jid, {
251
+ video: { url: './video.mp4' },
252
+ caption: 'Caption video'
253
+ })
262
254
 
263
- // Audio
264
- await sock.sendMessage(jid, { audio: { url: './audio.ogg' }, mimetype: 'audio/mp4' })
255
+ // Audio biasa
256
+ await sock.sendMessage(jid, {
257
+ audio: { url: './audio.mp3' },
258
+ mimetype: 'audio/mp4'
259
+ })
260
+
261
+ // Voice note (PTT)
262
+ await sock.sendMessage(jid, {
263
+ audio: fs.readFileSync('./voice.ogg'),
264
+ mimetype: 'audio/ogg; codecs=opus',
265
+ ptt: true
266
+ })
265
267
 
266
268
  // Sticker
267
- await sock.sendMessage(jid, { sticker: fs.readFileSync('./sticker.webp') })
269
+ await sock.sendMessage(jid, {
270
+ sticker: fs.readFileSync('./sticker.webp')
271
+ })
268
272
 
269
273
  // Dokumen
270
274
  await sock.sendMessage(jid, {
271
- document: { url: './file.pdf' },
275
+ document: { url: './laporan.pdf' },
272
276
  mimetype: 'application/pdf',
273
- fileName: 'file.pdf'
277
+ fileName: 'laporan.pdf'
274
278
  })
275
279
  ```
276
280
 
277
281
  ### Link Preview
278
282
 
279
- Install dulu:
283
+ Install `link-preview-js` dulu, lalu kirim teks dengan URL biasa — preview auto-generate.
280
284
 
281
285
  ```bash
282
286
  npm i link-preview-js
283
287
  ```
284
288
 
285
289
  ```js
286
- await sock.sendMessage(jid, { text: 'cek ini: https://npmjs.com/package/n4lyx' })
290
+ await sock.sendMessage(jid, {
291
+ text: 'Cek library ini: https://npmjs.com/package/n4lyx'
292
+ })
287
293
  ```
288
294
 
289
295
  ---
290
296
 
291
- ## Helper Methods ⚡ n4lyx exclusive
297
+ ## Shorthand Methods ⚡
292
298
 
293
- Shorthand methods langsung di `sock` nggak perlu susun object content manual.
299
+ Biar nggak perlu susun object setiap kali, n4lyx punya shorthand methods langsung di `sock`.
294
300
 
295
- ---
296
-
297
- ### `sock.sendImage(jid, image, caption?, options?)`
301
+ ### Gambar & Video
298
302
 
299
303
  ```js
300
- await sock.sendImage(jid, buffer, 'ini caption')
304
+ // Gambar
305
+ await sock.sendImage(jid, buffer, 'Caption opsional')
301
306
  await sock.sendImage(jid, { url: './foto.jpg' })
302
- ```
303
-
304
- ---
305
307
 
306
- ### `sock.sendVideo(jid, video, caption?, options?)`
307
-
308
- ```js
309
- await sock.sendVideo(jid, buffer, 'ini video')
308
+ // Video
309
+ await sock.sendVideo(jid, buffer, 'Caption opsional')
310
310
  ```
311
311
 
312
- ---
313
-
314
- ### `sock.sendAudio(jid, audio, isPtt?, options?)`
312
+ ### Audio
315
313
 
316
314
  ```js
317
- await sock.sendAudio(jid, buffer) // audio biasa
318
- await sock.sendAudio(jid, buffer, true) // voice note / PTT
315
+ await sock.sendAudio(jid, buffer) // audio biasa
316
+ await sock.sendAudio(jid, buffer, true) // voice note / PTT
317
+ await sock.sendAudioPTT(jid, buffer) // alias PTT
318
+ await sock.sendVoiceNote(jid, buffer) // alias voice note
319
319
  ```
320
320
 
321
- ---
322
-
323
- ### `sock.sendDocument(jid, document, fileName, mimetype?, caption?, options?)`
321
+ ### Dokumen
324
322
 
325
323
  ```js
326
- await sock.sendDocument(jid, buffer, 'laporan.pdf', 'application/pdf', 'ini file nya')
324
+ await sock.sendDocument(jid, buffer, 'laporan.pdf', 'application/pdf', 'Ini file-nya')
327
325
  ```
328
326
 
329
- ---
330
-
331
- ### `sock.sendGIF(jid, video, caption?, options?)`
327
+ ### GIF & Video Note
332
328
 
333
329
  ```js
330
+ // GIF animasi
334
331
  await sock.sendGIF(jid, gifBuffer, 'wkwk')
335
- await sock.sendGIF(jid, gifBuffer)
336
- ```
337
-
338
- ---
339
-
340
- ### `sock.sendPTV(jid, video, options?)`
341
-
342
- Circular video note (kayak voice note tapi video).
343
332
 
344
- ```js
333
+ // Circular video note (kayak voice note tapi video)
345
334
  await sock.sendPTV(jid, videoBuffer)
346
- await sock.sendPTV(jid, videoBuffer, { quoted: m })
335
+ await sock.sendPTV(jid, videoBuffer, { quoted: m }) // dengan quote
347
336
  ```
348
337
 
349
- ---
350
-
351
- ### `sock.sendViewOnce(jid, content, options?)`
338
+ ### View Once
352
339
 
353
- View-once media hilang setelah dilihat sekali.
340
+ Media otomatis hilang setelah dilihat sekali.
354
341
 
355
342
  ```js
356
343
  await sock.sendViewOnce(jid, { image: buffer })
@@ -358,319 +345,241 @@ await sock.sendViewOnce(jid, { video: buffer }, { quoted: m })
358
345
  await sock.sendViewOnce(jid, { audio: buffer, mimetype: 'audio/mp4' })
359
346
  ```
360
347
 
361
- ---
362
-
363
- ### `sock.sendSticker(jid, sticker, options?)` / `sock.sendStickerFromUrl(jid, url, options?)`
348
+ ### Sticker
364
349
 
365
350
  ```js
366
- await sock.sendMessage(jid, { sticker: buffer })
367
- await sock.sendStickerFromUrl(jid, 'https://example.com/sticker.webp')
368
- ```
369
-
370
- ---
351
+ // Dari Buffer
352
+ await sock.sendStickerFromBuffer(jid, buffer)
371
353
 
372
- ### `sock.sendStickerWithMetadata(jid, sticker, metadata?, options?)`
373
-
374
- Kirim sticker dengan pack name, publisher, kategori.
354
+ // Dari URL langsung
355
+ await sock.sendStickerFromUrl(jid, 'https://example.com/sticker.webp')
375
356
 
376
- ```js
357
+ // Dengan metadata pack
377
358
  await sock.sendStickerWithMetadata(jid, buffer, {
378
359
  packName: 'Pack Gue',
379
360
  packPublisher: 'N4tzz',
380
361
  categories: ['😂']
381
362
  })
382
- ```
383
-
384
- ---
385
-
386
- ### `sock.sendStickerPack(jid, stickers[], packName, packPublisher, options?)`
387
-
388
- Kirim banyak sticker sekaligus (max 30, auto delay).
389
363
 
390
- ```js
364
+ // Kirim banyak sticker sekaligus (max 30, ada auto-delay)
391
365
  await sock.sendStickerPack(jid, [buf1, buf2, buf3], 'Pack Gue', 'N4tzz')
392
366
  ```
393
367
 
394
- ---
395
-
396
- ### `sock.sendAlbum(jid, items[], options?)`
368
+ ### Album
397
369
 
398
- Album foto/video yang bisa di-swipe (max 10 item, mix image + video).
370
+ Kumpulan foto/video yang bisa di-swipe (max 10 item, bisa mix image + video).
399
371
 
400
372
  ```js
401
373
  await sock.sendAlbum(jid, [
402
374
  { image: buf1, caption: 'Foto 1' },
403
- { image: buf2 },
375
+ { image: buf2, caption: 'Foto 2' },
404
376
  { video: buf3, caption: 'Video' }
405
377
  ])
406
378
  ```
407
379
 
408
- ---
409
-
410
- ### `sock.sendPoll(jid, question, choices[], cfg?)`
380
+ ### Poll
411
381
 
412
382
  ```js
413
- // Multiple choice
383
+ // Pilih lebih dari satu
414
384
  await sock.sendPoll(jid, 'Bahasa favorit?', ['JavaScript', 'Python', 'Go'])
415
385
 
416
- // Single select
386
+ // Pilih satu saja
417
387
  await sock.sendPoll(jid, 'Setuju?', ['Ya', 'Tidak'], { selectableCount: 1 })
418
-
419
- // Community announcement group
420
- await sock.sendPoll(jid, 'Vote', ['A', 'B'], { toAnnouncementGroup: true })
421
388
  ```
422
389
 
423
- ---
424
-
425
- ### `sock.sendLocation(jid, latitude, longitude, name?, options?)`
390
+ ### Lokasi
426
391
 
427
392
  ```js
393
+ // Lokasi statis
428
394
  await sock.sendLocation(jid, -7.797068, 110.370529, 'Yogyakarta')
429
- await sock.sendLocation(jid, -6.2, 106.8)
430
- ```
431
-
432
- ---
433
395
 
434
- ### `sock.sendLiveLocation(jid, lat, lng, accuracy?, duration?, options?)`
435
-
436
- ```js
396
+ // Live location
437
397
  await sock.sendLiveLocation(jid, -7.79, 110.37, 10, 300)
398
+ // parameter: lat, lng, accuracy (meter), duration (detik)
438
399
  ```
439
400
 
440
- ---
441
-
442
- ### `sock.sendContact(jid, contacts, options?)`
401
+ ### Kontak
443
402
 
444
403
  ```js
445
404
  // Single
446
- await sock.sendContact(jid, { fullName: 'Budi', phoneNumber: '+62812xxxxxxx' })
447
-
448
- // Dengan org
449
- await sock.sendContact(jid, { fullName: 'Sari', phoneNumber: '+62813xxxxxxx', org: 'Acme Corp' })
405
+ await sock.sendContact(jid, {
406
+ fullName: 'Budi Santoso',
407
+ phoneNumber: '+62812xxxxxxx',
408
+ org: 'Acme Corp' // opsional
409
+ })
450
410
 
451
- // Multiple
411
+ // Multiple sekaligus
452
412
  await sock.sendContact(jid, [
453
413
  { fullName: 'Budi', phoneNumber: '+62812xxxxxxx' },
454
414
  { fullName: 'Sari', phoneNumber: '+62813xxxxxxx' }
455
415
  ])
456
-
457
- // Raw vCard manual
458
- await sock.sendContact(jid, { fullName: 'Custom', vcard: 'BEGIN:VCARD\n...\nEND:VCARD' })
459
416
  ```
460
417
 
461
- ---
462
-
463
- ### `sock.sendEvent(jid, eventData, options?)`
418
+ ### Event & Jadwal Call
464
419
 
465
420
  ```js
421
+ // WhatsApp Event
466
422
  await sock.sendEvent(jid, {
467
- name: 'Rapat Tim',
468
- description: 'Sync mingguan',
469
- startTime: Date.now() + 3_600_000, // ms timestamp, wajib
470
- endTime: Date.now() + 7_200_000, // opsional
471
- location: 'Zoom', // opsional
472
- joinLink: 'https://zoom.us/j/xxx' // opsional
423
+ name: 'Rapat Mingguan',
424
+ description: 'Sync tim setiap Senin',
425
+ startTime: Date.now() + 3_600_000, // 1 jam dari sekarang
426
+ endTime: Date.now() + 7_200_000, // 2 jam dari sekarang
427
+ location: 'Google Meet',
428
+ joinLink: 'https://meet.google.com/xxx'
473
429
  })
474
- ```
475
-
476
- ---
477
430
 
478
- ### `sock.sendScheduledCall(jid, title, time, callType?, options?)`
479
-
480
- ```js
481
- await sock.sendScheduledCall(jid, 'Catch-up', Date.now() + 86_400_000) // video (default)
482
- await sock.sendScheduledCall(jid, 'Voice call', Date.now() + 3_600_000, 2) // voice
431
+ // Jadwalkan panggilan
432
+ await sock.sendScheduledCall(jid, 'Catch-up session', Date.now() + 86_400_000) // video call (default)
433
+ await sock.sendScheduledCall(jid, 'Voice call', Date.now() + 3_600_000, 2) // voice call
483
434
  ```
484
435
 
485
- `callType`: `1` = video · `2` = voice
486
-
487
- ---
488
-
489
- ### `sock.sendGroupInvite(jid, groupJid, options?)`
490
-
491
- Kirim invite group sebagai pesan card (bukan plain link).
436
+ ### Reply & Mention
492
437
 
493
438
  ```js
494
- await sock.sendGroupInvite(jid, '120363xxx@g.us')
495
- ```
496
-
497
- ---
498
-
499
- ### `sock.groupStatusV2(jid, content)`
439
+ // Reply cepat
440
+ await sock.sendReply(jid, 'Oke siap!', m)
500
441
 
501
- Post status/story di dalam group (muncul kayak story).
502
-
503
- ```js
504
- // Teks
505
- await sock.groupStatusV2('120363xxx@g.us', { text: 'GM!', backgroundColor: '#25D366' })
506
- await sock.groupStatusV2('120363xxx@g.us', { text: 'Halo', backgroundColor: '#FF6B6B', font: 1 })
442
+ // Reply dengan media
443
+ await sock.sendMediaReply(jid, { image: buffer, caption: 'ini' }, m)
507
444
 
508
- // Gambar
509
- await sock.groupStatusV2('120363xxx@g.us', { image: buffer, caption: 'lihat ini!' })
445
+ // Reply + mention sekaligus
446
+ await sock.sendQuotedText(jid, 'Hayo @kamu', m, ['628xxx@s.whatsapp.net'])
510
447
 
511
- // Video
512
- await sock.groupStatusV2('120363xxx@g.us', { video: buffer, caption: 'tonton ini' })
448
+ // Teks + mention
449
+ await sock.sendTextWithMentions(jid, 'Halo @A dan @B', [jidA, jidB])
513
450
 
514
- // Audio
515
- await sock.groupStatusV2('120363xxx@g.us', { audio: buffer, mimetype: 'audio/mp4' })
451
+ // Tag all shorthand
452
+ await sock.sendTagAll(jid, '📢 Pengumuman untuk semua')
453
+ await sock.sendTagAll(jid, '🔔 Khusus admin', 'admins')
454
+ await sock.sendTagAll(jid, '👋 Hei member', 'non_admins')
516
455
 
517
- // Sticker
518
- await sock.groupStatusV2('120363xxx@g.us', { sticker: buffer })
456
+ // Tag all + mention
457
+ await sock.sendMentionAll(jid, 'Hei semua!')
519
458
  ```
520
459
 
521
- ---
522
-
523
- ### `sock.sendStatus(content, statusJidList?)`
460
+ ### Invite Group
524
461
 
525
- Post story/status pribadi ke `status@broadcast`.
462
+ Kirim invite sebagai card (bukan plain link).
526
463
 
527
464
  ```js
528
- await sock.sendStatus({ text: 'Pagi!', backgroundColor: '#128C7E' })
529
- await sock.sendStatus({ image: buffer, caption: 'foto hari ini' })
530
- await sock.sendStatus({ video: buffer })
531
-
532
- // Batasi siapa yang lihat
533
- await sock.sendStatus({ text: 'cuma buat kamu' }, ['628xxx@s.whatsapp.net'])
534
- ```
535
-
536
- ---
537
-
538
- ### `sock.sendReply(jid, text, quotedMessage, options?)`
539
-
540
- ```js
541
- await sock.sendReply(jid, 'oke siap', m)
465
+ await sock.sendGroupInvite(jid, '120363xxx@g.us')
542
466
  ```
543
467
 
544
- ---
545
-
546
- ### `sock.sendMediaReply(jid, content, quotedMessage, options?)`
468
+ ### Typing Indicator
547
469
 
548
470
  ```js
549
- await sock.sendMediaReply(jid, { image: buffer, caption: 'ini' }, m)
550
- ```
471
+ // Typing 3 detik lalu berhenti
472
+ await sock.sendTyping(jid)
551
473
 
552
- ---
553
-
554
- ### `sock.sendQuotedText(jid, text, quotedMessage, mentions?, options?)`
555
-
556
- Reply + mention sekaligus.
474
+ // Recording 2 detik
475
+ await sock.sendTyping(jid, 2000, 'recording')
557
476
 
558
- ```js
559
- await sock.sendQuotedText(jid, 'hayo @kamu', m, ['628xxx@s.whatsapp.net'])
477
+ // Kirim pesan dengan typing dulu
478
+ await sock.sendWithTyping(jid, { text: 'Halo!' })
479
+ await sock.sendWithTyping(jid, { text: 'Halo!' }, {}, 2000) // typing 2 detik
560
480
  ```
561
481
 
562
- ---
563
-
564
- ### `sock.sendTagAll(jid, text, scope?, options?)`
565
-
566
- Shorthand tag all + kirim pesan sekaligus.
482
+ ### Broadcast & Multi-Message
567
483
 
568
484
  ```js
569
- await sock.sendTagAll(jid, 'dengerin dulu ya')
570
- await sock.sendTagAll(jid, 'hei admin', 'admins')
571
- await sock.sendTagAll(jid, 'hei member', 'non_admins')
572
- ```
573
-
574
- ---
485
+ // Kirim ke banyak JID (auto deduplicate, ada delay antar kirim)
486
+ const results = await sock.broadcastMessage(
487
+ ['628xxx@s.whatsapp.net', '628yyy@s.whatsapp.net'],
488
+ { text: 'Pengumuman penting!' },
489
+ { delayMs: 1000 }
490
+ )
491
+ // results: [{ jid, success, msg? }, ...]
575
492
 
576
- ### `sock.sendTextWithMentions(jid, text, mentionJids[], options?)`
493
+ // Broadcast ke semua group yang diikuti
494
+ await sock.broadcastToGroups([groupJid1, groupJid2], { text: 'Halo semua group!' })
577
495
 
578
- ```js
579
- await sock.sendTextWithMentions(jid, 'halo @A dan @B', [jidA, jidB])
496
+ // Kirim array pesan berurutan ke satu JID
497
+ await sock.sendMultipleMessages(jid, [
498
+ { text: 'Pesan 1' },
499
+ { text: 'Pesan 2' },
500
+ { image: buffer, caption: 'Foto' }
501
+ ], 800) // delay 800ms antar pesan
580
502
  ```
581
503
 
582
- ---
583
-
584
- ### `sock.sendTyping(jid, duration?, type?)`
585
-
586
- Kirim indikator typing, auto berhenti setelah durasi.
504
+ ### Status / Story
587
505
 
588
506
  ```js
589
- await sock.sendTyping(jid) // composing 3 detik
590
- await sock.sendTyping(jid, 2000, 'recording') // recording 2 detik
591
- ```
592
-
593
- ---
594
-
595
- ### `sock.sendWithTyping(jid, content, options?, typingMs?)`
596
-
597
- Kirim pesan dengan typing indicator dulu sebelumnya.
507
+ // Status pribadi
508
+ await sock.sendStatus({ text: 'Pagi semua! ☀️', backgroundColor: '#128C7E' })
509
+ await sock.sendStatus({ image: buffer, caption: 'Foto hari ini' })
510
+ await sock.sendStatus({ video: buffer })
598
511
 
599
- ```js
600
- await sock.sendWithTyping(jid, { text: 'halo' })
601
- await sock.sendWithTyping(jid, { text: 'halo' }, {}, 2000)
512
+ // Batasi siapa yang bisa lihat
513
+ await sock.sendStatus({ text: 'Khusus kamu' }, ['628xxx@s.whatsapp.net'])
602
514
  ```
603
515
 
604
- ---
605
-
606
- ### `sock.broadcastMessage(jids[], content, options?)`
516
+ ### Group Status V2 ⚡
607
517
 
608
- Kirim pesan yang sama ke banyak JID. Auto delay antar kirim (default 500ms).
518
+ Post story langsung di dalam group muncul kayak story WhatsApp tapi di group.
609
519
 
610
520
  ```js
611
- const results = await sock.broadcastMessage(
612
- ['628xxx@s.whatsapp.net', '628yyy@s.whatsapp.net'],
613
- { text: 'pengumuman penting' },
614
- { delayMs: 1000 }
615
- )
616
-
617
- // results: [{ jid, success, msg? }, ...]
618
- ```
521
+ // Teks
522
+ await sock.groupStatusV2('120363xxx@g.us', {
523
+ text: 'GM semua! 🌅',
524
+ backgroundColor: '#25D366'
525
+ })
619
526
 
620
- ---
527
+ // Teks dengan font custom
528
+ await sock.groupStatusV2('120363xxx@g.us', {
529
+ text: 'Selamat ulang tahun! 🎉',
530
+ backgroundColor: '#FF6B6B',
531
+ font: 1
532
+ })
621
533
 
622
- ### `sock.sendMultipleMessages(jid, contents[], delayMs?)`
534
+ // Gambar
535
+ await sock.groupStatusV2('120363xxx@g.us', {
536
+ image: buffer,
537
+ caption: 'Foto kegiatan hari ini'
538
+ })
623
539
 
624
- Kirim array pesan berurutan ke satu JID.
540
+ // Video
541
+ await sock.groupStatusV2('120363xxx@g.us', {
542
+ video: buffer,
543
+ caption: 'Tonton ini!'
544
+ })
625
545
 
626
- ```js
627
- await sock.sendMultipleMessages(jid, [
628
- { text: 'pesan 1' },
629
- { text: 'pesan 2' },
630
- { image: buffer }
631
- ], 800)
546
+ // Sticker
547
+ await sock.groupStatusV2('120363xxx@g.us', { sticker: buffer })
632
548
  ```
633
549
 
634
550
  ---
635
551
 
636
- ## Edit & Delete
552
+ ## Edit, Delete, React
637
553
 
638
554
  ```js
639
- const sent = await sock.sendMessage(jid, { text: 'typo' })
555
+ const sent = await sock.sendMessage(jid, { text: 'Ada typo nih' })
640
556
 
641
- // Edit
642
- await sock.editMessage(jid, sent.key, 'sudah diperbaiki')
643
- // atau raw:
644
- await sock.sendMessage(jid, { text: 'sudah diperbaiki', edit: sent.key })
557
+ // Edit pesan
558
+ await sock.editMessage(jid, sent.key, 'Sudah diperbaiki')
645
559
 
646
- // Delete for everyone
560
+ // Hapus untuk semua
647
561
  await sock.deleteMessage(jid, sent.key)
648
- // atau raw:
649
- await sock.sendMessage(jid, { delete: sent.key })
650
- ```
651
-
652
- ---
653
562
 
654
- ## Pin, Keep, React
655
-
656
- ```js
657
563
  // Pin pesan
658
- await sock.pinMessage(jid, m.key) // 24 jam (default)
659
- await sock.pinMessage(jid, m.key, 604800) // 7 hari
660
- await sock.pinMessage(jid, m.key, 2592000) // 30 hari
661
- await sock.pinMessage(jid, m.key, 0) // unpin
564
+ await sock.pinMessage(jid, m.key) // 24 jam
565
+ await sock.pinMessage(jid, m.key, 604800) // 7 hari
566
+ await sock.pinMessage(jid, m.key, 0) // unpin
567
+
568
+ // Bookmark / keep
569
+ await sock.keepMessage(jid, m.key) // keep
570
+ await sock.keepMessage(jid, m.key, false) // unkeep
662
571
 
663
- // Keep / bookmark
664
- await sock.keepMessage(jid, m.key) // keep
665
- await sock.keepMessage(jid, m.key, false) // unkeep
572
+ // Bintang / star
573
+ await sock.starMessage(jid, m.key, true) // bintangin
574
+ await sock.unstarMessage(jid, m.key) // hapus bintang
666
575
 
667
576
  // React
668
577
  await sock.reactMessage(jid, m.key, '❤️')
669
- await sock.reactMessage(jid, m.key, '') // hapus reaksi
578
+ await sock.reactMessage(jid, m.key, '') // hapus reaksi
670
579
 
671
580
  // Forward
672
581
  await sock.forwardMessage(jid, m)
673
- await sock.forwardMessage(jid, m, true) // paksa mark as forwarded
582
+ await sock.forwardWithComment(jid, m, 'Check ini!') // forward + komentar
674
583
  ```
675
584
 
676
585
  ---
@@ -678,8 +587,6 @@ await sock.forwardMessage(jid, m, true) // paksa mark as forwarded
678
587
  ## Chat Management
679
588
 
680
589
  ```js
681
- const lastMsg = await getLastMessage(jid) // implementasi sendiri
682
-
683
590
  // Archive / unarchive
684
591
  await sock.archiveChat(jid, lastMsg)
685
592
  await sock.unarchiveChat(jid, lastMsg)
@@ -689,134 +596,234 @@ await sock.pinChat(jid)
689
596
  await sock.unpinChat(jid)
690
597
 
691
598
  // Mute / unmute
692
- await sock.muteJid(jid) // mute 8 jam (default)
693
- await sock.muteJid(jid, 24 * 60 * 60 * 1000) // mute 24 jam
599
+ await sock.muteJid(jid) // mute 8 jam
600
+ await sock.muteJid(jid, 24 * 60 * 60 * 1000) // mute 24 jam
694
601
  await sock.unmuteJid(jid)
695
602
 
696
603
  // Tandai baca / belum baca
697
604
  await sock.markAsRead([m.key])
605
+ await sock.sendSeen(jid) // alias markAsRead
698
606
  await sock.markAsUnread(jid, lastMsg)
699
607
 
608
+ // Hapus & bersihkan
609
+ await sock.deleteChat(jid)
610
+ await sock.clearChat(jid)
611
+
700
612
  // Block / unblock
701
613
  await sock.blockUser(jid)
702
614
  await sock.unblockUser(jid)
615
+ await sock.fetchBlocklist() // ambil daftar yang diblokir
703
616
  ```
704
617
 
705
- Raw via `chatModify`:
618
+ ---
619
+
620
+ ## Disappearing Messages
706
621
 
707
622
  ```js
708
- // Hapus chat
709
- await sock.chatModify({
710
- delete: true,
711
- lastMessages: [{ key: lastMsg.key, messageTimestamp: lastMsg.messageTimestamp }]
712
- }, jid)
713
-
714
- // Star pesan
715
- await sock.chatModify({
716
- star: { messages: [{ id: 'MSG_ID', fromMe: true }], star: true }
717
- }, jid)
623
+ // Aktifkan di chat
624
+ await sock.sendDisappearingToggle(jid, 86400) // 24 jam
625
+ await sock.setGroupDisappearing(jid, 604800) // 7 hari di group
626
+ await sock.setGroupDisappearing(jid, 0) // matikan
627
+
628
+ // Kirim satu pesan sebagai ephemeral
629
+ await sock.sendDisappearingMessage(jid, { text: 'Pesan ini akan hilang' }, 86400)
630
+
631
+ // Set default disappearing mode
632
+ await sock.setDefaultDisappearing(86400)
718
633
  ```
719
634
 
720
635
  ---
721
636
 
722
- ## Disappearing Messages
637
+ ## Groups
723
638
 
724
639
  ```js
725
- // Aktifkan di chat/group
726
- await sock.sendMessage(jid, { disappearingMessagesInChat: WA_DEFAULT_EPHEMERAL })
640
+ // Buat group baru
641
+ const group = await sock.groupCreate('Nama Group', ['628xxx@s.whatsapp.net'])
642
+ console.log('Group ID:', group.gid)
643
+
644
+ // Tambah / hapus / promote / demote member
645
+ await sock.groupParticipantsUpdate(jid, ['628xxx@s.whatsapp.net'], 'add')
646
+ await sock.groupParticipantsUpdate(jid, ['628xxx@s.whatsapp.net'], 'remove')
647
+ await sock.groupParticipantsUpdate(jid, ['628xxx@s.whatsapp.net'], 'promote')
648
+ await sock.groupParticipantsUpdate(jid, ['628xxx@s.whatsapp.net'], 'demote')
649
+
650
+ // Bulk action (auto chunk per 5 + delay)
651
+ await sock.bulkGroupAction(jid, [jid1, jid2, jid3], 'remove')
652
+
653
+ // Update info group
654
+ await sock.groupUpdateSubject(jid, 'Nama Group Baru')
655
+ await sock.groupUpdateDescription(jid, 'Deskripsi baru')
656
+ await sock.updateGroupName(jid, 'Nama Group Baru') // alias
657
+ await sock.updateGroupDescription(jid, 'Deskripsi baru') // alias
658
+ await sock.updateGroupProfilePicture(jid, buffer) // ganti foto group
659
+
660
+ // Setting group
661
+ await sock.groupSettingUpdate(jid, 'announcement') // hanya admin yang bisa kirim
662
+ await sock.groupSettingUpdate(jid, 'not_announcement') // semua bisa kirim
663
+ await sock.updateGroupSetting(jid, 'locked') // alias
664
+ await sock.updateGroupSetting(jid, 'unlocked')
727
665
 
728
- // Set di group langsung
729
- await sock.setGroupDisappearing(jid, 86400) // 24 jam
730
- await sock.setGroupDisappearing(jid, 604800) // 7 hari
731
- await sock.setGroupDisappearing(jid, 7776000) // 90 hari
666
+ // Invite link
667
+ const code = await sock.groupInviteCode(jid)
668
+ const link = await sock.getGroupInviteLink(jid) // return URL lengkap
669
+ await sock.groupRevokeInvite(jid) // atau: revokeGroupInvite(jid)
670
+ await sock.groupAcceptInvite(code) // join (tanpa URL prefix)
671
+ await sock.joinGroupViaLink('https://chat.whatsapp.com/...') // join via URL
732
672
 
733
- // Kirim sebagai ephemeral
734
- await sock.sendDisappearingMessage(jid, { text: 'poof' }, 86400)
673
+ // Info & metadata
674
+ const meta = await sock.groupMetadata(jid)
675
+ const all = await sock.fetchAllGroups() // semua group yang diikuti
735
676
 
736
- // Matikan
737
- await sock.sendMessage(jid, { disappearingMessagesInChat: false })
677
+ // Admin utilities
678
+ const admins = await sock.getGroupAdmins(jid)
679
+ const isAdmin = await sock.isGroupAdmin(jid, '628xxx@s.whatsapp.net')
680
+ const members = await sock.getGroupParticipants(jid)
681
+ await sock.sendToAdminsOnly(jid, 'Pesan khusus admin')
682
+ await sock.sendAdminInvite(jid, targetJid) // undang jadi admin
683
+
684
+ // Join approval
685
+ await sock.setGroupJoinApproval(jid, true) // nyalakan approval
686
+ const requests = await sock.getGroupJoinRequests(jid)
687
+ await sock.approveGroupJoinRequest(jid, ['628xxx@s.whatsapp.net'])
688
+ await sock.rejectGroupJoinRequest(jid, ['628xxx@s.whatsapp.net'])
689
+
690
+ // Member add mode
691
+ await sock.setGroupMemberAddMode(jid, 'all_member_add') // semua bisa add
692
+ await sock.setGroupMemberAddMode(jid, 'admin_add') // hanya admin
693
+
694
+ // Leave
695
+ await sock.leaveGroup(jid)
738
696
  ```
739
697
 
740
698
  ---
741
699
 
742
- ## Download Media
700
+ ## Interaktif: Buttons, List, Template ⚡
743
701
 
744
702
  ```js
745
- const { downloadMediaMessage, getContentType } = require('n4lyx')
746
- const { createWriteStream } = require('fs')
703
+ // Pesan dengan tombol
704
+ await sock.sendButtonsMessage(jid, {
705
+ text: 'Pilih salah satu:',
706
+ buttons: [
707
+ { buttonId: 'id1', buttonText: { displayText: 'Opsi A' }, type: 1 },
708
+ { buttonId: 'id2', buttonText: { displayText: 'Opsi B' }, type: 1 }
709
+ ],
710
+ headerType: 1
711
+ })
747
712
 
748
- sock.ev.on('messages.upsert', async ({ messages: [m] }) => {
749
- if (!m.message) return
750
- if (getContentType(m) !== 'imageMessage') return
713
+ // Gambar + tombol
714
+ await sock.sendImageWithButtons(jid, buffer, 'Caption', [
715
+ { buttonId: 'confirm', buttonText: { displayText: '✅ Konfirmasi' }, type: 1 },
716
+ { buttonId: 'cancel', buttonText: { displayText: '❌ Batal' }, type: 1 }
717
+ ])
751
718
 
752
- const stream = await downloadMediaMessage(m, 'stream', {}, {
753
- logger,
754
- reuploadRequest: sock.updateMediaMessage
755
- })
719
+ // Video + tombol
720
+ await sock.sendVideoWithButtons(jid, videoBuffer, 'Tonton dulu', [
721
+ { buttonId: 'share', buttonText: { displayText: '📤 Share' }, type: 1 }
722
+ ])
723
+
724
+ // Dokumen + tombol
725
+ await sock.sendDocumentWithButtons(jid, pdfBuffer, 'laporan.pdf', 'application/pdf', 'Ini laporan nya', [
726
+ { buttonId: 'download', buttonText: { displayText: '⬇️ Download' }, type: 1 }
727
+ ])
728
+
729
+ // List / menu
730
+ await sock.sendListMessage(jid, {
731
+ text: 'Pilih menu:',
732
+ footer: 'n4lyx bot',
733
+ title: 'Main Menu',
734
+ buttonText: 'Buka Menu',
735
+ sections: [
736
+ {
737
+ title: 'Kategori 1',
738
+ rows: [
739
+ { title: 'Info', rowId: 'info', description: 'Lihat informasi' },
740
+ { title: 'Help', rowId: 'help', description: 'Bantuan' }
741
+ ]
742
+ }
743
+ ]
744
+ })
756
745
 
757
- stream.pipe(createWriteStream('./download.jpg'))
746
+ // Template message
747
+ await sock.sendTemplateMessage(jid, {
748
+ text: 'Hai! Ada yang bisa dibantu?',
749
+ footer: 'n4lyx',
750
+ templateButtons: [
751
+ { index: 1, urlButton: { displayText: '🌐 Website', url: 'https://example.com' } },
752
+ { index: 2, callButton: { displayText: '📞 Telepon', phoneNumber: '+62812xxxxxxx' } },
753
+ { index: 3, quickReplyButton: { displayText: '💬 Chat', id: 'chat' } }
754
+ ]
758
755
  })
759
756
  ```
760
757
 
761
- Re-upload media yang expired:
758
+ ---
759
+
760
+ ## Newsletter ⚡
762
761
 
763
762
  ```js
764
- await sock.updateMediaMessage(msg)
763
+ // Info channel / newsletter
764
+ const info = await sock.getNewsletterInfo(newsletterJid)
765
+
766
+ // Kirim pesan ke newsletter
767
+ await sock.sendNewsletterMessage(newsletterJid, { text: 'Update terbaru!' })
768
+ await sock.sendNewsletterMessage(newsletterJid, { image: buffer, caption: 'Foto' })
769
+
770
+ // Reaksi di newsletter
771
+ await sock.sendNewsletterReaction(newsletterJid, messageId, '🔥')
765
772
  ```
766
773
 
767
774
  ---
768
775
 
769
- ## Groups
776
+ ## Download Media
770
777
 
771
778
  ```js
772
- // Buat group
773
- const group = await sock.groupCreate('Nama Group', ['628xxx@s.whatsapp.net'])
774
- console.log('Created:', group.gid)
779
+ const { downloadMediaMessage, getContentType } = require('n4lyx')
780
+ const { createWriteStream } = require('fs')
775
781
 
776
- // Add / remove / promote / demote
777
- await sock.groupParticipantsUpdate(jid, ['628xxx@s.whatsapp.net'], 'add')
778
- // 'add' | 'remove' | 'promote' | 'demote'
782
+ sock.ev.on('messages.upsert', async ({ messages: [m] }) => {
783
+ if (!m.message) return
784
+ const type = getContentType(m)
779
785
 
780
- // Bulk action (auto chunk per 5, ada delay)
781
- await sock.bulkGroupAction(jid, [jid1, jid2, jid3, ...], 'remove')
786
+ if (type === 'imageMessage') {
787
+ const stream = await downloadMediaMessage(m, 'stream', {}, {
788
+ logger,
789
+ reuploadRequest: sock.updateMediaMessage
790
+ })
791
+ stream.pipe(createWriteStream('./download.jpg'))
792
+ }
793
+ })
794
+ ```
782
795
 
783
- // Update nama / deskripsi
784
- await sock.groupUpdateSubject(jid, 'Nama Baru')
785
- await sock.groupUpdateDescription(jid, 'Deskripsi baru')
796
+ Re-upload media yang expired (link kedaluwarsa):
786
797
 
787
- // Setting
788
- await sock.groupSettingUpdate(jid, 'announcement') // hanya admin yang bisa kirim
789
- await sock.groupSettingUpdate(jid, 'not_announcement') // semua bisa kirim
790
- await sock.groupSettingUpdate(jid, 'locked') // hanya admin yang bisa edit info
791
- await sock.groupSettingUpdate(jid, 'unlocked') // semua bisa edit info
798
+ ```js
799
+ const refreshed = await sock.updateMediaMessage(msg)
800
+ ```
792
801
 
793
- // Invite link
794
- const code = await sock.groupInviteCode(jid) // https://chat.whatsapp.com/${code}
795
- await sock.groupRevokeInvite(jid)
796
- await sock.groupAcceptInvite(code) // join via code (tanpa URL prefix)
802
+ ---
797
803
 
798
- // Metadata
799
- const meta = await sock.groupMetadata(jid)
804
+ ## Poll — Dekripsi Vote
800
805
 
801
- // Admin utilities
802
- const admins = await sock.getGroupAdmins(jid)
803
- const isAdmin = await sock.isGroupAdmin(jid, '628xxx@s.whatsapp.net')
804
- await sock.sendToAdminsOnly(jid, 'khusus admin')
806
+ Poll dienkripsi by default. Dekripsi harus dilakukan di event `messages.update`.
805
807
 
806
- // Join approval
807
- await sock.groupJoinApprovalMode(jid, 'on')
808
- const requests = await sock.groupRequestParticipantsList(jid)
809
- await sock.groupRequestParticipantsUpdate(jid, ['628xxx@s.whatsapp.net'], 'approve')
808
+ ```js
809
+ const { getAggregateVotesInPollMessage } = require('n4lyx')
810
810
 
811
- // Add mode
812
- await sock.groupMemberAddMode(jid, 'all_member_add') // semua bisa add
813
- await sock.groupMemberAddMode(jid, 'admin_add') // hanya admin
811
+ sock.ev.on('messages.update', async (events) => {
812
+ for (const { key, update } of events) {
813
+ if (!update.pollUpdates) continue
814
814
 
815
- // Leave
816
- await sock.groupLeave(jid)
815
+ const creation = await getMessage(key) // ambil dari DB/store kamu
816
+ if (!creation) continue
817
+
818
+ const result = getAggregateVotesInPollMessage({
819
+ message: creation,
820
+ pollUpdates: update.pollUpdates
821
+ })
817
822
 
818
- // Semua group yang diikuti
819
- const all = await sock.groupFetchAllParticipating()
823
+ console.log('Hasil vote:', result)
824
+ // result: [{ name: 'JavaScript', voters: ['628xxx@s.whatsapp.net', ...] }, ...]
825
+ }
826
+ })
820
827
  ```
821
828
 
822
829
  ---
@@ -824,46 +831,43 @@ const all = await sock.groupFetchAllParticipating()
824
831
  ## Presence
825
832
 
826
833
  ```js
827
- // Mark as read
828
- await sock.readMessages([m.key])
829
-
830
- // Kirim presence
834
+ // Kirim indikator presence
831
835
  await sock.sendPresenceUpdate('composing', jid) // lagi ngetik
832
- await sock.sendPresenceUpdate('recording', jid) // lagi rekam
833
- await sock.sendPresenceUpdate('paused', jid) // berhenti
834
- await sock.sendPresenceUpdate('available', jid) // online
835
- await sock.sendPresenceUpdate('unavailable', jid) // offline
836
+ await sock.sendPresenceUpdate('recording', jid) // lagi rekam audio
837
+ await sock.sendPresenceUpdate('paused', jid) // berhenti ngetik
838
+ await sock.sendPresenceUpdate('available', jid) // online
839
+ await sock.sendPresenceUpdate('unavailable', jid) // offline
836
840
 
837
- // Subscribe presence kontak
838
- sock.ev.on('presence.update', console.log)
841
+ // Subscribe presence orang lain
839
842
  await sock.presenceSubscribe(jid)
843
+ sock.ev.on('presence.update', ({ id, presences }) => {
844
+ console.log(id, presences) // lihat siapa yang lagi online
845
+ })
840
846
  ```
841
847
 
842
848
  ---
843
849
 
844
- ## Query
850
+ ## Query & Info
845
851
 
846
852
  ```js
847
- // Cek nomor di WA
848
- const [result] = await sock.onWhatsApp('628xxx@s.whatsapp.net')
849
- if (result.exists) console.log(result.jid)
850
-
851
- // Shorthand — input bisa nomor atau JID
853
+ // Cek apakah nomor terdaftar di WA
852
854
  const info = await sock.isOnWhatsApp('628xxxxxxxxx')
853
855
  // → { exists: true, jid: '628xxx@s.whatsapp.net' }
854
856
 
855
- // Status teks
856
- const status = await sock.fetchStatus(jid)
857
+ // Info lengkap kontak
858
+ const contact = await sock.getContactInfo(jid)
859
+
860
+ // Status teks (safe — return null kalau gagal)
861
+ const status = await sock.getUserStatus(jid)
857
862
 
858
- // Foto profil (safe, return null kalau gagal)
859
- const pic = await sock.getProfilePicture(jid) // low res
860
- const picHD = await sock.getProfilePicture(jid, true) // high res
863
+ // Foto profil (safe return null kalau gagal)
864
+ const pic = await sock.getProfilePicture(jid) // low res
865
+ const picHD = await sock.getProfilePicture(jid, true) // high res
861
866
 
862
867
  // Business profile
863
868
  const biz = await sock.getBusinessProfile(jid)
864
869
 
865
- // Message history (max 50 per call)
866
- const oldest = await getOldestMessage(jid)
870
+ // Riwayat pesan (max 50 per call)
867
871
  await sock.fetchMessageHistory(50, oldest.key, oldest.messageTimestamp)
868
872
  // masuk via event: messaging.history-set
869
873
  ```
@@ -873,14 +877,7 @@ await sock.fetchMessageHistory(50, oldest.key, oldest.messageTimestamp)
873
877
  ## Privacy
874
878
 
875
879
  ```js
876
- // Block / unblock
877
- await sock.updateBlockStatus(jid, 'block')
878
- await sock.updateBlockStatus(jid, 'unblock')
879
-
880
- // Ambil blocklist
881
- await sock.fetchBlocklist()
882
-
883
- // Update privacy settings
880
+ // Update semua privacy settings
884
881
  // nilai: 'all' | 'contacts' | 'contact_blacklist' | 'none'
885
882
  await sock.updateLastSeenPrivacy('contacts')
886
883
  await sock.updateProfilePicturePrivacy('contacts')
@@ -898,7 +895,7 @@ await sock.updateDefaultDisappearingMode(86400)
898
895
  ## Profile
899
896
 
900
897
  ```js
901
- await sock.updateProfileStatus('lagi sibuk')
898
+ await sock.updateProfileStatus('Sedang coding...')
902
899
  await sock.updateProfileName('Nama Baru')
903
900
  await sock.updateProfilePicture(jid, { url: './foto.jpg' })
904
901
  await sock.removeProfilePicture(jid)
@@ -909,39 +906,30 @@ await sock.removeProfilePicture(jid)
909
906
  ## Calls
910
907
 
911
908
  ```js
912
- // Reject incoming call
909
+ // Tolak incoming call
913
910
  sock.ev.on('call', async ([call]) => {
914
911
  await sock.rejectCall(call.id, call.from)
915
912
  })
916
913
 
917
- // Auto-reject semua call
914
+ // Auto-reject semua call (aktifkan sekali saat startup)
918
915
  sock.rejectAllCalls()
919
916
  ```
920
917
 
921
918
  ---
922
919
 
923
- ## Poll Decryption
920
+ ## In-Memory Store
924
921
 
925
- Poll dienkripsi by default. Dekripsinya di event `messages.update`.
922
+ Untuk development / testing. **Jangan dipakai di production.**
926
923
 
927
924
  ```js
928
- const { getAggregateVotesInPollMessage } = require('n4lyx')
929
-
930
- sock.ev.on('messages.update', async (events) => {
931
- for (const { key, update } of events) {
932
- if (!update.pollUpdates) continue
933
-
934
- const creation = await getMessage(key) // implementasi sendiri
935
- if (!creation) continue
925
+ const { makeInMemoryStore } = require('n4lyx')
936
926
 
937
- const result = getAggregateVotesInPollMessage({
938
- message: creation,
939
- pollUpdates: update.pollUpdates
940
- })
927
+ const store = makeInMemoryStore({})
928
+ store.readFromFile('./store.json')
929
+ setInterval(() => store.writeToFile('./store.json'), 10_000)
941
930
 
942
- console.log(result)
943
- }
944
- })
931
+ const sock = makeWASocket({})
932
+ store.bind(sock.ev)
945
933
  ```
946
934
 
947
935
  ---
@@ -949,13 +937,15 @@ sock.ev.on('messages.update', async (events) => {
949
937
  ## WebSocket Low-Level
950
938
 
951
939
  ```js
940
+ // Listen ke protokol WA secara langsung
952
941
  sock.ws.on('CB:edge_routing', (node) => { })
953
942
  sock.ws.on('CB:edge_routing,id:abcd', (node) => { })
954
943
  ```
955
944
 
956
- Debug mode (log semua WA protocol frame):
945
+ Debug mode log semua WA protocol frame:
957
946
 
958
947
  ```js
948
+ const P = require('pino')
959
949
  const sock = makeWASocket({ logger: P({ level: 'debug' }) })
960
950
  ```
961
951
 
@@ -968,7 +958,7 @@ const sock = makeWASocket({ logger: P({ level: 'debug' }) })
968
958
  | User | `628XXXXXXXXX@s.whatsapp.net` |
969
959
  | Group | `123456789-123456@g.us` |
970
960
  | Broadcast list | `[timestamp]@broadcast` |
971
- | Story/Status | `status@broadcast` |
961
+ | Story / Status | `status@broadcast` |
972
962
 
973
963
  ---
974
964
 
@@ -977,7 +967,7 @@ const sock = makeWASocket({ logger: P({ level: 'debug' }) })
977
967
  | Fungsi | Kegunaan |
978
968
  |---|---|
979
969
  | `getContentType(msg)` | Ambil tipe konten dari sebuah pesan |
980
- | `getDevice(msg)` | Info device pengirim |
970
+ | `getDevice(msg)` | Info device pengirim pesan |
981
971
  | `makeCacheableSignalKeyStore` | Percepat operasi auth key store |
982
972
  | `downloadContentFromMessage` | Download raw content dari pesan |
983
973
  | `fetchLatestN4lyxVersion` | Ambil versi terbaru n4lyx dari npm |
@@ -985,79 +975,17 @@ const sock = makeWASocket({ logger: P({ level: 'debug' }) })
985
975
 
986
976
  ---
987
977
 
988
- ## Semua Fitur Eksklusif n4lyx
989
-
990
- | Method | Keterangan |
991
- |---|---|
992
- | `tagAll` di `sendMessage` | Auto-mention semua/admin/non-admin di group |
993
- | `sock.groupTagAll(jid, scope)` | Ambil list JID participant by scope |
994
- | `sock.sendTagAll(jid, text, scope?)` | Tag + kirim pesan sekaligus |
995
- | `sock.groupStatusV2(jid, content)` | Post story di group (text/image/video/audio/sticker) |
996
- | `sock.sendStatus(content, jidList?)` | Post story pribadi ke status@broadcast |
997
- | `sock.sendImage(jid, image, caption?)` | Shorthand kirim gambar |
998
- | `sock.sendVideo(jid, video, caption?)` | Shorthand kirim video |
999
- | `sock.sendAudio(jid, audio, isPtt?)` | Shorthand kirim audio / PTT |
1000
- | `sock.sendDocument(jid, doc, fileName, ...)` | Shorthand kirim dokumen |
1001
- | `sock.sendViewOnce(jid, content)` | View-once media |
1002
- | `sock.sendPTV(jid, video)` | Circular video note |
1003
- | `sock.sendGIF(jid, video, caption?)` | Kirim GIF animasi |
1004
- | `sock.sendAlbum(jid, items)` | Album swipeable (max 10) |
1005
- | `sock.sendStickerFromUrl(jid, url)` | Sticker dari URL langsung |
1006
- | `sock.sendStickerWithMetadata(jid, sticker, meta)` | Sticker + pack info |
1007
- | `sock.sendStickerPack(jid, stickers, packName, ...)` | Kirim banyak sticker (max 30) |
1008
- | `sock.sendPoll(jid, question, choices)` | Buat poll |
1009
- | `sock.sendEvent(jid, eventData)` | Kirim WhatsApp Event |
1010
- | `sock.sendScheduledCall(jid, title, time)` | Jadwalkan panggilan |
1011
- | `sock.sendLocation(jid, lat, lng, name?)` | Kirim lokasi statis |
1012
- | `sock.sendLiveLocation(jid, lat, lng, ...)` | Kirim live location |
1013
- | `sock.sendContact(jid, contacts)` | Kartu kontak (auto-vCard) |
1014
- | `sock.sendGroupInvite(jid, groupJid)` | Kirim invite group sebagai card |
1015
- | `sock.sendReply(jid, text, quotedMsg)` | Reply teks cepat |
1016
- | `sock.sendMediaReply(jid, content, quotedMsg)` | Reply dengan media |
1017
- | `sock.sendQuotedText(jid, text, quotedMsg, mentions?)` | Reply + mention |
1018
- | `sock.sendTextWithMentions(jid, text, jids[])` | Teks + mention array |
1019
- | `sock.sendTyping(jid, duration?, type?)` | Typing indicator + auto stop |
1020
- | `sock.sendWithTyping(jid, content, ...)` | Kirim pesan pakai typing dulu |
1021
- | `sock.broadcastMessage(jids[], content)` | Kirim ke banyak JID |
1022
- | `sock.sendMultipleMessages(jid, contents[])` | Kirim array pesan ke 1 JID |
1023
- | `sock.pinMessage(jid, key, duration?)` | Pin/unpin pesan |
1024
- | `sock.keepMessage(jid, key, keep?)` | Bookmark / unbookmark pesan |
1025
- | `sock.editMessage(jid, key, newText)` | Edit pesan yang sudah terkirim |
1026
- | `sock.deleteMessage(jid, key)` | Hapus pesan untuk semua |
1027
- | `sock.reactMessage(jid, key, emoji)` | React / hapus reaksi |
1028
- | `sock.forwardMessage(jid, msg, force?)` | Forward pesan |
1029
- | `sock.muteJid(jid, duration?)` | Mute chat |
1030
- | `sock.unmuteJid(jid)` | Unmute chat |
1031
- | `sock.archiveChat(jid, lastMsg)` | Arsip chat |
1032
- | `sock.unarchiveChat(jid, lastMsg)` | Buka arsip |
1033
- | `sock.pinChat(jid)` | Pin chat |
1034
- | `sock.unpinChat(jid)` | Unpin chat |
1035
- | `sock.markAsRead(keys[])` | Tandai baca |
1036
- | `sock.markAsUnread(jid, lastMsg)` | Tandai belum baca |
1037
- | `sock.blockUser(jid)` | Blokir user |
1038
- | `sock.unblockUser(jid)` | Buka blokir |
1039
- | `sock.getProfilePicture(jid, highRes?)` | Foto profil (safe, null kalau gagal) |
1040
- | `sock.getUserStatus(jid)` | Status teks user (safe, null kalau gagal) |
1041
- | `sock.isOnWhatsApp(jidOrNumber)` | Cek nomor — input fleksibel |
1042
- | `sock.sendDisappearingMessage(jid, content, exp)` | Kirim pesan ephemeral |
1043
- | `sock.setGroupDisappearing(jid, expiration)` | Set disappearing di group |
1044
- | `sock.getGroupAdmins(jid)` | Daftar admin group |
1045
- | `sock.isGroupAdmin(jid, userJid)` | Cek apakah user adalah admin |
1046
- | `sock.sendToAdminsOnly(jid, content)` | Kirim + mention admin saja |
1047
- | `sock.bulkGroupAction(jid, participants[], action)` | add/remove/promote/demote banyak user |
1048
- | `sock.rejectAllCalls()` | Auto-reject semua incoming call |
1049
-
1050
- ---
1051
-
1052
978
  ## Optional Dependencies
1053
979
 
980
+ Install sesuai kebutuhan — nggak wajib semua.
981
+
1054
982
  ```bash
1055
- npm i jimp # atau sharp untuk generate thumbnail
1056
- npm i link-preview-js # link preview di pesan teks
983
+ npm i jimp # thumbnail generator (bisa juga pakai sharp)
984
+ npm i link-preview-js # link preview otomatis di pesan teks
1057
985
  npm i qrcode-terminal # render QR code di terminal
1058
986
  ```
1059
987
 
1060
- Thumbnail video butuh `ffmpeg` di sistem:
988
+ Konversi audio ke format yang kompatibel (butuh `ffmpeg` di sistem):
1061
989
 
1062
990
  ```bash
1063
991
  ffmpeg -i input.mp4 -avoid_negative_ts make_zero -ac 1 output.ogg
@@ -1065,6 +993,188 @@ ffmpeg -i input.mp4 -avoid_negative_ts make_zero -ac 1 output.ogg
1065
993
 
1066
994
  ---
1067
995
 
996
+ ## Semua Fitur n4lyx
997
+
998
+ <details>
999
+ <summary><strong>Lihat semua method (klik untuk expand)</strong></summary>
1000
+
1001
+ ### Pesan
1002
+
1003
+ | Method | Keterangan |
1004
+ |---|---|
1005
+ | `sendImage` | Kirim gambar |
1006
+ | `sendVideo` | Kirim video |
1007
+ | `sendAudio` | Kirim audio / PTT |
1008
+ | `sendAudioPTT` | Alias PTT |
1009
+ | `sendVoiceNote` | Alias voice note |
1010
+ | `sendDocument` | Kirim dokumen |
1011
+ | `sendGIF` | Kirim GIF animasi |
1012
+ | `sendPTV` | Circular video note |
1013
+ | `sendViewOnce` | View-once media |
1014
+ | `sendSticker` / `sendStickerMessage` | Kirim sticker |
1015
+ | `sendStickerFromBuffer` | Sticker dari Buffer |
1016
+ | `sendStickerFromUrl` | Sticker dari URL |
1017
+ | `sendStickerWithMetadata` | Sticker + pack info |
1018
+ | `sendStickerPack` | Kirim banyak sticker |
1019
+ | `sendAlbum` | Album swipeable |
1020
+ | `sendPoll` | Buat poll |
1021
+ | `sendEvent` | WhatsApp Event |
1022
+ | `sendScheduledCall` | Jadwalkan panggilan |
1023
+ | `sendLocation` | Lokasi statis |
1024
+ | `sendLiveLocation` | Live location |
1025
+ | `sendContact` | Kartu kontak |
1026
+ | `sendGroupInvite` | Invite group sebagai card |
1027
+ | `sendLinkPreview` | Kirim dengan link preview |
1028
+ | `sendProductMessage` | Kirim produk (katalog) |
1029
+
1030
+ ### Reply & Mention
1031
+
1032
+ | Method | Keterangan |
1033
+ |---|---|
1034
+ | `sendReply` | Reply teks cepat |
1035
+ | `sendMediaReply` | Reply dengan media |
1036
+ | `sendQuotedText` | Reply + mention |
1037
+ | `sendTextWithMentions` | Teks + mention array |
1038
+ | `sendTagAll` | Tag all shorthand |
1039
+ | `sendMentionAll` | Mention semua member |
1040
+ | `sendWithQuotedFake` | Kirim dengan fake quote |
1041
+ | `forwardWithComment` | Forward + komentar |
1042
+ | `sendWithMentionAndReply` | Reply + mention sekaligus |
1043
+ | `tagAll` di `sendMessage` | Auto-mention all/admin/non-admin |
1044
+ | `groupTagAll` | Ambil list JID by scope |
1045
+
1046
+ ### Interaktif
1047
+
1048
+ | Method | Keterangan |
1049
+ |---|---|
1050
+ | `sendButtonsMessage` | Pesan dengan tombol |
1051
+ | `sendListMessage` | Pesan dengan menu list |
1052
+ | `sendTemplateMessage` | Template message |
1053
+ | `sendInteractiveMessage` | Interactive message raw |
1054
+ | `sendHighlyStructuredMessage` | Highly structured message |
1055
+ | `sendImageWithButtons` | Gambar + tombol |
1056
+ | `sendVideoWithButtons` | Video + tombol |
1057
+ | `sendDocumentWithButtons` | Dokumen + tombol |
1058
+
1059
+ ### Newsletter
1060
+
1061
+ | Method | Keterangan |
1062
+ |---|---|
1063
+ | `sendNewsletterMessage` | Kirim ke newsletter |
1064
+ | `sendNewsletterReaction` | Reaksi di newsletter |
1065
+ | `getNewsletterInfo` | Info channel |
1066
+
1067
+ ### Typing & Presence
1068
+
1069
+ | Method | Keterangan |
1070
+ |---|---|
1071
+ | `sendTyping` | Typing indicator + auto stop |
1072
+ | `sendWithTyping` | Kirim pesan pakai typing dulu |
1073
+ | `sendSeen` | Tandai pesan sudah dibaca |
1074
+
1075
+ ### Broadcast
1076
+
1077
+ | Method | Keterangan |
1078
+ |---|---|
1079
+ | `broadcastMessage` | Kirim ke banyak JID |
1080
+ | `broadcastToGroups` | Kirim ke banyak group |
1081
+ | `sendMultipleMessages` | Kirim array pesan ke 1 JID |
1082
+
1083
+ ### Edit & Aksi Pesan
1084
+
1085
+ | Method | Keterangan |
1086
+ |---|---|
1087
+ | `editMessage` | Edit pesan terkirim |
1088
+ | `deleteMessage` | Hapus untuk semua |
1089
+ | `pinMessage` | Pin / unpin pesan |
1090
+ | `keepMessage` | Bookmark pesan |
1091
+ | `starMessage` / `unstarMessage` | Bintang pesan |
1092
+ | `reactMessage` | React / hapus reaksi |
1093
+ | `forwardMessage` | Forward pesan |
1094
+
1095
+ ### Chat Management
1096
+
1097
+ | Method | Keterangan |
1098
+ |---|---|
1099
+ | `archiveChat` / `unarchiveChat` | Arsip chat |
1100
+ | `pinChat` / `unpinChat` | Pin chat |
1101
+ | `muteJid` / `unmuteJid` | Mute / unmute chat |
1102
+ | `markAsRead` / `markAsUnread` | Tandai baca |
1103
+ | `deleteChat` / `clearChat` | Hapus / kosongkan chat |
1104
+ | `blockUser` / `unblockUser` | Blokir user |
1105
+ | `fetchBlocklist` | Daftar yang diblokir |
1106
+
1107
+ ### Group
1108
+
1109
+ | Method | Keterangan |
1110
+ |---|---|
1111
+ | `groupCreate` | Buat group |
1112
+ | `groupParticipantsUpdate` | add/remove/promote/demote |
1113
+ | `bulkGroupAction` | Bulk action member |
1114
+ | `groupUpdateSubject` / `updateGroupName` | Ganti nama |
1115
+ | `groupUpdateDescription` / `updateGroupDescription` | Ganti deskripsi |
1116
+ | `updateGroupProfilePicture` | Ganti foto group |
1117
+ | `updateGroupSetting` / `groupSettingUpdate` | Setting group |
1118
+ | `getGroupInviteLink` / `groupInviteCode` | Invite link |
1119
+ | `revokeGroupInvite` / `groupRevokeInvite` | Revoke link |
1120
+ | `joinGroupViaLink` / `groupAcceptInvite` | Join group |
1121
+ | `groupMetadata` | Metadata group |
1122
+ | `fetchAllGroups` | Semua group |
1123
+ | `getGroupAdmins` | Daftar admin |
1124
+ | `isGroupAdmin` | Cek apakah admin |
1125
+ | `getGroupParticipants` | Daftar member |
1126
+ | `sendToAdminsOnly` | Pesan + mention admin |
1127
+ | `sendAdminInvite` | Undang jadi admin |
1128
+ | `setGroupJoinApproval` | Nyalakan approval join |
1129
+ | `getGroupJoinRequests` | Daftar request join |
1130
+ | `approveGroupJoinRequest` | Approve request |
1131
+ | `rejectGroupJoinRequest` | Reject request |
1132
+ | `setGroupMemberAddMode` | Siapa yang bisa add member |
1133
+ | `groupLeave` / `leaveGroup` | Leave group |
1134
+ | `setGroupDisappearing` | Disappearing messages di group |
1135
+
1136
+ ### Disappearing
1137
+
1138
+ | Method | Keterangan |
1139
+ |---|---|
1140
+ | `sendDisappearingMessage` | Kirim pesan ephemeral |
1141
+ | `sendDisappearingToggle` | Nyalakan/matikan disappearing |
1142
+ | `setDefaultDisappearing` | Default disappearing mode |
1143
+
1144
+ ### Status / Story
1145
+
1146
+ | Method | Keterangan |
1147
+ |---|---|
1148
+ | `sendStatus` | Post story pribadi |
1149
+ | `groupStatusV2` | Post story di group ⚡ |
1150
+
1151
+ ### Query & Info
1152
+
1153
+ | Method | Keterangan |
1154
+ |---|---|
1155
+ | `isOnWhatsApp` | Cek nomor (input fleksibel) |
1156
+ | `getContactInfo` | Info kontak |
1157
+ | `getUserStatus` | Status teks (safe) |
1158
+ | `getProfilePicture` | Foto profil (safe) |
1159
+ | `getBusinessProfile` | Business profile |
1160
+ | `fetchMessageHistory` | Riwayat pesan |
1161
+
1162
+ ### Privacy
1163
+
1164
+ | Method | Keterangan |
1165
+ |---|---|
1166
+ | `updateLastSeenPrivacy` | Privacy last seen |
1167
+ | `updateProfilePicturePrivacy` | Privacy foto profil |
1168
+ | `updateStatusPrivacy` | Privacy status |
1169
+ | `updateReadReceiptsPrivacy` | Privacy read receipt |
1170
+ | `updateGroupsAddPrivacy` | Privacy add ke group |
1171
+ | `updateOnlinePrivacy` | Privacy online |
1172
+ | `updateDefaultDisappearingMode` | Default disappearing |
1173
+
1174
+ </details>
1175
+
1176
+ ---
1177
+
1068
1178
  ## License
1069
1179
 
1070
1180
  MIT — lihat [LICENSE](LICENSE).
@@ -1072,5 +1182,5 @@ MIT — lihat [LICENSE](LICENSE).
1072
1182
  ---
1073
1183
 
1074
1184
  <div align="center">
1075
- <sub>n4lyx — built by N4tzzOfficial | Channel: https://whatsapp.com/channel/0029VbAVYIx5PO0z9LqImz3U</sub>
1185
+ <sub>built by N4tzzOfficial · <a href="https://whatsapp.com/channel/0029VbAVYIx5PO0z9LqImz3U">Channel WhatsApp</a> · <a href="https://npmjs.com/package/n4lyx">npm</a></sub>
1076
1186
  </div>