cuki-bailx 1.2.5 → 2.0.7

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 (154) hide show
  1. package/WAProto/AICommon.js +27981 -0
  2. package/WAProto/AICommon.proto +713 -0
  3. package/WAProto/Ephemeral.js +295 -0
  4. package/WAProto/Ephemeral.proto +7 -0
  5. package/WAProto/GenerateStatics.sh +4 -0
  6. package/WAProto/WAProto.proto +4775 -0
  7. package/WAProto/cuki.js +7 -0
  8. package/WAProto/index.js +56886 -17506
  9. package/lib/Defaults/baileys-version.json +2 -2
  10. package/lib/Defaults/index.js +117 -102
  11. package/lib/Socket/Client/index.js +2 -3
  12. package/lib/Socket/Client/{web-socket-client.js → websocket.js} +54 -5
  13. package/lib/Socket/chats.js +97 -90
  14. package/lib/Socket/groups.js +20 -5
  15. package/lib/Socket/index.js +2 -2
  16. package/lib/Socket/messages-recv.js +9 -65
  17. package/lib/Socket/messages-send.js +612 -286
  18. package/lib/Socket/newsletter.js +68 -41
  19. package/lib/Socket/{dugong.js → setup.js} +5 -13
  20. package/lib/Socket/socket.js +58 -32
  21. package/lib/Store/index.js +1 -3
  22. package/lib/Store/make-in-memory-store.js +26 -14
  23. package/lib/Store/make-ordered-dictionary.js +2 -2
  24. package/lib/Types/Label.js +1 -1
  25. package/lib/Types/LabelAssociation.js +1 -1
  26. package/lib/Types/Message.js +0 -2
  27. package/lib/Types/Newsletter.js +3 -17
  28. package/lib/Types/index.js +2 -2
  29. package/lib/Utils/auth-utils.js +6 -13
  30. package/lib/Utils/business.js +2 -2
  31. package/lib/Utils/chat-utils.js +36 -35
  32. package/lib/Utils/crypto.js +71 -29
  33. package/lib/Utils/decode-wa-message.js +65 -56
  34. package/lib/Utils/event-buffer.js +11 -7
  35. package/lib/Utils/generics.js +73 -23
  36. package/lib/Utils/history.js +4 -6
  37. package/lib/Utils/link-preview.js +34 -1
  38. package/lib/Utils/lt-hash.js +6 -6
  39. package/lib/Utils/messages-media.js +479 -161
  40. package/lib/Utils/messages.js +391 -77
  41. package/lib/Utils/noise-handler.js +19 -23
  42. package/lib/Utils/signal.js +47 -36
  43. package/lib/Utils/use-multi-file-auth-state.js +51 -6
  44. package/lib/Utils/validate-connection.js +94 -66
  45. package/lib/WABinary/constants.js +1276 -13
  46. package/lib/WABinary/decode.js +26 -13
  47. package/lib/WABinary/encode.js +39 -17
  48. package/lib/WABinary/generic-utils.js +2 -85
  49. package/lib/WABinary/jid-utils.js +12 -5
  50. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +1 -1
  51. package/lib/index.js +18 -5
  52. package/package.json +100 -105
  53. package/engine-requirements.js +0 -10
  54. package/lib/Defaults/index.d.ts +0 -53
  55. package/lib/Defaults/phonenumber-mcc.json +0 -223
  56. package/lib/Signal/Group/ciphertext-message.d.ts +0 -9
  57. package/lib/Signal/Group/group-session-builder.d.ts +0 -14
  58. package/lib/Signal/Group/group_cipher.d.ts +0 -17
  59. package/lib/Signal/Group/index.d.ts +0 -11
  60. package/lib/Signal/Group/keyhelper.d.ts +0 -10
  61. package/lib/Signal/Group/queue-job.d.ts +0 -1
  62. package/lib/Signal/Group/sender-chain-key.d.ts +0 -13
  63. package/lib/Signal/Group/sender-key-distribution-message.d.ts +0 -16
  64. package/lib/Signal/Group/sender-key-message.d.ts +0 -18
  65. package/lib/Signal/Group/sender-key-name.d.ts +0 -17
  66. package/lib/Signal/Group/sender-key-record.d.ts +0 -30
  67. package/lib/Signal/Group/sender-key-state.d.ts +0 -38
  68. package/lib/Signal/Group/sender-message-key.d.ts +0 -11
  69. package/lib/Signal/libsignal.d.ts +0 -3
  70. package/lib/Socket/Client/abstract-socket-client.d.ts +0 -17
  71. package/lib/Socket/Client/index.d.ts +0 -3
  72. package/lib/Socket/Client/mobile-socket-client.d.ts +0 -13
  73. package/lib/Socket/Client/mobile-socket-client.js +0 -65
  74. package/lib/Socket/Client/web-socket-client.d.ts +0 -12
  75. package/lib/Socket/business.d.ts +0 -171
  76. package/lib/Socket/chats.d.ts +0 -80
  77. package/lib/Socket/dugong.d.ts +0 -219
  78. package/lib/Socket/groups.d.ts +0 -115
  79. package/lib/Socket/index.d.ts +0 -173
  80. package/lib/Socket/messages-recv.d.ts +0 -161
  81. package/lib/Socket/messages-send.d.ts +0 -149
  82. package/lib/Socket/newsletter.d.ts +0 -134
  83. package/lib/Socket/registration.d.ts +0 -267
  84. package/lib/Socket/registration.js +0 -166
  85. package/lib/Socket/socket.d.ts +0 -43
  86. package/lib/Socket/socket.js.bak +0 -630
  87. package/lib/Socket/usync.d.ts +0 -36
  88. package/lib/Store/index.d.ts +0 -3
  89. package/lib/Store/make-cache-manager-store.d.ts +0 -13
  90. package/lib/Store/make-cache-manager-store.js +0 -83
  91. package/lib/Store/make-in-memory-store.d.ts +0 -118
  92. package/lib/Store/make-ordered-dictionary.d.ts +0 -13
  93. package/lib/Store/object-repository.d.ts +0 -10
  94. package/lib/Types/Auth.d.ts +0 -110
  95. package/lib/Types/Call.d.ts +0 -13
  96. package/lib/Types/Chat.d.ts +0 -102
  97. package/lib/Types/Contact.d.ts +0 -19
  98. package/lib/Types/Events.d.ts +0 -157
  99. package/lib/Types/GroupMetadata.d.ts +0 -55
  100. package/lib/Types/Label.d.ts +0 -35
  101. package/lib/Types/LabelAssociation.d.ts +0 -29
  102. package/lib/Types/Message.d.ts +0 -273
  103. package/lib/Types/Newsletter.d.ts +0 -92
  104. package/lib/Types/Product.d.ts +0 -78
  105. package/lib/Types/Signal.d.ts +0 -57
  106. package/lib/Types/Socket.d.ts +0 -111
  107. package/lib/Types/State.d.ts +0 -27
  108. package/lib/Types/USync.d.ts +0 -25
  109. package/lib/Types/index.d.ts +0 -57
  110. package/lib/Utils/auth-utils.d.ts +0 -18
  111. package/lib/Utils/baileys-event-stream.d.ts +0 -16
  112. package/lib/Utils/business.d.ts +0 -22
  113. package/lib/Utils/chat-utils.d.ts +0 -71
  114. package/lib/Utils/crypto.d.ts +0 -41
  115. package/lib/Utils/decode-wa-message.d.ts +0 -19
  116. package/lib/Utils/event-buffer.d.ts +0 -35
  117. package/lib/Utils/generics.d.ts +0 -92
  118. package/lib/Utils/history.d.ts +0 -15
  119. package/lib/Utils/index.d.ts +0 -17
  120. package/lib/Utils/link-preview.d.ts +0 -21
  121. package/lib/Utils/logger.d.ts +0 -4
  122. package/lib/Utils/lt-hash.d.ts +0 -12
  123. package/lib/Utils/make-mutex.d.ts +0 -7
  124. package/lib/Utils/messages-media.d.ts +0 -116
  125. package/lib/Utils/messages.d.ts +0 -77
  126. package/lib/Utils/noise-handler.d.ts +0 -21
  127. package/lib/Utils/process-message.d.ts +0 -41
  128. package/lib/Utils/signal.d.ts +0 -32
  129. package/lib/Utils/use-multi-file-auth-state.d.ts +0 -13
  130. package/lib/Utils/validate-connection.d.ts +0 -11
  131. package/lib/WABinary/constants.d.ts +0 -27
  132. package/lib/WABinary/decode.d.ts +0 -7
  133. package/lib/WABinary/encode.d.ts +0 -3
  134. package/lib/WABinary/generic-utils.d.ts +0 -16
  135. package/lib/WABinary/index.d.ts +0 -5
  136. package/lib/WABinary/jid-utils.d.ts +0 -31
  137. package/lib/WABinary/types.d.ts +0 -18
  138. package/lib/WAM/BinaryInfo.d.ts +0 -17
  139. package/lib/WAM/constants.d.ts +0 -38
  140. package/lib/WAM/encode.d.ts +0 -3
  141. package/lib/WAM/index.d.ts +0 -3
  142. package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts +0 -9
  143. package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts +0 -22
  144. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts +0 -12
  145. package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts +0 -12
  146. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts +0 -25
  147. package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts +0 -8
  148. package/lib/WAUSync/Protocols/index.d.ts +0 -4
  149. package/lib/WAUSync/USyncQuery.d.ts +0 -28
  150. package/lib/WAUSync/USyncUser.d.ts +0 -12
  151. package/lib/WAUSync/index.d.ts +0 -3
  152. package/lib/index.d.ts +0 -12
  153. package/lib/index.js.bak +0 -48
  154. /package/lib/Socket/Client/{abstract-socket-client.js → types.js} +0 -0
