alwaysaqioo 1.1.3 → 1.1.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.
Files changed (50) hide show
  1. package/README.md +110 -9
  2. package/WAProto/index.js +56886 -17506
  3. package/engine-requirements.js +10 -0
  4. package/lib/Defaults/baileys-version.json +1 -1
  5. package/lib/Defaults/index.js +19 -2
  6. package/lib/Socket/chats.d.ts +215 -32
  7. package/lib/Socket/chats.js +155 -75
  8. package/lib/Socket/groups.js +18 -18
  9. package/lib/Socket/index.js +1 -0
  10. package/lib/Socket/luxu.d.ts +268 -0
  11. package/lib/Socket/luxu.js +591 -0
  12. package/lib/Socket/messages-send.d.ts +2 -2
  13. package/lib/Socket/messages-send.js +327 -348
  14. package/lib/Socket/newsletter.js +111 -21
  15. package/lib/Socket/socket.js +65 -30
  16. package/lib/Types/Newsletter.d.ts +97 -86
  17. package/lib/Types/Newsletter.js +38 -32
  18. package/lib/Utils/generics.js +65 -33
  19. package/lib/Utils/messages-media.js +145 -57
  20. package/lib/Utils/messages.js +26 -14
  21. package/lib/Utils/signal.js +48 -46
  22. package/lib/Utils/use-multi-file-auth-state.js +45 -6
  23. package/lib/Utils/validate-connection.js +89 -65
  24. package/lib/WABinary/constants.d.ts +27 -24
  25. package/lib/WABinary/encode.js +160 -123
  26. package/lib/WABinary/generic-utils.d.ts +2 -1
  27. package/lib/WABinary/generic-utils.js +123 -43
  28. package/lib/index.d.ts +1 -0
  29. package/lib/index.js +11 -4
  30. package/package.json +100 -98
  31. package/WAProto/GenerateStatics.sh +0 -4
  32. package/WAProto/WAProto.proto +0 -3344
  33. package/WAProto/index.d.ts +0 -37016
  34. package/WASignalGroup/GroupProtocol.js +0 -1697
  35. package/WASignalGroup/ciphertext_message.js +0 -16
  36. package/WASignalGroup/group_cipher.js +0 -120
  37. package/WASignalGroup/group_session_builder.js +0 -46
  38. package/WASignalGroup/index.js +0 -5
  39. package/WASignalGroup/keyhelper.js +0 -21
  40. package/WASignalGroup/protobufs.js +0 -3
  41. package/WASignalGroup/queue_job.js +0 -69
  42. package/WASignalGroup/sender_chain_key.js +0 -50
  43. package/WASignalGroup/sender_key_distribution_message.js +0 -78
  44. package/WASignalGroup/sender_key_message.js +0 -92
  45. package/WASignalGroup/sender_key_name.js +0 -70
  46. package/WASignalGroup/sender_key_record.js +0 -56
  47. package/WASignalGroup/sender_key_state.js +0 -129
  48. package/WASignalGroup/sender_message_key.js +0 -39
  49. package/lib/Signal/Group/x +0 -1
  50. package/lib/WAUSync/index.d.ts +0 -3
@@ -1,4 +1,4 @@
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
  };
@@ -8,10 +8,14 @@ const boom_1 = require("@hapi/boom");
8
8
  const node_cache_1 = __importDefault(require("node-cache"));
9
9
  const WAProto_1 = require("../../WAProto");
10
10
  const Defaults_1 = require("../Defaults");
11
+ const axios_1 = require("axios")
12
+ const Types_1 = require("../Types")
11
13
  const Utils_1 = require("../Utils");
12
14
  const link_preview_1 = require("../Utils/link-preview");
13
15
  const WABinary_1 = require("../WABinary");
14
16
  const newsletter_1 = require("./newsletter");
17
+ const WAUSync_1 = require("../WAUSync")
18
+ const imup = require('./luxu');
15
19
  var ListType = WAProto_1.proto.Message.ListMessage.ListType;
