n4lyx 3.0.1 → 3.0.2
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 +629 -519
- package/lib/Socket/business.js +661 -224
- package/package.json +1 -1
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
|
|
12
|
+
**WhatsApp Web API · Multi-device · No bloat.**
|
|
15
13
|
|
|
16
|
-
[](https://npmjs.com/package/n4lyx)
|
|
15
|
+
[](https://npmjs.com/package/n4lyx)
|
|
16
|
+
[](LICENSE)
|
|
17
|
+
[](package.json)
|
|
20
18
|
|
|
21
19
|
</div>
|
|
22
20
|
|
|
23
21
|
---
|
|
24
22
|
|
|
25
|
-
##
|
|
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
|
-
|
|
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.
|
|
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
|
|
66
|
-
|
|
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
|
-
##
|
|
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('
|
|
112
|
+
console.log('Kode pairing:', code) // → misalnya: N4LX-1234
|
|
100
113
|
}
|
|
101
114
|
```
|
|
102
115
|
|
|
103
|
-
Custom
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
###
|
|
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
|
-
|
|
167
|
-
|
|
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
|
-
|
|
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: '
|
|
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: '
|
|
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 ⚡
|
|
205
|
+
### Tag All ⚡
|
|
218
206
|
|
|
219
|
-
|
|
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: '
|
|
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: '
|
|
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: '
|
|
225
|
+
text: '👋 Hei member!',
|
|
238
226
|
tagAll: true,
|
|
239
227
|
tagAllScope: 'non_admins'
|
|
240
228
|
})
|
|
241
229
|
```
|
|
242
230
|
|
|
243
|
-
|
|
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
|
-
// → ['
|
|
235
|
+
// → ['628xxx@s.whatsapp.net', '628yyy@s.whatsapp.net', ...]
|
|
250
236
|
```
|
|
251
237
|
|
|
252
238
|
### Media
|
|
253
239
|
|
|
254
|
-
|
|
240
|
+
Semua media support: `Buffer`, `{ url: '...' }`, atau `{ stream: Stream }`.
|
|
255
241
|
|
|
256
242
|
```js
|
|
257
243
|
// Gambar
|
|
258
|
-
await sock.sendMessage(jid, {
|
|
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, {
|
|
250
|
+
await sock.sendMessage(jid, {
|
|
251
|
+
video: { url: './video.mp4' },
|
|
252
|
+
caption: 'Caption video'
|
|
253
|
+
})
|
|
262
254
|
|
|
263
|
-
// Audio
|
|
264
|
-
await sock.sendMessage(jid, {
|
|
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, {
|
|
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: './
|
|
275
|
+
document: { url: './laporan.pdf' },
|
|
272
276
|
mimetype: 'application/pdf',
|
|
273
|
-
fileName: '
|
|
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, {
|
|
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
|
-
##
|
|
297
|
+
## Shorthand Methods ⚡
|
|
292
298
|
|
|
293
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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)
|
|
318
|
-
await sock.sendAudio(jid, buffer, true)
|
|
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', '
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
367
|
-
await sock.
|
|
368
|
-
```
|
|
369
|
-
|
|
370
|
-
---
|
|
351
|
+
// Dari Buffer
|
|
352
|
+
await sock.sendStickerFromBuffer(jid, buffer)
|
|
371
353
|
|
|
372
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
//
|
|
383
|
+
// Pilih lebih dari satu
|
|
414
384
|
await sock.sendPoll(jid, 'Bahasa favorit?', ['JavaScript', 'Python', 'Go'])
|
|
415
385
|
|
|
416
|
-
//
|
|
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
|
-
|
|
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, {
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
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
|
|
468
|
-
description: 'Sync
|
|
469
|
-
startTime: Date.now() + 3_600_000,
|
|
470
|
-
endTime: Date.now() + 7_200_000,
|
|
471
|
-
location: '
|
|
472
|
-
joinLink: 'https://
|
|
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
|
-
|
|
479
|
-
|
|
480
|
-
|
|
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
|
-
|
|
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
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
---
|
|
498
|
-
|
|
499
|
-
### `sock.groupStatusV2(jid, content)`
|
|
439
|
+
// Reply cepat
|
|
440
|
+
await sock.sendReply(jid, 'Oke siap!', m)
|
|
500
441
|
|
|
501
|
-
|
|
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
|
-
//
|
|
509
|
-
await sock.
|
|
445
|
+
// Reply + mention sekaligus
|
|
446
|
+
await sock.sendQuotedText(jid, 'Hayo @kamu', m, ['628xxx@s.whatsapp.net'])
|
|
510
447
|
|
|
511
|
-
//
|
|
512
|
-
await sock.
|
|
448
|
+
// Teks + mention
|
|
449
|
+
await sock.sendTextWithMentions(jid, 'Halo @A dan @B', [jidA, jidB])
|
|
513
450
|
|
|
514
|
-
//
|
|
515
|
-
await sock.
|
|
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
|
-
//
|
|
518
|
-
await sock.
|
|
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
|
-
|
|
462
|
+
Kirim invite sebagai card (bukan plain link).
|
|
526
463
|
|
|
527
464
|
```js
|
|
528
|
-
await sock.
|
|
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
|
-
|
|
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
|
-
|
|
559
|
-
await sock.
|
|
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
|
-
|
|
570
|
-
await sock.
|
|
571
|
-
|
|
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
|
-
|
|
493
|
+
// Broadcast ke semua group yang diikuti
|
|
494
|
+
await sock.broadcastToGroups([groupJid1, groupJid2], { text: 'Halo semua group!' })
|
|
577
495
|
|
|
578
|
-
|
|
579
|
-
await sock.
|
|
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
|
-
|
|
590
|
-
await sock.
|
|
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
|
-
|
|
600
|
-
await sock.
|
|
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
|
-
|
|
518
|
+
Post story langsung di dalam group — muncul kayak story WhatsApp tapi di group.
|
|
609
519
|
|
|
610
520
|
```js
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
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
|
-
|
|
534
|
+
// Gambar
|
|
535
|
+
await sock.groupStatusV2('120363xxx@g.us', {
|
|
536
|
+
image: buffer,
|
|
537
|
+
caption: 'Foto kegiatan hari ini'
|
|
538
|
+
})
|
|
623
539
|
|
|
624
|
-
|
|
540
|
+
// Video
|
|
541
|
+
await sock.groupStatusV2('120363xxx@g.us', {
|
|
542
|
+
video: buffer,
|
|
543
|
+
caption: 'Tonton ini!'
|
|
544
|
+
})
|
|
625
545
|
|
|
626
|
-
|
|
627
|
-
await sock.
|
|
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
|
|
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, '
|
|
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
|
-
//
|
|
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)
|
|
659
|
-
await sock.pinMessage(jid, m.key, 604800)
|
|
660
|
-
await sock.pinMessage(jid, m.key,
|
|
661
|
-
|
|
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
|
-
//
|
|
664
|
-
await sock.
|
|
665
|
-
await sock.
|
|
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, '')
|
|
578
|
+
await sock.reactMessage(jid, m.key, '') // hapus reaksi
|
|
670
579
|
|
|
671
580
|
// Forward
|
|
672
581
|
await sock.forwardMessage(jid, m)
|
|
673
|
-
await sock.
|
|
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)
|
|
693
|
-
await sock.muteJid(jid, 24 * 60 * 60 * 1000)
|
|
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
|
-
|
|
618
|
+
---
|
|
619
|
+
|
|
620
|
+
## Disappearing Messages
|
|
706
621
|
|
|
707
622
|
```js
|
|
708
|
-
//
|
|
709
|
-
await sock.
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
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
|
-
##
|
|
637
|
+
## Groups
|
|
723
638
|
|
|
724
639
|
```js
|
|
725
|
-
//
|
|
726
|
-
await sock.
|
|
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
|
-
//
|
|
729
|
-
await sock.
|
|
730
|
-
await sock.
|
|
731
|
-
await sock.
|
|
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
|
-
//
|
|
734
|
-
await sock.
|
|
673
|
+
// Info & metadata
|
|
674
|
+
const meta = await sock.groupMetadata(jid)
|
|
675
|
+
const all = await sock.fetchAllGroups() // semua group yang diikuti
|
|
735
676
|
|
|
736
|
-
//
|
|
737
|
-
await sock.
|
|
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
|
-
##
|
|
700
|
+
## Interaktif: Buttons, List, Template ⚡
|
|
743
701
|
|
|
744
702
|
```js
|
|
745
|
-
|
|
746
|
-
|
|
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
|
-
|
|
749
|
-
|
|
750
|
-
|
|
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
|
-
|
|
753
|
-
|
|
754
|
-
|
|
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
|
-
|
|
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
|
-
|
|
758
|
+
---
|
|
759
|
+
|
|
760
|
+
## Newsletter ⚡
|
|
762
761
|
|
|
763
762
|
```js
|
|
764
|
-
|
|
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
|
-
##
|
|
776
|
+
## Download Media
|
|
770
777
|
|
|
771
778
|
```js
|
|
772
|
-
|
|
773
|
-
const
|
|
774
|
-
console.log('Created:', group.gid)
|
|
779
|
+
const { downloadMediaMessage, getContentType } = require('n4lyx')
|
|
780
|
+
const { createWriteStream } = require('fs')
|
|
775
781
|
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
782
|
+
sock.ev.on('messages.upsert', async ({ messages: [m] }) => {
|
|
783
|
+
if (!m.message) return
|
|
784
|
+
const type = getContentType(m)
|
|
779
785
|
|
|
780
|
-
|
|
781
|
-
await
|
|
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
|
-
|
|
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
|
-
|
|
788
|
-
await sock.
|
|
789
|
-
|
|
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
|
-
|
|
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
|
-
|
|
799
|
-
const meta = await sock.groupMetadata(jid)
|
|
804
|
+
## Poll — Dekripsi Vote
|
|
800
805
|
|
|
801
|
-
|
|
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
|
-
|
|
807
|
-
|
|
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
|
-
|
|
812
|
-
|
|
813
|
-
|
|
811
|
+
sock.ev.on('messages.update', async (events) => {
|
|
812
|
+
for (const { key, update } of events) {
|
|
813
|
+
if (!update.pollUpdates) continue
|
|
814
814
|
|
|
815
|
-
//
|
|
816
|
-
|
|
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
|
-
|
|
819
|
-
|
|
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
|
-
//
|
|
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)
|
|
834
|
-
await sock.sendPresenceUpdate('available', jid)
|
|
835
|
-
await sock.sendPresenceUpdate('unavailable', jid)
|
|
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
|
|
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
|
-
//
|
|
856
|
-
const
|
|
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
|
|
859
|
-
const pic
|
|
860
|
-
const picHD = await sock.getProfilePicture(jid, true)
|
|
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
|
-
//
|
|
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
|
-
//
|
|
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('
|
|
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
|
-
//
|
|
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
|
-
##
|
|
920
|
+
## In-Memory Store
|
|
924
921
|
|
|
925
|
-
|
|
922
|
+
Untuk development / testing. **Jangan dipakai di production.**
|
|
926
923
|
|
|
927
924
|
```js
|
|
928
|
-
const {
|
|
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
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
})
|
|
927
|
+
const store = makeInMemoryStore({})
|
|
928
|
+
store.readFromFile('./store.json')
|
|
929
|
+
setInterval(() => store.writeToFile('./store.json'), 10_000)
|
|
941
930
|
|
|
942
|
-
|
|
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
|
|
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 #
|
|
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
|
-
|
|
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>
|
|
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>
|