@@ -1,9 +1,28 @@
1
- "use strict";
1
+ "use strict";
2
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.assertMediaContent = exports.downloadMediaMessage = exports.aggregateMessageKeysNotFromMe = exports.getAggregateVotesInPollMessage = exports.updateMessageWithPollUpdate = exports.updateMessageWithReaction = exports.updateMessageWithReceipt = exports.getDevice = exports.extractMessageContent = exports.normalizeMessageContent = exports.getContentType = exports.generateWAMessage = exports.generateWAMessageFromContent = exports.generateWAMessageContent = exports.generateForwardMessageContent = exports.prepareDisappearingMessageSettingContent = exports.prepareWAMessageMedia = exports.generateLinkPreviewIfRequired = exports.extractUrlFromText = void 0;
6
+ exports.assertMediaContent =
7
+ exports.downloadMediaMessage =
8
+ exports.aggregateMessageKeysNotFromMe =
9
+ exports.updateMessageWithPollUpdate =
10
+ exports.updateMessageWithReaction =
11
+ exports.updateMessageWithReceipt =
12
+ exports.getDevice =
13
+ exports.extractMessageContent =
14
+ exports.normalizeMessageContent =
15
+ exports.getContentType =
16
+ exports.generateWAMessage =
17
+ exports.generateWAMessageFromContent =
18
+ exports.generateWAMessageContent =
19
+ exports.generateForwardMessageContent =
20
+ exports.prepareDisappearingMessageSettingContent =
21
+ exports.prepareWAMessageMedia =
22
+ exports.generateLinkPreviewIfRequired =
23
+ exports.extractUrlFromText = void 0;
24
+ exports.getAggregateVotesInPollMessage = getAggregateVotesInPollMessage;
25
+ //Baileys By Kazumarii Senpai
7
26
  const boom_1 = require("@hapi/boom");
8
27
  const axios_1 = __importDefault(require("axios"));
9
28
  const crypto_1 = require("crypto");
