@rexxhayanasi/elaina-baileys 1.1.0-rc.3 → 1.1.0-rc.5

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.
@@ -1,5 +1,9 @@
1
- const WAProto = require('../../WAProto').proto;
2
- const crypto = require('crypto');
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+
5
+ const WAProto = require("../../WAProto").proto;
6
+ const crypto = require("crypto");
3
7
  const Utils_1 = require("../Utils");
4
8
 
5
9
  class RexxHayanasi {
@@ -7,39 +11,34 @@ class RexxHayanasi {
7
11
  this.utils = utils;
8
12
  this.relayMessage = relayMessageFn;
9
13
  this.waUploadToServer = waUploadToServer;
10
-
11
14
  this.bail = {
12
15
  generateWAMessageContent: this.utils.generateWAMessageContent || Utils_1.generateWAMessageContent,
13
16
  generateMessageID: Utils_1.generateMessageID,
14
- // FIXED: safer getContentType guard
15
17
  getContentType: (msg) => {
16
- if (!msg || typeof msg !== 'object') return null;
18
+ if (!msg || typeof msg !== "object") return null;
17
19
  const m = msg.message || {};
18
- if (typeof m !== 'object') return null;
20
+ if (typeof m !== "object") return null;
19
21
  return Object.keys(m)[0] || null;
20
22
  }
21
23
  };
22
24
  }
23
25
 
24
26
  detectType(content) {
25
- if (content.requestPaymentMessage) return 'PAYMENT';
26
- if (content.productMessage) return 'PRODUCT';
27
- if (content.interactiveMessage) return 'INTERACTIVE';
28
- if (content.albumMessage) return 'ALBUM';
29
- if (content.eventMessage) return 'EVENT';
30
- if (content.pollResultMessage) return 'POLL_RESULT';
31
- if (content.groupStatusMessage) return 'GROUP_STORY';
27
+ if (content.requestPaymentMessage) return "PAYMENT";
28
+ if (content.productMessage) return "PRODUCT";
29
+ if (content.interactiveMessage) return "INTERACTIVE";
30
+ if (content.albumMessage) return "ALBUM";
31
+ if (content.eventMessage) return "EVENT";
32
+ if (content.pollResultMessage) return "POLL_RESULT";
33
+ if (content.groupStatusMessage) return "GROUP_STORY";
32
34
  return null;
33
35
  }
34
36
 
35
37
  async handlePayment(content, quoted) {
36
- // FIXED: Guard & error handling
37
38
  const data = content?.requestPaymentMessage;
38
- if (!data) throw new Error('Missing requestPaymentMessage in content');
39
-
39
+ if (!data) throw new Error("Missing requestPaymentMessage in content");
40
40
  try {
41
41
  let notes = {};
42
-
43
42
  if (data.sticker?.stickerMessage) {
44
43
  notes = {
45
44
  stickerMessage: {
@@ -63,7 +62,6 @@ class RexxHayanasi {
63
62
  }
64
63
  };
65
64
  }
66
-
67
65
  return {
68
66
  requestPaymentMessage: WAProto.Message.RequestPaymentMessage.fromObject({
69
67
  expiryTimestamp: data.expiry || 0,
@@ -73,55 +71,43 @@ class RexxHayanasi {
73
71
  noteMessage: notes,
74
72
  background: data.background ?? {
75
73
  id: "DEFAULT",
76
- placeholderArgb: 0xFFF0F0F0
74
+ placeholderArgb: 0xfff0f0f0
77
75
  }
78
76
  })
79
77
  };
80
78
  } catch (err) {
81
- console.error('handlePayment error:', err);
79
+ console.error("handlePayment error:", err);
82
80
  throw err;
83
81
  }
84
82
  }
85
-
83
+
86
84
  async handleProduct(content, jid, quoted) {
87
85
  try {
88
86
  const {
89
- title = "",
90
- description = "",
87
+ title = "",
88
+ description = "",
91
89
  thumbnail,
92
- productId,
93
- retailerId,
94
- url,
95
- body = "",
96
- footer = "",
90
+ productId,
91
+ retailerId,
92
+ url,
93
+ body = "",
94
+ footer = "",
97
95
  buttons = [],
98
96
  priceAmount1000 = null,
99
97
  currencyCode = "IDR"
100
98
  } = content.productMessage || {};
101
-
102
99
  let productImage = null;
103
-
104
- // FIXED: safer handling & fallback
105
100
  if (thumbnail) {
106
101
  try {
107
102
  if (Buffer.isBuffer(thumbnail)) {
108
- const res = await this.utils.generateWAMessageContent(
109
- { image: thumbnail },
110
- { upload: this.waUploadToServer }
111
- );
103
+ const res = await this.utils.generateWAMessageContent({ image: thumbnail }, { upload: this.waUploadToServer });
112
104
  productImage = res?.imageMessage || res?.message?.imageMessage || null;
113
- } else if (typeof thumbnail === 'object' && thumbnail.url) {
114
- const res = await this.utils.generateWAMessageContent(
115
- { image: { url: thumbnail.url }},
116
- { upload: this.waUploadToServer }
117
- );
105
+ } else if (typeof thumbnail === "object" && thumbnail.url) {
106
+ const res = await this.utils.generateWAMessageContent({ image: { url: thumbnail.url } }, { upload: this.waUploadToServer });
118
107
  productImage = res?.imageMessage || res?.message?.imageMessage || null;
119
108
  }
120
- } catch (err) {
121
- console.warn('Thumbnail upload failed', err);
122
- }
109
+ } catch {}
123
110
  }
124
-
125
111
  const product = {
126
112
  productId,
127
113
  title,
@@ -132,9 +118,7 @@ class RexxHayanasi {
132
118
  url,
133
119
  productImageCount: productImage ? 1 : 0
134
120
  };
135
-
136
121
  if (productImage) product.productImage = productImage;
137
-
138
122
  return {
139
123
  viewOnceMessage: {
140
124
  message: {
@@ -155,11 +139,11 @@ class RexxHayanasi {
155
139
  }
156
140
  };
157
141
  } catch (err) {
158
- console.error('handleProduct error:', err);
142
+ console.error("handleProduct error:", err);
159
143
  throw err;
160
144
  }
161
145
  }
162
-
146
+
163
147
  async handleInteractive(content, jid, quoted) {
164
148
  try {
165
149
  const {
@@ -178,96 +162,47 @@ class RexxHayanasi {
178
162
  nativeFlowMessage,
179
163
  header
180
164
  } = content.interactiveMessage || {};
181
-
182
165
  let media = null;
183
- let mediaType = null;
184
-
185
166
  if (thumbnail) {
167
+ media = await this.utils.prepareWAMessageMedia({ image: { url: thumbnail } }, { upload: this.waUploadToServer });
168
+ } else if (image) {
186
169
  media = await this.utils.prepareWAMessageMedia(
187
- { image: { url: thumbnail } },
170
+ typeof image === "object" && image.url ? { image: { url: image.url } } : { image },
188
171
  { upload: this.waUploadToServer }
189
172
  );
190
- mediaType = 'image';
191
- } else if (image) {
192
- if (typeof image === 'object' && image.url) {
193
- media = await this.utils.prepareWAMessageMedia(
194
- { image: { url: image.url } },
195
- { upload: this.waUploadToServer }
196
- );
197
- } else {
198
- media = await this.utils.prepareWAMessageMedia(
199
- { image },
200
- { upload: this.waUploadToServer }
201
- );
202
- }
203
- mediaType = 'image';
204
173
  } else if (video) {
205
- if (typeof video === 'object' && video.url) {
206
- media = await this.utils.prepareWAMessageMedia(
207
- { video: { url: video.url } },
208
- { upload: this.waUploadToServer }
209
- );
210
- } else {
211
- media = await this.utils.prepareWAMessageMedia(
212
- { video },
213
- { upload: this.waUploadToServer }
214
- );
215
- }
216
- mediaType = 'video';
217
- } else if (document) {
218
- let documentPayload = { document };
219
- if (jpegThumbnail) {
220
- if (typeof jpegThumbnail === 'object' && jpegThumbnail.url) {
221
- documentPayload.jpegThumbnail = { url: jpegThumbnail.url };
222
- } else {
223
- documentPayload.jpegThumbnail = jpegThumbnail;
224
- }
225
- }
226
174
  media = await this.utils.prepareWAMessageMedia(
227
- documentPayload,
175
+ typeof video === "object" && video.url ? { video: { url: video.url } } : { video },
228
176
  { upload: this.waUploadToServer }
229
177
  );
178
+ } else if (document) {
179
+ const docPayload = { document };
180
+ if (jpegThumbnail) {
181
+ docPayload.jpegThumbnail = typeof jpegThumbnail === "object" && jpegThumbnail.url ? { url: jpegThumbnail.url } : jpegThumbnail;
182
+ }
183
+ media = await this.utils.prepareWAMessageMedia(docPayload, { upload: this.waUploadToServer });
230
184
  if (fileName) media.documentMessage.fileName = fileName;
231
185
  if (mimetype) media.documentMessage.mimetype = mimetype;
232
- mediaType = 'document';
233
186
  }
234
-
235
- let interactiveMessage = {
187
+ const interactiveMessage = {
236
188
  body: { text: title || "" },
237
189
  footer: { text: footer || "" }
238
190
  };
239
-
240
- if (buttons && buttons.length > 0) {
191
+ if (buttons.length > 0) {
241
192
  interactiveMessage.nativeFlowMessage = { buttons };
242
- if (nativeFlowMessage) {
243
- interactiveMessage.nativeFlowMessage = {
244
- ...interactiveMessage.nativeFlowMessage,
245
- ...nativeFlowMessage
246
- };
247
- }
193
+ if (nativeFlowMessage) Object.assign(interactiveMessage.nativeFlowMessage, nativeFlowMessage);
248
194
  } else if (nativeFlowMessage) {
249
195
  interactiveMessage.nativeFlowMessage = nativeFlowMessage;
250
196
  }
251
-
252
- // FIXED: safer header spreading
253
197
  if (media) {
254
198
  const headerMedia = {};
255
199
  if (media.imageMessage) headerMedia.imageMessage = media.imageMessage;
256
200
  if (media.videoMessage) headerMedia.videoMessage = media.videoMessage;
257
201
  if (media.documentMessage) headerMedia.documentMessage = media.documentMessage;
258
-
259
- interactiveMessage.header = {
260
- title: header || "",
261
- hasMediaAttachment: true,
262
- ...headerMedia
263
- };
202
+ interactiveMessage.header = { title: header || "", hasMediaAttachment: true, ...headerMedia };
264
203
  } else {
265
- interactiveMessage.header = {
266
- title: header || "",
267
- hasMediaAttachment: false
268
- };
204
+ interactiveMessage.header = { title: header || "", hasMediaAttachment: false };
269
205
  }
270
-
271
206
  let finalContextInfo = {};
272
207
  if (contextInfo) {
273
208
  finalContextInfo = {
@@ -277,7 +212,6 @@ class RexxHayanasi {
277
212
  ...contextInfo
278
213
  };
279
214
  }
280
-
281
215
  if (externalAdReply) {
282
216
  finalContextInfo.externalAdReply = {
283
217
  title: externalAdReply.title || "",
@@ -291,50 +225,44 @@ class RexxHayanasi {
291
225
  ...externalAdReply
292
226
  };
293
227
  }
294
-
295
228
  if (Object.keys(finalContextInfo).length > 0) {
296
229
  interactiveMessage.contextInfo = finalContextInfo;
297
230
  }
298
-
299
231
  return { interactiveMessage };
300
232
  } catch (err) {
301
- console.error('handleInteractive error:', err);
233
+ console.error("handleInteractive error:", err);
302
234
  throw err;
303
235
  }
304
236
  }
305
-
237
+
306
238
  async handleAlbum(content, jid, quoted) {
307
239
  try {
308
240
  const array = Array.isArray(content.albumMessage) ? content.albumMessage : [];
309
- if (array.length === 0) throw new Error('albumMessage harus berupa array dengan isi media');
310
-
311
- const album = await this.utils.generateWAMessageFromContent(jid, {
312
- messageContextInfo: {
313
- messageSecret: crypto.randomBytes(32),
314
- },
315
- albumMessage: {
316
- expectedImageCount: array.filter(a => a.image).length,
317
- expectedVideoCount: array.filter(a => a.video).length,
241
+ if (array.length === 0) throw new Error("albumMessage harus berupa array dengan isi media");
242
+ const album = await this.utils.generateWAMessageFromContent(
243
+ jid,
244
+ {
245
+ messageContextInfo: { messageSecret: crypto.randomBytes(32) },
246
+ albumMessage: {
247
+ expectedImageCount: array.filter((a) => a.image).length,
248
+ expectedVideoCount: array.filter((a) => a.video).length
249
+ }
318
250
  },
319
- }, {
320
- userJid: this.utils.generateMessageID().split('@')[0] + '@s.whatsapp.net',
321
- quoted,
322
- upload: this.waUploadToServer
323
- });
324
-
251
+ {
252
+ userJid: this.utils.generateMessageID().split("@")[0] + "@s.whatsapp.net",
253
+ quoted,
254
+ upload: this.waUploadToServer
255
+ }
256
+ );
325
257
  await this.relayMessage(jid, album.message, { messageId: album.key.id });
326
-
327
- for (let item of array) {
328
- const img = await this.utils.generateWAMessage(jid, item, {
329
- upload: this.waUploadToServer,
330
- });
331
-
258
+ for (const item of array) {
259
+ const img = await this.utils.generateWAMessage(jid, item, { upload: this.waUploadToServer });
332
260
  img.message.messageContextInfo = {
333
261
  messageSecret: crypto.randomBytes(32),
334
262
  messageAssociation: {
335
263
  associationType: 1,
336
- parentMessageKey: album.key,
337
- },
264
+ parentMessageKey: album.key
265
+ },
338
266
  participant: "0@s.whatsapp.net",
339
267
  remoteJid: "status@broadcast",
340
268
  forwardingScore: 99999,
@@ -343,26 +271,20 @@ class RexxHayanasi {
343
271
  starred: true,
344
272
  labels: ["Y", "Important"],
345
273
  isHighlighted: true,
346
- businessMessageForwardInfo: {
347
- businessOwnerJid: jid,
348
- },
349
- dataSharingContext: {
350
- showMmDisclosure: true,
351
- },
274
+ businessMessageForwardInfo: { businessOwnerJid: jid },
275
+ dataSharingContext: { showMmDisclosure: true }
352
276
  };
353
-
354
277
  img.message.forwardedNewsletterMessageInfo = {
355
278
  newsletterJid: "0@newsletter",
356
279
  serverMessageId: 1,
357
- newsletterName: `WhatsApp`,
280
+ newsletterName: "WhatsApp",
358
281
  contentType: 1,
359
282
  timestamp: new Date().toISOString(),
360
283
  senderName: "kikyy dugonggg",
361
284
  content: "Text Message",
362
285
  priority: "high",
363
- status: "sent",
286
+ status: "sent"
364
287
  };
365
-
366
288
  img.message.disappearingMode = {
367
289
  initiator: 3,
368
290
  trigger: 4,
@@ -375,9 +297,8 @@ class RexxHayanasi {
375
297
  initiatedByUser: true,
376
298
  initiatedByApp: true,
377
299
  initiatedByBot: true,
378
- initiatedByMe: true,
300
+ initiatedByMe: true
379
301
  };
380
-
381
302
  await this.relayMessage(jid, img.message, {
382
303
  messageId: img.key.id,
383
304
  quoted: {
@@ -385,98 +306,100 @@ class RexxHayanasi {
385
306
  remoteJid: album.key.remoteJid,
386
307
  id: album.key.id,
387
308
  fromMe: true,
388
- participant: this.utils.generateMessageID().split('@')[0] + '@s.whatsapp.net',
309
+ participant: this.utils.generateMessageID().split("@")[0] + "@s.whatsapp.net"
389
310
  },
390
- message: album.message,
391
- },
311
+ message: album.message
312
+ }
392
313
  });
393
314
  }
394
315
  return album;
395
316
  } catch (err) {
396
- console.error('handleAlbum error:', err);
317
+ console.error("handleAlbum error:", err);
397
318
  throw err;
398
319
  }
399
- }
320
+ }
400
321
 
401
322
  async handleEvent(content, jid, quoted) {
402
323
  try {
403
324
  const eventData = content.eventMessage;
404
- if (!eventData) throw new Error('Missing eventMessage');
405
-
406
- const msg = await this.utils.generateWAMessageFromContent(jid, {
407
- viewOnceMessage: {
408
- message: {
409
- messageContextInfo: {
410
- deviceListMetadata: {},
411
- deviceListMetadataVersion: 2,
412
- messageSecret: crypto.randomBytes(32),
413
- supportPayload: JSON.stringify({
414
- version: 2,
415
- is_ai_message: true,
416
- should_show_system_message: true,
417
- ticket_id: crypto.randomBytes(16).toString('hex')
418
- })
419
- },
420
- eventMessage: {
421
- contextInfo: {
422
- mentionedJid: [jid],
423
- participant: jid,
424
- remoteJid: "status@broadcast",
425
- forwardedNewsletterMessageInfo: {
426
- newsletterName: "shenvn.",
427
- newsletterJid: "120363297591152843@newsletter",
428
- serverMessageId: 1
429
- }
325
+ if (!eventData) throw new Error("Missing eventMessage");
326
+ const msg = await this.utils.generateWAMessageFromContent(
327
+ jid,
328
+ {
329
+ viewOnceMessage: {
330
+ message: {
331
+ messageContextInfo: {
332
+ deviceListMetadata: {},
333
+ deviceListMetadataVersion: 2,
334
+ messageSecret: crypto.randomBytes(32),
335
+ supportPayload: JSON.stringify({
336
+ version: 2,
337
+ is_ai_message: true,
338
+ should_show_system_message: true,
339
+ ticket_id: crypto.randomBytes(16).toString("hex")
340
+ })
430
341
  },
431
- isCanceled: eventData.isCanceled || false,
432
- name: eventData.name,
433
- description: eventData.description,
434
- location: eventData.location || {
435
- degreesLatitude: 0,
436
- degreesLongitude: 0,
437
- name: "Location"
438
- },
439
- joinLink: eventData.joinLink || '',
440
- startTime: typeof eventData.startTime === 'string' ? parseInt(eventData.startTime) : eventData.startTime || Date.now(),
441
- endTime: typeof eventData.endTime === 'string' ? parseInt(eventData.endTime) : eventData.endTime || Date.now() + 3600000,
442
- extraGuestsAllowed: eventData.extraGuestsAllowed !== false
342
+ eventMessage: {
343
+ contextInfo: {
344
+ mentionedJid: [jid],
345
+ participant: jid,
346
+ remoteJid: "status@broadcast",
347
+ forwardedNewsletterMessageInfo: {
348
+ newsletterName: "shenvn.",
349
+ newsletterJid: "120363297591152843@newsletter",
350
+ serverMessageId: 1
351
+ }
352
+ },
353
+ isCanceled: eventData.isCanceled || false,
354
+ name: eventData.name,
355
+ description: eventData.description,
356
+ location: eventData.location || {
357
+ degreesLatitude: 0,
358
+ degreesLongitude: 0,
359
+ name: "Location"
360
+ },
361
+ joinLink: eventData.joinLink || "",
362
+ startTime: typeof eventData.startTime === "string" ? parseInt(eventData.startTime) : eventData.startTime || Date.now(),
363
+ endTime: typeof eventData.endTime === "string" ? parseInt(eventData.endTime) : eventData.endTime || Date.now() + 3600000,
364
+ extraGuestsAllowed: eventData.extraGuestsAllowed !== false
365
+ }
443
366
  }
444
367
  }
445
- }
446
- }, { quoted });
447
-
368
+ },
369
+ { quoted }
370
+ );
448
371
  await this.relayMessage(jid, msg.message, { messageId: msg.key.id });
449
372
  return msg;
450
373
  } catch (err) {
451
- console.error('handleEvent error:', err);
374
+ console.error("handleEvent error:", err);
452
375
  throw err;
453
376
  }
454
377
  }
455
-
378
+
456
379
  async handlePollResult(content, jid, quoted) {
457
380
  try {
458
381
  const pollData = content.pollResultMessage;
459
- if (!pollData) throw new Error('Missing pollResultMessage');
460
-
461
- const msg = await this.utils.generateWAMessageFromContent(jid, {
462
- pollResultSnapshotMessage: {
463
- name: pollData.name,
464
- pollVotes: (pollData.pollVotes || []).map(vote => ({
465
- optionName: vote.optionName,
466
- optionVoteCount: typeof vote.optionVoteCount === 'number'
467
- ? vote.optionVoteCount.toString()
468
- : vote.optionVoteCount
469
- }))
382
+ if (!pollData) throw new Error("Missing pollResultMessage");
383
+ const msg = await this.utils.generateWAMessageFromContent(
384
+ jid,
385
+ {
386
+ pollResultSnapshotMessage: {
387
+ name: pollData.name,
388
+ pollVotes: (pollData.pollVotes || []).map((v) => ({
389
+ optionName: v.optionName,
390
+ optionVoteCount: typeof v.optionVoteCount === "number" ? v.optionVoteCount.toString() : v.optionVoteCount
391
+ }))
392
+ }
393
+ },
394
+ {
395
+ userJid: this.utils.generateMessageID().split("@")[0] + "@s.whatsapp.net",
396
+ quoted
470
397
  }
471
- }, {
472
- userJid: this.utils.generateMessageID().split('@')[0] + '@s.whatsapp.net',
473
- quoted
474
- });
475
-
398
+ );
476
399
  await this.relayMessage(jid, msg.message, { messageId: msg.key.id });
477
400
  return msg;
478
401
  } catch (err) {
479
- console.error('handlePollResult error:', err);
402
+ console.error("handlePollResult error:", err);
480
403
  throw err;
481
404
  }
482
405
  }
@@ -484,44 +407,39 @@ class RexxHayanasi {
484
407
  async handleGroupStory(content, jid, quoted) {
485
408
  try {
486
409
  const storyData = content.groupStatusMessage;
487
- if (!storyData) throw new Error('Missing groupStatusMessage');
488
-
410
+ if (!storyData) throw new Error("Missing groupStatusMessage");
489
411
  let waMsgContent;
490
412
  if (storyData.message) {
491
413
  waMsgContent = storyData;
414
+ } else if (typeof this.bail?.generateWAMessageContent === "function") {
415
+ waMsgContent = await this.bail.generateWAMessageContent(storyData, {
416
+ upload: this.waUploadToServer
417
+ });
418
+ } else if (typeof this.utils?.generateWAMessageContent === "function") {
419
+ waMsgContent = await this.utils.generateWAMessageContent(storyData, {
420
+ upload: this.waUploadToServer
421
+ });
422
+ } else if (typeof this.utils?.prepareMessageContent === "function") {
423
+ waMsgContent = await this.utils.prepareMessageContent(storyData, {
424
+ upload: this.waUploadToServer
425
+ });
492
426
  } else {
493
- if (typeof this.bail?.generateWAMessageContent === "function") {
494
- waMsgContent = await this.bail.generateWAMessageContent(storyData, {
495
- upload: this.waUploadToServer
496
- });
497
- } else if (typeof this.utils?.generateWAMessageContent === "function") {
498
- waMsgContent = await this.utils.generateWAMessageContent(storyData, {
499
- upload: this.waUploadToServer
500
- });
501
- } else if (typeof this.utils?.prepareMessageContent === "function") {
502
- waMsgContent = await this.utils.prepareMessageContent(storyData, {
503
- upload: this.waUploadToServer
504
- });
505
- } else {
506
- waMsgContent = await Utils_1.generateWAMessageContent(storyData, {
507
- upload: this.waUploadToServer
508
- });
509
- }
427
+ waMsgContent = await Utils_1.generateWAMessageContent(storyData, {
428
+ upload: this.waUploadToServer
429
+ });
510
430
  }
511
-
512
- let msg = {
431
+ const msg = {
513
432
  message: {
514
433
  groupStatusMessageV2: {
515
434
  message: waMsgContent.message || waMsgContent
516
435
  }
517
436
  }
518
437
  };
519
-
520
438
  return await this.relayMessage(jid, msg.message, {
521
439
  messageId: this.bail.generateMessageID()
522
440
  });
523
441
  } catch (err) {
524
- console.error('handleGroupStory error:', err);
442
+ console.error("handleGroupStory error:", err);
525
443
  throw err;
526
444
  }
527
445
  }