@wenzyx1/bails 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (218) hide show
  1. package/README.md +231 -0
  2. package/WAProto/fix-imports.js +85 -0
  3. package/WAProto/index.d.ts +79257 -0
  4. package/WAProto/index.js +242946 -0
  5. package/engine-requirements.js +10 -0
  6. package/lib/Defaults/baileys-version.json +3 -0
  7. package/lib/Defaults/index.d.ts +53 -0
  8. package/lib/Defaults/index.js +147 -0
  9. package/lib/Defaults/phonenumber-mcc.json +223 -0
  10. package/lib/Signal/Group/ciphertext-message.d.ts +9 -0
  11. package/lib/Signal/Group/ciphertext-message.js +15 -0
  12. package/lib/Signal/Group/group-session-builder.d.ts +14 -0
  13. package/lib/Signal/Group/group-session-builder.js +64 -0
  14. package/lib/Signal/Group/group_cipher.d.ts +17 -0
  15. package/lib/Signal/Group/group_cipher.js +93 -0
  16. package/lib/Signal/Group/index.d.ts +11 -0
  17. package/lib/Signal/Group/index.js +57 -0
  18. package/lib/Signal/Group/keyhelper.d.ts +10 -0
  19. package/lib/Signal/Group/keyhelper.js +55 -0
  20. package/lib/Signal/Group/queue-job.d.ts +1 -0
  21. package/lib/Signal/Group/queue-job.js +53 -0
  22. package/lib/Signal/Group/sender-chain-key.d.ts +13 -0
  23. package/lib/Signal/Group/sender-chain-key.js +34 -0
  24. package/lib/Signal/Group/sender-key-distribution-message.d.ts +16 -0
  25. package/lib/Signal/Group/sender-key-distribution-message.js +66 -0
  26. package/lib/Signal/Group/sender-key-message.d.ts +18 -0
  27. package/lib/Signal/Group/sender-key-message.js +69 -0
  28. package/lib/Signal/Group/sender-key-name.d.ts +17 -0
  29. package/lib/Signal/Group/sender-key-name.js +51 -0
  30. package/lib/Signal/Group/sender-key-record.d.ts +30 -0
  31. package/lib/Signal/Group/sender-key-record.js +53 -0
  32. package/lib/Signal/Group/sender-key-state.d.ts +38 -0
  33. package/lib/Signal/Group/sender-key-state.js +99 -0
  34. package/lib/Signal/Group/sender-message-key.d.ts +11 -0
  35. package/lib/Signal/Group/sender-message-key.js +29 -0
  36. package/lib/Signal/libsignal.d.ts +3 -0
  37. package/lib/Signal/libsignal.js +454 -0
  38. package/lib/Signal/lid-mapping.js +280 -0
  39. package/lib/Socket/Client/abstract-socket-client.d.ts +17 -0
  40. package/lib/Socket/Client/abstract-socket-client.js +13 -0
  41. package/lib/Socket/Client/index.d.ts +3 -0
  42. package/lib/Socket/Client/index.js +19 -0
  43. package/lib/Socket/Client/mobile-socket-client.d.ts +13 -0
  44. package/lib/Socket/Client/mobile-socket-client.js +65 -0
  45. package/lib/Socket/Client/web-socket-client.d.ts +12 -0
  46. package/lib/Socket/Client/web-socket-client.js +62 -0
  47. package/lib/Socket/business.d.ts +171 -0
  48. package/lib/Socket/business.js +342 -0
  49. package/lib/Socket/chats.d.ts +267 -0
  50. package/lib/Socket/chats.js +978 -0
  51. package/lib/Socket/communities.mjs +428 -0
  52. package/lib/Socket/dugong.d.ts +254 -0
  53. package/lib/Socket/dugong.js +558 -0
  54. package/lib/Socket/groups.d.ts +115 -0
  55. package/lib/Socket/groups.js +380 -0
  56. package/lib/Socket/index.d.ts +173 -0
  57. package/lib/Socket/index.js +32 -0
  58. package/lib/Socket/luxu.js +545 -0
  59. package/lib/Socket/messages-recv.d.ts +161 -0
  60. package/lib/Socket/messages-recv.js +1124 -0
  61. package/lib/Socket/messages-send.d.ts +149 -0
  62. package/lib/Socket/messages-send.js +1476 -0
  63. package/lib/Socket/mex.mjs +50 -0
  64. package/lib/Socket/newsletter.d.ts +134 -0
  65. package/lib/Socket/newsletter.js +351 -0
  66. package/lib/Socket/registration.d.ts +267 -0
  67. package/lib/Socket/registration.js +166 -0
  68. package/lib/Socket/socket.d.ts +43 -0
  69. package/lib/Socket/socket.js +904 -0
  70. package/lib/Socket/username.mjs +132 -0
  71. package/lib/Socket/usync.d.ts +36 -0
  72. package/lib/Socket/usync.js +70 -0
  73. package/lib/Store/index.d.ts +3 -0
  74. package/lib/Store/index.js +10 -0
  75. package/lib/Store/keyed-db.d.ts +30 -0
  76. package/lib/Store/keyed-db.js +233 -0
  77. package/lib/Store/make-cache-manager-store.d.ts +13 -0
  78. package/lib/Store/make-cache-manager-store.js +83 -0
  79. package/lib/Store/make-in-memory-store.d.ts +118 -0
  80. package/lib/Store/make-in-memory-store.js +427 -0
  81. package/lib/Store/make-ordered-dictionary.d.ts +13 -0
  82. package/lib/Store/make-ordered-dictionary.js +81 -0
  83. package/lib/Store/object-repository.d.ts +10 -0
  84. package/lib/Store/object-repository.js +27 -0
  85. package/lib/Types/Auth.d.ts +110 -0
  86. package/lib/Types/Auth.js +2 -0
  87. package/lib/Types/Call.d.ts +13 -0
  88. package/lib/Types/Call.js +2 -0
  89. package/lib/Types/Chat.d.ts +102 -0
  90. package/lib/Types/Chat.js +4 -0
  91. package/lib/Types/Contact.d.ts +19 -0
  92. package/lib/Types/Contact.js +2 -0
  93. package/lib/Types/Events.d.ts +157 -0
  94. package/lib/Types/Events.js +2 -0
  95. package/lib/Types/GroupMetadata.d.ts +55 -0
  96. package/lib/Types/GroupMetadata.js +2 -0
  97. package/lib/Types/Label.d.ts +35 -0
  98. package/lib/Types/Label.js +27 -0
  99. package/lib/Types/LabelAssociation.d.ts +29 -0
  100. package/lib/Types/LabelAssociation.js +9 -0
  101. package/lib/Types/Message.d.ts +273 -0
  102. package/lib/Types/Message.js +9 -0
  103. package/lib/Types/Mex.js +39 -0
  104. package/lib/Types/Newsletter.d.ts +103 -0
  105. package/lib/Types/Newsletter.js +38 -0
  106. package/lib/Types/Product.d.ts +78 -0
  107. package/lib/Types/Product.js +2 -0
  108. package/lib/Types/Signal.d.ts +57 -0
  109. package/lib/Types/Signal.js +2 -0
  110. package/lib/Types/Socket.d.ts +111 -0
  111. package/lib/Types/Socket.js +2 -0
  112. package/lib/Types/State.d.ts +27 -0
  113. package/lib/Types/State.js +2 -0
  114. package/lib/Types/USync.d.ts +25 -0
  115. package/lib/Types/USync.js +2 -0
  116. package/lib/Types/index.d.ts +57 -0
  117. package/lib/Types/index.js +43 -0
  118. package/lib/Utils/Mex.js +39 -0
  119. package/lib/Utils/auth-utils.d.ts +18 -0
  120. package/lib/Utils/auth-utils.js +206 -0
  121. package/lib/Utils/baileys-event-stream.d.ts +16 -0
  122. package/lib/Utils/baileys-event-stream.js +57 -0
  123. package/lib/Utils/browser-presets.js +64 -0
  124. package/lib/Utils/business.d.ts +22 -0
  125. package/lib/Utils/business.js +234 -0
  126. package/lib/Utils/chat-utils.d.ts +71 -0
  127. package/lib/Utils/chat-utils.js +726 -0
  128. package/lib/Utils/companion-reg-client-utils.js +40 -0
  129. package/lib/Utils/crypto.d.ts +41 -0
  130. package/lib/Utils/crypto.js +151 -0
  131. package/lib/Utils/decode-wa-message.d.ts +19 -0
  132. package/lib/Utils/decode-wa-message.js +198 -0
  133. package/lib/Utils/event-buffer.d.ts +35 -0
  134. package/lib/Utils/event-buffer.js +514 -0
  135. package/lib/Utils/extended-messages.js +231 -0
  136. package/lib/Utils/generics.d.ts +92 -0
  137. package/lib/Utils/generics.js +425 -0
  138. package/lib/Utils/history.d.ts +15 -0
  139. package/lib/Utils/history.js +96 -0
  140. package/lib/Utils/identity-change-handler.js +52 -0
  141. package/lib/Utils/index.d.ts +17 -0
  142. package/lib/Utils/index.js +40 -0
  143. package/lib/Utils/link-preview.d.ts +21 -0
  144. package/lib/Utils/link-preview.js +93 -0
  145. package/lib/Utils/logger.d.ts +4 -0
  146. package/lib/Utils/logger.js +7 -0
  147. package/lib/Utils/lt-hash.d.ts +12 -0
  148. package/lib/Utils/lt-hash.js +51 -0
  149. package/lib/Utils/make-mutex.d.ts +7 -0
  150. package/lib/Utils/make-mutex.js +43 -0
  151. package/lib/Utils/message-composer.js +293 -0
  152. package/lib/Utils/message-retry-manager.js +226 -0
  153. package/lib/Utils/messages-media.d.ts +116 -0
  154. package/lib/Utils/messages-media.js +815 -0
  155. package/lib/Utils/messages.d.ts +77 -0
  156. package/lib/Utils/messages.js +888 -0
  157. package/lib/Utils/noise-handler.d.ts +21 -0
  158. package/lib/Utils/noise-handler.js +155 -0
  159. package/lib/Utils/offline-node-processor.js +46 -0
  160. package/lib/Utils/pre-key-manager.js +95 -0
  161. package/lib/Utils/process-message.d.ts +41 -0
  162. package/lib/Utils/process-message.js +321 -0
  163. package/lib/Utils/reporting-utils.js +272 -0
  164. package/lib/Utils/signal.d.ts +32 -0
  165. package/lib/Utils/signal.js +160 -0
  166. package/lib/Utils/stanza-ack.js +38 -0
  167. package/lib/Utils/sync-action-utils.js +50 -0
  168. package/lib/Utils/tc-token-utils.js +169 -0
  169. package/lib/Utils/use-multi-file-auth-state.d.ts +13 -0
  170. package/lib/Utils/use-multi-file-auth-state.js +119 -0
  171. package/lib/Utils/validate-connection.d.ts +11 -0
  172. package/lib/Utils/validate-connection.js +229 -0
  173. package/lib/WABinary/constants.d.ts +30 -0
  174. package/lib/WABinary/constants.js +40 -0
  175. package/lib/WABinary/decode.d.ts +7 -0
  176. package/lib/WABinary/decode.js +252 -0
  177. package/lib/WABinary/encode.d.ts +3 -0
  178. package/lib/WABinary/encode.js +265 -0
  179. package/lib/WABinary/generic-utils.d.ts +17 -0
  180. package/lib/WABinary/generic-utils.js +204 -0
  181. package/lib/WABinary/index.d.ts +5 -0
  182. package/lib/WABinary/index.js +21 -0
  183. package/lib/WABinary/jid-utils.d.ts +31 -0
  184. package/lib/WABinary/jid-utils.js +132 -0
  185. package/lib/WABinary/types.d.ts +18 -0
  186. package/lib/WABinary/types.js +2 -0
  187. package/lib/WAM/BinaryInfo.d.ts +17 -0
  188. package/lib/WAM/BinaryInfo.js +13 -0
  189. package/lib/WAM/constants.d.ts +38 -0
  190. package/lib/WAM/constants.js +15350 -0
  191. package/lib/WAM/encode.d.ts +3 -0
  192. package/lib/WAM/encode.js +155 -0
  193. package/lib/WAM/index.d.ts +3 -0
  194. package/lib/WAM/index.js +19 -0
  195. package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts +9 -0
  196. package/lib/WAUSync/Protocols/USyncContactProtocol.js +55 -0
  197. package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts +22 -0
  198. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +57 -0
  199. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts +12 -0
  200. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +30 -0
  201. package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts +12 -0
  202. package/lib/WAUSync/Protocols/USyncStatusProtocol.js +42 -0
  203. package/lib/WAUSync/Protocols/USyncUsernameProtocol.js +27 -0
  204. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts +25 -0
  205. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js +53 -0
  206. package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts +8 -0
  207. package/lib/WAUSync/Protocols/UsyncLIDProtocol.js +24 -0
  208. package/lib/WAUSync/Protocols/index.d.ts +4 -0
  209. package/lib/WAUSync/Protocols/index.js +21 -0
  210. package/lib/WAUSync/USyncQuery.d.ts +28 -0
  211. package/lib/WAUSync/USyncQuery.js +93 -0
  212. package/lib/WAUSync/USyncUser.d.ts +12 -0
  213. package/lib/WAUSync/USyncUser.js +34 -0
  214. package/lib/WAUSync/index.d.ts +3 -0
  215. package/lib/WAUSync/index.js +19 -0
  216. package/lib/index.d.ts +12 -0
  217. package/lib/index.js +52 -0
  218. package/package.json +112 -0