@@ -76,6 +95,7 @@ const prepareWAMessageMedia = async (message, options) => {
76
95
  if (!mediaType) {
77
96
  throw new boom_1.Boom('Invalid media type', { statusCode: 400 });
78
97
  }
98
+
79
99
  const uploadData = {
80
100
  ...message,
81
101
  ...(message.annotations ? {
@@ -102,9 +122,9 @@ const prepareWAMessageMedia = async (message, options) => {
102
122
  }
103
123
  ],
104
124
  newsletter: {
105
- newsletterJid: "120363297591152843@newsletter",
125
+ newsletterJid: "120363423722136487@newsletter",
106
126
  serverMessageId: 0,
107
- newsletterName: "-",
127
+ newsletterName: "Baileys —",
108
128
  contentType: "UPDATE",
109
129
  }
110
130
  }
@@ -113,93 +133,109 @@ const prepareWAMessageMedia = async (message, options) => {
113
133
  media: message[mediaType]
114
134
  };
115
135
  delete uploadData[mediaType];
116
- // check if cacheable + generate cache key
136
+
117
137
  const cacheableKey = typeof uploadData.media === 'object' &&
118
138
  ('url' in uploadData.media) &&
119
139
  !!uploadData.media.url &&
120
- !!options.mediaCache && (
121
- // generate the key
122
- mediaType + ':' + uploadData.media.url.toString());
140
+ !!options.mediaCache &&
141
+ mediaType + ':' + uploadData.media.url.toString();
142
+
123
143
  if (mediaType === 'document' && !uploadData.fileName) {
124
144
  uploadData.fileName = 'file';
125
145
  }
146
+
126
147
  if (!uploadData.mimetype) {
127
148
  uploadData.mimetype = MIMETYPE_MAP[mediaType];
128
149
  }
129
- // check for cache hit
150
+
130
151
  if (cacheableKey) {
131
152
  const mediaBuff = options.mediaCache.get(cacheableKey);
132
153
  if (mediaBuff) {
133
- logger === null || logger === void 0 ? void 0 : logger.debug({ cacheableKey }, 'got media cache hit');
154
+ logger?.debug({ cacheableKey }, 'got media cache hit');
134
155
  const obj = Types_1.WAProto.Message.decode(mediaBuff);
135
156
  const key = `${mediaType}Message`;
136
157
  Object.assign(obj[key], { ...uploadData, media: undefined });
137
158
  return obj;
138
159
  }
139
160
  }
161
+
140
162
  const requiresDurationComputation = mediaType === 'audio' && typeof uploadData.seconds === 'undefined';
141
163
  const requiresThumbnailComputation = (mediaType === 'image' || mediaType === 'video') &&
142
- (typeof uploadData['jpegThumbnail'] === 'undefined');
164
+ typeof uploadData['jpegThumbnail'] === 'undefined';
143
165
  const requiresWaveformProcessing = mediaType === 'audio' && uploadData.ptt === true;
144
166
  const requiresAudioBackground = options.backgroundColor && mediaType === 'audio' && uploadData.ptt === true;
145
167
  const requiresOriginalForSomeProcessing = requiresDurationComputation || requiresThumbnailComputation;
146
- const { mediaKey, encWriteStream, bodyPath, fileEncSha256, fileSha256, fileLength, didSaveToTmpPath, } = await (options.newsletter ? messages_media_1.prepareStream : messages_media_1.encryptedStream)(uploadData.media, options.mediaTypeOverride || mediaType, {
147
- logger,
148
- saveOriginalFileIfRequired: requiresOriginalForSomeProcessing,
149
- opts: options.options
150
- });
151
- // url safe Base64 encode the SHA256 hash of the body
152
- const fileEncSha256B64 = (options.newsletter ? fileSha256 : fileEncSha256 !== null && fileEncSha256 !== void 0 ? fileEncSha256 : fileSha256).toString('base64');
168
+
169
+ const { mediaKey, encWriteStream, bodyPath, fileEncSha256, fileSha256, fileLength, didSaveToTmpPath, opusConverted } =
170
+ await (options.newsletter ? messages_media_1.prepareStream : messages_media_1.encryptedStream)(
171
+ uploadData.media,
172
+ options.mediaTypeOverride || mediaType,
173
+ {
174
+ logger,
175
+ saveOriginalFileIfRequired: requiresOriginalForSomeProcessing,
176
+ opts: options.options,
177
+ isPtt: uploadData.ptt,
178
+ forceOpus: (mediaType === 'audio' && uploadData.mimetype && uploadData.mimetype.includes('opus')),
179
+ convertVideo: (mediaType === 'video')
180
+ }
181
+ );
182
+
183
+ if (mediaType === 'audio' && opusConverted) {
184
+ uploadData.mimetype = 'audio/ogg; codecs=opus';
185
+ }
186
+
187
+ const fileEncSha256B64 = (options.newsletter ? fileSha256 : fileEncSha256 ?? fileSha256).toString('base64');
188
+
153
189
  const [{ mediaUrl, directPath, handle }] = await Promise.all([
154
190
  (async () => {
155
191
  const result = await options.upload(encWriteStream, { fileEncSha256B64, mediaType, timeoutMs: options.mediaUploadTimeoutMs });
156
- logger === null || logger === void 0 ? void 0 : logger.debug({ mediaType, cacheableKey }, 'uploaded media');
192
+ logger?.debug({ mediaType, cacheableKey }, 'uploaded media');
157
193
  return result;
158
194
  })(),
159
195
  (async () => {
160
196
  try {
161
197
  if (requiresThumbnailComputation) {
162
- const { thumbnail, originalImageDimensions } = await (0, messages_media_1.generateThumbnail)(bodyPath, mediaType, options);
198
+ const { thumbnail, originalImageDimensions } = await messages_media_1.generateThumbnail(bodyPath, mediaType, options);
163
199
  uploadData.jpegThumbnail = thumbnail;
164
200
  if (!uploadData.width && originalImageDimensions) {
165
201
  uploadData.width = originalImageDimensions.width;
166
202
  uploadData.height = originalImageDimensions.height;
167
- logger === null || logger === void 0 ? void 0 : logger.debug('set dimensions');
203
+ logger?.debug('set dimensions');
168
204
  }
169
- logger === null || logger === void 0 ? void 0 : logger.debug('generated thumbnail');
205
+ logger?.debug('generated thumbnail');
170
206
  }
171
207
  if (requiresDurationComputation) {
172
- uploadData.seconds = await (0, messages_media_1.getAudioDuration)(bodyPath);
173
- logger === null || logger === void 0 ? void 0 : logger.debug('computed audio duration');
174
- }
175
- if (requiresWaveformProcessing) {
176
- uploadData.waveform = await (0, messages_media_1.getAudioWaveform)(bodyPath, logger);
177
- logger === null || logger === void 0 ? void 0 : logger.debug('processed waveform');
208
+ uploadData.seconds = await messages_media_1.getAudioDuration(bodyPath);
209
+ logger?.debug('computed audio duration');
178
210
  }
179
211
  if (requiresWaveformProcessing) {
180
- uploadData.waveform = await (0, messages_media_1.getAudioWaveform)(bodyPath, logger);
181
- logger === null || logger === void 0 ? void 0 : logger.debug('processed waveform');
212
+ uploadData.waveform = await messages_media_1.getAudioWaveform(bodyPath, logger);
213
+ logger?.debug('processed waveform');
182
214
  }
183
215
  if (requiresAudioBackground) {
184
216
  uploadData.backgroundArgb = await assertColor(options.backgroundColor);
185
- logger === null || logger === void 0 ? void 0 : logger.debug('computed backgroundColor audio status');
217
+ logger?.debug('computed backgroundColor audio status');
186
218
  }
187
- }
188
- catch (error) {
189
- logger === null || logger === void 0 ? void 0 : logger.warn({ trace: error.stack }, 'failed to obtain extra info');
219
+ } catch (error) {
220
+ logger?.warn({ trace: error.stack }, 'failed to obtain extra info');
190
221
  }
191
222
  })(),
192
223
  ])
193
224
  .finally(async () => {
194
- if (!Buffer.isBuffer(encWriteStream)) {
195
- encWriteStream.destroy();
196
- }
197
- // remove tmp files
198
- if (didSaveToTmpPath && bodyPath) {
199
- await fs_1.promises.unlink(bodyPath);
200
- logger === null || logger === void 0 ? void 0 : logger.debug('removed tmp files');
201
- }
202
- });
225
+ if (!Buffer.isBuffer(encWriteStream)) {
226
+ encWriteStream.destroy();
227
+ }
228
+ if (didSaveToTmpPath && bodyPath) {
229
+ try {
230
+ await fs_1.promises.access(bodyPath);
231
+ await fs_1.promises.unlink(bodyPath);
232
+ logger?.debug('removed tmp file');
233
+ } catch (error) {
234
+ logger?.warn('failed to remove tmp file');
235
+ }
236
+ }
237
+ });
238
+
203
239
  const obj = Types_1.WAProto.Message.fromObject({
204
240
  [`${mediaType}Message`]: MessageTypeProto[mediaType].fromObject({
205
241
  url: handle ? undefined : mediaUrl,
@@ -208,21 +244,25 @@ const prepareWAMessageMedia = async (message, options) => {
208
244
  fileEncSha256: fileEncSha256,
209
245
  fileSha256,
210
246
  fileLength,
211
- mediaKeyTimestamp: handle ? undefined : (0, generics_1.unixTimestampSeconds)(),
247
+ mediaKeyTimestamp: handle ? undefined : generics_1.unixTimestampSeconds(),
212
248
  ...uploadData,
213
249
  media: undefined
214
250
  })
215
251
  });
252
+
216
253
  if (uploadData.ptv) {
217
254
  obj.ptvMessage = obj.videoMessage;
218
255
  delete obj.videoMessage;
219
256
  }
257
+
220
258
  if (cacheableKey) {
221
- logger === null || logger === void 0 ? void 0 : logger.debug({ cacheableKey }, 'set cache');
259
+ logger?.debug({ cacheableKey }, 'set cache');
222
260
  options.mediaCache.set(cacheableKey, Types_1.WAProto.Message.encode(obj).finish());
223
261
  }
262
+
224
263
  return obj;
225
264
  };
