@blurose/baileys 1.1.21 → 1.1.23
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 +268 -0
- package/WAProto/WAProto.proto +18 -0
- package/WAProto/index.d.ts +1832 -4261
- package/WAProto/index.js +32547 -29291
- package/lib/Defaults/index.js +1 -1
- package/lib/Socket/business.d.ts.map +1 -1
- package/lib/Socket/communities.d.ts.map +1 -1
- package/lib/Socket/groups.d.ts.map +1 -1
- package/lib/Socket/groups.js +8 -6
- package/lib/Socket/groups.js.map +1 -1
- package/lib/Socket/index.d.ts.map +1 -1
- package/lib/Socket/messages-recv.d.ts.map +1 -1
- package/lib/Socket/messages-recv.js +5 -2
- package/lib/Socket/messages-recv.js.map +1 -1
- package/lib/Socket/messages-send.d.ts.map +1 -1
- package/lib/Socket/messages-send.js +72 -1
- package/lib/Socket/messages-send.js.map +1 -1
- package/lib/Types/Events.d.ts +1 -0
- package/lib/Types/Events.d.ts.map +1 -1
- package/lib/Types/Message.d.ts +12 -7
- package/lib/Types/Message.d.ts.map +1 -1
- package/lib/Utils/a2ui.d.ts +45 -1
- package/lib/Utils/a2ui.d.ts.map +1 -1
- package/lib/Utils/a2ui.js +217 -1
- package/lib/Utils/a2ui.js.map +1 -1
- package/lib/Utils/generics.js +1 -1
- package/lib/Utils/history.d.ts +2 -2
- package/lib/Utils/html-apps.d.ts +30 -0
- package/lib/Utils/html-apps.d.ts.map +1 -0
- package/lib/Utils/html-apps.js +99 -0
- package/lib/Utils/html-apps.js.map +1 -0
- package/lib/Utils/html-multiplayer.d.ts +10 -0
- package/lib/Utils/html-multiplayer.d.ts.map +1 -0
- package/lib/Utils/html-multiplayer.js +90 -0
- package/lib/Utils/html-multiplayer.js.map +1 -0
- package/lib/Utils/index.d.ts +9 -0
- package/lib/Utils/index.d.ts.map +1 -1
- package/lib/Utils/index.js +9 -0
- package/lib/Utils/index.js.map +1 -1
- package/lib/Utils/mbuilder-airich.d.ts +124 -0
- package/lib/Utils/mbuilder-airich.d.ts.map +1 -0
- package/lib/Utils/mbuilder-airich.js +960 -0
- package/lib/Utils/mbuilder-airich.js.map +1 -0
- package/lib/Utils/mbuilder-base.d.ts +32 -0
- package/lib/Utils/mbuilder-base.d.ts.map +1 -0
- package/lib/Utils/mbuilder-base.js +65 -0
- package/lib/Utils/mbuilder-base.js.map +1 -0
- package/lib/Utils/mbuilder-buttonv2.d.ts +27 -0
- package/lib/Utils/mbuilder-buttonv2.d.ts.map +1 -0
- package/lib/Utils/mbuilder-buttonv2.js +165 -0
- package/lib/Utils/mbuilder-buttonv2.js.map +1 -0
- package/lib/Utils/mbuilder-carousel.d.ts +21 -0
- package/lib/Utils/mbuilder-carousel.d.ts.map +1 -0
- package/lib/Utils/mbuilder-carousel.js +120 -0
- package/lib/Utils/mbuilder-carousel.js.map +1 -0
- package/lib/Utils/mbuilder-toolkit.d.ts +90 -0
- package/lib/Utils/mbuilder-toolkit.d.ts.map +1 -0
- package/lib/Utils/mbuilder-toolkit.js +266 -0
- package/lib/Utils/mbuilder-toolkit.js.map +1 -0
- package/lib/Utils/mbuilder-utils.d.ts +69 -0
- package/lib/Utils/mbuilder-utils.d.ts.map +1 -0
- package/lib/Utils/mbuilder-utils.js +214 -0
- package/lib/Utils/mbuilder-utils.js.map +1 -0
- package/lib/Utils/messages.d.ts +1 -0
- package/lib/Utils/messages.d.ts.map +1 -1
- package/lib/Utils/messages.js +66 -9
- package/lib/Utils/messages.js.map +1 -1
- package/lib/Utils/scheduled-message.d.ts +75 -0
- package/lib/Utils/scheduled-message.d.ts.map +1 -0
- package/lib/Utils/scheduled-message.js +101 -0
- package/lib/Utils/scheduled-message.js.map +1 -0
- package/lib/Utils/use-multi-file-auth-state.d.ts +1 -7
- package/lib/Utils/use-multi-file-auth-state.d.ts.map +1 -1
- package/lib/Utils/use-multi-file-auth-state.js +39 -47
- package/lib/Utils/use-multi-file-auth-state.js.map +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -0
- package/lib/index.js.map +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Do not remove this watermark.
|
|
3
|
+
*
|
|
4
|
+
* NIXCODE - Advanced WhatsApp Interactive Message Builder
|
|
5
|
+
* Created by Nixel
|
|
6
|
+
* Contributors: ~ Ahmad tumbuh kembang
|
|
7
|
+
*
|
|
8
|
+
* Copyright (c) 2026 Nixel
|
|
9
|
+
* Permission is granted to use and modify this library for personal or commercial projects.
|
|
10
|
+
* Reuploading, reselling, or redistributing as a standalone product is prohibited.
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Toolkit — kumpulan static helper untuk proses media sebelum dikirim ke WA.
|
|
14
|
+
*
|
|
15
|
+
* Semua method static, tidak perlu new Toolkit().
|
|
16
|
+
*
|
|
17
|
+
* Contoh:
|
|
18
|
+
* const thumb = await Toolkit.getMp4Preview(videoBuffer)
|
|
19
|
+
* const buf = await Toolkit.fetchBuffer('https://...')
|
|
20
|
+
* const url = await Toolkit.toUrl(conn, imageBuffer, 'image')
|
|
21
|
+
*/
|
|
22
|
+
declare class Toolkit {
|
|
23
|
+
constructor();
|
|
24
|
+
/** Delegate ke extractIE dari mbuilder-utils */
|
|
25
|
+
static extractIE(text: string, opts?: any): {
|
|
26
|
+
text: string;
|
|
27
|
+
ie: any[];
|
|
28
|
+
inline_entities: any[];
|
|
29
|
+
};
|
|
30
|
+
/** Delegate ke waitAllPromises dari mbuilder-utils */
|
|
31
|
+
static waitAllPromises(input: any): Promise<any>;
|
|
32
|
+
/**
|
|
33
|
+
* Resize gambar (Buffer) ke dimensi x × y.
|
|
34
|
+
* Output: PNG Buffer.
|
|
35
|
+
* fit: 'cover' | 'contain' | 'fill' | 'inside' | 'outside'
|
|
36
|
+
*/
|
|
37
|
+
static resize(buffer: Buffer, x: number, y: number, fit?: any): Promise<Buffer>;
|
|
38
|
+
/**
|
|
39
|
+
* Fetch URL → Buffer.
|
|
40
|
+
* silent=true (default): return Buffer kosong jika gagal, tanpa throw.
|
|
41
|
+
* silent=false: throw jika HTTP error atau network error.
|
|
42
|
+
*/
|
|
43
|
+
static fetchBuffer(url: string, options?: RequestInit, { silent }?: {
|
|
44
|
+
silent?: boolean | undefined;
|
|
45
|
+
}): Promise<Buffer>;
|
|
46
|
+
/**
|
|
47
|
+
* Upload Buffer atau URL ke CDN WhatsApp dan return URL CDN-nya.
|
|
48
|
+
* Berguna untuk mendapat URL media yang bisa dipakai di interactiveMessage header.
|
|
49
|
+
*/
|
|
50
|
+
static toUrl(_client: any, path: Buffer | string, mediaType?: string): Promise<string | undefined>;
|
|
51
|
+
/**
|
|
52
|
+
* Resolve media (URL / Buffer / base64 string) menjadi format yang diinginkan.
|
|
53
|
+
*
|
|
54
|
+
* result: 'url' | 'buffer' | 'base64'
|
|
55
|
+
* resolveUrl: true = fetch URL jadi Buffer dulu sebelum upload ke CDN
|
|
56
|
+
* resolveWAUrl: true = fetch WA CDN URL jadi Buffer
|
|
57
|
+
* resize: true = resize ke width × height sebelum return
|
|
58
|
+
*/
|
|
59
|
+
static resolveMedia(_client: any, media: any, mediaType?: string, { resolveUrl, resolveWAUrl, result, resize, width, height }?: {
|
|
60
|
+
resolveUrl?: boolean | undefined;
|
|
61
|
+
resolveWAUrl?: boolean | undefined;
|
|
62
|
+
result?: string | undefined;
|
|
63
|
+
resize?: boolean | undefined;
|
|
64
|
+
width?: number | undefined;
|
|
65
|
+
height?: number | undefined;
|
|
66
|
+
}): Promise<any>;
|
|
67
|
+
/**
|
|
68
|
+
* Baca durasi video MP4 dari Buffer tanpa ffmpeg.
|
|
69
|
+
* Parsing langsung atom moov/mvhd di binary MP4.
|
|
70
|
+
* silent=true (default): return 0 jika gagal.
|
|
71
|
+
*/
|
|
72
|
+
static getMp4Duration(buffer: Buffer, { silent }?: {
|
|
73
|
+
silent?: boolean | undefined;
|
|
74
|
+
}): number;
|
|
75
|
+
/**
|
|
76
|
+
* Ambil frame dari video MP4 Buffer sebagai gambar (thumbnail).
|
|
77
|
+
* time: detik ke-berapa frame diambil (default: 20% durasi video, max 10 detik)
|
|
78
|
+
* result: 'buffer' | 'base64'
|
|
79
|
+
* resize: true = resize ke width × height
|
|
80
|
+
* silent: true = return buffer kosong jika gagal (tidak throw)
|
|
81
|
+
*/
|
|
82
|
+
static getMp4Preview(videoBuffer: Buffer, { time, result, resize, width, height, silent }?: any): Promise<Buffer | string>;
|
|
83
|
+
/**
|
|
84
|
+
* JSON.stringify dengan unicode escape untuk karakter non-ASCII.
|
|
85
|
+
* Berguna saat payload dikirim ke endpoint yang strict soal encoding.
|
|
86
|
+
*/
|
|
87
|
+
static stringifyEscaped(obj: any): string;
|
|
88
|
+
}
|
|
89
|
+
export { Toolkit };
|
|
90
|
+
//# sourceMappingURL=mbuilder-toolkit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mbuilder-toolkit.d.ts","sourceRoot":"","sources":["../../src/Utils/mbuilder-toolkit.ts"],"names":[],"mappings":"AACA;;;;;;;;;;GAUG;AAUH;;;;;;;;;GASG;AACH,cAAM,OAAO;;IAGZ,gDAAgD;IAChD,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG;;;;;IAIzC,sDAAsD;WACzC,eAAe,CAAC,KAAK,EAAE,GAAG;IAIvC;;;;OAIG;WACU,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,GAAE,GAAa,GAAG,OAAO,CAAC,MAAM,CAAC;IAW9F;;;;OAIG;WACU,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,EAAE,EAAE,MAAa,EAAE;;KAAK,GAAG,OAAO,CAAC,MAAM,CAAC;IAWzG;;;OAGG;WACU,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,SAAS,SAAa,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAe5G;;;;;;;OAOG;WACU,YAAY,CACxB,OAAO,EAAE,GAAG,EACZ,KAAK,EAAE,GAAG,EACV,SAAS,SAAU,EACnB,EAAE,UAAkB,EAAE,YAAoB,EAAE,MAAc,EAAE,MAAc,EAAE,KAAW,EAAE,MAAY,EAAE;;;;;;;KAAK,GAC1G,OAAO,CAAC,GAAG,CAAC;IA+Cf;;;;OAIG;IACH,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,MAAa,EAAE;;KAAK,GAAG,MAAM;IAwDrE;;;;;;OAMG;IACH,MAAM,CAAC,aAAa,CACnB,WAAW,EAAE,MAAM,EACnB,EAAE,IAAI,EAAE,MAAiB,EAAE,MAAa,EAAE,KAAW,EAAE,MAAY,EAAE,MAAa,EAAE,GAAE,GAAQ,GAC5F,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;IA4C3B;;;OAGG;IACH,MAAM,CAAC,gBAAgB,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM;CAKzC;AAED,OAAO,EAAE,OAAO,EAAE,CAAC"}
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
// @ts-nocheck
|
|
2
|
+
/**
|
|
3
|
+
* Do not remove this watermark.
|
|
4
|
+
*
|
|
5
|
+
* NIXCODE - Advanced WhatsApp Interactive Message Builder
|
|
6
|
+
* Created by Nixel
|
|
7
|
+
* Contributors: ~ Ahmad tumbuh kembang
|
|
8
|
+
*
|
|
9
|
+
* Copyright (c) 2026 Nixel
|
|
10
|
+
* Permission is granted to use and modify this library for personal or commercial projects.
|
|
11
|
+
* Reuploading, reselling, or redistributing as a standalone product is prohibited.
|
|
12
|
+
*/
|
|
13
|
+
'use strict';
|
|
14
|
+
import sharp from 'sharp';
|
|
15
|
+
import ffmpeg from 'fluent-ffmpeg';
|
|
16
|
+
import { PassThrough, Readable } from 'stream';
|
|
17
|
+
import { prepareWAMessageMedia } from 'baileys';
|
|
18
|
+
import { extractIE, waitAllPromises } from './mbuilder-utils.js';
|
|
19
|
+
/**
|
|
20
|
+
* Toolkit — kumpulan static helper untuk proses media sebelum dikirim ke WA.
|
|
21
|
+
*
|
|
22
|
+
* Semua method static, tidak perlu new Toolkit().
|
|
23
|
+
*
|
|
24
|
+
* Contoh:
|
|
25
|
+
* const thumb = await Toolkit.getMp4Preview(videoBuffer)
|
|
26
|
+
* const buf = await Toolkit.fetchBuffer('https://...')
|
|
27
|
+
* const url = await Toolkit.toUrl(conn, imageBuffer, 'image')
|
|
28
|
+
*/
|
|
29
|
+
class Toolkit {
|
|
30
|
+
constructor() { }
|
|
31
|
+
/** Delegate ke extractIE dari mbuilder-utils */
|
|
32
|
+
static extractIE(text, opts) {
|
|
33
|
+
return extractIE(text, opts);
|
|
34
|
+
}
|
|
35
|
+
/** Delegate ke waitAllPromises dari mbuilder-utils */
|
|
36
|
+
static async waitAllPromises(input) {
|
|
37
|
+
return await waitAllPromises(input);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Resize gambar (Buffer) ke dimensi x × y.
|
|
41
|
+
* Output: PNG Buffer.
|
|
42
|
+
* fit: 'cover' | 'contain' | 'fill' | 'inside' | 'outside'
|
|
43
|
+
*/
|
|
44
|
+
static async resize(buffer, x, y, fit = 'cover') {
|
|
45
|
+
return await sharp(buffer)
|
|
46
|
+
.resize(x, y, {
|
|
47
|
+
fit,
|
|
48
|
+
position: 'center',
|
|
49
|
+
background: { r: 0, g: 0, b: 0, alpha: 0 },
|
|
50
|
+
})
|
|
51
|
+
.png()
|
|
52
|
+
.toBuffer();
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Fetch URL → Buffer.
|
|
56
|
+
* silent=true (default): return Buffer kosong jika gagal, tanpa throw.
|
|
57
|
+
* silent=false: throw jika HTTP error atau network error.
|
|
58
|
+
*/
|
|
59
|
+
static async fetchBuffer(url, options = {}, { silent = true } = {}) {
|
|
60
|
+
try {
|
|
61
|
+
const response = await fetch(url, options);
|
|
62
|
+
if (!response.ok)
|
|
63
|
+
throw new Error(`HTTP ${response.status}`);
|
|
64
|
+
return Buffer.from(await response.arrayBuffer());
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
if (silent)
|
|
68
|
+
return Buffer.alloc(0);
|
|
69
|
+
throw error;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Upload Buffer atau URL ke CDN WhatsApp dan return URL CDN-nya.
|
|
74
|
+
* Berguna untuk mendapat URL media yang bisa dipakai di interactiveMessage header.
|
|
75
|
+
*/
|
|
76
|
+
static async toUrl(_client, path, mediaType = 'document') {
|
|
77
|
+
if (!path)
|
|
78
|
+
throw new Error('Url or buffer needed');
|
|
79
|
+
const media = await prepareWAMessageMedia({ [mediaType]: Buffer.isBuffer(path) ? path : { url: path } }, {
|
|
80
|
+
upload: _client.waUploadToServer,
|
|
81
|
+
// @newsletter = bypass enkripsi CDN
|
|
82
|
+
jid: '\u0040\u006e\u0065\u0077\u0073\u006c\u0065\u0074\u0074\u0065\u0072',
|
|
83
|
+
});
|
|
84
|
+
return Object.values(media)[0]?.url;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Resolve media (URL / Buffer / base64 string) menjadi format yang diinginkan.
|
|
88
|
+
*
|
|
89
|
+
* result: 'url' | 'buffer' | 'base64'
|
|
90
|
+
* resolveUrl: true = fetch URL jadi Buffer dulu sebelum upload ke CDN
|
|
91
|
+
* resolveWAUrl: true = fetch WA CDN URL jadi Buffer
|
|
92
|
+
* resize: true = resize ke width × height sebelum return
|
|
93
|
+
*/
|
|
94
|
+
static async resolveMedia(_client, media, mediaType = 'image', { resolveUrl = false, resolveWAUrl = false, result = 'url', resize = false, width = 300, height = 300 } = {}) {
|
|
95
|
+
const isUrl = (str) => /^https?:\/\/.+/i.test(str);
|
|
96
|
+
const isWAUrl = (str) => /^https?:\/\/[^/]*\.whatsapp\.net\//i.test(str);
|
|
97
|
+
if (Array.isArray(media)) {
|
|
98
|
+
return Promise.all(media.map((item) => Toolkit.resolveMedia(_client, item, mediaType, { resolveUrl, resolveWAUrl, result, resize, width, height })));
|
|
99
|
+
}
|
|
100
|
+
const originalIsBuffer = Buffer.isBuffer(media);
|
|
101
|
+
if (typeof media === 'string' && isUrl(media)) {
|
|
102
|
+
if (isWAUrl(media)) {
|
|
103
|
+
if (resolveWAUrl) {
|
|
104
|
+
media = await Toolkit.fetchBuffer(media, {}, { silent: true });
|
|
105
|
+
}
|
|
106
|
+
else if (!resolveUrl) {
|
|
107
|
+
if (result === 'url')
|
|
108
|
+
return media;
|
|
109
|
+
media = await Toolkit.fetchBuffer(media, {}, { silent: true });
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
if (!resolveUrl) {
|
|
114
|
+
if (result === 'url')
|
|
115
|
+
return media;
|
|
116
|
+
media = await Toolkit.fetchBuffer(media, {}, { silent: true });
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
media = await Toolkit.fetchBuffer(media, {}, { silent: true });
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
if (typeof media === 'string' && !isUrl(media)) {
|
|
124
|
+
media = Buffer.from(media, 'base64');
|
|
125
|
+
}
|
|
126
|
+
if (!Buffer.isBuffer(media) || !media.length)
|
|
127
|
+
return;
|
|
128
|
+
if (resize && Buffer.isBuffer(media)) {
|
|
129
|
+
media = await Toolkit.resize(media, width, height);
|
|
130
|
+
}
|
|
131
|
+
if (result === 'buffer')
|
|
132
|
+
return media;
|
|
133
|
+
if (result === 'base64')
|
|
134
|
+
return media.toString('base64');
|
|
135
|
+
// Upload ke CDN WA
|
|
136
|
+
return Toolkit.toUrl(_client, media, mediaType);
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Baca durasi video MP4 dari Buffer tanpa ffmpeg.
|
|
140
|
+
* Parsing langsung atom moov/mvhd di binary MP4.
|
|
141
|
+
* silent=true (default): return 0 jika gagal.
|
|
142
|
+
*/
|
|
143
|
+
static getMp4Duration(buffer, { silent = true } = {}) {
|
|
144
|
+
try {
|
|
145
|
+
if (!Buffer.isBuffer(buffer) || buffer.length < 8) {
|
|
146
|
+
if (silent)
|
|
147
|
+
return 0;
|
|
148
|
+
throw new Error('Invalid buffer');
|
|
149
|
+
}
|
|
150
|
+
let offset = 0;
|
|
151
|
+
while (offset < buffer.length - 8) {
|
|
152
|
+
const size = buffer.readUInt32BE(offset);
|
|
153
|
+
if (size < 8 || offset + size > buffer.length) {
|
|
154
|
+
if (silent)
|
|
155
|
+
return 0;
|
|
156
|
+
throw new Error('Invalid atom size');
|
|
157
|
+
}
|
|
158
|
+
const type = buffer.toString('ascii', offset + 4, offset + 8);
|
|
159
|
+
if (type === 'moov') {
|
|
160
|
+
let moovOffset = offset + 8;
|
|
161
|
+
const moovEnd = offset + size;
|
|
162
|
+
while (moovOffset < moovEnd - 8) {
|
|
163
|
+
const childSize = buffer.readUInt32BE(moovOffset);
|
|
164
|
+
if (childSize < 8 || moovOffset + childSize > moovEnd) {
|
|
165
|
+
if (silent)
|
|
166
|
+
return 0;
|
|
167
|
+
throw new Error('Invalid child atom size');
|
|
168
|
+
}
|
|
169
|
+
const childType = buffer.toString('ascii', moovOffset + 4, moovOffset + 8);
|
|
170
|
+
if (childType === 'mvhd') {
|
|
171
|
+
const version = buffer.readUInt8(moovOffset + 8);
|
|
172
|
+
if (version === 0) {
|
|
173
|
+
const timescale = buffer.readUInt32BE(moovOffset + 20);
|
|
174
|
+
const duration = buffer.readUInt32BE(moovOffset + 24);
|
|
175
|
+
if (!timescale) {
|
|
176
|
+
if (silent)
|
|
177
|
+
return 0;
|
|
178
|
+
throw new Error('Invalid timescale');
|
|
179
|
+
}
|
|
180
|
+
return duration / timescale;
|
|
181
|
+
}
|
|
182
|
+
if (version === 1) {
|
|
183
|
+
const timescale = buffer.readUInt32BE(moovOffset + 32);
|
|
184
|
+
const duration = Number(buffer.readBigUInt64BE(moovOffset + 36));
|
|
185
|
+
if (!timescale) {
|
|
186
|
+
if (silent)
|
|
187
|
+
return 0;
|
|
188
|
+
throw new Error('Invalid timescale');
|
|
189
|
+
}
|
|
190
|
+
return duration / timescale;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
moovOffset += childSize;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
offset += size;
|
|
197
|
+
}
|
|
198
|
+
if (silent)
|
|
199
|
+
return 0;
|
|
200
|
+
throw new Error('No mvhd found!');
|
|
201
|
+
}
|
|
202
|
+
catch (err) {
|
|
203
|
+
if (silent)
|
|
204
|
+
return 0;
|
|
205
|
+
throw err;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Ambil frame dari video MP4 Buffer sebagai gambar (thumbnail).
|
|
210
|
+
* time: detik ke-berapa frame diambil (default: 20% durasi video, max 10 detik)
|
|
211
|
+
* result: 'buffer' | 'base64'
|
|
212
|
+
* resize: true = resize ke width × height
|
|
213
|
+
* silent: true = return buffer kosong jika gagal (tidak throw)
|
|
214
|
+
*/
|
|
215
|
+
static getMp4Preview(videoBuffer, { time, result = 'buffer', resize = true, width = 300, height = 300, silent = true } = {}) {
|
|
216
|
+
return new Promise((resolve, reject) => {
|
|
217
|
+
const fail = (err) => {
|
|
218
|
+
if (silent)
|
|
219
|
+
return resolve(result === 'base64' ? '' : Buffer.alloc(0));
|
|
220
|
+
return reject(err);
|
|
221
|
+
};
|
|
222
|
+
try {
|
|
223
|
+
if (!Buffer.isBuffer(videoBuffer) || !videoBuffer.length) {
|
|
224
|
+
return fail(new Error('videoBuffer tidak valid atau kosong'));
|
|
225
|
+
}
|
|
226
|
+
const inputStream = new Readable({ read() { } });
|
|
227
|
+
inputStream.push(videoBuffer);
|
|
228
|
+
inputStream.push(null);
|
|
229
|
+
const outputStream = new PassThrough();
|
|
230
|
+
const chunks = [];
|
|
231
|
+
outputStream.on('data', (chunk) => chunks.push(chunk));
|
|
232
|
+
outputStream.on('end', async () => {
|
|
233
|
+
try {
|
|
234
|
+
let output = Buffer.concat(chunks);
|
|
235
|
+
if (!output.length)
|
|
236
|
+
return fail(new Error('Output kosong — cek format atau timestamp video'));
|
|
237
|
+
if (resize)
|
|
238
|
+
output = await Toolkit.resize(output, width, height);
|
|
239
|
+
return resolve(result === 'base64' ? output.toString('base64') : output);
|
|
240
|
+
}
|
|
241
|
+
catch (err) {
|
|
242
|
+
return fail(err);
|
|
243
|
+
}
|
|
244
|
+
});
|
|
245
|
+
outputStream.on('error', fail);
|
|
246
|
+
const t = time ?? Math.min(Toolkit.getMp4Duration(videoBuffer) * 0.2, 10);
|
|
247
|
+
ffmpeg(inputStream)
|
|
248
|
+
.outputOptions([`-ss ${t}`, '-vframes 1', '-vcodec png', '-f image2pipe'])
|
|
249
|
+
.on('error', (err) => fail(new Error(`ffmpeg error: ${err.message}`)))
|
|
250
|
+
.pipe(outputStream, { end: true });
|
|
251
|
+
}
|
|
252
|
+
catch (err) {
|
|
253
|
+
return fail(err);
|
|
254
|
+
}
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* JSON.stringify dengan unicode escape untuk karakter non-ASCII.
|
|
259
|
+
* Berguna saat payload dikirim ke endpoint yang strict soal encoding.
|
|
260
|
+
*/
|
|
261
|
+
static stringifyEscaped(obj) {
|
|
262
|
+
return JSON.stringify(obj).replace(/[\u007f-\uffff]/g, (c) => '\\u' + c.charCodeAt(0).toString(16).padStart(4, '0'));
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
export { Toolkit };
|
|
266
|
+
//# sourceMappingURL=mbuilder-toolkit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mbuilder-toolkit.js","sourceRoot":"","sources":["../../src/Utils/mbuilder-toolkit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Do not remove this watermark.
|
|
3
|
+
*
|
|
4
|
+
* NIXCODE - Advanced WhatsApp Interactive Message Builder
|
|
5
|
+
* Built for creating buttons, carousels, native flows,
|
|
6
|
+
* and AI rich response payloads using Baileys with
|
|
7
|
+
* fluent chaining, flexible payload customization,
|
|
8
|
+
* and scalable architecture for modern bot development.
|
|
9
|
+
*
|
|
10
|
+
* Runtime:
|
|
11
|
+
* - Baileys: @whiskeysockets/baileys (latest)
|
|
12
|
+
*
|
|
13
|
+
* Created by Nixel
|
|
14
|
+
* Contributors: ~ Ahmad tumbuh kembang
|
|
15
|
+
*
|
|
16
|
+
* WhatsApp: wa.me/6285188349341
|
|
17
|
+
* Channel: https://whatsapp.com/channel/0029VbCV1ck8fewpdNb2TY2k
|
|
18
|
+
*
|
|
19
|
+
* Copyright (c) 2026 Nixel
|
|
20
|
+
*
|
|
21
|
+
* Permission is granted to use and modify this library
|
|
22
|
+
* for personal or commercial projects.
|
|
23
|
+
*
|
|
24
|
+
* Reuploading, reselling, relicensing, or redistributing
|
|
25
|
+
* this library as a standalone product is prohibited.
|
|
26
|
+
*
|
|
27
|
+
* Do not claim this project as your own original work.
|
|
28
|
+
*/
|
|
29
|
+
/**
|
|
30
|
+
* Parser untuk inline entities di teks AiRich:
|
|
31
|
+
* - [teks](url) → hyperlink
|
|
32
|
+
* - [](url) → citation
|
|
33
|
+
* - [teks|w|h]<url> → latex image
|
|
34
|
+
*
|
|
35
|
+
* Prefix `!` di url = untrusted hyperlink, misal: [klik](!https://...)
|
|
36
|
+
*/
|
|
37
|
+
declare function extractIE(text: string, { extract, hyperlink, citation, latex }?: {
|
|
38
|
+
extract?: boolean | undefined;
|
|
39
|
+
hyperlink?: boolean | undefined;
|
|
40
|
+
citation?: boolean | undefined;
|
|
41
|
+
latex?: boolean | undefined;
|
|
42
|
+
}): {
|
|
43
|
+
text: string;
|
|
44
|
+
ie: any[];
|
|
45
|
+
inline_entities: any[];
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Resolve semua Promise secara rekursif di dalam object/array bersarang.
|
|
49
|
+
* Berguna untuk await semua nilai async sekaligus sebelum dilempar ke payload.
|
|
50
|
+
*/
|
|
51
|
+
declare function waitAllPromises(input: any): Promise<any>;
|
|
52
|
+
declare class AIRichError extends Error {
|
|
53
|
+
code: string;
|
|
54
|
+
constructor(message: string, code: string, meta?: Record<string, any>);
|
|
55
|
+
}
|
|
56
|
+
declare class ItemNotFoundError extends AIRichError {
|
|
57
|
+
constructor(id: string, availableIds?: string[]);
|
|
58
|
+
}
|
|
59
|
+
declare class DuplicateIdError extends AIRichError {
|
|
60
|
+
constructor(id: string);
|
|
61
|
+
}
|
|
62
|
+
declare class InvalidTargetError extends AIRichError {
|
|
63
|
+
constructor(message: string, meta?: Record<string, any>);
|
|
64
|
+
}
|
|
65
|
+
declare class ContentValidationError extends AIRichError {
|
|
66
|
+
constructor(message: string, meta?: Record<string, any>);
|
|
67
|
+
}
|
|
68
|
+
export { extractIE, waitAllPromises, AIRichError, ItemNotFoundError, DuplicateIdError, InvalidTargetError, ContentValidationError, };
|
|
69
|
+
//# sourceMappingURL=mbuilder-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mbuilder-utils.d.ts","sourceRoot":"","sources":["../../src/Utils/mbuilder-utils.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAQH;;;;;;;GAOG;AACH,iBAAS,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAc,EAAE,SAAgB,EAAE,QAAe,EAAE,KAAY,EAAE;;;;;CAAK;;;;EAqHxG;AAED;;;GAGG;AACH,iBAAe,eAAe,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAevD;AAID,cAAM,WAAY,SAAQ,KAAK;IAC9B,IAAI,EAAE,MAAM,CAAC;gBACD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM;CAMzE;AAED,cAAM,iBAAkB,SAAQ,WAAW;gBAC9B,EAAE,EAAE,MAAM,EAAE,YAAY,GAAE,MAAM,EAAO;CAQnD;AAED,cAAM,gBAAiB,SAAQ,WAAW;gBAC7B,EAAE,EAAE,MAAM;CAItB;AAED,cAAM,kBAAmB,SAAQ,WAAW;gBAC/B,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM;CAI3D;AAED,cAAM,sBAAuB,SAAQ,WAAW;gBACnC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM;CAI3D;AAED,OAAO,EACN,SAAS,EACT,eAAe,EACf,WAAW,EACX,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,sBAAsB,GACtB,CAAC"}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
// @ts-nocheck
|
|
2
|
+
/**
|
|
3
|
+
* Do not remove this watermark.
|
|
4
|
+
*
|
|
5
|
+
* NIXCODE - Advanced WhatsApp Interactive Message Builder
|
|
6
|
+
* Built for creating buttons, carousels, native flows,
|
|
7
|
+
* and AI rich response payloads using Baileys with
|
|
8
|
+
* fluent chaining, flexible payload customization,
|
|
9
|
+
* and scalable architecture for modern bot development.
|
|
10
|
+
*
|
|
11
|
+
* Runtime:
|
|
12
|
+
* - Baileys: @whiskeysockets/baileys (latest)
|
|
13
|
+
*
|
|
14
|
+
* Created by Nixel
|
|
15
|
+
* Contributors: ~ Ahmad tumbuh kembang
|
|
16
|
+
*
|
|
17
|
+
* WhatsApp: wa.me/6285188349341
|
|
18
|
+
* Channel: https://whatsapp.com/channel/0029VbCV1ck8fewpdNb2TY2k
|
|
19
|
+
*
|
|
20
|
+
* Copyright (c) 2026 Nixel
|
|
21
|
+
*
|
|
22
|
+
* Permission is granted to use and modify this library
|
|
23
|
+
* for personal or commercial projects.
|
|
24
|
+
*
|
|
25
|
+
* Reuploading, reselling, relicensing, or redistributing
|
|
26
|
+
* this library as a standalone product is prohibited.
|
|
27
|
+
*
|
|
28
|
+
* Do not claim this project as your own original work.
|
|
29
|
+
*/
|
|
30
|
+
'use strict';
|
|
31
|
+
// ─── Step 1: Foundations ─────────────────────────────────────────────────────
|
|
32
|
+
// extractIE, waitAllPromises, error classes
|
|
33
|
+
// Ported from MessageBuilderV4.7.js by Nixel
|
|
34
|
+
/**
|
|
35
|
+
* Parser untuk inline entities di teks AiRich:
|
|
36
|
+
* - [teks](url) → hyperlink
|
|
37
|
+
* - [](url) → citation
|
|
38
|
+
* - [teks|w|h]<url> → latex image
|
|
39
|
+
*
|
|
40
|
+
* Prefix `!` di url = untrusted hyperlink, misal: [klik](!https://...)
|
|
41
|
+
*/
|
|
42
|
+
function extractIE(text, { extract = true, hyperlink = true, citation = true, latex = true } = {}) {
|
|
43
|
+
if (!extract) {
|
|
44
|
+
return { text, ie: [], inline_entities: [] };
|
|
45
|
+
}
|
|
46
|
+
const createIE = (type, ie) => {
|
|
47
|
+
if (type === 'hyperlink') {
|
|
48
|
+
return {
|
|
49
|
+
key: ie.key,
|
|
50
|
+
metadata: {
|
|
51
|
+
display_name: ie.text,
|
|
52
|
+
is_trusted: ie.is_trusted,
|
|
53
|
+
url: ie.url,
|
|
54
|
+
__typename: 'GenAIInlineLinkItem',
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
if (type === 'citation') {
|
|
59
|
+
return {
|
|
60
|
+
key: ie.key,
|
|
61
|
+
metadata: {
|
|
62
|
+
reference_id: ie.reference_id,
|
|
63
|
+
reference_url: ie.url,
|
|
64
|
+
reference_title: ie.url,
|
|
65
|
+
reference_display_name: ie.url,
|
|
66
|
+
sources: [],
|
|
67
|
+
__typename: 'GenAISearchCitationItem',
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
if (type === 'latex') {
|
|
72
|
+
return {
|
|
73
|
+
key: ie.key,
|
|
74
|
+
metadata: {
|
|
75
|
+
latex_expression: ie.text,
|
|
76
|
+
latex_image: {
|
|
77
|
+
url: ie.url,
|
|
78
|
+
width: Number(ie.width) || 100,
|
|
79
|
+
height: Number(ie.height) || 100,
|
|
80
|
+
},
|
|
81
|
+
font_height: Number(ie.font_height) || 83.333333333333,
|
|
82
|
+
padding: Number(ie.padding) || 15,
|
|
83
|
+
__typename: 'GenAILatexItem',
|
|
84
|
+
},
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
let ie = [];
|
|
89
|
+
let inline_entities = [];
|
|
90
|
+
let result = '';
|
|
91
|
+
let last = 0;
|
|
92
|
+
let citation_index = 1;
|
|
93
|
+
let hyperlink_index = 0;
|
|
94
|
+
let latex_index = 0;
|
|
95
|
+
let stack = [];
|
|
96
|
+
for (let i = 0; i < text.length; i++) {
|
|
97
|
+
if (text[i] === '[' && text[i - 1] !== '\\') {
|
|
98
|
+
stack.push(i);
|
|
99
|
+
}
|
|
100
|
+
else if (text[i] === ']' && (text[i + 1] === '(' || text[i + 1] === '<')) {
|
|
101
|
+
let start = stack.pop();
|
|
102
|
+
if (start == null)
|
|
103
|
+
continue;
|
|
104
|
+
const open = text[i + 1];
|
|
105
|
+
const close = open === '(' ? ')' : '>';
|
|
106
|
+
const type = open === '(' ? 'link' : 'latex';
|
|
107
|
+
let end = i + 2;
|
|
108
|
+
let depth = 1;
|
|
109
|
+
while (end < text.length && depth) {
|
|
110
|
+
if (text[end] === open && text[end - 1] !== '\\')
|
|
111
|
+
depth++;
|
|
112
|
+
else if (text[end] === close && text[end - 1] !== '\\')
|
|
113
|
+
depth--;
|
|
114
|
+
end++;
|
|
115
|
+
}
|
|
116
|
+
if (depth)
|
|
117
|
+
continue;
|
|
118
|
+
const raw = text.slice(start + 1, i).trim();
|
|
119
|
+
let url = text.slice(i + 2, end - 1).trim();
|
|
120
|
+
let key;
|
|
121
|
+
let tag;
|
|
122
|
+
let data;
|
|
123
|
+
if (type === 'latex') {
|
|
124
|
+
if (!latex)
|
|
125
|
+
continue;
|
|
126
|
+
const [txt = '', width = null, height = null, font_height = null, padding = null] = raw.split('|');
|
|
127
|
+
key = `\u004E\u0049\u0058\u0045\u004C_LATEX_${latex_index++}`;
|
|
128
|
+
tag = `{{${key}}}${txt || 'image'}{{/${key}}}`;
|
|
129
|
+
data = { type: 'latex', ie: { key, text: txt, url, width, height, font_height, padding } };
|
|
130
|
+
}
|
|
131
|
+
else if (raw) {
|
|
132
|
+
if (!hyperlink)
|
|
133
|
+
continue;
|
|
134
|
+
const trusted = !url.startsWith('!');
|
|
135
|
+
if (!trusted)
|
|
136
|
+
url = url.slice(1);
|
|
137
|
+
key = `\u004E\u0049\u0058\u0045\u004C_HYPERLINK_${hyperlink_index++}`;
|
|
138
|
+
tag = `{{${key}}}${url}{{/${key}}}`;
|
|
139
|
+
data = { type: 'hyperlink', ie: { key, text: raw, url, is_trusted: trusted } };
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
if (!citation)
|
|
143
|
+
continue;
|
|
144
|
+
key = `\u004E\u0049\u0058\u0045\u004C_CITATION_${citation_index - 1}`;
|
|
145
|
+
tag = `{{${key}}}${url}{{/${key}}}`;
|
|
146
|
+
data = { type: 'citation', ie: { reference_id: citation_index++, key, text: '', url } };
|
|
147
|
+
}
|
|
148
|
+
result += text.slice(last, start) + tag;
|
|
149
|
+
last = end;
|
|
150
|
+
ie.push(data);
|
|
151
|
+
const entity = createIE(data.type, data.ie);
|
|
152
|
+
if (entity)
|
|
153
|
+
inline_entities.push(entity);
|
|
154
|
+
i = end - 1;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
result += text.slice(last);
|
|
158
|
+
return { text: result, ie, inline_entities };
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Resolve semua Promise secara rekursif di dalam object/array bersarang.
|
|
162
|
+
* Berguna untuk await semua nilai async sekaligus sebelum dilempar ke payload.
|
|
163
|
+
*/
|
|
164
|
+
async function waitAllPromises(input) {
|
|
165
|
+
const isPromise = (v) => v && typeof v.then === 'function';
|
|
166
|
+
const isObject = (v) => v && typeof v === 'object';
|
|
167
|
+
const deep = async (v) => {
|
|
168
|
+
if (isPromise(v))
|
|
169
|
+
return deep(await v);
|
|
170
|
+
if (Array.isArray(v))
|
|
171
|
+
return Promise.all(v.map(deep));
|
|
172
|
+
if (isObject(v)) {
|
|
173
|
+
const entries = await Promise.all(Object.entries(v).map(async ([k, val]) => [k, await deep(val)]));
|
|
174
|
+
return Object.fromEntries(entries);
|
|
175
|
+
}
|
|
176
|
+
return v;
|
|
177
|
+
};
|
|
178
|
+
return deep(await input);
|
|
179
|
+
}
|
|
180
|
+
// ─── Error Classes ────────────────────────────────────────────────────────────
|
|
181
|
+
class AIRichError extends Error {
|
|
182
|
+
constructor(message, code, meta = {}) {
|
|
183
|
+
super(message);
|
|
184
|
+
this.name = 'AIRichError';
|
|
185
|
+
this.code = code;
|
|
186
|
+
Object.assign(this, meta);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
class ItemNotFoundError extends AIRichError {
|
|
190
|
+
constructor(id, availableIds = []) {
|
|
191
|
+
super(`Item id "${id}" not found${availableIds.length ? ` (available: ${availableIds.join(', ')})` : ' (no items have an id yet)'}`, 'ITEM_NOT_FOUND', { id, availableIds });
|
|
192
|
+
this.name = 'ItemNotFoundError';
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
class DuplicateIdError extends AIRichError {
|
|
196
|
+
constructor(id) {
|
|
197
|
+
super(`Item id "${id}" already exists`, 'DUPLICATE_ID', { id });
|
|
198
|
+
this.name = 'DuplicateIdError';
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
class InvalidTargetError extends AIRichError {
|
|
202
|
+
constructor(message, meta = {}) {
|
|
203
|
+
super(message, 'INVALID_TARGET', meta);
|
|
204
|
+
this.name = 'InvalidTargetError';
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
class ContentValidationError extends AIRichError {
|
|
208
|
+
constructor(message, meta = {}) {
|
|
209
|
+
super(message, 'CONTENT_VALIDATION', meta);
|
|
210
|
+
this.name = 'ContentValidationError';
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
export { extractIE, waitAllPromises, AIRichError, ItemNotFoundError, DuplicateIdError, InvalidTargetError, ContentValidationError, };
|
|
214
|
+
//# sourceMappingURL=mbuilder-utils.js.map
|