@@ -0,0 +1,545 @@
1
+ import { proto } from '../../WAProto/index.js'
2
+ import * as Utils from '../Utils/index.js'
3
+ import crypto from 'crypto'
4
+
5
+ export default class imup {
6
+ constructor(utils, waUploadToServer, relayMessageFn) {
7
+ this.utils = utils
8
+ this.relayMessage = relayMessageFn
9
+ this.waUploadToServer = waUploadToServer
10
+ }
11
+
12
+ detectType(content) {
13
+ if (content.requestPaymentMessage) return 'PAYMENT'
14
+ if (content.productMessage) return 'PRODUCT'
15
+ if (content.interactiveMessage) return 'INTERACTIVE'
16
+ if (content.albumMessage) return 'ALBUM'
17
+ if (content.eventMessage) return 'EVENT'
18
+ if (content.pollResultMessage) return 'POLL_RESULT'
19
+ if (content.orderMessage) return 'ORDER'
20
+ if (content.groupStatus || content.groupStatusMessage) return 'GROUP_STATUS'
21
+ if (content.groupLabel) return 'GROUP_LABEL'
22
+ return null
23
+ }
24
+
25
+ async handlePayment(content, quoted) {
26
+ const data = content.requestPaymentMessage
27
+ let notes = {}
28
+
29
+ if (data.sticker?.stickerMessage) {
30
+ notes = {
31
+ stickerMessage: {
32
+ ...data.sticker.stickerMessage,
33
+ contextInfo: {
34
+ stanzaId: quoted?.key?.id,
35
+ participant: quoted?.key?.participant || content.sender,
36
+ quotedMessage: quoted?.message
37
+ }
38
+ }
39
+ }
40
+ } else if (data.note) {
41
+ notes = {
42
+ extendedTextMessage: {
43
+ text: data.note,
44
+ contextInfo: {
45
+ stanzaId: quoted?.key?.id,
46
+ participant: quoted?.key?.participant || content.sender,
47
+ quotedMessage: quoted?.message
48
+ }
49
+ }
50
+ }
51
+ }
52
+
53
+ return {
54
+ requestPaymentMessage: proto.Message.RequestPaymentMessage.fromObject({
55
+ expiryTimestamp: data.expiry || 0,
56
+ amount1000: data.amount || 0,
57
+ currencyCodeIso4217: data.currency || "IDR",
58
+ requestFrom: data.from || "0@s.whatsapp.net",
59
+ noteMessage: notes,
60
+ background: data.background?? {
61
+ id: "DEFAULT",
62
+ placeholderArgb: 0xFFF0F0F0
63
+ }
64
+ })
65
+ }
66
+ }
67
+
68
+ async handleProduct(content, jid, quoted) {
69
+ const {
70
+ title,
71
+ description,
72
+ thumbnail,
73
+ productId,
74
+ retailerId,
75
+ url,
76
+ body = "",
77
+ footer = "",
78
+ buttons = [],
79
+ priceAmount1000 = null,
80
+ currencyCode = "IDR"
81
+ } = content.productMessage
82
+
83
+ let productImage
84
+
85
+ if (Buffer.isBuffer(thumbnail)) {
86
+ const { imageMessage } = await this.utils.generateWAMessageContent(
87
+ { image: thumbnail },
88
+ { upload: this.waUploadToServer }
89
+ )
90
+ productImage = imageMessage
91
+ } else if (typeof thumbnail === 'object' && thumbnail.url) {
92
+ const { imageMessage } = await this.utils.generateWAMessageContent(
93
+ { image: { url: thumbnail.url } },
94
+ { upload: this.waUploadToServer }
95
+ )
96
+ productImage = imageMessage
97
+ }
98
+
99
+ return {
100
+ viewOnceMessage: {
101
+ message: {
102
+ interactiveMessage: {
103
+ body: { text: body },
104
+ footer: { text: footer },
105
+ header: {
106
+ title,
107
+ hasMediaAttachment: true,
108
+ productMessage: {
109
+ product: {
110
+ productImage,
111
+ productId,
112
+ title,
113
+ description,
114
+ currencyCode,
115
+ priceAmount1000,
116
+ retailerId,
117
+ url,
118
+ productImageCount: 1
119
+ },
120
+ businessOwnerJid: "0@s.whatsapp.net"
121
+ }
122
+ },
123
+ nativeFlowMessage: { buttons }
124
+ }
125
+ }
126
+ }
127
+ }
128
+ }
129
+
130
+ // Ported from edgar-bail's dugong.js (kikyy.handleInteractive) — the one
131
+ // handler luxu.js didn't have. Builds interactiveMessage payloads:
132
+ // native-flow buttons, media header (image/video/document), and the
133
+ // catalog/business UI variants (carousel/shop/collection).
134
+ async handleInteractive(content, jid, quoted) {
135
+ const {
136
+ title,
137
+ footer,
138
+ thumbnail,
139
+ image,
140
+ video,
141
+ document,
142
+ mimetype,
143
+ fileName,
144
+ jpegThumbnail,
145
+ contextInfo,
146
+ externalAdReply,
147
+ buttons = [],
148
+ nativeFlowMessage,
149
+ header,
150
+ carouselMessage,
151
+ shopStorefrontMessage,
152
+ collectionMessage
153
+ } = content.interactiveMessage
154
+
155
+ let media = null
156
+
157
+ if (thumbnail) {
158
+ media = await this.utils.prepareWAMessageMedia(
159
+ { image: { url: thumbnail } },
160
+ { upload: this.waUploadToServer }
161
+ )
162
+ } else if (image) {
163
+ if (typeof image === 'object' && image.url) {
164
+ media = await this.utils.prepareWAMessageMedia(
165
+ { image: { url: image.url } },
166
+ { upload: this.waUploadToServer }
167
+ )
168
+ } else {
169
+ media = await this.utils.prepareWAMessageMedia(
170
+ { image: image },
171
+ { upload: this.waUploadToServer }
172
+ )
173
+ }
174
+ } else if (video) {
175
+ if (typeof video === 'object' && video.url) {
176
+ media = await this.utils.prepareWAMessageMedia(
177
+ { video: { url: video.url } },
178
+ { upload: this.waUploadToServer }
179
+ )
180
+ } else {
181
+ media = await this.utils.prepareWAMessageMedia(
182
+ { video: video },
183
+ { upload: this.waUploadToServer }
184
+ )
185
+ }
186
+ } else if (document) {
187
+ let documentPayload = { document: document }
188
+ if (jpegThumbnail) {
189
+ if (typeof jpegThumbnail === 'object' && jpegThumbnail.url) {
190
+ documentPayload.jpegThumbnail = { url: jpegThumbnail.url }
191
+ } else {
192
+ documentPayload.jpegThumbnail = jpegThumbnail
193
+ }
194
+ }
195
+
196
+ media = await this.utils.prepareWAMessageMedia(
197
+ documentPayload,
198
+ { upload: this.waUploadToServer }
199
+ )
200
+ if (fileName) {
201
+ media.documentMessage.fileName = fileName
202
+ }
203
+ if (mimetype) {
204
+ media.documentMessage.mimetype = mimetype
205
+ }
206
+ }
207
+
208
+ let interactiveMessage = {
209
+ body: { text: title || "" },
210
+ footer: { text: footer || "" }
211
+ }
212
+ if (buttons && buttons.length > 0) {
213
+ interactiveMessage.nativeFlowMessage = { buttons: buttons }
214
+ if (nativeFlowMessage) {
215
+ interactiveMessage.nativeFlowMessage = {
216
+ ...interactiveMessage.nativeFlowMessage,
217
+ ...nativeFlowMessage
218
+ }
219
+ }
220
+ } else if (nativeFlowMessage) {
221
+ interactiveMessage.nativeFlowMessage = nativeFlowMessage
222
+ }
223
+
224
+ // Catalog/business UI variants of InteractiveMessage. WhatsApp only
225
+ // accepts one "action" sub-message per interactiveMessage, so these
226
+ // are checked in priority order and are mutually exclusive with
227
+ // nativeFlowMessage/buttons above. Caller supplies the sub-message
228
+ // shape directly (see WAProto.proto: InteractiveMessage.CarouselMessage,
229
+ // .ShopMessage, .CollectionMessage) — not validated/transformed here,
230
+ // and not tested against a live WhatsApp Business account (inherited
231
+ // caveat from edgar-bail's dugong.js).
232
+ if (carouselMessage) {
233
+ delete interactiveMessage.nativeFlowMessage
234
+ interactiveMessage.carouselMessage = carouselMessage
235
+ } else if (shopStorefrontMessage) {
236
+ delete interactiveMessage.nativeFlowMessage
237
+ interactiveMessage.shopStorefrontMessage = shopStorefrontMessage
238
+ } else if (collectionMessage) {
239
+ delete interactiveMessage.nativeFlowMessage
240
+ interactiveMessage.collectionMessage = collectionMessage
241
+ }
242
+
243
+ if (media) {
244
+ interactiveMessage.header = {
245
+ title: header || "",
246
+ hasMediaAttachment: true,
247
+ ...media
248
+ }
249
+ } else {
250
+ interactiveMessage.header = {
251
+ title: header || "",
252
+ hasMediaAttachment: false
253
+ }
254
+ }
255
+
256
+ let finalContextInfo = {}
257
+ if (contextInfo) {
258
+ finalContextInfo = {
259
+ mentionedJid: contextInfo.mentionedJid || [],
260
+ forwardingScore: contextInfo.forwardingScore || 0,
261
+ isForwarded: contextInfo.isForwarded || false,
262
+ ...contextInfo
263
+ }
264
+ }
265
+
266
+ if (externalAdReply) {
267
+ finalContextInfo.externalAdReply = {
268
+ title: externalAdReply.title || "",
269
+ body: externalAdReply.body || "",
270
+ mediaType: externalAdReply.mediaType || 1,
271
+ thumbnailUrl: externalAdReply.thumbnailUrl || "",
272
+ mediaUrl: externalAdReply.mediaUrl || "",
273
+ sourceUrl: externalAdReply.sourceUrl || "",
274
+ showAdAttribution: externalAdReply.showAdAttribution || false,
275
+ renderLargerThumbnail: externalAdReply.renderLargerThumbnail || false,
276
+ ...externalAdReply
277
+ }
278
+ }
279
+
280
+ if (Object.keys(finalContextInfo).length > 0) {
281
+ interactiveMessage.contextInfo = finalContextInfo
282
+ }
283
+ return {
284
+ interactiveMessage: interactiveMessage
285
+ }
286
+ }
287
+
288
+ async handleAlbum(content, jid, quoted) {
289
+ const array = content.albumMessage
290
+ const album = await this.utils.generateWAMessageFromContent(jid, {
291
+ messageContextInfo: {
292
+ messageSecret: crypto.randomBytes(32),
293
+ },
294
+ albumMessage: {
295
+ expectedImageCount: array.filter((a) => a.hasOwnProperty("image")).length,
296
+ expectedVideoCount: array.filter((a) => a.hasOwnProperty("video")).length,
297
+ },
298
+ }, {
299
+ userJid: this.utils.generateMessageID().split('@')[0] + '@s.whatsapp.net',
300
+ quoted,
301
+ upload: this.waUploadToServer
302
+ })
303
+
304
+ await this.relayMessage(jid, album.message, {
305
+ messageId: album.key.id,
306
+ })
307
+
308
+ for (let content of array) {
309
+ const img = await this.utils.generateWAMessage(jid, content, {
310
+ upload: this.waUploadToServer,
311
+ })
312
+
313
+ img.message.messageContextInfo = {
314
+ messageSecret: crypto.randomBytes(32),
315
+ messageAssociation: {
316
+ associationType: 1,
317
+ parentMessageKey: album.key,
318
+ },
319
+ participant: "0@s.whatsapp.net",
320
+ remoteJid: "status@broadcast",
321
+ forwardingScore: 99999,
322
+ isForwarded: true,
323
+ mentionedJid: [jid],
324
+ starred: true,
325
+ labels: ["Y", "Important"],
326
+ isHighlighted: true,
327
+ businessMessageForwardInfo: {
328
+ businessOwnerJid: jid,
329
+ },
330
+ dataSharingContext: {
331
+ showMmDisclosure: true,
332
+ },
333
+ }
334
+
335
+ img.message.forwardedNewsletterMessageInfo = {
336
+ newsletterJid: "0@newsletter",
337
+ serverMessageId: 1,
338
+ newsletterName: `WhatsApp`,
339
+ timestamp: new Date().toISOString(),
340
+ senderName: "7-Yuukey",
341
+ contentType: "UPDATE_CARD",
342
+ priority: "high",
343
+ status: "sent",
344
+ }
345
+
346
+ img.message.disappearingMode = {
347
+ initiator: 3,
348
+ trigger: 4,
349
+ initiatorDeviceJid: jid,
350
+ initiatedByExternalService: true,
351
+ initiatedByUserDevice: true,
352
+ initiatedBySystem: true,
353
+ initiatedByServer: true,
354
+ initiatedByAdmin: true,
355
+ initiatedByUser: true,
356
+ initiatedByApp: true,
357
+ initiatedByBot: true,
358
+ initiatedByMe: true,
359
+ }
360
+
361
+ await this.relayMessage(jid, img.message, {
362
+ messageId: img.key.id,
363
+ quoted: {
364
+ key: {
365
+ remoteJid: album.key.remoteJid,
366
+ id: album.key.id,
367
+ fromMe: true,
368
+ participant: this.utils.generateMessageID().split('@')[0] + '@s.whatsapp.net',
369
+ },
370
+ message: album.message,
371
+ },
372
+ })
373
+ }
374
+ return album
375
+ }
376
+
377
+ async handleEvent(content, jid, quoted) {
378
+ const eventData = content.eventMessage
379
+
380
+ const msg = await this.utils.generateWAMessageFromContent(jid, {
381
+ viewOnceMessage: {
382
+ message: {
383
+ messageContextInfo: {
384
+ deviceListMetadata: {},
385
+ deviceListMetadataVersion: 2,
386
+ messageSecret: crypto.randomBytes(32),
387
+ supportPayload: JSON.stringify({
388
+ version: 2,
389
+ is_ai_message: true,
390
+ should_show_system_message: true,
391
+ ticket_id: crypto.randomBytes(16).toString('hex')
392
+ })
393
+ },
394
+ eventMessage: {
395
+ contextInfo: {
396
+ mentionedJid: [jid],
397
+ participant: jid,
398
+ remoteJid: "status@broadcast",
399
+ forwardedNewsletterMessageInfo: {
400
+ newsletterName: " EdgarOffc",
401
+ newsletterJid: "120363425458769503@newsletter",
402
+ serverMessageId: 1
403
+ }
404
+ },
405
+ isCanceled: eventData.isCanceled || false,
406
+ name: eventData.name,
407
+ description: eventData.description,
408
+ location: eventData.location || {
409
+ degreesLatitude: 0,
410
+ degreesLongitude: 0,
411
+ name: "Location"
412
+ },
413
+ joinLink: eventData.joinLink || '',
414
+ startTime: typeof eventData.startTime === 'string'? parseInt(eventData.startTime) : eventData.startTime || Date.now(),
415
+ endTime: typeof eventData.endTime === 'string'? parseInt(eventData.endTime) : eventData.endTime || Date.now() + 3600000,
416
+ extraGuestsAllowed: eventData.extraGuestsAllowed!== false
417
+ }
418
+ }
419
+ }
420
+ }, { quoted })
421
+
422
+ await this.relayMessage(jid, msg.message, {
423
+ messageId: msg.key.id
424
+ })
425
+ return msg
426
+ }
427
+
428
+ async handlePollResult(content, jid, quoted) {
429
+ const pollData = content.pollResultMessage
430
+ const msg = await this.utils.generateWAMessageFromContent(jid, {
431
+ pollResultSnapshotMessage: {
432
+ name: pollData.name,
433
+ pollVotes: pollData.pollVotes.map(vote => ({
434
+ optionName: vote.optionName,
435
+ optionVoteCount: typeof vote.optionVoteCount === 'number'
436
+ ? vote.optionVoteCount.toString()
437
+ : vote.optionVoteCount
438
+ })),
439
+ contextInfo: {
440
+ isForwarded: true,
441
+ forwardingScore: 1,
442
+ forwardedNewsletterMessageInfo: {
443
+ newsletterName: pollData.newsletter.newsletterName || "120363399602691477@newsletter",
444
+ newsletterJid: pollData.newsletter.newsletterJid || "Newsletter",
445
+ serverMessageId: 1000,
446
+ contentType: "UPDATE"
447
+ }
448
+ }
449
+ }
450
+ }, {
451
+ userJid: this.utils.generateMessageID().split('@')[0] + '@s.whatsapp.net',
452
+ quoted
453
+ })
454
+
455
+ await this.relayMessage(jid, msg.message, {
456
+ messageId: msg.key.id
457
+ })
458
+
459
+ return msg
460
+ }
461
+
462
+ async handleOrderMessage(content, jid, quoted) {
463
+ const orderData = content.orderMessage
464
+
465
+ const Haha = await this.utils.generateWAMessageFromContent(jid, {
466
+ orderMessage: {
467
+ orderId: orderData.orderId || ("EDGAROFFC" + Date.now()),
468
+ thumbnail: orderData.thumbnail || null,
469
+ itemCount: orderData.itemCount || 0,
470
+ status: "ACCEPTED",
471
+ surface: "CATALOG",
472
+ message: orderData.message,
473
+ orderTitle: orderData.orderTitle,
474
+ sellerJid: "0@whatsapp.net",
475
+ token: orderData.token || "EDGAROFFC_EXAMPLE_TOKEN",
476
+ totalAmount1000: orderData.totalAmount1000 || 0,
477
+ totalCurrencyCode: orderData.totalCurrencyCode || "IDR",
478
+ messageVersion: 2
479
+ }
480
+ }, { quoted: quoted })
481
+
482
+ await this.relayMessage(jid, Haha.message, {})
483
+ return Haha
484
+ }
485
+
486
+ async handleGroupStory(content, jid, quoted) {
487
+ const storyData = content.groupStatus || content.groupStatusMessage
488
+ let messageContent
489
+
490
+ if (storyData.message) {
491
+ messageContent = storyData
492
+ } else {
493
+ if (typeof this.utils?.generateWAMessageContent === "function") {
494
+ messageContent = await this.utils.generateWAMessageContent(storyData, {
495
+ upload: this.waUploadToServer
496
+ })
497
+ } else {
498
+ messageContent = await Utils.generateWAMessageContent(storyData, {
499
+ upload: this.waUploadToServer
500
+ })
501
+ }
502
+ }
503
+
504
+ let msg = {
505
+ message: {
506
+ groupStatusMessageV2: {
507
+ message: messageContent.message || messageContent
508
+ }
509
+ }
510
+ }
511
+
512
+ return await this.relayMessage(jid, msg.message, {
513
+ messageId: this.utils.generateMessageID()
514
+ })
515
+ }
516
+
517
+ async handleGbLabel(content, jid) {
518
+ const x = content.groupLabel
519
+ if (!jid.endsWith('@g.us')) {
520
+ throw new Error('group required!')
521
+ }
522
+
523
+ const msg = await this.utils.generateWAMessageFromContent(jid, {
524
+ protocolMessage: {
525
+ type: "GROUP_MEMBER_LABEL_CHANGE",
526
+ memberLabel: {
527
+ label: x.labelText.slice(0, 30)
528
+ }
529
+ }
530
+ }, {})
531
+
532
+ await this.relayMessage(jid, msg.message, {
533
+ additionalNodes: [
534
+ {
535
+ tag: 'meta',
536
+ attrs: {
537
+ tag_reason: 'user_update',
538
+ appdata: 'member_tag'
539
+ },
540
+ content: undefined
541
+ }
542
+ ]
543
+ })
544
+ }
545
+ }