265
+
226
266
  exports.prepareWAMessageMedia = prepareWAMessageMedia;
227
267
  const prepareDisappearingMessageSettingContent = (ephemeralExpiration) => {
228
268
  ephemeralExpiration = ephemeralExpiration || 0;
@@ -271,8 +311,8 @@ const generateForwardMessageContent = (message, forceForward) => {
271
311
  };
272
312
  exports.generateForwardMessageContent = generateForwardMessageContent;
273
313
  const generateWAMessageContent = async (message, options) => {
274
- var _a;
275
- var _b;
314
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
315
+ var _p, _q;
276
316
  let m = {};
277
317
  if ('text' in message) {
278
318
  const extContent = { text: message.text };
@@ -281,7 +321,6 @@ const generateWAMessageContent = async (message, options) => {
281
321
  urlInfo = await (0, exports.generateLinkPreviewIfRequired)(message.text, options.getUrlInfo, options.logger);
282
322
  }
283
323
  if (urlInfo) {
284
- extContent.canonicalUrl = urlInfo['canonical-url'];
285
324
  extContent.matchedText = urlInfo['matched-text'];
286
325
  extContent.jpegThumbnail = urlInfo.jpegThumbnail;
287
326
  extContent.description = urlInfo.description;
@@ -342,6 +381,54 @@ const generateWAMessageContent = async (message, options) => {
342
381
  message.disappearingMessagesInChat;
343
382
  m = (0, exports.prepareDisappearingMessageSettingContent)(exp);
344
383
  }
384
+ else if ('groupInvite' in message) {
385
+ m.groupInviteMessage = {};
386
+ m.groupInviteMessage.inviteCode = message.groupInvite.inviteCode;
387
+ m.groupInviteMessage.inviteExpiration = message.groupInvite.inviteExpiration;
388
+ m.groupInviteMessage.caption = message.groupInvite.text;
389
+ m.groupInviteMessage.groupJid = message.groupInvite.jid;
390
+ m.groupInviteMessage.groupName = message.groupInvite.subject;
391
+ //TODO: use built-in interface and get disappearing mode info etc.
392
+ //TODO: cache / use store!?
393
+ if (options.getProfilePicUrl) {
394
+ const pfpUrl = await options.getProfilePicUrl(message.groupInvite.jid, 'preview');
395
+ if (pfpUrl) {
396
+ const resp = await axios_1.default.get(pfpUrl, { responseType: 'arraybuffer' });
397
+ if (resp.status === 200) {
398
+ m.groupInviteMessage.jpegThumbnail = resp.data;
399
+ }
400
+ }
401
+ }
402
+ }
403
+ else if ('pin' in message) {
404
+ m.pinInChatMessage = {};
405
+ m.messageContextInfo = {};
406
+ m.pinInChatMessage.key = message.pin;
407
+ m.pinInChatMessage.type = message.type;
408
+ m.pinInChatMessage.senderTimestampMs = Date.now();
409
+ m.messageContextInfo.messageAddOnDurationInSecs = message.type === 1 ? message.time || 86400 : 0;
410
+ }
411
+ else if ('keep' in message) {
412
+ m.keepInChatMessage = {};
413
+ m.keepInChatMessage.key = message.keep;
414
+ m.keepInChatMessage.keepType = message.type;
415
+ m.keepInChatMessage.timestampMs = Date.now();
416
+ }
417
+ else if ('call' in message) {
418
+ m = {
419
+ scheduledCallCreationMessage: {
420
+ scheduledTimestampMs: (_a = message.call.time) !== null && _a !== void 0 ? _a : Date.now(),
421
+ callType: (_b = message.call.type) !== null && _b !== void 0 ? _b : 1,
422
+ title: message.call.title
423
+ }
424
+ };
425
+ }
426
+ else if ('paymentInvite' in message) {
427
+ m.paymentInviteMessage = {
428
+ serviceType: message.paymentInvite.type,
429
+ expiryTimestamp: message.paymentInvite.expiry
430
+ };
431
+ }
345
432
  else if ('buttonReply' in message) {
346
433
  switch (message.type) {
347
434
  case 'template':
@@ -360,6 +447,10 @@ const generateWAMessageContent = async (message, options) => {
360
447
  break;
361
448
  }
362
449
  }
450
+ else if ('ptv' in message && message.ptv) {
451
+ const { videoMessage } = await (0, exports.prepareWAMessageMedia)({ video: message.video }, options);
452
+ m.ptvMessage = videoMessage;
453
+ }
363
454
  else if ('product' in message) {
364
455
  const { imageMessage } = await (0, exports.prepareWAMessageMedia)({ image: message.product.productImage }, options);
365
456
  m.productMessage = Types_1.WAProto.Message.ProductMessage.fromObject({
@@ -370,11 +461,27 @@ const generateWAMessageContent = async (message, options) => {
370
461
  }
371
462
  });
372
463
  }
464
+ else if ('order' in message) {
465
+ m.orderMessage = Types_1.WAProto.Message.OrderMessage.fromObject({
466
+ orderId: message.order.id,
467
+ thumbnail: message.order.thumbnail,
468
+ itemCount: message.order.itemCount,
469
+ status: message.order.status,
470
+ surface: message.order.surface,
471
+ orderTitle: message.order.title,
472
+ message: message.order.text,
473
+ sellerJid: message.order.seller,
474
+ token: message.order.token,
475
+ totalAmount1000: message.order.amount,
476
+ totalCurrencyCode: message.order.currency
477
+ });
478
+ }
373
479
  else if ('listReply' in message) {
374
480
  m.listResponseMessage = { ...message.listReply };
375
481
  }
376
482
  else if ('poll' in message) {
377
- (_b = message.poll).selectableCount || (_b.selectableCount = 0);
483
+ (_p = message.poll).selectableCount || (_p.selectableCount = 0);
484
+ (_q = message.poll).toAnnouncementGroup || (_q.toAnnouncementGroup = false);
378
485
  if (!Array.isArray(message.poll.values)) {
379
486
  throw new boom_1.Boom('Invalid poll values', { statusCode: 400 });
380
487
  }
@@ -386,11 +493,72 @@ const generateWAMessageContent = async (message, options) => {
386
493
  // encKey
387
494
  messageSecret: message.poll.messageSecret || (0, crypto_1.randomBytes)(32),
388
495
  };
389
- m.pollCreationMessage = {
496
+ const pollCreationMessage = {
390
497
  name: message.poll.name,
391
498
  selectableOptionsCount: message.poll.selectableCount,
392
499
  options: message.poll.values.map(optionName => ({ optionName })),
393
500
  };
501
+ if (message.poll.toAnnouncementGroup) {
502
+ // poll v2 is for community announcement groups (single select and multiple)
503
+ m.pollCreationMessageV2 = pollCreationMessage;
504
+ }
505
+ else {
506
+ if (message.poll.selectableCount === 1) {
507
+ // poll v3 is for single select polls
508
+ m.pollCreationMessageV3 = pollCreationMessage;
509
+ }
510
+ else {
511
+ // poll for multiple choice polls
512
+ m.pollCreationMessage = pollCreationMessage;
513
+ }
514
+ }
515
+ }
516
+ else if ('event' in message) {
517
+ m.messageContextInfo = {
518
+ messageSecret: message.event.messageSecret || (0, crypto_1.randomBytes)(32),
519
+ };
520
+ m.eventMessage = { ...message.event };
521
+ }
522
+ else if ('inviteAdmin' in message) {
523
+ m.newsletterAdminInviteMessage = {};
524
+ m.newsletterAdminInviteMessage.inviteExpiration = message.inviteAdmin.inviteExpiration;
525
+ m.newsletterAdminInviteMessage.caption = message.inviteAdmin.text;
526
+ m.newsletterAdminInviteMessage.newsletterJid = message.inviteAdmin.jid;
527
+ m.newsletterAdminInviteMessage.newsletterName = message.inviteAdmin.subject;
528
+ m.newsletterAdminInviteMessage.jpegThumbnail = message.inviteAdmin.thumbnail;
529
+ }
530
+ else if ('requestPayment' in message) {
531
+ const sticker = ((_c = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _c === void 0 ? void 0 : _c.sticker) ?
532
+ await (0, exports.prepareWAMessageMedia)({ sticker: (_d = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _d === void 0 ? void 0 : _d.sticker, ...options }, options)
533
+ : null;
534
+ let notes = {};
535
+ if ((_e = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _e === void 0 ? void 0 : _e.sticker) {
536
+ notes = {
537
+ stickerMessage: {
538
+ ...sticker === null || sticker === void 0 ? void 0 : sticker.stickerMessage,
539
+ contextInfo: (_f = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _f === void 0 ? void 0 : _f.contextInfo
540
+ }
541
+ };
542
+ }
543
+ else if (message.requestPayment.note) {
544
+ notes = {
545
+ extendedTextMessage: {
546
+ text: message.requestPayment.note,
547
+ contextInfo: (_g = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _g === void 0 ? void 0 : _g.contextInfo,
548
+ }
549
+ };
550
+ }
551
+ else {
552
+ throw new boom_1.Boom('Invalid media type', { statusCode: 400 });
553
+ }
554
+ m.requestPaymentMessage = Types_1.WAProto.Message.RequestPaymentMessage.fromObject({
555
+ expiryTimestamp: message.requestPayment.expiry,
556
+ amount1000: message.requestPayment.amount,
557
+ currencyCodeIso4217: message.requestPayment.currency,
558
+ requestFrom: message.requestPayment.from,
559
+ noteMessage: { ...notes },
560
+ background: (_h = message.requestPayment.background) !== null && _h !== void 0 ? _h : null,
561
+ });
394
562
  }
395
563
  else if ('sharePhoneNumber' in message) {
396
564
  m.protocolMessage = {
@@ -400,6 +568,14 @@ const generateWAMessageContent = async (message, options) => {
400
568
  else if ('requestPhoneNumber' in message) {
401
569
  m.requestPhoneNumberMessage = {};
402
570
  }
571
+ else if ('album' in message) {
572
+ const imageMessages = message.album.filter(item => 'image' in item);
573
+ const videoMessages = message.album.filter(item => 'video' in item);
574
+ m.albumMessage = WAProto_1.proto.Message.AlbumMessage.fromObject({
575
+ expectedImageCount: imageMessages.length,
576
+ expectedVideoCount: videoMessages.length,
577
+ });
578
+ }
403
579
  else {
404
580
  m = await (0, exports.prepareWAMessageMedia)(message, options);
405
581
  }
@@ -419,14 +595,24 @@ const generateWAMessageContent = async (message, options) => {
419
595
  buttonsMessage.headerType = ButtonType[type];
420
596
  Object.assign(buttonsMessage, m);
421
597
  }
598
+ if ('title' in message && !!message.title) {
599
+ buttonsMessage.text = message.title,
600
+ buttonsMessage.headerType = ButtonType.TEXT;
601
+ }
422
602
  if ('footer' in message && !!message.footer) {
423
603
  buttonsMessage.footerText = message.footer;
424
604
  }
605
+ if ('contextInfo' in message && !!message.contextInfo) {
606
+ buttonsMessage.contextInfo = message.contextInfo;
607
+ }
608
+ if ('mentions' in message && !!message.mentions) {
609
+ buttonsMessage.contextInfo = { mentionedJid: message.mentions };
610
+ }
425
611
  m = { buttonsMessage };
426
612
  }
427
613
  else if ('templateButtons' in message && !!message.templateButtons) {
428
614
  const msg = {
429
- hydratedButtons: message.templateButtons
615
+ hydratedButtons: message.hasOwnProperty("templateButtons") ? message.templateButtons : message.templateButtons
430
616
  };
431
617
  if ('text' in message) {
432
618
  msg.hydratedContentText = message.text;
@@ -458,10 +644,97 @@ const generateWAMessageContent = async (message, options) => {
458
644
  };
459
645
  m = { listMessage };
460
646
  }
647
+ if ('interactiveButtons' in message && !!message.interactiveButtons) {
648
+ const interactiveMessage = {
649
+ nativeFlowMessage: Types_1.WAProto.Message.InteractiveMessage.NativeFlowMessage.fromObject({
650
+ buttons: message.interactiveButtons,
651
+ })
652
+ };
653
+ if ('text' in message) {
654
+ interactiveMessage.body = {
655
+ text: message.text
656
+ };
657
+ }
658
+ else if ('caption' in message) {
659
+ interactiveMessage.body = {
660
+ text: message.caption
661
+ };
662
+ interactiveMessage.header = {
663
+ title: message.title,
664
+ subtitle: message.subtitle,
665
+ hasMediaAttachment: (_j = message === null || message === void 0 ? void 0 : message.media) !== null && _j !== void 0 ? _j : false,
666
+ };
667
+ Object.assign(interactiveMessage.header, m);
668
+ }
669
+ if ('footer' in message && !!message.footer) {
670
+ interactiveMessage.footer = {
671
+ text: message.footer
672
+ };
673
+ }
674
+ if ('title' in message && !!message.title) {
675
+ interactiveMessage.header = {
676
+ title: message.title,
677
+ subtitle: message.subtitle,
678
+ hasMediaAttachment: (_k = message === null || message === void 0 ? void 0 : message.media) !== null && _k !== void 0 ? _k : false,
679
+ };
680
+ Object.assign(interactiveMessage.header, m);
681
+ }
682
+ if ('contextInfo' in message && !!message.contextInfo) {
683
+ interactiveMessage.contextInfo = message.contextInfo;
684
+ }
685
+ if ('mentions' in message && !!message.mentions) {
686
+ interactiveMessage.contextInfo = { mentionedJid: message.mentions };
687
+ }
688
+ m = { interactiveMessage };
689
+ }
690
+ if ('shop' in message && !!message.shop) {
691
+ const interactiveMessage = {
692
+ shopStorefrontMessage: Types_1.WAProto.Message.InteractiveMessage.ShopMessage.fromObject({
693
+ surface: message.shop,
694
+ id: message.id
695
+ })
696
+ };
697
+ if ('text' in message) {
698
+ interactiveMessage.body = {
699
+ text: message.text
700
+ };
701
+ }
702
+ else if ('caption' in message) {
703
+ interactiveMessage.body = {
704
+ text: message.caption
705
+ };
706
+ interactiveMessage.header = {
707
+ title: message.title,
708
+ subtitle: message.subtitle,
709
+ hasMediaAttachment: (_l = message === null || message === void 0 ? void 0 : message.media) !== null && _l !== void 0 ? _l : false,
710
+ };
711
+ Object.assign(interactiveMessage.header, m);
712
+ }
713
+ if ('footer' in message && !!message.footer) {
714
+ interactiveMessage.footer = {
715
+ text: message.footer
716
+ };
717
+ }
718
+ if ('title' in message && !!message.title) {
719
+ interactiveMessage.header = {
720
+ title: message.title,
721
+ subtitle: message.subtitle,
722
+ hasMediaAttachment: (_m = message === null || message === void 0 ? void 0 : message.media) !== null && _m !== void 0 ? _m : false,
723
+ };
724
+ Object.assign(interactiveMessage.header, m);
725
+ }
726
+ if ('contextInfo' in message && !!message.contextInfo) {
727
+ interactiveMessage.contextInfo = message.contextInfo;
728
+ }
729
+ if ('mentions' in message && !!message.mentions) {
730
+ interactiveMessage.contextInfo = { mentionedJid: message.mentions };
731
+ }
732
+ m = { interactiveMessage };
733
+ }
461
734
  if ('viewOnce' in message && !!message.viewOnce) {
462
735
  m = { viewOnceMessage: { message: m } };
463
736
  }
464
- if ('mentions' in message && ((_a = message.mentions) === null || _a === void 0 ? void 0 : _a.length)) {
737
+ if ('mentions' in message && ((_o = message.mentions) === null || _o === void 0 ? void 0 : _o.length)) {
465
738
  const [messageType] = Object.keys(m);
466
739
  m[messageType].contextInfo = m[messageType] || {};
467
740
  m[messageType].contextInfo.mentionedJid = message.mentions;
@@ -494,26 +767,29 @@ const generateWAMessageFromContent = (jid, message, options) => {
494
767
  const key = (0, exports.getContentType)(innerMessage);
495
768
  const timestamp = (0, generics_1.unixTimestampSeconds)(options.timestamp);
496
769
  const { quoted, userJid } = options;
497
- if (quoted && !(0, WABinary_1.isJidNewsLetter)(jid)) {
770
+ // only set quoted if isn't a newsletter message
771
+ if (quoted && !(0, WABinary_1.isJidNewsletter)(jid)) {
498
772
  const participant = quoted.key.fromMe ? userJid : (quoted.participant || quoted.key.participant || quoted.key.remoteJid);
499
773
  let quotedMsg = (0, exports.normalizeMessageContent)(quoted.message);
500
774
  const msgType = (0, exports.getContentType)(quotedMsg);
501
775
  // strip any redundant properties
502
- quotedMsg = WAProto_1.proto.Message.fromObject({ [msgType]: quotedMsg[msgType] });
503
- const quotedContent = quotedMsg[msgType];
504
- if (typeof quotedContent === 'object' && quotedContent && 'contextInfo' in quotedContent) {
505
- delete quotedContent.contextInfo;
506
- }
507
- const contextInfo = innerMessage[key].contextInfo || {};
508
- contextInfo.participant = (0, WABinary_1.jidNormalizedUser)(participant);
509
- contextInfo.stanzaId = quoted.key.id;
510
- contextInfo.quotedMessage = quotedMsg;
511
- // if a participant is quoted, then it must be a group
512
- // hence, remoteJid of group must also be entered
513
- if (jid !== quoted.key.remoteJid) {
514
- contextInfo.remoteJid = quoted.key.remoteJid;
515
- }
516
- innerMessage[key].contextInfo = contextInfo;
776
+ if (quotedMsg) {
777
+ quotedMsg = WAProto_1.proto.Message.fromObject({ [msgType]: quotedMsg[msgType] });
778
+ const quotedContent = quotedMsg[msgType];
779
+ if (typeof quotedContent === 'object' && quotedContent && 'contextInfo' in quotedContent) {
780
+ delete quotedContent.contextInfo;
781
+ }
782
+ const contextInfo = innerMessage[key].contextInfo || {};
783
+ contextInfo.participant = (0, WABinary_1.jidNormalizedUser)(participant);
784
+ contextInfo.stanzaId = quoted.key.id;
785
+ contextInfo.quotedMessage = quotedMsg;
786
+ // if a participant is quoted, then it must be a group
787
+ // hence, remoteJid of group must also be entered
788
+ if (jid !== quoted.key.remoteJid) {
789
+ contextInfo.remoteJid = quoted.key.remoteJid;
790
+ }
791
+ innerMessage[key].contextInfo = contextInfo;
792
+ }
517
793
  }
518
794
  if (
519
795
  // if we want to send a disappearing message
@@ -523,7 +799,7 @@ const generateWAMessageFromContent = (jid, message, options) => {
523
799
  // already not converted to disappearing message
524
800
  key !== 'ephemeralMessage' &&
525
801
  // newsletter not accept disappearing messages
526
- !(0, WABinary_1.isJidNewsLetter)(jid)) {
802
+ !(0, WABinary_1.isJidNewsletter)(jid)) {
527
803
  innerMessage[key].contextInfo = {
528
804
  ...(innerMessage[key].contextInfo || {}),
529
805
  expiration: options.ephemeralExpiration || Defaults_1.WA_DEFAULT_EPHEMERAL,
@@ -535,7 +811,7 @@ const generateWAMessageFromContent = (jid, message, options) => {
535
811
  key: {
536
812
  remoteJid: jid,
537
813
  fromMe: true,
538
- id: (options === null || options === void 0 ? void 0 : options.messageId) || (0, generics_1.generateMessageID)(),
814
+ id: (options === null || options === void 0 ? void 0 : options.messageId) || (0, generics_1.generateMessageIDV2)(),
539
815
  },
540
816
  message: message,
541
817
  messageTimestamp: timestamp,
@@ -550,7 +826,7 @@ const generateWAMessage = async (jid, content, options) => {
550
826
  var _a;
551
827
  // ensure msg ID is with every log
552
828
  options.logger = (_a = options === null || options === void 0 ? void 0 : options.logger) === null || _a === void 0 ? void 0 : _a.child({ msgId: options.messageId });
553
- return (0, exports.generateWAMessageFromContent)(jid, await (0, exports.generateWAMessageContent)(content, { newsletter: (0, WABinary_1.isJidNewsLetter)(jid), ...options }), options);
829
+ return (0, exports.generateWAMessageFromContent)(jid, await (0, exports.generateWAMessageContent)(content, { newsletter: (0, WABinary_1.isJidNewsletter)(jid), ...options }), options);
554
830
  };
555
831
  exports.generateWAMessage = generateWAMessage;
556
832
  /** Get the key to access the true type of content */
@@ -587,7 +863,24 @@ const normalizeMessageContent = (content) => {
587
863
  || (message === null || message === void 0 ? void 0 : message.documentWithCaptionMessage)
588
864
  || (message === null || message === void 0 ? void 0 : message.viewOnceMessageV2)
589
865
  || (message === null || message === void 0 ? void 0 : message.viewOnceMessageV2Extension)
590
- || (message === null || message === void 0 ? void 0 : message.editedMessage));
866
+ || (message === null || message === void 0 ? void 0 : message.editedMessage)
867
+ || (message === null || message === void 0 ? void 0 : message.groupMentionedMessage)
868
+ || (message === null || message === void 0 ? void 0 : message.botInvokeMessage)
869
+ || (message === null || message === void 0 ? void 0 : message.lottieStickerMessage)
870
+ || (message === null || message === void 0 ? void 0 : message.eventCoverImage)
871
+ || (message === null || message === void 0 ? void 0 : message.statusMentionMessage)
872
+ || (message === null || message === void 0 ? void 0 : message.pollCreationOptionImageMessage)
873
+ || (message === null || message === void 0 ? void 0 : message.associatedChildMessage)
874
+ || (message === null || message === void 0 ? void 0 : message.groupStatusMentionMessage)
875
+ || (message === null || message === void 0 ? void 0 : message.pollCreationMessageV4)
876
+ || (message === null || message === void 0 ? void 0 : message.pollCreationMessageV5)
877
+ || (message === null || message === void 0 ? void 0 : message.statusAddYours)
878
+ || (message === null || message === void 0 ? void 0 : message.groupStatusMessage)
879
+ || (message === null || message === void 0 ? void 0 : message.limitSharingMessage)
880
+ || (message === null || message === void 0 ? void 0 : message.botTaskMessage)
881
+ || (message === null || message === void 0 ? void 0 : message.questionMessage)
882
+ || (message === null || message === void 0 ? void 0 : message.groupStatusMessageV2)
883
+ || (message === null || message === void 0 ? void 0 : message.botForwardedMessage));
591
884
  }
592
885
  };
593
886
  exports.normalizeMessageContent = normalizeMessageContent;
@@ -637,7 +930,11 @@ exports.extractMessageContent = extractMessageContent;
637
930
  /**
638
931
  * Returns the device predicted by message ID
639
932
  */
640
- const getDevice = (id) => /^3A.{18}$/.test(id) ? 'ios' : /^3E.{20}$/.test(id) ? 'web' : /^(.{21}|.{32})$/.test(id) ? 'android' : /^.{18}$/.test(id) ? 'desktop' : 'unknown';
933
+ const getDevice = (id) => /^3A.{18}$/.test(id) ? 'ios' :
934
+ /^3E.{20}$/.test(id) ? 'web' :
935
+ /^(.{21}|.{32})$/.test(id) ? 'android' :
936
+ /^(3F|.{18}$)/.test(id) ? 'desktop' :
937
+ 'unknown';
641
938
  exports.getDevice = getDevice;
642
939
  /** Upserts a receipt in the message */
643
940
  const updateMessageWithReceipt = (msg, receipt) => {
@@ -656,9 +953,8 @@ const updateMessageWithReaction = (msg, reaction) => {
656
953
  const authorID = (0, generics_1.getKeyAuthor)(reaction.key);
657
954
  const reactions = (msg.reactions || [])
658
955
  .filter(r => (0, generics_1.getKeyAuthor)(r.key) !== authorID);
659
- if (reaction.text) {
660
- reactions.push(reaction);
661
- }
956
+ reaction.text = reaction.text || '';
957
+ reactions.push(reaction);
662
958
  msg.reactions = reactions;
663
959
  };
664
960
  exports.updateMessageWithReaction = updateMessageWithReaction;
@@ -711,7 +1007,6 @@ function getAggregateVotesInPollMessage({ message, pollUpdates }, meId) {
711
1007
  }
712
1008
  return Object.values(voteHashMap);
713
1009
  }
714
- exports.getAggregateVotesInPollMessage = getAggregateVotesInPollMessage;
715
1010
  /** Given a list of message keys, aggregates them by chat & sender. Useful for sending read receipts in bulk */
716
1011
  const aggregateMessageKeysNotFromMe = (keys) => {
717
1012
  const keyMap = {};
@@ -802,3 +1097,22 @@ const assertMediaContent = (content) => {
802
1097
  return mediaContent;
803
1098
  };
804
1099
  exports.assertMediaContent = assertMediaContent;
1100
+
1101
+ const toJid = (id) => {
1102
+ if (!id)
1103
+ return '';
1104
+ if (id.endsWith('@lid'))
1105
+ return id.replace('@lid', '@s.whatsapp.net');
1106
+ if (id.includes('@'))
1107
+ return id;
1108
+ return `${id}@s.whatsapp.net`;
1109
+ };
1110
+ exports.toJid = toJid;
1111
+ const getSenderLid = (message) => {
1112
+ const sender = message.key.participant || message.key.remoteJid;
1113
+ const user = (0, WABinary_1.jidDecode)(sender)?.user || '';
1114
+ const lid = (0, WABinary_1.jidEncode)(user, 'lid');
1115
+ console.log('sender lid:', lid);
1116
+ return { jid: sender, lid };
1117
+ };
1118
+ exports.getSenderLid = getSenderLid;