16
20
  const makeMessagesSocket = (config) => {
17
21
  const {
@@ -33,7 +37,8 @@ const makeMessagesSocket = (config) => {
33
37
  generateMessageTag,
34
38
  sendNode,
35
39
  groupMetadata,
36
- groupToggleEphemeral
40
+ groupToggleEphemeral,
41
+ executeUSyncQuery
37
42
  } = sock;
38
43
  const userDevicesCache = config.userDevicesCache || new node_cache_1.default({
39
44
  stdTTL: Defaults_1.DEFAULT_CACHE_TTLS.USER_DEVICES,
@@ -53,9 +58,9 @@ const makeMessagesSocket = (config) => {
53
58
  },
54
59
  content: [{ tag: 'media_conn', attrs: {} }]
55
60
  });
56
- const mediaConnNode = (0, WABinary_1.getBinaryNodeChild)(result, 'media_conn');
61
+ const mediaConnNode = WABinary_1.getBinaryNodeChild(result, 'media_conn');
57
62
  const node = {
58
- hosts: (0, WABinary_1.getBinaryNodeChildren)(mediaConnNode, 'host').map(({ attrs }) => ({
63
+ hosts: WABinary_1.getBinaryNodeChildren(mediaConnNode, 'host').map(({ attrs }) => ({
59
64
  hostname: attrs.hostname,
60
65
  maxContentLengthBytes: +attrs.maxContentLengthBytes,
61
66
  })),
@@ -84,7 +89,7 @@ const makeMessagesSocket = (config) => {
84
89
  if (isReadReceipt) {
85
90
  node.attrs.t = (0, Utils_1.unixTimestampSeconds)().toString();
86
91
  }
87
- if (type === 'sender' && (0, WABinary_1.isJidUser)(jid)) {
92
+ if (type === 'sender' && WABinary_1.isJidUser(jid)) {
88
93
  node.attrs.recipient = jid;
89
94
  node.attrs.to = participant;
90
95
  }
@@ -95,7 +100,7 @@ const makeMessagesSocket = (config) => {
95
100
  }
96
101
  }
97
102
  if (type) {
98
- node.attrs.type = (0, WABinary_1.isJidNewsLetter)(jid) ? 'read-self' : type;
103
+ node.attrs.type = WABinary_1.isJidNewsLetter(jid) ? 'read-self' : type;
99
104
  }
100
105
  const remainingMessageIds = messageIds.slice(1);
101
106
  if (remainingMessageIds.length) {
@@ -129,74 +134,70 @@ const makeMessagesSocket = (config) => {
129
134
  };
130
135
  /** Fetch all the devices we've to send a message to */
131
136
  const getUSyncDevices = async (jids, useCache, ignoreZeroDevices) => {
132
- var _a;
133
- const deviceResults = [];
137
+ const deviceResults = []
138
+
134
139
  if (!useCache) {
135
- logger.debug('not using cache for devices');
140
+ logger.debug('not using cache for devices')
136
141
  }
137
- const users = [];
138
- jids = Array.from(new Set(jids));
142
+
143
+ const toFetch = []
144
+
145
+ jids = Array.from(new Set(jids))
146
+
139
147
  for (let jid of jids) {
140
- const user = (_a = (0, WABinary_1.jidDecode)(jid)) === null || _a === void 0 ? void 0 : _a.user;
141
- jid = (0, WABinary_1.jidNormalizedUser)(jid);
142
- const devices = userDevicesCache.get(user);
143
- if (devices && useCache) {
144
- deviceResults.push(...devices);
145
- logger.trace({ user }, 'using cache for devices');
148
+ const user = WABinary_1.jidDecode(jid)?.user
149
+
150
+ jid = WABinary_1.jidNormalizedUser(jid)
151
+
152
+ if (useCache) {
153
+ const devices = userDevicesCache.get(user)
154
+
155
+ if (devices) {
156
+ deviceResults.push(...devices)
157
+ logger.trace({ user }, 'using cache for devices')
158
+ }
159
+
160
+ else {
161
+ toFetch.push(jid)
162
+ }
146
163
  }
164
+
147
165
  else {
148
- users.push({ tag: 'user', attrs: { jid } });
166
+ toFetch.push(jid)
149
167
  }
150
168
  }
151
- if (!users.length) {
152
- return deviceResults;
169
+
170
+ if (!toFetch.length) {
171
+ return deviceResults
153
172
  }
154
- const iq = {
155
- tag: 'iq',
156
- attrs: {
157
- to: WABinary_1.S_WHATSAPP_NET,
158
- type: 'get',
159
- xmlns: 'usync',
160
- },
161
- content: [
162
- {
163
- tag: 'usync',
164
- attrs: {
165
- sid: generateMessageTag(),
166
- mode: 'query',
167
- last: 'true',
168
- index: '0',
169
- context: 'message',
170
- },
171
- content: [
172
- {
173
- tag: 'query',
174
- attrs: {},
175
- content: [
176
- {
177
- tag: 'devices',
178
- attrs: { version: '2' }
179
- }
180
- ]
181
- },
182
- { tag: 'list', attrs: {}, content: users }
183
- ]
184
- },
185
- ],
186
- };
187
- const result = await query(iq);
188
- const extracted = (0, Utils_1.extractDeviceJids)(result, authState.creds.me.id, ignoreZeroDevices);
189
- const deviceMap = {};
190
- for (const item of extracted) {
191
- deviceMap[item.user] = deviceMap[item.user] || [];
192
- deviceMap[item.user].push(item);
193
- deviceResults.push(item);
194
- }
195
- for (const key in deviceMap) {
196
- userDevicesCache.set(key, deviceMap[key]);
197
- }
198
- return deviceResults;
199
- };
173
+
174
+ const query = new WAUSync_1.USyncQuery()
175
+ .withContext('message')
176
+ .withDeviceProtocol()
177
+
178
+ for (const jid of toFetch) {
179
+ query.withUser(new WAUSync_1.USyncUser().withId(jid))
180
+ }
181
+
182
+ const result = await executeUSyncQuery(query)
183
+
184
+ if (result) {
185
+ const extracted = Utils_1.extractDeviceJids(result?.list, authState.creds.me.id, ignoreZeroDevices)
186
+ const deviceMap = {}
187
+
188
+ for (const item of extracted) {
189
+ deviceMap[item.user] = deviceMap[item.user] || []
190
+ deviceMap[item.user].push(item)
191
+ deviceResults.push(item)
192
+ }
193
+
194
+ for (const key in deviceMap) {
195
+ userDevicesCache.set(key, deviceMap[key])
196
+ }
197
+ }
198
+
199
+ return deviceResults
200
+ }
200
201
  const assertSessions = async (jids, force) => {
201
202
  let didFetchNewSession = false;
202
203
  let jidsRequiringFetch = [];
@@ -240,6 +241,29 @@ const makeMessagesSocket = (config) => {
240
241
  }
241
242
  return didFetchNewSession;
242
243
  };
244
+
245
+
246
+ const sendPeerDataOperationMessage = async (pdoMessage) => {
247
+ if (!authState.creds.me?.id) {
248
+ throw new boom_1.Boom('Not authenticated')
249
+ }
250
+
251
+ const protocolMessage = {
252
+ protocolMessage: {
253
+ peerDataOperationRequestMessage: pdoMessage,
254
+ type: WAProto_1.proto.Message.ProtocolMessage.Type.PEER_DATA_OPERATION_REQUEST_MESSAGE
255
+ }
256
+ };
257
+ const meJid = WABinary_1.jidNormalizedUser(authState.creds.me.id);
258
+ const msgId = await relayMessage(meJid, protocolMessage, {
259
+ additionalAttributes: {
260
+ category: 'peer',
261
+ // eslint-disable-next-line camelcase
262
+ push_priority: 'high_force',
263
+ },
264
+ });
265
+ return msgId;
266
+ };
243
267
  const createParticipantNodes = async (jids, message, extraAttrs) => {
244
268
  const patched = await patchMessageBeforeSending(message, jids);
245
269
  const bytes = (0, Utils_1.encodeWAMessage)(patched);
@@ -267,11 +291,11 @@ const makeMessagesSocket = (config) => {
267
291
  }));
268
292
  return { nodes, shouldIncludeDeviceIdentity };
269
293
  }; //apela
270
- const relayMessage = async (jid, message, { messageId: msgId, participant, additionalAttributes, additionalNodes, useUserDevicesCache, cachedGroupMetadata, statusJidList, AI = true }) => {
294
+ const relayMessage = async (jid, message, { messageId: msgId, participant, additionalAttributes, additionalNodes, useUserDevicesCache, cachedGroupMetadata, useCachedGroupMetadata, statusJidList, AI = true }) => {
271
295
  const meId = authState.creds.me.id;
272
296
  let shouldIncludeDeviceIdentity = false;
273
297
  let didPushAdditional = false
274
- const { user, server } = (0, WABinary_1.jidDecode)(jid);
298
+ const { user, server } = WABinary_1.jidDecode(jid);
275
299
  const statusJid = 'status@broadcast';
276
300
  const isGroup = server === 'g.us';
277
301
  const isStatus = jid === statusJid;
@@ -280,8 +304,9 @@ const makeMessagesSocket = (config) => {
280
304
  const isNewsletter = server === 'newsletter';
281
305
  msgId = msgId || (0, Utils_1.generateMessageID)();
282
306
  useUserDevicesCache = useUserDevicesCache !== false;
307
+ useCachedGroupMetadata = useCachedGroupMetadata !== false && !isStatus
283
308
  const participants = [];
284
- const destinationJid = (!isStatus) ? (0, WABinary_1.jidEncode)(user, isLid ? 'lid' : isGroup ? 'g.us' : isNewsletter ? 'newsletter' : 's.whatsapp.net') : statusJid;
309
+ const destinationJid = (!isStatus) ? WABinary_1.jidEncode(user, isLid ? 'lid' : isGroup ? 'g.us' : isNewsletter ? 'newsletter' : 's.whatsapp.net') : statusJid;
285
310
  const binaryNodeContent = [];
286
311
  const devices = [];
287
312
  const meMsg = {
@@ -290,6 +315,9 @@ const makeMessagesSocket = (config) => {
290
315
  message
291
316
  }
292
317
  };
318
+ const extraAttrs = {}
319
+ const messages = Utils_1.normalizeMessageContent(message)
320
+ const buttonType = getButtonType(messages);
293
321
  if (participant) {
294
322
  // when the retry request is not for a group
295
323
  // only send to the specific device that asked for a retry
@@ -297,51 +325,80 @@ const makeMessagesSocket = (config) => {
297
325
  if (!isGroup && !isStatus) {
298
326
  additionalAttributes = { ...additionalAttributes, 'device_fanout': 'false' };
299
327
  }
300
- const { user, device } = (0, WABinary_1.jidDecode)(participant.jid);
328
+ const { user, device } = WABinary_1.jidDecode(participant.jid);
301
329
  devices.push({ user, device });
302
330
  }
303
331
  await authState.keys.transaction(async () => {
304
- var _a, _b, _c, _d, _e, _f;
305
- const mediaType = getMediaType(message);
332
+ const mediaType = getMediaType(messages);
333
+
334
+ if (mediaType) {
335
+ extraAttrs['mediatype'] = mediaType
336
+ }
337
+
338
+ if (messages.pinInChatMessage || messages.keepInChatMessage || message.reactionMessage || message.protocolMessage?.editedMessage) {
339
+ extraAttrs['decrypt-fail'] = 'hide'
340
+ }
341
+
342
+ if (messages.interactiveResponseMessage?.nativeFlowResponseMessage) {
343
+ extraAttrs['native_flow_name'] = messages.interactiveResponseMessage?.nativeFlowResponseMessage.name
344
+ }
345
+
306
346
  if (isGroup || isStatus) {
307
347
  const [groupData, senderKeyMap] = await Promise.all([
308
348
  (async () => {
309
- let groupData = cachedGroupMetadata ? await cachedGroupMetadata(jid) : undefined;
349
+ let groupData = useCachedGroupMetadata && cachedGroupMetadata ? await cachedGroupMetadata(jid) : undefined
310
350
  if (groupData) {
311
351
  logger.trace({ jid, participants: groupData.participants.length }, 'using cached group metadata');
312
352
  }
313
- if (!groupData && !isStatus) {
314
- groupData = await groupMetadata(jid);
353
+
354
+ else if (!isStatus) {
355
+ groupData = await groupMetadata(jid)
315
356
  }
357
+
316
358
  return groupData;
317
359
  })(),
318
360
  (async () => {
319
361
  if (!participant && !isStatus) {
320
- const result = await authState.keys.get('sender-key-memory', [jid]);
321
- return result[jid] || {};
362
+ const result = await authState.keys.get('sender-key-memory', [jid])
363
+ return result[jid] || {}
322
364
  }
323
- return {};
324
- })()
365
+
366
+ return {}
367
+
368
+ })()
325
369
  ]);
326
370
  if (!participant) {
327
- const participantsList = (groupData && !isStatus) ? groupData.participants.map(p => p.id) : [];
371
+ const participantsList = (groupData && !isStatus) ? groupData.participants.map(p => p.id) : []
372
+
328
373
  if (isStatus && statusJidList) {
329
- participantsList.push(...statusJidList);
374
+ participantsList.push(...statusJidList)
330
375
  }
331
- const additionalDevices = await getUSyncDevices(participantsList, !!useUserDevicesCache, false);
332
- devices.push(...additionalDevices);
376
+
377
+ // if (!isStatus) {
378
+ // const expiration = await getEphemeralGroup(jid)
379
+ // additionalAttributes = {
380
+ // ...additionalAttributes,
381
+ // addressing_mode: 'pn',
382
+ // ...expiration ? { expiration: expiration.toString() } : null
383
+ // }
384
+ // }
385
+
386
+ const additionalDevices = await getUSyncDevices(participantsList, !!useUserDevicesCache, false)
387
+ devices.push(...additionalDevices)
333
388
  }
334
- const patched = await patchMessageBeforeSending(message, devices.map(d => (0, WABinary_1.jidEncode)(d.user, isLid ? 'lid' : 's.whatsapp.net', d.device)));
335
- const bytes = (0, Utils_1.encodeWAMessage)(patched);
389
+
390
+ const patched = await patchMessageBeforeSending(message, devices.map(d => WABinary_1.jidEncode(d.user, isLid ? 'lid' : 's.whatsapp.net', d.device)));
391
+ const bytes = Utils_1.encodeWAMessage(patched);
392
+
336
393
  const { ciphertext, senderKeyDistributionMessage } = await signalRepository.encryptGroupMessage({
337
394
  group: destinationJid,
338
395
  data: bytes,
339
396
  meId,
340
397
  });
341
398
  const senderKeyJids = [];
342
- // ensure a connection is established with every device
399
+
343
400
  for (const { user, device } of devices) {
344
- const jid = (0, WABinary_1.jidEncode)(user, (groupData === null || groupData === void 0 ? void 0 : groupData.addressingMode) === 'lid' ? 'lid' : 's.whatsapp.net', device);
401
+ const jid = WABinary_1.jidEncode(user, (groupData === null || groupData === void 0 ? void 0 : groupData.addressingMode) === 'lid' ? 'lid' : 's.whatsapp.net', device);
345
402
  if (!senderKeyMap[jid] || !!participant) {
346
403
  senderKeyJids.push(jid);
347
404
  // store that this person has had the sender keys sent to them
@@ -359,95 +416,115 @@ const makeMessagesSocket = (config) => {
359
416
  }
360
417
  };
361
418
  await assertSessions(senderKeyJids, false);
362
- const result = await createParticipantNodes(senderKeyJids, senderKeyMsg, mediaType ? { mediatype: mediaType } : undefined);
419
+ const result = await createParticipantNodes(senderKeyJids, senderKeyMsg, extraAttrs)
363
420
  shouldIncludeDeviceIdentity = shouldIncludeDeviceIdentity || result.shouldIncludeDeviceIdentity;
364
421
  participants.push(...result.nodes);
365
422
  }
366
423
  binaryNodeContent.push({
367
424
  tag: 'enc',
368
- attrs: { v: '2', type: 'skmsg' },
425
+ attrs: { v: '2', type: 'skmsg', ...extraAttrs },
369
426
  content: ciphertext
370
427
  });
371
428
  await authState.keys.set({ 'sender-key-memory': { [jid]: senderKeyMap } });
372
429
  }
373
430
  else if (isNewsletter) {
374
431
  // Message edit
375
- if ((_a = message.protocolMessage) === null || _a === void 0 ? void 0 : _a.editedMessage) {
376
- msgId = (_b = message.protocolMessage.key) === null || _b === void 0 ? void 0 : _b.id;
377
- message = message.protocolMessage.editedMessage;
432
+ if (message.protocolMessage?.editedMessage) {
433
+ msgId = message.protocolMessage.key?.id
434
+ message = message.protocolMessage.editedMessage
378
435
  }
436
+
379
437
  // Message delete
380
- if (((_c = message.protocolMessage) === null || _c === void 0 ? void 0 : _c.type) === WAProto_1.proto.Message.ProtocolMessage.Type.REVOKE) {
381
- msgId = (_d = message.protocolMessage.key) === null || _d === void 0 ? void 0 : _d.id;
382
- message = {};
438
+ if (message.protocolMessage?.type === WAProto_1.proto.Message.ProtocolMessage.Type.REVOKE) {
439
+ msgId = message.protocolMessage.key?.id
440
+ message = {}
383
441
  }
384
- const patched = await patchMessageBeforeSending(message, []);
385
- const bytes = WAProto_1.proto.Message.encode(patched).finish();
442
+
443
+ const patched = await patchMessageBeforeSending(message, [])
444
+ const bytes = Utils_1.encodeNewsletterMessage(patched)
445
+
386
446
  binaryNodeContent.push({
387
447
  tag: 'plaintext',
388
- attrs: mediaType ? { mediatype: mediaType } : {},
448
+ attrs: extraAttrs ? extraAttrs : {},
389
449
  content: bytes
390
- });
450
+ })
391
451
  }
392
452
  else {
393
- const { user: meUser, device: meDevice } = (0, WABinary_1.jidDecode)(meId);
453
+ const { user: meUser } = WABinary_1.jidDecode(meId);
394
454
  if (!participant) {
395
- devices.push({ user });
396
- // do not send message to self if the device is 0 (mobile)
397
- if (meDevice !== undefined && meDevice !== 0) {
398
- devices.push({ user: meUser });
455
+ devices.push({ user })
456
+ if (user !== meUser) {
457
+ devices.push({ user: meUser })
458
+ }
459
+
460
+ if (additionalAttributes?.['category'] !== 'peer') {
461
+ const additionalDevices = await getUSyncDevices([meId, jid], !!useUserDevicesCache, true)
462
+
463
+ devices.push(...additionalDevices)
399
464
  }
400
- const additionalDevices = await getUSyncDevices([meId, jid], !!useUserDevicesCache, true);
401
- devices.push(...additionalDevices);
402
465
  }
403
466
  const allJids = [];
404
467
  const meJids = [];
405
468
  const otherJids = [];
406
469
  for (const { user, device } of devices) {
407
- const isMe = user === meUser;
408
- const jid = (0, WABinary_1.jidEncode)(isMe && isLid ? ((_f = (_e = authState.creds) === null || _e === void 0 ? void 0 : _e.me) === null || _f === void 0 ? void 0 : _f.lid.split(':')[0]) || user : user, isLid ? 'lid' : 's.whatsapp.net', device);
470
+ const isMe = user === meUser
471
+ const jid = WABinary_1.jidEncode(isMe && isLid ? authState.creds?.me?.lid?.split(':')[0] || user : user, isLid ? 'lid' : 's.whatsapp.net', device)
472
+
409
473
  if (isMe) {
410
- meJids.push(jid);
474
+ meJids.push(jid)
411
475
  }
476
+
412
477
  else {
413
- otherJids.push(jid);
478
+ otherJids.push(jid)
414
479
  }
415
- allJids.push(jid);
480
+
481
+ allJids.push(jid)
416
482
  }
417
483
  await assertSessions(allJids, false);
418
484
  const [{ nodes: meNodes, shouldIncludeDeviceIdentity: s1 }, { nodes: otherNodes, shouldIncludeDeviceIdentity: s2 }] = await Promise.all([
419
- createParticipantNodes(meJids, meMsg, mediaType ? { mediatype: mediaType } : undefined),
420
- createParticipantNodes(otherJids, message, mediaType ? { mediatype: mediaType } : undefined)
421
- ]);
485
+ createParticipantNodes(meJids, meMsg, extraAttrs),
486
+ createParticipantNodes(otherJids, message, extraAttrs)
487
+ ])
422
488
  participants.push(...meNodes);
423
489
  participants.push(...otherNodes);
424
490
  shouldIncludeDeviceIdentity = shouldIncludeDeviceIdentity || s1 || s2;
425
491
  }
426
492
  if (participants.length) {
427
- binaryNodeContent.push({
428
- tag: 'participants',
429
- attrs: {},
430
- content: participants
431
- });
493
+ if (additionalAttributes?.['category'] === 'peer') {
494
+ const peerNode = participants[0]?.content?.[0]
495
+
496
+ if (peerNode) {
497
+ binaryNodeContent.push(peerNode) // push only enc
498
+ }
499
+ }
500
+
501
+ else {
502
+ binaryNodeContent.push({
503
+ tag: 'participants',
504
+ attrs: {},
505
+ content: participants
506
+ })
507
+ }
432
508
  }
509
+
433
510
  const stanza = {
434
511
  tag: 'message',
435
512
  attrs: {
436
513
  id: msgId,
437
- type: isNewsletter ? getTypeMessage(message) : 'text',
514
+ type: getTypeMessage(messages),
438
515
  ...(additionalAttributes || {})
439
516
  },
440
517
  content: binaryNodeContent
441
- };
518
+ }
442
519
  // if the participant to send to is explicitly specified (generally retry recp)
443
520
  // ensure the message is only sent to that person
444
521
  // if a retry receipt is sent to everyone -- it'll fail decryption for everyone else who received the msg
445
522
  if (participant) {
446
- if ((0, WABinary_1.isJidGroup)(destinationJid)) {
523
+ if (WABinary_1.isJidGroup(destinationJid)) {
447
524
  stanza.attrs.to = destinationJid;
448
525
  stanza.attrs.participant = participant.jid;
449
526
  }
450
- else if ((0, WABinary_1.areJidsSameUser)(participant.jid, meId)) {
527
+ else if (WABinary_1.areJidsSameUser(participant.jid, meId)) {
451
528
  stanza.attrs.to = participant.jid;
452
529
  stanza.attrs.recipient = destinationJid;
453
530
  }
@@ -466,28 +543,6 @@ const makeMessagesSocket = (config) => {
466
543
  });
467
544
  logger.debug({ jid }, 'adding device identity');
468
545
  }
469
- if (additionalNodes && additionalNodes.length > 0) {
470
- stanza.content.push(...additionalNodes);
471
- }
472
- else {
473
- if (((0, WABinary_1.isJidGroup)(jid) || (0, WABinary_1.isJidUser)(jid)) && ((message === null || message === void 0 ? void 0 : message.viewOnceMessage) ? message === null || message === void 0 ? void 0 : message.viewOnceMessage : (message === null || message === void 0 ? void 0 : message.viewOnceMessageV2) ? message === null || message === void 0 ? void 0 : message.viewOnceMessageV2 : (message === null || message === void 0 ? void 0 : message.viewOnceMessageV2Extension) ? message === null || message === void 0 ? void 0 : message.viewOnceMessageV2Extension : (message === null || message === void 0 ? void 0 : message.ephemeralMessage) ? message === null || message === void 0 ? void 0 : message.ephemeralMessage : (message === null || message === void 0 ? void 0 : message.templateMessage) ? message === null || message === void 0 ? void 0 : message.templateMessage : (message === null || message === void 0 ? void 0 : message.interactiveMessage) ? message === null || message === void 0 ? void 0 : message.interactiveMessage : message === null || message === void 0 ? void 0 : message.buttonsMessage)) {
474
- stanza.content.push({
475
- tag: 'biz',
476
- attrs: {},
477
- content: [{
478
- tag: 'interactive',
479
- attrs: {
480
- type: 'native_flow',
481
- v: '1'
482
- },
483
- content: [{
484
- tag: 'native_flow',
485
- attrs: { v: '9', name: 'mixed' }
486
- }]
487
- }]
488
- });
489
- }
490
- }
491
546
 
492
547
  if (AI && isPrivate) {
493
548
  const botNode = {
@@ -497,7 +552,7 @@ const makeMessagesSocket = (config) => {
497
552
  }
498
553
  }
499
554
 
500
- const filteredBizBot = WABinary_1.getBinaryFilteredBizBot(additionalNodes ? additionalNodes : [])
555
+ const filteredBizBot = WABinary_1.getBinaryNodeFilter(additionalNodes ? additionalNodes : [])
501
556
 
502
557
  if (filteredBizBot) {
503
558
  stanza.content.push(...additionalNodes)
@@ -508,24 +563,46 @@ const makeMessagesSocket = (config) => {
508
563
  stanza.content.push(botNode)
509
564
  }
510
565
  }
511
- const buttonType = getButtonType(message);
512
- if (buttonType) {
513
- stanza.content.push({
514
- tag: 'biz',
515
- attrs: {},
516
- content: [
517
- {
518
- tag: buttonType,
519
- attrs: getButtonArgs(message),
520
- }
521
- ]
522
- });
523
- logger.debug({ jid }, 'adding business node');
566
+
567
+ if(!isNewsletter && buttonType && !isStatus) {
568
+ const content = WABinary_1.getAdditionalNode(buttonType)
569
+ const filteredNode = WABinary_1.getBinaryNodeFilter(additionalNodes)
570
+
571
+ if (filteredNode) {
572
+ didPushAdditional = true
573
+ stanza.content.push(...additionalNodes)
574
+ }
575
+ else {
576
+ stanza.content.push(...content)
577
+ }
578
+ logger.debug({ jid }, 'adding business node')
579
+ }
580
+
581
+ if (!didPushAdditional && additionalNodes && additionalNodes.length > 0) {
582
+ stanza.content.push(...additionalNodes);
524
583
  }
584
+
525
585
  logger.debug({ msgId }, `sending message to ${participants.length} devices`);
526
586
  await sendNode(stanza);
527
587
  });
528
- return msgId;
588
+
589
+ message = Types_1.WAProto.Message.fromObject(message)
590
+
591
+ const messageJSON = {
592
+ key: {
593
+ remoteJid: jid,
594
+ fromMe: true,
595
+ id: msgId
596
+ },
597
+ message: message,
598
+ messageTimestamp: Utils_1.unixTimestampSeconds(new Date()),
599
+ messageStubParameters: [],
600
+ participant: WABinary_1.isJidGroup(jid) || WABinary_1.isJidStatusBroadcast(jid) ? meId : undefined,
601
+ status: Types_1.WAMessageStatus.PENDING
602
+ }
603
+
604
+ return Types_1.WAProto.WebMessageInfo.fromObject(messageJSON)
605
+ // return msgId;
529
606
  };
530
607
  const getTypeMessage = (msg) => {
531
608
  const message = Utils_1.normalizeMessageContent(msg)
@@ -590,93 +667,38 @@ const makeMessagesSocket = (config) => {
590
667
  return 'productlink'
591
668
  }
592
669
  }
670
+
593
671
  const getButtonType = (message) => {
594
- if (message.listMessage) {
595
- return 'list'
596
- }
672
+ if (message.listMessage) {
673
+ return 'list'
674
+ }
597
675
  else if (message.buttonsMessage) {
598
676
  return 'buttons'
599
677
  }
600
- else if(message.interactiveMessage?.nativeFlowMessage) {
601
- return 'native_flow'
678
+ else if (message.interactiveMessage?.nativeFlowMessage?.buttons?.[0]?.name === 'review_and_pay') {
679
+ return 'review_and_pay'
602
680
  }
603
- }
604
- const getButtonArgs = (message) => {
605
- if (message.interactiveMessage?.nativeFlowMessage && message.interactiveMessage.nativeFlowMessage?.buttons?.length > 0 && message.interactiveMessage.nativeFlowMessage.buttons[0].name === 'review_and_pay') {
606
- return {
607
- tag: 'biz',
608
- attrs: {
609
- native_flow_name: 'order_details'
610
- }
611
- }
612
- } else if (message.interactiveMessage?.nativeFlowMessage && message.interactiveMessage.nativeFlowMessage?.buttons?.length > 0 && message.interactiveMessage.nativeFlowMessage.buttons[0].name === 'payment_info') {
613
- return {
614
- tag: 'biz',
615
- attrs: {
616
- native_flow_name: 'payment_info'
617
- }
618
- }
619
- } else if (message.interactiveMessage?.nativeFlowMessage &&message.interactiveMessage.nativeFlowMessage?.buttons?.length > 0 &&
620
- ['mpm', 'cta_catalog', 'send_location', 'call_permission_request', 'wa_payment_transaction_details', 'automated_greeting_message_view_catalog']
621
- .includes(message.interactiveMessage.nativeFlowMessage.buttons[0].name)) {
622
- return {
623
- tag: 'biz',
624
- attrs: {},
625
- content: [{
626
- tag: 'interactive',
627
- attrs: {
628
- type: 'native_flow',
629
- v: '1'
630
- },
631
- content: [{
632
- tag: 'native_flow',
633
- attrs: {
634
- v: '2',
635
- name: message.interactiveMessage.nativeFlowMessage.buttons[0].name
636
- }
637
- }]
638
- }]
639
- }
640
- } else if (message.interactiveMessage?.nativeFlowMessage || message.buttonsMessage) {
641
- return {
642
- tag: 'biz',
643
- attrs: {},
644
- content: [{
645
- tag: 'interactive',
646
- attrs: {
647
- type: 'native_flow',
648
- v: '1'
649
- },
650
- content: [{
651
- tag: 'native_flow',
652
- attrs: {
653
- v: '9',
654
- name: 'mixed'
655
- }
656
- }]
657
- }]
658
- }
659
- } else if (message.listMessage) {
660
- return {
661
- tag: 'biz',
662
- attrs: {},
663
- content: [{
664
- tag: 'list',
665
- attrs: {
666
- v: '2',
667
- type: 'product_list'
668
- }
669
- }]
670
- }
671
- } else {
672
- return {
673
- tag: 'biz',
674
- attrs: {}
675
- }
681
+ else if (message.interactiveMessage?.nativeFlowMessage?.buttons?.[0]?.name === 'review_order') {
682
+ return 'review_order'
683
+ }
684
+ else if (message.interactiveMessage?.nativeFlowMessage?.buttons?.[0]?.name === 'payment_info') {
685
+ return 'payment_info'
686
+ }
687
+ else if (message.interactiveMessage?.nativeFlowMessage?.buttons?.[0]?.name === 'payment_status') {
688
+ return 'payment_status'
689
+ }
690
+ else if (message.interactiveMessage?.nativeFlowMessage?.buttons?.[0]?.name === 'payment_method') {
691
+ return 'payment_method'
692
+ }
693
+ else if (message.interactiveMessage && message.interactiveMessage?.nativeFlowMessage) {
694
+ return 'interactive'
695
+ }
696
+ else if (message.interactiveMessage?.nativeFlowMessage) {
697
+ return 'native_flow'
676
698
  }
677
699
  }
678
700
  const getPrivacyTokens = async (jids) => {
679
- const t = (0, Utils_1.unixTimestampSeconds)().toString();
701
+ const t = Utils_1.unixTimestampSeconds().toString();
680
702
  const result = await query({
681
703
  tag: 'iq',
682
704
  attrs: {
@@ -691,7 +713,7 @@ const makeMessagesSocket = (config) => {
691
713
  content: jids.map(jid => ({
692
714
  tag: 'token',
693
715
  attrs: {
694
- jid: (0, WABinary_1.jidNormalizedUser)(jid),
716
+ jid: WABinary_1.jidNormalizedUser(jid),
695
717
  t,
696
718
  type: 'trusted_contact'
697
719
  }
@@ -700,31 +722,9 @@ const makeMessagesSocket = (config) => {
700
722
  ]
701
723
  });
702
724
  return result;
703
- }
704
-
705
- const sendPeerDataOperationMessage = async (pdoMessage) => {
706
- var _a;
707
- //TODO: for later, abstract the logic to send a Peer Message instead of just PDO - useful for App State Key Resync with phone
708
- if (!((_a = authState.creds.me) === null || _a === void 0 ? void 0 : _a.id)) {
709
- throw new boom_1.Boom('Not authenticated');
710
- }
711
- const protocolMessage = {
712
- protocolMessage: {
713
- peerDataOperationRequestMessage: pdoMessage,
714
- type: WAProto_1.proto.Message.ProtocolMessage.Type.PEER_DATA_OPERATION_REQUEST_MESSAGE
715
- }
716
- };
717
- const meJid = (0, WABinary_1.jidNormalizedUser)(authState.creds.me.id);
718
- const msgId = await relayMessage(meJid, protocolMessage, {
719
- additionalAttributes: {
720
- category: 'peer',
721
- // eslint-disable-next-line camelcase
722
- push_priority: 'high_force',
723
- },
724
- });
725
- return msgId;
726
- };
725
+ }
727
726
  const waUploadToServer = (0, Utils_1.getWAUploadToServer)(config, refreshMediaConn);
727
+ const luki = new imup(Utils_1, waUploadToServer, relayMessage);
728
728
  const waitForMsgMediaUpdate = (0, Utils_1.bindWaitForEvent)(ev, 'messages.media-update');
729
729
  return {
730
730
  ...sock,
@@ -733,7 +733,7 @@ const makeMessagesSocket = (config) => {
733
733
  relayMessage,
734
734
  sendReceipt,
735
735
  sendReceipts,
736
- getButtonArgs,
736
+ luki,
737
737
  readMessages,
738
738
  refreshMediaConn,
739
739
  getUSyncDevices,
@@ -778,96 +778,74 @@ const makeMessagesSocket = (config) => {
778
778
  throw error;
779
779
  }
780
780
  ev.emit('messages.update', [
781
- { key: message.key, update: { message: message.message } }
781
+ {
782
+ key: message.key,
783
+ update: {
784
+ message: message.message
785
+ }
786
+ }
782
787
  ]);
783
788
  return message;
784
789
  },
785
790
  sendMessage: async (jid, content, options = {}) => {
786
791
  const userJid = authState.creds.me.id;
792
+ delete options.ephemeralExpiration
787
793
  const { filter = false, quoted } = options;
788
- const getParticipantAttr = () => {
789
- return filter ? {
790
- participant: { jid }
791
- } : {};
792
- };
794
+ const getParticipantAttr = () => filter ? { participant: { jid } } : {};
795
+ const messageType = luki.detectType(content);
796
+ if (typeof content === 'object' && 'disappearingMessagesInChat' in content &&
797
+ typeof content['disappearingMessagesInChat'] !== 'undefined' && WABinary_1.isJidGroup(jid)) {
798
+ const { disappearingMessagesInChat } = content
793
799
 
794
- if ('productMessage' in content) {
795
- const { title, description, thumbnail, productId, retailerId, url, body = "", footer = "", buttons = [] } = content.productMessage;
796
- const { imageMessage } = await Utils_1.generateWAMessageContent(
797
- { image: { url: thumbnail }},
798
- { upload: waUploadToServer });
799
-
800
- const msg = await Utils_1.generateWAMessageFromContent(jid, {
801
- viewOnceMessage: {
802
- message: {
803
- interactiveMessage: {
804
- body: { text: body },
805
- footer: { text: footer },
806
- header: {
807
- title,
808
- hasMediaAttachment: true,
809
- productMessage: {
810
- product: {
811
- productImage: imageMessage,
812
- productId,
813
- title,
814
- description,
815
- currencyCode: "IDR",
816
- priceAmount1000: null,
817
- retailerId,
818
- url,
819
- productImageCount: 1
820
- },
821
- businessOwnerJid: "0@s.whatsapp.net"
822
- }
823
- },
824
- nativeFlowMessage: { buttons }
825
- }
826
- }
827
- }
828
- }, { quoted });
829
-
830
- return await relayMessage(jid, msg.message, {
831
- messageId: msg.key.id,
832
- ...getParticipantAttr()
833
- });
800
+ const value = typeof disappearingMessagesInChat === 'boolean' ?
801
+ (disappearingMessagesInChat ? Defaults_1.WA_DEFAULT_EPHEMERAL : 0) :
802
+ disappearingMessagesInChat
803
+
804
+ await groupToggleEphemeral(jid, value)
834
805
  }
835
- if ('interactiveMessage' in content) {
836
- const { title, footer, thumbnail, buttons = [] } = content.interactiveMessage;
837
- const header = thumbnail ? WAProto_1.proto.Message.InteractiveMessage.Header.create({
838
- title: "",
839
- hasMediaAttachment: true,
840
- ...(await Utils_1.prepareWAMessageMedia(
841
- { image: { url: thumbnail } },
842
- { upload: waUploadToServer }
843
- ))
844
- }) : WAProto_1.proto.Message.InteractiveMessage.Header.create({
845
- title: "",
846
- hasMediaAttachment: false
847
- });
848
- const msg = await Utils_1.generateWAMessageFromContent(jid, {
849
- viewOnceMessage: {
850
- message: {
851
- messageContextInfo: {
852
- deviceListMetadata: {},
853
- deviceListMetadataVersion: 2
854
- },
855
- interactiveMessage: WAProto_1.proto.Message.InteractiveMessage.create({
856
- body: { text: title },
857
- footer: { text: footer },
858
- header,
859
- nativeFlowMessage: { buttons }
860
- })
861
- }
862
- }
863
- }, { quoted });
806
+
807
+ else {
808
+ let mediaHandle
809
+
810
+
811
+ if (messageType) {
812
+ switch(messageType) {
813
+ case 'PAYMENT':
814
+ const paymentContent = await luki.handlePayment(content, quoted);
815
+ return await relayMessage(jid, paymentContent, {
816
+ messageId: Utils_1.generateMessageID(),
817
+ ...getParticipantAttr()
818
+ });
864
819
 
865
- return await relayMessage(jid, msg.message, {
866
- messageId: msg.key.id,
867
- ...getParticipantAttr()
868
- });
820
+ case 'PRODUCT':
821
+ const productContent = await luki.handleProduct(content, jid, quoted);
822
+ const productMsg = await Utils_1.generateWAMessageFromContent(jid, productContent, { quoted });
823
+ return await relayMessage(jid, productMsg.message, {
824
+ messageId: productMsg.key.id,
825
+ ...getParticipantAttr()
826
+ });
827
+
828
+ case 'INTERACTIVE':
829
+ const interactiveContent = await luki.handleInteractive(content, jid, quoted);
830
+ const interactiveMsg = await Utils_1.generateWAMessageFromContent(jid, interactiveContent, { quoted });
831
+ return await relayMessage(jid, interactiveMsg.message, {
832
+ messageId: interactiveMsg.key.id,
833
+ ...getParticipantAttr()
834
+ });
835
+ case 'ALBUM':
836
+ return await luki.handleAlbum(content, jid, quoted)
837
+ case 'EVENT':
838
+ return await luki.handleEvent(content, jid, quoted)
839
+ case 'POLL_RESULT':
840
+ return await luki.handlePollResult(content, jid, quoted)
841
+ case 'STATUS_MENTION':
842
+ return await luki.handleStMention(content, jid, quoted)
843
+ case 'ORDER':
844
+ return await luki.handleOrderMessage(content, jid, quoted)
845
+ case 'GROUP_STATUS':
846
+ return await luki.handleGroupStory(content, jid, quoted)
847
+ }
869
848
  }
870
-
871
849
  const fullMsg = await Utils_1.generateWAMessage(jid, content, {
872
850
  logger,
873
851
  userJid,
@@ -892,14 +870,14 @@ const makeMessagesSocket = (config) => {
892
870
  options: config.options,
893
871
  ...options
894
872
  });
895
-
873
+
896
874
  const isDeleteMsg = 'delete' in content && !!content.delete;
897
875
  const isEditMsg = 'edit' in content && !!content.edit;
898
876
  const isAiMsg = 'ai' in content && !!content.ai;
899
877
 
900
878
  const additionalAttributes = {};
901
879
  const additionalNodes = [];
902
-
880
+
903
881
  if (isDeleteMsg) {
904
882
  const fromMe = content.delete?.fromMe;
905
883
  const isGroup = WABinary_1.isJidGroup(content.delete?.remoteJid);
@@ -913,7 +891,7 @@ const makeMessagesSocket = (config) => {
913
891
  }, tag: "bot"
914
892
  });
915
893
  }
916
-
894
+
917
895
  await relayMessage(jid, fullMsg.message, {
918
896
  messageId: fullMsg.key.id,
919
897
  cachedGroupMetadata: options.cachedGroupMetadata,
@@ -928,6 +906,7 @@ const makeMessagesSocket = (config) => {
928
906
  });
929
907
  }
930
908
  return fullMsg;
909
+ }
931
910
  }
932
911
  }
933
912
  };