baileys-xbats 1.0.0

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.
Files changed (99) hide show
  1. package/LICENSE +23 -0
  2. package/README.MD +991 -0
  3. package/WAProto/index.d.ts +15933 -0
  4. package/WAProto/index.js +115857 -0
  5. package/engine-requirements.js +10 -0
  6. package/lib/Defaults/index.js +120 -0
  7. package/lib/Defaults/noxleyss-version.json +3 -0
  8. package/lib/Signal/Group/ciphertext-message.js +15 -0
  9. package/lib/Signal/Group/group-session-builder.js +64 -0
  10. package/lib/Signal/Group/group_cipher.js +96 -0
  11. package/lib/Signal/Group/index.js +57 -0
  12. package/lib/Signal/Group/keyhelper.js +55 -0
  13. package/lib/Signal/Group/queue-job.js +57 -0
  14. package/lib/Signal/Group/sender-chain-key.js +34 -0
  15. package/lib/Signal/Group/sender-key-distribution-message.js +66 -0
  16. package/lib/Signal/Group/sender-key-message.js +69 -0
  17. package/lib/Signal/Group/sender-key-name.js +51 -0
  18. package/lib/Signal/Group/sender-key-record.js +53 -0
  19. package/lib/Signal/Group/sender-key-state.js +99 -0
  20. package/lib/Signal/Group/sender-message-key.js +29 -0
  21. package/lib/Signal/libsignal.js +184 -0
  22. package/lib/Socket/Client/index.js +18 -0
  23. package/lib/Socket/Client/types.js +13 -0
  24. package/lib/Socket/Client/websocket.js +72 -0
  25. package/lib/Socket/business.js +260 -0
  26. package/lib/Socket/chats.js +997 -0
  27. package/lib/Socket/groups.js +332 -0
  28. package/lib/Socket/index.js +10 -0
  29. package/lib/Socket/messages-recv.js +1161 -0
  30. package/lib/Socket/messages-send.js +944 -0
  31. package/lib/Socket/newsletter.js +283 -0
  32. package/lib/Socket/socket.js +646 -0
  33. package/lib/Socket/usync.js +70 -0
  34. package/lib/Store/index.js +8 -0
  35. package/lib/Store/make-in-memory-store.js +439 -0
  36. package/lib/Store/make-ordered-dictionary.js +81 -0
  37. package/lib/Store/object-repository.js +27 -0
  38. package/lib/Types/Auth.js +2 -0
  39. package/lib/Types/Call.js +2 -0
  40. package/lib/Types/Chat.js +4 -0
  41. package/lib/Types/Contact.js +2 -0
  42. package/lib/Types/Events.js +2 -0
  43. package/lib/Types/GroupMetadata.js +2 -0
  44. package/lib/Types/Label.js +27 -0
  45. package/lib/Types/LabelAssociation.js +9 -0
  46. package/lib/Types/Message.js +7 -0
  47. package/lib/Types/Newsletter.js +18 -0
  48. package/lib/Types/Product.js +2 -0
  49. package/lib/Types/Signal.js +2 -0
  50. package/lib/Types/Socket.js +2 -0
  51. package/lib/Types/State.js +2 -0
  52. package/lib/Types/USync.js +2 -0
  53. package/lib/Types/index.js +42 -0
  54. package/lib/Utils/auth-utils.js +199 -0
  55. package/lib/Utils/browser-utils.js +35 -0
  56. package/lib/Utils/business.js +234 -0
  57. package/lib/Utils/chat-utils.js +730 -0
  58. package/lib/Utils/crypto.js +193 -0
  59. package/lib/Utils/decode-wa-message.js +217 -0
  60. package/lib/Utils/event-buffer.js +518 -0
  61. package/lib/Utils/generics.js +467 -0
  62. package/lib/Utils/history.js +94 -0
  63. package/lib/Utils/index.js +35 -0
  64. package/lib/Utils/link-preview.js +126 -0
  65. package/lib/Utils/logger.js +7 -0
  66. package/lib/Utils/lt-hash.js +51 -0
  67. package/lib/Utils/make-mutex.js +43 -0
  68. package/lib/Utils/message-retry-manager.js +185 -0
  69. package/lib/Utils/messages-media.js +879 -0
  70. package/lib/Utils/messages.js +1944 -0
  71. package/lib/Utils/noise-handler.js +150 -0
  72. package/lib/Utils/noxleyss-event-stream.js +63 -0
  73. package/lib/Utils/process-message.js +404 -0
  74. package/lib/Utils/signal.js +153 -0
  75. package/lib/Utils/use-multi-file-auth-state.js +124 -0
  76. package/lib/Utils/validate-connection.js +229 -0
  77. package/lib/WABinary/constants.js +1303 -0
  78. package/lib/WABinary/decode.js +265 -0
  79. package/lib/WABinary/encode.js +250 -0
  80. package/lib/WABinary/generic-utils.js +110 -0
  81. package/lib/WABinary/index.js +21 -0
  82. package/lib/WABinary/jid-utils.js +85 -0
  83. package/lib/WABinary/types.js +2 -0
  84. package/lib/WAM/BinaryInfo.js +13 -0
  85. package/lib/WAM/constants.js +15350 -0
  86. package/lib/WAM/encode.js +155 -0
  87. package/lib/WAM/index.js +19 -0
  88. package/lib/WAUSync/Protocols/USyncContactProtocol.js +32 -0
  89. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +57 -0
  90. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +30 -0
  91. package/lib/WAUSync/Protocols/USyncStatusProtocol.js +42 -0
  92. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js +53 -0
  93. package/lib/WAUSync/Protocols/UsyncLIDProtocol.js +24 -0
  94. package/lib/WAUSync/Protocols/index.js +20 -0
  95. package/lib/WAUSync/USyncQuery.js +89 -0
  96. package/lib/WAUSync/USyncUser.js +26 -0
  97. package/lib/WAUSync/index.js +19 -0
  98. package/lib/index.js +89 -0
  99. package/package.json +97 -0
package/README.MD ADDED
@@ -0,0 +1,991 @@
1
+ # <div align='center'>noxleyss</div>
2
+
3
+ <div align='center'>
4
+
5
+ [![npm version](https://img.shields.io/npm/v/noxleyss.svg)](https://www.npmjs.com/package/noxleyss)
6
+ [![License](https://img.shields.io/badge/license-GPL%203-blue.svg)](LICENSE)
7
+ [![Downloads](https://img.shields.io/npm/dm/noxleyss.svg)](https://www.npmjs.com/package/noxleyss)
8
+
9
+ </div>
10
+
11
+ <div align="center">
12
+ <strong>noxleyss</strong> — WhatsApp API Multi‑Device Modern untuk bot dan aplikasi berbasis Node.js.
13
+ </div>
14
+
15
+ ## ✨ Fitur Utama
16
+
17
+ - 🚀 **Modern & Cepat** – Dibangun dengan TypeScript dan teknologi terkini.
18
+ - 🔧 **Perbaikan @lid & @jid** – Mengatasi masalah ID lokal ke ID ponsel di grup WhatsApp.
19
+ - 📱 **Dukungan Multi‑Device** – Koneksi penuh ke WhatsApp Multi‑Device.
20
+ - 🔐 **Enkripsi End‑to‑End** – Semua pesan terenkripsi.
21
+ - 📨 **Semua Jenis Pesan** – Teks, media (gambar, video, audio), polling, stiker, lokasi, kontak, dan lainnya.
22
+ - 🧩 **Ringan & Optimal** – Performa stabil dengan dukungan streaming media.
23
+ - 📂 **Manajemen Autentikasi** – Simpan kredensial di file atau database.
24
+
25
+ ---
26
+
27
+ ## ⚠️ Peringatan
28
+
29
+ Proyek ini **tidak berafiliasi, didukung, atau terhubung secara resmi** dengan WhatsApp atau anak perusahaannya. Situs resmi WhatsApp: [whatsapp.com](https://whatsapp.com).
30
+
31
+ Pengguna bertanggung jawab penuh atas penggunaan aplikasi ini. Hindari spam dan otomatisasi berlebihan yang melanggar Ketentuan Layanan WhatsApp.
32
+
33
+ ---
34
+
35
+ ## 📦 Instalasi
36
+
37
+ ### Versi Stabil (Direkomendasikan)
38
+
39
+ ```bash
40
+ npm install noxleyss
41
+ ```
42
+
43
+ Versi Terbaru (Edge)
44
+
45
+ ```bash
46
+ npm install noxleyss@latest
47
+ # atau dengan yarn
48
+ yarn add noxleyss@latest
49
+ ```
50
+
51
+ Cara Impor
52
+
53
+ ```javascript
54
+ // CommonJS
55
+ const { default: makeWASocket } = require("noxleyss")
56
+
57
+ // ES6 Module
58
+ import makeWASocket from "noxleyss"
59
+ ```
60
+
61
+ ---
62
+
63
+ 🚀 Mulai Cepat
64
+
65
+ Contoh Dasar (dengan QR Code)
66
+
67
+ ```javascript
68
+ const { default: makeWASocket, DisconnectReason, useMultiFileAuthState } = require('noxleyss')
69
+ const { Boom } = require('@hapi/boom')
70
+
71
+ async function connectToWhatsApp() {
72
+ // Simpan kredensial di folder 'auth_info_noxleyss'
73
+ const { state, saveCreds } = await useMultiFileAuthState('auth_info_noxleyss')
74
+
75
+ const sock = makeWASocket({
76
+ auth: state,
77
+ printQRInTerminal: true,
78
+ browser: ['noxleyss', 'Desktop', '3.0']
79
+ })
80
+
81
+ // Event koneksi
82
+ sock.ev.on('connection.update', (update) => {
83
+ const { connection, lastDisconnect } = update
84
+ if (connection === 'close') {
85
+ const shouldReconnect = (lastDisconnect?.error as Boom)?.output?.statusCode !== DisconnectReason.loggedOut
86
+ console.log('Koneksi tertutup, reconnecting:', shouldReconnect)
87
+ if (shouldReconnect) connectToWhatsApp()
88
+ } else if (connection === 'open') {
89
+ console.log('✅ Berhasil terhubung ke WhatsApp!')
90
+ }
91
+ })
92
+
93
+ // Event pesan masuk
94
+ sock.ev.on('messages.upsert', async ({ messages }) => {
95
+ for (const m of messages) {
96
+ if (!m.message) continue
97
+ console.log('📱 Pesan baru:', JSON.stringify(m, undefined, 2))
98
+
99
+ // Balas otomatis
100
+ await sock.sendMessage(m.key.remoteJid!, {
101
+ text: 'Halo! Saya bot WhatsApp menggunakan noxleyss 🤖'
102
+ })
103
+ }
104
+ })
105
+
106
+ // Simpan kredensial saat diperbarui
107
+ sock.ev.on('creds.update', saveCreds)
108
+ }
109
+
110
+ connectToWhatsApp()
111
+ ```
112
+
113
+ ---
114
+
115
+ 🔌 Koneksi Akun
116
+
117
+ WhatsApp menyediakan API multi‑device yang memungkinkan noxleyss terautentikasi sebagai klien WhatsApp sekunder melalui QR code atau pairing code.
118
+
119
+ Hubungkan dengan QR Code
120
+
121
+ ```javascript
122
+ const { default: makeWASocket, Browsers } = require("noxleyss")
123
+
124
+ const sock = makeWASocket({
125
+ browser: Browsers.ubuntu('My App'),
126
+ printQRInTerminal: true
127
+ })
128
+ ```
129
+
130
+ Setelah koneksi berhasil, QR code akan muncul di terminal. Pindai dengan WhatsApp di ponsel Anda untuk login.
131
+
132
+ Hubungkan dengan Pairing Code
133
+
134
+ Penting: Pairing code memungkinkan koneksi tanpa QR code. Nomor telepon harus tanpa +, (), atau -, dan sertakan kode negara.
135
+
136
+ ```javascript
137
+ const { default: makeWASocket } = require("noxleyss")
138
+
139
+ const sock = makeWASocket({
140
+ printQRInTerminal: false
141
+ })
142
+
143
+ // Pairing normal
144
+ if (!sock.authState.creds.registered) {
145
+ const number = '6283134600805' // ganti dengan nomor Anda
146
+ const code = await sock.requestPairingCode(number)
147
+ console.log('🔑 Kode Pairing:', code)
148
+ }
149
+
150
+ // Pairing dengan kode kustom (8 karakter)
151
+ if (!sock.authState.creds.registered) {
152
+ const pair = "noxleyss"
153
+ const number = '6283134600805'
154
+ const code = await sock.requestPairingCode(number, pair)
155
+ console.log('🔑 Kode Pairing Kustom:', code)
156
+ }
157
+ ```
158
+
159
+ Terima Riwayat Lengkap
160
+
161
+ Untuk menerima riwayat pesan lengkap, setel syncFullHistory ke true.
162
+
163
+ ```javascript
164
+ const { default: makeWASocket, Browsers } = require("noxleyss")
165
+
166
+ const sock = makeWASocket({
167
+ browser: Browsers.macOS('Desktop'),
168
+ syncFullHistory: true
169
+ })
170
+ ```
171
+
172
+ ---
173
+
174
+ ⚙️ Catatan Penting Konfigurasi Socket
175
+
176
+ Caching Metadata Grup (Direkomendasikan)
177
+
178
+ Untuk penggunaan grup, implementasikan caching metadata grup:
179
+
180
+ ```javascript
181
+ const { default: makeWASocket } = require("noxleyss")
182
+ const NodeCache = require('node-cache')
183
+
184
+ const groupCache = new NodeCache({ stdTTL: 5 * 60, useClones: false })
185
+
186
+ const sock = makeWASocket({
187
+ cachedGroupMetadata: async (jid) => groupCache.get(jid)
188
+ })
189
+
190
+ sock.ev.on('groups.update', async ([event]) => {
191
+ const metadata = await sock.groupMetadata(event.id)
192
+ groupCache.set(event.id, metadata)
193
+ })
194
+
195
+ sock.ev.on('group-participants.update', async (event) => {
196
+ const metadata = await sock.groupMetadata(event.id)
197
+ groupCache.set(event.id, metadata)
198
+ })
199
+ ```
200
+
201
+ Perbaiki Sistem Retry & Dekripsi Vote Poll
202
+
203
+ Tingkatkan pengiriman pesan dan dekripsi vote poll dengan store:
204
+
205
+ ```javascript
206
+ const sock = makeWASocket({
207
+ getMessage: async (key) => await getMessageFromStore(key)
208
+ })
209
+ ```
210
+
211
+ Terima Notifikasi di Aplikasi WhatsApp
212
+
213
+ Nonaktifkan status online untuk menerima notifikasi:
214
+
215
+ ```javascript
216
+ const sock = makeWASocket({
217
+ markOnlineOnConnect: false
218
+ })
219
+ ```
220
+
221
+ ---
222
+
223
+ 💾 Simpan Info Auth
224
+
225
+ Hindari pemindaian QR code berulang dengan menyimpan kredensial:
226
+
227
+ ```javascript
228
+ const { default: makeWASocket, useMultiFileAuthState } = require("noxleyss")
229
+
230
+ async function connect() {
231
+ const { state, saveCreds } = await useMultiFileAuthState('auth_info_noxleyss')
232
+ const sock = makeWASocket({ auth: state })
233
+ sock.ev.on('creds.update', saveCreds)
234
+ }
235
+
236
+ connect()
237
+ ```
238
+
239
+ Penting: useMultiFileAuthState menyimpan status auth di folder. Untuk produksi, gunakan database SQL/No‑SQL dan kelola update kunci dengan hati‑hati.
240
+
241
+ ---
242
+
243
+ 🗄️ Implementasi Data Store
244
+
245
+ noxleyss tidak menyertakan penyimpanan default untuk obrolan, kontak, atau pesan. Namun, implementasi in‑memory sederhana disediakan.
246
+
247
+ ```javascript
248
+ const { default: makeWASocket, makeInMemoryStore } = require("noxleyss")
249
+
250
+ const store = makeInMemoryStore({ })
251
+
252
+ store.readFromFile('./noxleyss_store.json')
253
+
254
+ setInterval(() => {
255
+ store.writeToFile('./noxleyss_store.json')
256
+ }, 10_000)
257
+
258
+ const sock = makeWASocket({ })
259
+ store.bind(sock.ev)
260
+
261
+ sock.ev.on('chats.upsert', () => {
262
+ console.log('dapat obrolan', store.chats.all())
263
+ })
264
+
265
+ sock.ev.on('contacts.upsert', () => {
266
+ console.log('dapat kontak', Object.values(store.contacts))
267
+ })
268
+ ```
269
+
270
+ ---
271
+
272
+ 🆔 Penjelasan ID WhatsApp
273
+
274
+ id adalah ID WhatsApp, disebut juga jid, untuk orang atau grup tujuan pesan.
275
+
276
+ · Orang: [kode negara][nomor telepon]@s.whatsapp.net
277
+ Contoh: +19999999999@s.whatsapp.net
278
+ · Grup: 123456789-123345@g.us
279
+ · Daftar siaran: [timestamp pembuatan]@broadcast
280
+ · Cerita: status@broadcast
281
+
282
+ ---
283
+
284
+ 🔧 Fungsi Utilitas
285
+
286
+ · getContentType – Mengembalikan tipe konten pesan
287
+ · getDevice – Mengembalikan perangkat dari pesan
288
+ · makeCacheableSignalKeyStore – Mempercepat store auth
289
+ · downloadContentFromMessage – Unduh konten dari pesan
290
+
291
+ ---
292
+
293
+ 📤 Kirim Pesan
294
+
295
+ Kirim semua jenis pesan dengan satu fungsi.
296
+
297
+ ```javascript
298
+ sock.sendMessage(jid, content, options)
299
+ ```
300
+
301
+ Pesan Non‑Media
302
+
303
+ Pesan Teks
304
+
305
+ ```javascript
306
+ await sock.sendMessage(jid, { text: 'halo dunia' })
307
+ ```
308
+
309
+ Pesan Kutipan (bekerja dengan semua tipe)
310
+
311
+ ```javascript
312
+ await sock.sendMessage(jid, { text: 'halo dunia' }, { quoted: message })
313
+ ```
314
+
315
+ Sebut Pengguna
316
+
317
+ ```javascript
318
+ await sock.sendMessage(
319
+ jid,
320
+ {
321
+ text: '@12345678901',
322
+ mentions: ['12345678901@s.whatsapp.net']
323
+ }
324
+ )
325
+ ```
326
+
327
+ Teruskan Pesan
328
+
329
+ ```javascript
330
+ const msg = getMessageFromStore() // implementasikan sendiri
331
+ await sock.sendMessage(jid, { forward: msg })
332
+ ```
333
+
334
+ Pesan Lokasi
335
+
336
+ ```javascript
337
+ await sock.sendMessage(
338
+ jid,
339
+ {
340
+ location: {
341
+ degreesLatitude: 24.121231,
342
+ degreesLongitude: 55.1121221
343
+ }
344
+ }
345
+ )
346
+ ```
347
+
348
+ Pesan Kontak (vCard)
349
+
350
+ ```javascript
351
+ const vcard = 'BEGIN:VCARD\n'
352
+ + 'VERSION:3.0\n'
353
+ + 'FN:Jeff Singh\n'
354
+ + 'ORG:Ashoka Uni;\n'
355
+ + 'TEL;type=CELL;type=VOICE;waid=911234567890:+91 12345 67890\n'
356
+ + 'END:VCARD'
357
+
358
+ await sock.sendMessage(
359
+ id,
360
+ {
361
+ contacts: {
362
+ displayName: 'Jeff',
363
+ contacts: [{ vcard }]
364
+ }
365
+ }
366
+ )
367
+ ```
368
+
369
+ Pesan Reaksi
370
+
371
+ ```javascript
372
+ await sock.sendMessage(
373
+ jid,
374
+ {
375
+ react: {
376
+ text: '💖', // kosongkan untuk hapus reaksi
377
+ key: message.key
378
+ }
379
+ }
380
+ )
381
+ ```
382
+
383
+ Pin Pesan
384
+
385
+ ```javascript
386
+ await sock.sendMessage(
387
+ jid,
388
+ {
389
+ pin: {
390
+ type: 1, // 0 untuk hapus
391
+ time: 86400, // 24 jam dalam detik
392
+ key: message.key
393
+ }
394
+ }
395
+ )
396
+ ```
397
+
398
+ Pesan Poll
399
+
400
+ ```javascript
401
+ await sock.sendMessage(
402
+ jid,
403
+ {
404
+ poll: {
405
+ name: 'Poll Saya',
406
+ values: ['Opsi 1', 'Opsi 2', 'Opsi 3'],
407
+ selectableCount: 1,
408
+ toAnnouncementGroup: false
409
+ }
410
+ }
411
+ )
412
+ ```
413
+
414
+ Kirim dengan Pratinjau Tautan
415
+
416
+ Instal link-preview-js:
417
+
418
+ ```bash
419
+ npm install link-preview-js
420
+ ```
421
+
422
+ ```javascript
423
+ await sock.sendMessage(
424
+ jid,
425
+ {
426
+ text: 'Halo, ini dikirim menggunakan https://npmjs.com/noxleyss'
427
+ }
428
+ )
429
+ ```
430
+
431
+ Pesan Media
432
+
433
+ Catatan: Di pesan media, bisa gunakan { stream: Stream }, { url: Url }, atau Buffer langsung.
434
+
435
+ Kirim Gambar
436
+
437
+ ```javascript
438
+ await sock.sendMessage(
439
+ id,
440
+ {
441
+ image: {
442
+ url: './Media/ma_img.png'
443
+ },
444
+ caption: 'halo dunia'
445
+ }
446
+ )
447
+ ```
448
+
449
+ Kirim Video
450
+
451
+ ```javascript
452
+ await sock.sendMessage(
453
+ id,
454
+ {
455
+ video: {
456
+ url: './Media/ma_video.mp4'
457
+ },
458
+ caption: 'halo dunia',
459
+ ptv: false // true untuk video note
460
+ }
461
+ )
462
+ ```
463
+
464
+ Kirim GIF
465
+
466
+ ```javascript
467
+ await sock.sendMessage(
468
+ jid,
469
+ {
470
+ video: fs.readFileSync('Media/ma_gif.mp4'),
471
+ caption: 'halo dunia',
472
+ gifPlayback: true
473
+ }
474
+ )
475
+ ```
476
+
477
+ Kirim Audio
478
+
479
+ ```javascript
480
+ await sock.sendMessage(
481
+ jid,
482
+ {
483
+ audio: {
484
+ url: './Media/audio.mp3'
485
+ },
486
+ mimetype: 'audio/mp4'
487
+ }
488
+ )
489
+ ```
490
+
491
+ View Once
492
+
493
+ ```javascript
494
+ await sock.sendMessage(
495
+ id,
496
+ {
497
+ image: {
498
+ url: './Media/ma_img.png'
499
+ },
500
+ viewOnce: true,
501
+ caption: 'halo dunia'
502
+ }
503
+ )
504
+ ```
505
+
506
+ ---
507
+
508
+ ✏️ Ubah Pesan
509
+
510
+ Hapus Pesan (untuk semua)
511
+
512
+ ```javascript
513
+ const msg = await sock.sendMessage(jid, { text: 'halo dunia' })
514
+ await sock.sendMessage(jid, { delete: msg.key })
515
+ ```
516
+
517
+ Edit Pesan
518
+
519
+ ```javascript
520
+ await sock.sendMessage(jid, {
521
+ text: 'teks terupdate di sini',
522
+ edit: response.key,
523
+ })
524
+ ```
525
+
526
+ ---
527
+
528
+ 🖼️ Manipulasi Pesan Media
529
+
530
+ Unduh Pesan Media
531
+
532
+ ```javascript
533
+ import { createWriteStream } from 'fs'
534
+ import { downloadMediaMessage, getContentType } from 'noxleyss'
535
+
536
+ sock.ev.on('messages.upsert', async ({ messages: [m] }) => {
537
+ if (!m.message) return
538
+ const messageType = getContentType(m)
539
+
540
+ if (messageType === 'imageMessage') {
541
+ const stream = await downloadMediaMessage(
542
+ m,
543
+ 'stream',
544
+ { },
545
+ {
546
+ logger,
547
+ reuploadRequest: sock.updateMediaMessage
548
+ }
549
+ )
550
+ const writeStream = createWriteStream('./my-download.jpeg')
551
+ stream.pipe(writeStream)
552
+ }
553
+ })
554
+ ```
555
+
556
+ ---
557
+
558
+ 📞 Tolak Panggilan
559
+
560
+ ```javascript
561
+ await sock.rejectCall(callId, callFrom)
562
+ ```
563
+
564
+ ---
565
+
566
+ 💬 Status Kirim di Obrolan
567
+
568
+ Baca Pesan
569
+
570
+ ```javascript
571
+ await sock.readMessages([key]) // bisa multiple kunci
572
+ ```
573
+
574
+ Update Kehadiran
575
+
576
+ ```javascript
577
+ await sock.sendPresenceUpdate('available', jid)
578
+ await sock.sendPresenceUpdate('composing', jid)
579
+ ```
580
+
581
+ ---
582
+
583
+ 📁 Ubah Obrolan
584
+
585
+ Arsipkan Obrolan
586
+
587
+ ```javascript
588
+ const lastMsgInChat = await getLastMessageInChat(jid) // implementasikan sendiri
589
+ await sock.chatModify({ archive: true, lastMessages: [lastMsgInChat] }, jid)
590
+ ```
591
+
592
+ Bisukan/Buka Bisukan Obrolan
593
+
594
+ ```javascript
595
+ // Bisukan 8 jam
596
+ await sock.chatModify({ mute: 8 * 60 * 60 * 1000 }, jid)
597
+ // Buka bisukan
598
+ await sock.chatModify({ mute: null }, jid)
599
+ ```
600
+
601
+ Tandai Obrolan Dibaca/Tidak Dibaca
602
+
603
+ ```javascript
604
+ const lastMsgInChat = await getLastMessageInChat(jid)
605
+ await sock.chatModify({ markRead: false, lastMessages: [lastMsgInChat] }, jid)
606
+ ```
607
+
608
+ Hapus Pesan untuk Saya
609
+
610
+ ```javascript
611
+ await sock.chatModify(
612
+ {
613
+ clear: {
614
+ messages: [
615
+ {
616
+ id: 'ATWYHDNNWU81732J',
617
+ fromMe: true,
618
+ timestamp: '1654823909'
619
+ }
620
+ ]
621
+ }
622
+ },
623
+ jid
624
+ )
625
+ ```
626
+
627
+ Hapus Obrolan
628
+
629
+ ```javascript
630
+ const lastMsgInChat = await getLastMessageInChat(jid)
631
+ await sock.chatModify({
632
+ delete: true,
633
+ lastMessages: [
634
+ {
635
+ key: lastMsgInChat.key,
636
+ messageTimestamp: lastMsgInChat.messageTimestamp
637
+ }
638
+ ]
639
+ }, jid)
640
+ ```
641
+
642
+ Pin/Hapus Pin Obrolan
643
+
644
+ ```javascript
645
+ await sock.chatModify({ pin: true }, jid) // pin
646
+ await sock.chatModify({ pin: false }, jid) // hapus pin
647
+ ```
648
+
649
+ Bintangi/Hapus Bintang Pesan
650
+
651
+ ```javascript
652
+ await sock.chatModify({
653
+ star: {
654
+ messages: [
655
+ {
656
+ id: 'messageID',
657
+ fromMe: true
658
+ }
659
+ ],
660
+ star: true // atau false untuk hapus bintang
661
+ }
662
+ }, jid)
663
+ ```
664
+
665
+ Pesan Menghilang
666
+
667
+ ```javascript
668
+ // Nyalakan pesan menghilang (7 hari default)
669
+ await sock.sendMessage(
670
+ jid,
671
+ { disappearingMessagesInChat: 604800 } // 7 hari dalam detik
672
+ )
673
+
674
+ // Kirim sebagai pesan menghilang
675
+ await sock.sendMessage(jid, { text: 'halo' }, { ephemeralExpiration: 604800 })
676
+
677
+ // Matikan
678
+ await sock.sendMessage(
679
+ jid,
680
+ { disappearingMessagesInChat: false }
681
+ )
682
+ ```
683
+
684
+ ---
685
+
686
+ 👤 Query Pengguna
687
+
688
+ Periksa ID Ada di WhatsApp
689
+
690
+ ```javascript
691
+ const [result] = await sock.onWhatsApp(jid)
692
+ if (result.exists) console.log(`${jid} ada di WhatsApp, sebagai jid: ${result.jid}`)
693
+ ```
694
+
695
+ Query Riwayat Obrolan
696
+
697
+ ```javascript
698
+ const msg = await getOldestMessageInChat(jid) // implementasikan sendiri
699
+ await sock.fetchMessageHistory(
700
+ 50, // jumlah (max: 50 per query)
701
+ msg.key,
702
+ msg.messageTimestamp
703
+ )
704
+ ```
705
+
706
+ Ambil Status
707
+
708
+ ```javascript
709
+ const status = await sock.fetchStatus(jid)
710
+ console.log('status: ' + status)
711
+ ```
712
+
713
+ Ambil Foto Profil (grup juga)
714
+
715
+ ```javascript
716
+ // resolusi rendah
717
+ const ppUrl = await sock.profilePictureUrl(jid)
718
+ console.log(ppUrl)
719
+
720
+ // resolusi tinggi
721
+ const ppUrlHigh = await sock.profilePictureUrl(jid, 'image')
722
+ ```
723
+
724
+ Ambil Profil Bisnis
725
+
726
+ ```javascript
727
+ const profile = await sock.getBusinessProfile(jid)
728
+ console.log('deskripsi: ' + profile.description + ', kategori: ' + profile.category)
729
+ ```
730
+
731
+ Ambil Kehadiran Seseorang
732
+
733
+ ```javascript
734
+ sock.ev.on('presence.update', console.log)
735
+ await sock.presenceSubscribe(jid)
736
+ ```
737
+
738
+ ---
739
+
740
+ 🔄 Ubah Profil
741
+
742
+ Ubah Status Profil
743
+
744
+ ```javascript
745
+ await sock.updateProfileStatus('Halo Dunia!')
746
+ ```
747
+
748
+ Ubah Nama Profil
749
+
750
+ ```javascript
751
+ await sock.updateProfileName('Nama Saya')
752
+ ```
753
+
754
+ Ubah Foto Tampilan (grup juga)
755
+
756
+ ```javascript
757
+ await sock.updateProfilePicture(jid, { url: './new-profile-picture.jpeg' })
758
+ ```
759
+
760
+ Hapus Foto Tampilan (grup juga)
761
+
762
+ ```javascript
763
+ await sock.removeProfilePicture(jid)
764
+ ```
765
+
766
+ ---
767
+
768
+ 👥 Grup
769
+
770
+ Buat Grup
771
+
772
+ ```javascript
773
+ const group = await sock.groupCreate('Grup Saya', ['1234@s.whatsapp.net', '4564@s.whatsapp.net'])
774
+ console.log('grup dibuat dengan id: ' + group.gid)
775
+ ```
776
+
777
+ Tambah/Hapus atau Turunkan/Naikkan
778
+
779
+ ```javascript
780
+ await sock.groupParticipantsUpdate(
781
+ jid,
782
+ ['abcd@s.whatsapp.net', 'efgh@s.whatsapp.net'],
783
+ 'add' // 'remove', 'demote', atau 'promote'
784
+ )
785
+ ```
786
+
787
+ Ubah Subjek (nama)
788
+
789
+ ```javascript
790
+ await sock.groupUpdateSubject(jid, 'Subjek Baru!')
791
+ ```
792
+
793
+ Ubah Deskripsi
794
+
795
+ ```javascript
796
+ await sock.groupUpdateDescription(jid, 'Deskripsi Baru!')
797
+ ```
798
+
799
+ Ubah Pengaturan
800
+
801
+ ```javascript
802
+ // Hanya admin kirim pesan
803
+ await sock.groupSettingUpdate(jid, 'announcement')
804
+ // Semua bisa kirim
805
+ await sock.groupSettingUpdate(jid, 'not_announcement')
806
+ // Semua bisa ubah pengaturan grup
807
+ await sock.groupSettingUpdate(jid, 'unlocked')
808
+ // Hanya admin ubah pengaturan
809
+ await sock.groupSettingUpdate(jid, 'locked')
810
+ ```
811
+
812
+ Keluar Grup
813
+
814
+ ```javascript
815
+ await sock.groupLeave(jid)
816
+ ```
817
+
818
+ Ambil Kode Undangan
819
+
820
+ ```javascript
821
+ const code = await sock.groupInviteCode(jid)
822
+ console.log('https://chat.whatsapp.com/' + code)
823
+ ```
824
+
825
+ Cabut Kode Undangan
826
+
827
+ ```javascript
828
+ const code = await sock.groupRevokeInvite(jid)
829
+ console.log('Kode grup baru: ' + code)
830
+ ```
831
+
832
+ Gabung Menggunakan Kode Undangan
833
+
834
+ ```javascript
835
+ const response = await sock.groupAcceptInvite(code)
836
+ console.log('bergabung ke: ' + response)
837
+ ```
838
+
839
+ Ambil Info Grup dari Kode Undangan
840
+
841
+ ```javascript
842
+ const response = await sock.groupGetInviteInfo(code)
843
+ console.log('info grup: ' + response)
844
+ ```
845
+
846
+ Query Metadata
847
+
848
+ ```javascript
849
+ const metadata = await sock.groupMetadata(jid)
850
+ console.log(metadata.id + ', judul: ' + metadata.subject + ', deskripsi: ' + metadata.desc)
851
+ ```
852
+
853
+ Ambil Semua Metadata Grup yang Diikuti
854
+
855
+ ```javascript
856
+ const response = await sock.groupFetchAllParticipating()
857
+ console.log(response)
858
+ ```
859
+
860
+ Toggle Ephemeral
861
+
862
+ ```javascript
863
+ await sock.groupToggleEphemeral(jid, 86400) // 24 jam
864
+ ```
865
+
866
+ Ubah Mode Tambah
867
+
868
+ ```javascript
869
+ await sock.groupMemberAddMode(
870
+ jid,
871
+ 'all_member_add' // atau 'admin_add'
872
+ )
873
+ ```
874
+
875
+ ---
876
+
877
+ 🔒 Privasi
878
+
879
+ Blokir/Buka Blokir Pengguna
880
+
881
+ ```javascript
882
+ await sock.updateBlockStatus(jid, 'block')
883
+ await sock.updateBlockStatus(jid, 'unblock')
884
+ ```
885
+
886
+ Ambil Pengaturan Privasi
887
+
888
+ ```javascript
889
+ const privacySettings = await sock.fetchPrivacySettings(true)
890
+ console.log(privacySettings)
891
+ ```
892
+
893
+ Ambil Daftar Blokir
894
+
895
+ ```javascript
896
+ const blocklist = await sock.fetchBlocklist()
897
+ console.log(blocklist)
898
+ ```
899
+
900
+ Update Privasi
901
+
902
+ ```javascript
903
+ await sock.updateLastSeenPrivacy('contacts')
904
+ await sock.updateOnlinePrivacy('all')
905
+ await sock.updateProfilePicturePrivacy('contacts')
906
+ await sock.updateStatusPrivacy('none')
907
+ await sock.updateReadReceiptsPrivacy('all')
908
+ await sock.updateGroupsAddPrivacy('contacts')
909
+ await sock.updateDefaultDisappearingMode(86400) // 24 jam
910
+ ```
911
+
912
+ ---
913
+
914
+ 📢 Daftar Siaran & Cerita
915
+
916
+ Kirim Siaran & Cerita
917
+
918
+ ```javascript
919
+ await sock.sendMessage(
920
+ jid,
921
+ {
922
+ image: {
923
+ url: url
924
+ },
925
+ caption: caption
926
+ },
927
+ {
928
+ backgroundColor: backgroundColor,
929
+ font: font,
930
+ statusJidList: statusJidList,
931
+ broadcast: true
932
+ }
933
+ )
934
+ ```
935
+
936
+ Query Penerima & Nama Daftar Siaran
937
+
938
+ ```javascript
939
+ const bList = await sock.getBroadcastListInfo('1234@broadcast')
940
+ console.log(`nama daftar: ${bList.name}, penerima: ${bList.recipients}`)
941
+ ```
942
+
943
+ ---
944
+
945
+ 🛠️ Fungsi Kustom
946
+
947
+ Aktifkan Level Debug
948
+
949
+ ```javascript
950
+ const { P } = require('noxleyss')
951
+
952
+ const sock = makeWASocket({
953
+ logger: P({ level: 'debug' }),
954
+ })
955
+ ```
956
+
957
+ Daftarkan Callback untuk Event Websocket
958
+
959
+ ```javascript
960
+ // Untuk tag 'edge_routing'
961
+ sock.ws.on('CB:edge_routing', (node) => { })
962
+
963
+ // Dengan id 'abcd'
964
+ sock.ws.on('CB:edge_routing,id:abcd', (node) => { })
965
+
966
+ // Dengan node routing_info
967
+ sock.ws.on('CB:edge_routing,id:abcd,routing_info', (node) => { })
968
+ ```
969
+
970
+ ---
971
+
972
+ 💡 Tips & Praktik Terbaik
973
+
974
+ · Gunakan Caching – Cache metadata grup untuk performa lebih baik.
975
+ · Tangani Rekoneksi – Implementasikan auto‑reconnect untuk kestabilan.
976
+ · Kelola Store – Gunakan database (MongoDB, PostgreSQL) untuk produksi.
977
+ · Penanganan Error – Bungkus panggilan socket dengan try‑catch.
978
+ · Batas Rate – Hormati batas WhatsApp untuk hindari ban.
979
+ · Keamanan – Jangan bagikan kredensial auth; gunakan variabel lingkungan.
980
+
981
+ ---
982
+
983
+ 📄 Lisensi
984
+
985
+ Didistribusikan di bawah Lisensi GPL‑3.0. Lihat file LICENSE untuk informasi lebih lanjut.
986
+
987
+ ---
988
+ <div align="center">
989
+ <strong>noxleyss</strong> — noxleyss<br>
990
+ WhatsApp API Modern dengan Perbaikan @lid Ke @pn
991
+ </div>