@neelegirl/baileys 1.5.6 → 1.5.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -27
- package/WAProto/WAProto.proto +665 -291
- package/WAProto/index.d.ts +48037 -2294
- package/WAProto/index.js +139804 -45203
- package/lib/Defaults/baileys-version.json +3 -0
- package/lib/Defaults/index.d.ts +64 -58
- package/lib/Defaults/index.js +96 -74
- package/lib/Defaults/phonenumber-mcc.json +223 -0
- package/lib/Signal/WASignalGroup/GroupProtocol.js +1909 -0
- package/lib/Signal/WASignalGroup/ciphertext_message.js +16 -0
- package/lib/Signal/WASignalGroup/generate-proto.sh +1 -0
- package/lib/Signal/WASignalGroup/group.proto +42 -0
- package/lib/Signal/WASignalGroup/group_cipher.js +120 -0
- package/lib/Signal/WASignalGroup/group_session_builder.js +46 -0
- package/lib/Signal/WASignalGroup/index.js +6 -0
- package/lib/Signal/WASignalGroup/keyhelper.js +21 -0
- package/lib/Signal/WASignalGroup/protobufs.js +3 -0
- package/lib/Signal/WASignalGroup/queue_job.js +69 -0
- package/lib/Signal/WASignalGroup/readme.md +6 -0
- package/lib/Signal/WASignalGroup/sender_chain_key.js +50 -0
- package/lib/Signal/WASignalGroup/sender_key_distribution_message.js +78 -0
- package/lib/Signal/WASignalGroup/sender_key_message.js +92 -0
- package/lib/Signal/WASignalGroup/sender_key_name.js +70 -0
- package/lib/Signal/WASignalGroup/sender_key_record.js +56 -0
- package/lib/Signal/WASignalGroup/sender_key_state.js +129 -0
- package/lib/Signal/{Group/sender-message-key.js → WASignalGroup/sender_message_key.js} +16 -3
- package/lib/Signal/libsignal.d.ts +4 -5
- package/lib/Signal/libsignal.js +112 -292
- package/lib/Socket/Client/abstract-socket-client.d.ts +15 -0
- package/lib/Socket/Client/abstract-socket-client.js +13 -0
- package/lib/Socket/Client/index.d.ts +2 -3
- package/lib/Socket/Client/index.js +22 -3
- package/lib/Socket/Client/mobile-socket-client.d.ts +12 -0
- package/lib/Socket/Client/mobile-socket-client.js +65 -0
- package/lib/Socket/Client/types.d.ts +15 -15
- package/lib/Socket/Client/types.js +15 -8
- package/lib/Socket/Client/websocket.d.ts +12 -12
- package/lib/Socket/Client/websocket.js +36 -24
- package/lib/Socket/business.d.ts +177 -178
- package/lib/Socket/business.js +71 -179
- package/lib/Socket/chats.d.ts +93 -93
- package/lib/Socket/chats.js +625 -474
- package/lib/Socket/communities.d.ts +62 -83
- package/lib/Socket/communities.js +414 -412
- package/lib/Socket/groups.d.ts +112 -118
- package/lib/Socket/groups.js +171 -146
- package/lib/Socket/index.d.ts +182 -222
- package/lib/Socket/index.js +17 -12
- package/lib/Socket/messages-recv.d.ts +169 -165
- package/lib/Socket/messages-recv.js +1721 -1185
- package/lib/Socket/messages-send.d.ts +160 -161
- package/lib/Socket/messages-send.js +992 -642
- package/lib/Socket/mex.d.ts +0 -1
- package/lib/Socket/mex.js +9 -4
- package/lib/Socket/newsletter.d.ts +139 -139
- package/lib/Socket/newsletter.js +258 -153
- package/lib/Socket/registration.d.ts +266 -0
- package/lib/Socket/registration.js +166 -0
- package/lib/Socket/socket.d.ts +36 -42
- package/lib/Socket/socket.js +615 -533
- package/lib/Socket/usync.d.ts +37 -0
- package/lib/Socket/usync.js +83 -0
- package/lib/Store/index.d.ts +4 -0
- package/lib/Store/index.js +24 -0
- package/lib/Store/make-cache-manager-store.d.ts +14 -0
- package/lib/Store/make-cache-manager-store.js +90 -0
- package/lib/Store/make-in-memory-store.d.ts +123 -0
- package/lib/Store/make-in-memory-store.js +429 -0
- package/lib/Store/make-ordered-dictionary.d.ts +12 -0
- package/lib/Store/make-ordered-dictionary.js +86 -0
- package/lib/Store/object-repository.d.ts +10 -0
- package/lib/Store/object-repository.js +31 -0
- package/lib/Types/Auth.d.ts +96 -87
- package/lib/Types/Auth.js +3 -2
- package/lib/Types/Call.d.ts +13 -13
- package/lib/Types/Call.js +3 -2
- package/lib/Types/Chat.d.ts +94 -79
- package/lib/Types/Chat.js +9 -8
- package/lib/Types/Contact.d.ts +9 -13
- package/lib/Types/Contact.js +3 -2
- package/lib/Types/Events.d.ts +179 -152
- package/lib/Types/Events.js +3 -2
- package/lib/Types/GroupMetadata.d.ts +48 -49
- package/lib/Types/GroupMetadata.js +3 -2
- package/lib/Types/Label.d.ts +14 -13
- package/lib/Types/Label.js +30 -24
- package/lib/Types/LabelAssociation.d.ts +20 -15
- package/lib/Types/LabelAssociation.js +12 -6
- package/lib/Types/Message.d.ts +404 -234
- package/lib/Types/Message.js +13 -11
- package/lib/Types/MexUpdates.d.ts +9 -0
- package/lib/Types/MexUpdates.js +18 -0
- package/lib/Types/Newsletter.d.ts +104 -130
- package/lib/Types/Newsletter.js +40 -31
- package/lib/Types/Product.d.ts +71 -58
- package/lib/Types/Product.js +3 -2
- package/lib/Types/Signal.d.ts +55 -63
- package/lib/Types/Signal.js +3 -2
- package/lib/Types/Socket.d.ts +66 -77
- package/lib/Types/Socket.js +3 -3
- package/lib/Types/State.d.ts +19 -17
- package/lib/Types/State.js +14 -13
- package/lib/Types/USync.d.ts +8 -8
- package/lib/Types/USync.js +3 -2
- package/lib/Types/index.d.ts +61 -47
- package/lib/Types/index.js +48 -26
- package/lib/Utils/auth-utils.d.ts +10 -8
- package/lib/Utils/auth-utils.js +154 -206
- package/lib/Utils/baileys-event-stream.d.ts +7 -6
- package/lib/Utils/baileys-event-stream.js +43 -29
- package/lib/Utils/business.d.ts +20 -14
- package/lib/Utils/business.js +134 -110
- package/lib/Utils/chat-utils.d.ts +69 -57
- package/lib/Utils/chat-utils.js +380 -362
- package/lib/Utils/check-npm-version.d.ts +15 -0
- package/lib/Utils/check-npm-version.js +52 -0
- package/lib/Utils/crypto.d.ts +45 -30
- package/lib/Utils/crypto.js +178 -141
- package/lib/Utils/decode-wa-message.d.ts +35 -42
- package/lib/Utils/decode-wa-message.js +150 -176
- package/lib/Utils/event-buffer.d.ts +17 -12
- package/lib/Utils/event-buffer.js +286 -269
- package/lib/Utils/generics.d.ts +99 -60
- package/lib/Utils/generics.js +481 -244
- package/lib/Utils/history.d.ts +22 -18
- package/lib/Utils/history.js +80 -54
- package/lib/Utils/index.d.ts +19 -20
- package/lib/Utils/index.js +41 -19
- package/lib/Utils/link-preview.d.ts +14 -12
- package/lib/Utils/link-preview.js +75 -40
- package/lib/Utils/logger.d.ts +11 -10
- package/lib/Utils/logger.js +7 -3
- package/lib/Utils/lt-hash.d.ts +13 -12
- package/lib/Utils/lt-hash.js +37 -27
- package/lib/Utils/make-mutex.d.ts +7 -6
- package/lib/Utils/make-mutex.js +29 -20
- package/lib/Utils/message-retry-manager.d.ts +6 -6
- package/lib/Utils/message-retry-manager.js +36 -8
- package/lib/Utils/messages-media.d.ts +102 -87
- package/lib/Utils/messages-media.js +570 -427
- package/lib/Utils/messages.d.ts +64 -37
- package/lib/Utils/messages.js +1270 -511
- package/lib/Utils/noise-handler.d.ts +18 -18
- package/lib/Utils/noise-handler.js +109 -101
- package/lib/Utils/process-message.d.ts +32 -25
- package/lib/Utils/process-message.js +281 -266
- package/lib/Utils/signal.d.ts +32 -24
- package/lib/Utils/signal.js +105 -98
- package/lib/Utils/use-mongo-file-auth-state.d.ts +6 -0
- package/lib/Utils/use-mongo-file-auth-state.js +84 -0
- package/lib/Utils/use-multi-file-auth-state.d.ts +10 -5
- package/lib/Utils/use-multi-file-auth-state.js +186 -69
- package/lib/Utils/use-single-file-auth-state.d.ts +13 -0
- package/lib/Utils/use-single-file-auth-state.js +80 -0
- package/lib/Utils/validate-connection.d.ts +13 -11
- package/lib/Utils/validate-connection.js +116 -124
- package/lib/WABinary/constants.d.ts +27 -25
- package/lib/WABinary/constants.js +1292 -1277
- package/lib/WABinary/decode.d.ts +9 -7
- package/lib/WABinary/decode.js +189 -139
- package/lib/WABinary/encode.d.ts +3 -3
- package/lib/WABinary/encode.js +154 -105
- package/lib/WABinary/generic-utils.d.ts +27 -14
- package/lib/WABinary/generic-utils.js +102 -62
- package/lib/WABinary/index.d.ts +5 -6
- package/lib/WABinary/index.js +25 -6
- package/lib/WABinary/jid-utils.d.ts +46 -41
- package/lib/WABinary/jid-utils.js +80 -84
- package/lib/WABinary/types.d.ts +13 -10
- package/lib/WABinary/types.js +3 -2
- package/lib/WAM/BinaryInfo.d.ts +15 -8
- package/lib/WAM/BinaryInfo.js +14 -7
- package/lib/WAM/constants.d.ts +37 -30
- package/lib/WAM/constants.js +11983 -19465
- package/lib/WAM/encode.d.ts +3 -3
- package/lib/WAM/encode.js +110 -95
- package/lib/WAM/index.d.ts +3 -4
- package/lib/WAM/index.js +23 -4
- package/lib/WAUSync/Protocols/USyncBotProfileProtocol.d.ts +28 -0
- package/lib/WAUSync/Protocols/USyncBotProfileProtocol.js +69 -0
- package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts +9 -9
- package/lib/WAUSync/Protocols/USyncContactProtocol.js +19 -12
- package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts +22 -19
- package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +26 -18
- package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts +12 -11
- package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +20 -12
- package/lib/WAUSync/Protocols/USyncLIDProtocol.d.ts +9 -0
- package/lib/WAUSync/Protocols/USyncLIDProtocol.js +30 -0
- package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts +12 -11
- package/lib/WAUSync/Protocols/USyncStatusProtocol.js +24 -16
- package/lib/WAUSync/Protocols/index.d.ts +6 -5
- package/lib/WAUSync/Protocols/index.js +26 -5
- package/lib/WAUSync/USyncQuery.d.ts +28 -26
- package/lib/WAUSync/USyncQuery.js +62 -64
- package/lib/WAUSync/USyncUser.d.ts +10 -11
- package/lib/WAUSync/USyncUser.js +19 -12
- package/lib/WAUSync/index.d.ts +3 -4
- package/lib/WAUSync/index.js +23 -4
- package/lib/index.d.ts +11 -10
- package/lib/index.js +33 -11
- package/package.json +43 -48
- package/WAProto/GenerateStatics.sh +0 -3
- package/WAProto/fix-imports.js +0 -29
- package/engine-requirements.js +0 -10
- package/lib/Defaults/index.d.ts.map +0 -1
- package/lib/Defaults/index.js.map +0 -1
- package/lib/Signal/Group/ciphertext-message.d.ts +0 -10
- package/lib/Signal/Group/ciphertext-message.d.ts.map +0 -1
- package/lib/Signal/Group/ciphertext-message.js +0 -12
- package/lib/Signal/Group/ciphertext-message.js.map +0 -1
- package/lib/Signal/Group/group-session-builder.d.ts +0 -15
- package/lib/Signal/Group/group-session-builder.d.ts.map +0 -1
- package/lib/Signal/Group/group-session-builder.js +0 -30
- package/lib/Signal/Group/group-session-builder.js.map +0 -1
- package/lib/Signal/Group/group_cipher.d.ts +0 -17
- package/lib/Signal/Group/group_cipher.d.ts.map +0 -1
- package/lib/Signal/Group/group_cipher.js +0 -82
- package/lib/Signal/Group/group_cipher.js.map +0 -1
- package/lib/Signal/Group/index.d.ts +0 -12
- package/lib/Signal/Group/index.d.ts.map +0 -1
- package/lib/Signal/Group/index.js +0 -12
- package/lib/Signal/Group/index.js.map +0 -1
- package/lib/Signal/Group/keyhelper.d.ts +0 -11
- package/lib/Signal/Group/keyhelper.d.ts.map +0 -1
- package/lib/Signal/Group/keyhelper.js +0 -18
- package/lib/Signal/Group/keyhelper.js.map +0 -1
- package/lib/Signal/Group/sender-chain-key.d.ts +0 -14
- package/lib/Signal/Group/sender-chain-key.d.ts.map +0 -1
- package/lib/Signal/Group/sender-chain-key.js +0 -26
- package/lib/Signal/Group/sender-chain-key.js.map +0 -1
- package/lib/Signal/Group/sender-key-distribution-message.d.ts +0 -17
- package/lib/Signal/Group/sender-key-distribution-message.d.ts.map +0 -1
- package/lib/Signal/Group/sender-key-distribution-message.js +0 -63
- package/lib/Signal/Group/sender-key-distribution-message.js.map +0 -1
- package/lib/Signal/Group/sender-key-message.d.ts +0 -19
- package/lib/Signal/Group/sender-key-message.d.ts.map +0 -1
- package/lib/Signal/Group/sender-key-message.js +0 -66
- package/lib/Signal/Group/sender-key-message.js.map +0 -1
- package/lib/Signal/Group/sender-key-name.d.ts +0 -18
- package/lib/Signal/Group/sender-key-name.d.ts.map +0 -1
- package/lib/Signal/Group/sender-key-name.js +0 -48
- package/lib/Signal/Group/sender-key-name.js.map +0 -1
- package/lib/Signal/Group/sender-key-record.d.ts +0 -31
- package/lib/Signal/Group/sender-key-record.d.ts.map +0 -1
- package/lib/Signal/Group/sender-key-record.js +0 -41
- package/lib/Signal/Group/sender-key-record.js.map +0 -1
- package/lib/Signal/Group/sender-key-state.d.ts +0 -39
- package/lib/Signal/Group/sender-key-state.d.ts.map +0 -1
- package/lib/Signal/Group/sender-key-state.js +0 -84
- package/lib/Signal/Group/sender-key-state.js.map +0 -1
- package/lib/Signal/Group/sender-message-key.d.ts +0 -12
- package/lib/Signal/Group/sender-message-key.d.ts.map +0 -1
- package/lib/Signal/Group/sender-message-key.js.map +0 -1
- package/lib/Signal/libsignal.d.ts.map +0 -1
- package/lib/Signal/libsignal.js.map +0 -1
- package/lib/Signal/lid-mapping.d.ts +0 -23
- package/lib/Signal/lid-mapping.d.ts.map +0 -1
- package/lib/Signal/lid-mapping.js +0 -171
- package/lib/Signal/lid-mapping.js.map +0 -1
- package/lib/Socket/Client/index.d.ts.map +0 -1
- package/lib/Socket/Client/index.js.map +0 -1
- package/lib/Socket/Client/types.d.ts.map +0 -1
- package/lib/Socket/Client/types.js.map +0 -1
- package/lib/Socket/Client/websocket.d.ts.map +0 -1
- package/lib/Socket/Client/websocket.js.map +0 -1
- package/lib/Socket/business.d.ts.map +0 -1
- package/lib/Socket/business.js.map +0 -1
- package/lib/Socket/chats.d.ts.map +0 -1
- package/lib/Socket/chats.js.map +0 -1
- package/lib/Socket/communities.d.ts.map +0 -1
- package/lib/Socket/communities.js.map +0 -1
- package/lib/Socket/groups.d.ts.map +0 -1
- package/lib/Socket/groups.js.map +0 -1
- package/lib/Socket/index.d.ts.map +0 -1
- package/lib/Socket/index.js.map +0 -1
- package/lib/Socket/messages-recv.d.ts.map +0 -1
- package/lib/Socket/messages-recv.js.map +0 -1
- package/lib/Socket/messages-send.d.ts.map +0 -1
- package/lib/Socket/messages-send.js.map +0 -1
- package/lib/Socket/mex.d.ts.map +0 -1
- package/lib/Socket/mex.js.map +0 -1
- package/lib/Socket/newsletter.d.ts.map +0 -1
- package/lib/Socket/newsletter.js.map +0 -1
- package/lib/Socket/socket.d.ts.map +0 -1
- package/lib/Socket/socket.js.map +0 -1
- package/lib/Types/Auth.d.ts.map +0 -1
- package/lib/Types/Auth.js.map +0 -1
- package/lib/Types/Bussines.d.ts +0 -25
- package/lib/Types/Bussines.d.ts.map +0 -1
- package/lib/Types/Bussines.js +0 -2
- package/lib/Types/Bussines.js.map +0 -1
- package/lib/Types/Call.d.ts.map +0 -1
- package/lib/Types/Call.js.map +0 -1
- package/lib/Types/Chat.d.ts.map +0 -1
- package/lib/Types/Chat.js.map +0 -1
- package/lib/Types/Contact.d.ts.map +0 -1
- package/lib/Types/Contact.js.map +0 -1
- package/lib/Types/Events.d.ts.map +0 -1
- package/lib/Types/Events.js.map +0 -1
- package/lib/Types/GroupMetadata.d.ts.map +0 -1
- package/lib/Types/GroupMetadata.js.map +0 -1
- package/lib/Types/Label.d.ts.map +0 -1
- package/lib/Types/Label.js.map +0 -1
- package/lib/Types/LabelAssociation.d.ts.map +0 -1
- package/lib/Types/LabelAssociation.js.map +0 -1
- package/lib/Types/Message.d.ts.map +0 -1
- package/lib/Types/Message.js.map +0 -1
- package/lib/Types/Newsletter.d.ts.map +0 -1
- package/lib/Types/Newsletter.js.map +0 -1
- package/lib/Types/Product.d.ts.map +0 -1
- package/lib/Types/Product.js.map +0 -1
- package/lib/Types/Signal.d.ts.map +0 -1
- package/lib/Types/Signal.js.map +0 -1
- package/lib/Types/Socket.d.ts.map +0 -1
- package/lib/Types/Socket.js.map +0 -1
- package/lib/Types/State.d.ts.map +0 -1
- package/lib/Types/State.js.map +0 -1
- package/lib/Types/USync.d.ts.map +0 -1
- package/lib/Types/USync.js.map +0 -1
- package/lib/Types/index.d.ts.map +0 -1
- package/lib/Types/index.js.map +0 -1
- package/lib/Utils/auth-utils.d.ts.map +0 -1
- package/lib/Utils/auth-utils.js.map +0 -1
- package/lib/Utils/baileys-event-stream.d.ts.map +0 -1
- package/lib/Utils/baileys-event-stream.js.map +0 -1
- package/lib/Utils/browser-utils.d.ts +0 -4
- package/lib/Utils/browser-utils.d.ts.map +0 -1
- package/lib/Utils/browser-utils.js +0 -28
- package/lib/Utils/browser-utils.js.map +0 -1
- package/lib/Utils/business.d.ts.map +0 -1
- package/lib/Utils/business.js.map +0 -1
- package/lib/Utils/chat-utils.d.ts.map +0 -1
- package/lib/Utils/chat-utils.js.map +0 -1
- package/lib/Utils/crypto.d.ts.map +0 -1
- package/lib/Utils/crypto.js.map +0 -1
- package/lib/Utils/decode-wa-message.d.ts.map +0 -1
- package/lib/Utils/decode-wa-message.js.map +0 -1
- package/lib/Utils/event-buffer.d.ts.map +0 -1
- package/lib/Utils/event-buffer.js.map +0 -1
- package/lib/Utils/generics.d.ts.map +0 -1
- package/lib/Utils/generics.js.map +0 -1
- package/lib/Utils/history.d.ts.map +0 -1
- package/lib/Utils/history.js.map +0 -1
- package/lib/Utils/index.d.ts.map +0 -1
- package/lib/Utils/index.js.map +0 -1
- package/lib/Utils/link-preview.d.ts.map +0 -1
- package/lib/Utils/link-preview.js.map +0 -1
- package/lib/Utils/logger.d.ts.map +0 -1
- package/lib/Utils/logger.js.map +0 -1
- package/lib/Utils/lt-hash.d.ts.map +0 -1
- package/lib/Utils/lt-hash.js.map +0 -1
- package/lib/Utils/make-mutex.d.ts.map +0 -1
- package/lib/Utils/make-mutex.js.map +0 -1
- package/lib/Utils/message-retry-manager.d.ts.map +0 -1
- package/lib/Utils/message-retry-manager.js.map +0 -1
- package/lib/Utils/messages-media.d.ts.map +0 -1
- package/lib/Utils/messages-media.js.map +0 -1
- package/lib/Utils/messages.d.ts.map +0 -1
- package/lib/Utils/messages.js.map +0 -1
- package/lib/Utils/noise-handler.d.ts.map +0 -1
- package/lib/Utils/noise-handler.js.map +0 -1
- package/lib/Utils/pre-key-manager.d.ts +0 -28
- package/lib/Utils/pre-key-manager.d.ts.map +0 -1
- package/lib/Utils/pre-key-manager.js +0 -106
- package/lib/Utils/pre-key-manager.js.map +0 -1
- package/lib/Utils/process-message.d.ts.map +0 -1
- package/lib/Utils/process-message.js.map +0 -1
- package/lib/Utils/signal.d.ts.map +0 -1
- package/lib/Utils/signal.js.map +0 -1
- package/lib/Utils/use-multi-file-auth-state.d.ts.map +0 -1
- package/lib/Utils/use-multi-file-auth-state.js.map +0 -1
- package/lib/Utils/validate-connection.d.ts.map +0 -1
- package/lib/Utils/validate-connection.js.map +0 -1
- package/lib/WABinary/constants.d.ts.map +0 -1
- package/lib/WABinary/constants.js.map +0 -1
- package/lib/WABinary/decode.d.ts.map +0 -1
- package/lib/WABinary/decode.js.map +0 -1
- package/lib/WABinary/encode.d.ts.map +0 -1
- package/lib/WABinary/encode.js.map +0 -1
- package/lib/WABinary/generic-utils.d.ts.map +0 -1
- package/lib/WABinary/generic-utils.js.map +0 -1
- package/lib/WABinary/index.d.ts.map +0 -1
- package/lib/WABinary/index.js.map +0 -1
- package/lib/WABinary/jid-utils.d.ts.map +0 -1
- package/lib/WABinary/jid-utils.js.map +0 -1
- package/lib/WABinary/types.d.ts.map +0 -1
- package/lib/WABinary/types.js.map +0 -1
- package/lib/WAM/BinaryInfo.d.ts.map +0 -1
- package/lib/WAM/BinaryInfo.js.map +0 -1
- package/lib/WAM/constants.d.ts.map +0 -1
- package/lib/WAM/constants.js.map +0 -1
- package/lib/WAM/encode.d.ts.map +0 -1
- package/lib/WAM/encode.js.map +0 -1
- package/lib/WAM/index.d.ts.map +0 -1
- package/lib/WAM/index.js.map +0 -1
- package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts.map +0 -1
- package/lib/WAUSync/Protocols/USyncContactProtocol.js.map +0 -1
- package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts.map +0 -1
- package/lib/WAUSync/Protocols/USyncDeviceProtocol.js.map +0 -1
- package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts.map +0 -1
- package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js.map +0 -1
- package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts.map +0 -1
- package/lib/WAUSync/Protocols/USyncStatusProtocol.js.map +0 -1
- package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts +0 -26
- package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts.map +0 -1
- package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js +0 -51
- package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js.map +0 -1
- package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts +0 -10
- package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts.map +0 -1
- package/lib/WAUSync/Protocols/UsyncLIDProtocol.js +0 -29
- package/lib/WAUSync/Protocols/UsyncLIDProtocol.js.map +0 -1
- package/lib/WAUSync/Protocols/index.d.ts.map +0 -1
- package/lib/WAUSync/Protocols/index.js.map +0 -1
- package/lib/WAUSync/USyncQuery.d.ts.map +0 -1
- package/lib/WAUSync/USyncQuery.js.map +0 -1
- package/lib/WAUSync/USyncUser.d.ts.map +0 -1
- package/lib/WAUSync/USyncUser.js.map +0 -1
- package/lib/WAUSync/index.d.ts.map +0 -1
- package/lib/WAUSync/index.js.map +0 -1
- package/lib/index.d.ts.map +0 -1
- package/lib/index.js.map +0 -1
package/lib/Utils/messages.js
CHANGED
|
@@ -1,820 +1,1579 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
1
|
+
"use strict"
|
|
2
|
+
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod }
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true })
|
|
8
|
+
|
|
9
|
+
const boom_1 = require("@hapi/boom")
|
|
10
|
+
const axios_1 = __importDefault(require("axios"))
|
|
11
|
+
const crypto_1 = require("crypto")
|
|
12
|
+
const fs_1 = require("fs")
|
|
13
|
+
const WAProto_1 = require("../../WAProto")
|
|
14
|
+
const Defaults_1 = require("../Defaults")
|
|
15
|
+
const Types_1 = require("../Types")
|
|
16
|
+
const WABinary_1 = require("../WABinary")
|
|
17
|
+
const crypto_2 = require("./crypto")
|
|
18
|
+
const generics_1 = require("./generics")
|
|
19
|
+
const messages_media_1 = require("./messages-media")
|
|
20
|
+
|
|
12
21
|
const MIMETYPE_MAP = {
|
|
13
22
|
image: 'image/jpeg',
|
|
14
23
|
video: 'video/mp4',
|
|
15
24
|
document: 'application/pdf',
|
|
16
|
-
audio: 'audio/ogg
|
|
25
|
+
audio: 'audio/ogg codecs=opus',
|
|
17
26
|
sticker: 'image/webp',
|
|
18
27
|
'product-catalog-image': 'image/jpeg'
|
|
19
|
-
}
|
|
28
|
+
}
|
|
29
|
+
|
|
20
30
|
const MessageTypeProto = {
|
|
21
|
-
image: WAProto.Message.ImageMessage,
|
|
22
|
-
video: WAProto.Message.VideoMessage,
|
|
23
|
-
audio: WAProto.Message.AudioMessage,
|
|
24
|
-
sticker: WAProto.Message.StickerMessage,
|
|
25
|
-
document: WAProto.Message.DocumentMessage
|
|
26
|
-
}
|
|
31
|
+
'image': Types_1.WAProto.Message.ImageMessage,
|
|
32
|
+
'video': Types_1.WAProto.Message.VideoMessage,
|
|
33
|
+
'audio': Types_1.WAProto.Message.AudioMessage,
|
|
34
|
+
'sticker': Types_1.WAProto.Message.StickerMessage,
|
|
35
|
+
'document': Types_1.WAProto.Message.DocumentMessage,
|
|
36
|
+
}
|
|
37
|
+
|
|
27
38
|
/**
|
|
28
39
|
* Uses a regex to test whether the string contains a URL, and returns the URL if it does.
|
|
29
40
|
* @param text eg. hello https://google.com
|
|
30
41
|
* @returns the URL, eg. https://google.com
|
|
31
42
|
*/
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
43
|
+
const extractUrlFromText = (text) => text.match(Defaults_1.URL_REGEX)?.[0]
|
|
44
|
+
|
|
45
|
+
const generateLinkPreviewIfRequired = async (text, getUrlInfo, logger) => {
|
|
46
|
+
const url = extractUrlFromText(text)
|
|
47
|
+
|
|
35
48
|
if (!!getUrlInfo && url) {
|
|
36
49
|
try {
|
|
37
|
-
const urlInfo = await getUrlInfo(url)
|
|
38
|
-
return urlInfo
|
|
50
|
+
const urlInfo = await getUrlInfo(url)
|
|
51
|
+
return urlInfo
|
|
39
52
|
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
logger?.warn({ trace: error.stack }, 'url generation failed')
|
|
53
|
+
|
|
54
|
+
catch (error) {
|
|
55
|
+
logger?.warn({ trace: error.stack }, 'url generation failed')
|
|
43
56
|
}
|
|
44
57
|
}
|
|
45
|
-
}
|
|
58
|
+
}
|
|
59
|
+
|
|
46
60
|
const assertColor = async (color) => {
|
|
47
|
-
let assertedColor
|
|
61
|
+
let assertedColor
|
|
62
|
+
|
|
48
63
|
if (typeof color === 'number') {
|
|
49
|
-
assertedColor = color > 0 ? color : 0xffffffff + Number(color) + 1
|
|
64
|
+
assertedColor = color > 0 ? color : 0xffffffff + Number(color) + 1
|
|
50
65
|
}
|
|
66
|
+
|
|
51
67
|
else {
|
|
52
|
-
let hex = color.trim().replace('#', '')
|
|
68
|
+
let hex = color.trim().replace('#', '')
|
|
53
69
|
if (hex.length <= 6) {
|
|
54
|
-
hex = 'FF' + hex.padStart(6, '0')
|
|
70
|
+
hex = 'FF' + hex.padStart(6, '0')
|
|
55
71
|
}
|
|
56
|
-
assertedColor = parseInt(hex, 16)
|
|
57
|
-
return assertedColor
|
|
72
|
+
assertedColor = parseInt(hex, 16)
|
|
73
|
+
return assertedColor
|
|
58
74
|
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const prepareWAMessageMedia = async (message, options) => {
|
|
78
|
+
const logger = options.logger
|
|
79
|
+
let mediaType
|
|
80
|
+
|
|
81
|
+
for (const key of Defaults_1.MEDIA_KEYS) {
|
|
64
82
|
if (key in message) {
|
|
65
|
-
mediaType = key
|
|
83
|
+
mediaType = key
|
|
66
84
|
}
|
|
67
85
|
}
|
|
86
|
+
|
|
68
87
|
if (!mediaType) {
|
|
69
|
-
throw new Boom('Invalid media type', { statusCode: 400 })
|
|
88
|
+
throw new boom_1.Boom('Invalid media type', { statusCode: 400 })
|
|
70
89
|
}
|
|
90
|
+
|
|
71
91
|
const uploadData = {
|
|
72
92
|
...message,
|
|
73
93
|
media: message[mediaType]
|
|
74
|
-
}
|
|
75
|
-
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
delete uploadData[mediaType]
|
|
97
|
+
|
|
76
98
|
// check if cacheable + generate cache key
|
|
77
99
|
const cacheableKey = typeof uploadData.media === 'object' &&
|
|
78
|
-
'url' in uploadData.media &&
|
|
100
|
+
('url' in uploadData.media) &&
|
|
79
101
|
!!uploadData.media.url &&
|
|
80
|
-
!!options.mediaCache &&
|
|
81
|
-
|
|
102
|
+
!!options.mediaCache && (
|
|
103
|
+
// generate the key
|
|
104
|
+
mediaType + ':' + uploadData.media.url.toString())
|
|
105
|
+
|
|
82
106
|
if (mediaType === 'document' && !uploadData.fileName) {
|
|
83
|
-
uploadData.fileName = 'file'
|
|
107
|
+
uploadData.fileName = 'file'
|
|
84
108
|
}
|
|
109
|
+
|
|
85
110
|
if (!uploadData.mimetype) {
|
|
86
|
-
uploadData.mimetype = MIMETYPE_MAP[mediaType]
|
|
111
|
+
uploadData.mimetype = MIMETYPE_MAP[mediaType]
|
|
87
112
|
}
|
|
113
|
+
|
|
114
|
+
// check for cache hit
|
|
88
115
|
if (cacheableKey) {
|
|
89
|
-
const mediaBuff =
|
|
116
|
+
const mediaBuff = options.mediaCache.get(cacheableKey)
|
|
90
117
|
if (mediaBuff) {
|
|
91
|
-
logger?.debug({ cacheableKey }, 'got media cache hit')
|
|
92
|
-
const obj =
|
|
93
|
-
const key = `${mediaType}Message
|
|
94
|
-
Object.assign(obj[key], { ...uploadData, media: undefined })
|
|
95
|
-
return obj
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
});
|
|
108
|
-
await fs.unlink(filePath);
|
|
109
|
-
const obj = WAProto.Message.fromObject({
|
|
110
|
-
// todo: add more support here
|
|
111
|
-
[`${mediaType}Message`]: MessageTypeProto[mediaType].fromObject({
|
|
112
|
-
url: mediaUrl,
|
|
113
|
-
directPath,
|
|
114
|
-
fileSha256,
|
|
115
|
-
fileLength,
|
|
116
|
-
...uploadData,
|
|
117
|
-
media: undefined
|
|
118
|
-
})
|
|
119
|
-
});
|
|
120
|
-
if (uploadData.ptv) {
|
|
121
|
-
obj.ptvMessage = obj.videoMessage;
|
|
122
|
-
delete obj.videoMessage;
|
|
123
|
-
}
|
|
124
|
-
if (obj.stickerMessage) {
|
|
125
|
-
obj.stickerMessage.stickerSentTs = Date.now();
|
|
126
|
-
}
|
|
127
|
-
if (cacheableKey) {
|
|
128
|
-
logger?.debug({ cacheableKey }, 'set cache');
|
|
129
|
-
await options.mediaCache.set(cacheableKey, WAProto.Message.encode(obj).finish());
|
|
130
|
-
}
|
|
131
|
-
return obj;
|
|
132
|
-
}
|
|
133
|
-
const requiresDurationComputation = mediaType === 'audio' && typeof uploadData.seconds === 'undefined';
|
|
134
|
-
const requiresThumbnailComputation = (mediaType === 'image' || mediaType === 'video') && typeof uploadData['jpegThumbnail'] === 'undefined';
|
|
135
|
-
const requiresWaveformProcessing = mediaType === 'audio' && uploadData.ptt === true;
|
|
136
|
-
const requiresAudioBackground = options.backgroundColor && mediaType === 'audio' && uploadData.ptt === true;
|
|
137
|
-
const requiresOriginalForSomeProcessing = requiresDurationComputation || requiresThumbnailComputation;
|
|
138
|
-
const { mediaKey, encFilePath, originalFilePath, fileEncSha256, fileSha256, fileLength } = await encryptedStream(uploadData.media, options.mediaTypeOverride || mediaType, {
|
|
118
|
+
logger?.debug({ cacheableKey }, 'got media cache hit')
|
|
119
|
+
const obj = Types_1.WAProto.Message.decode(mediaBuff)
|
|
120
|
+
const key = `${mediaType}Message`
|
|
121
|
+
Object.assign(obj[key], { ...uploadData, media: undefined })
|
|
122
|
+
return obj
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
const requiresDurationComputation = mediaType === 'audio' && typeof uploadData.seconds === 'undefined'
|
|
127
|
+
const requiresThumbnailComputation = (mediaType === 'image' || mediaType === 'video') &&
|
|
128
|
+
(typeof uploadData['jpegThumbnail'] === 'undefined')
|
|
129
|
+
const requiresWaveformProcessing = mediaType === 'audio' && uploadData.ptt === true
|
|
130
|
+
const requiresAudioBackground = options.backgroundColor && mediaType === 'audio' && uploadData.ptt === true
|
|
131
|
+
const requiresOriginalForSomeProcessing = requiresDurationComputation || requiresThumbnailComputation
|
|
132
|
+
|
|
133
|
+
const { mediaKey, encFilePath, originalFilePath, fileEncSha256, fileSha256, fileLength } = await (options.newsletter ? messages_media_1.prepareStream : messages_media_1.encryptedStream)(uploadData.media, options.mediaTypeOverride || mediaType, {
|
|
139
134
|
logger,
|
|
140
135
|
saveOriginalFileIfRequired: requiresOriginalForSomeProcessing,
|
|
141
136
|
opts: options.options
|
|
142
|
-
})
|
|
143
|
-
|
|
144
|
-
|
|
137
|
+
})
|
|
138
|
+
|
|
139
|
+
// url safe Base64 encode the SHA256 hash of the body
|
|
140
|
+
const fileEncSha256B64 = (options.newsletter ? fileSha256 : fileEncSha256 !== null && fileEncSha256 ? fileEncSha256 : fileSha256).toString('base64')
|
|
141
|
+
|
|
142
|
+
const [{ mediaUrl, directPath, handle }] = await Promise.all([
|
|
145
143
|
(async () => {
|
|
146
|
-
const result = await options.upload(encFilePath, {
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
});
|
|
151
|
-
logger?.debug({ mediaType, cacheableKey }, 'uploaded media');
|
|
152
|
-
return result;
|
|
144
|
+
const result = await options.upload(encFilePath, { fileEncSha256B64, mediaType, timeoutMs: options.mediaUploadTimeoutMs })
|
|
145
|
+
logger?.debug({ mediaType, cacheableKey }, 'uploaded media')
|
|
146
|
+
|
|
147
|
+
return result
|
|
153
148
|
})(),
|
|
154
149
|
(async () => {
|
|
155
150
|
try {
|
|
156
151
|
if (requiresThumbnailComputation) {
|
|
157
|
-
const { thumbnail, originalImageDimensions } = await generateThumbnail(originalFilePath, mediaType, options)
|
|
158
|
-
uploadData.jpegThumbnail = thumbnail
|
|
152
|
+
const { thumbnail, originalImageDimensions } = await messages_media_1.generateThumbnail(originalFilePath, mediaType, options)
|
|
153
|
+
uploadData.jpegThumbnail = thumbnail
|
|
154
|
+
|
|
159
155
|
if (!uploadData.width && originalImageDimensions) {
|
|
160
|
-
uploadData.width = originalImageDimensions.width
|
|
161
|
-
uploadData.height = originalImageDimensions.height
|
|
162
|
-
logger?.debug('set dimensions')
|
|
156
|
+
uploadData.width = originalImageDimensions.width
|
|
157
|
+
uploadData.height = originalImageDimensions.height
|
|
158
|
+
logger?.debug('set dimensions')
|
|
163
159
|
}
|
|
164
|
-
logger?.debug('generated thumbnail')
|
|
160
|
+
logger?.debug('generated thumbnail')
|
|
165
161
|
}
|
|
162
|
+
|
|
166
163
|
if (requiresDurationComputation) {
|
|
167
|
-
uploadData.seconds = await getAudioDuration(originalFilePath)
|
|
168
|
-
logger?.debug('computed audio duration')
|
|
164
|
+
uploadData.seconds = await messages_media_1.getAudioDuration(originalFilePath)
|
|
165
|
+
logger?.debug('computed audio duration')
|
|
169
166
|
}
|
|
167
|
+
|
|
170
168
|
if (requiresWaveformProcessing) {
|
|
171
|
-
uploadData.waveform = await getAudioWaveform(originalFilePath, logger)
|
|
172
|
-
logger?.debug('processed waveform')
|
|
169
|
+
uploadData.waveform = await messages_media_1.getAudioWaveform(originalFilePath, logger)
|
|
170
|
+
logger?.debug('processed waveform')
|
|
173
171
|
}
|
|
172
|
+
|
|
174
173
|
if (requiresAudioBackground) {
|
|
175
|
-
uploadData.backgroundArgb = await assertColor(options.backgroundColor)
|
|
176
|
-
logger?.debug('computed backgroundColor audio status')
|
|
174
|
+
uploadData.backgroundArgb = await assertColor(options.backgroundColor)
|
|
175
|
+
logger?.debug('computed backgroundColor audio status')
|
|
177
176
|
}
|
|
178
177
|
}
|
|
178
|
+
|
|
179
179
|
catch (error) {
|
|
180
|
-
logger?.warn({ trace: error.stack }, 'failed to obtain extra info')
|
|
180
|
+
logger?.warn({ trace: error.stack }, 'failed to obtain extra info')
|
|
181
181
|
}
|
|
182
|
-
})()
|
|
182
|
+
})(),
|
|
183
183
|
]).finally(async () => {
|
|
184
184
|
try {
|
|
185
|
-
await
|
|
185
|
+
await fs_1.promises.unlink(encFilePath)
|
|
186
186
|
if (originalFilePath) {
|
|
187
|
-
await
|
|
187
|
+
await fs_1.promises.unlink(originalFilePath)
|
|
188
188
|
}
|
|
189
|
-
logger?.debug('removed tmp files')
|
|
189
|
+
logger?.debug('removed tmp files')
|
|
190
190
|
}
|
|
191
191
|
catch (error) {
|
|
192
|
-
logger?.warn('failed to remove tmp file')
|
|
192
|
+
logger?.warn('failed to remove tmp file')
|
|
193
193
|
}
|
|
194
|
-
})
|
|
195
|
-
const obj = WAProto.Message.fromObject({
|
|
194
|
+
})
|
|
195
|
+
const obj = Types_1.WAProto.Message.fromObject({
|
|
196
196
|
[`${mediaType}Message`]: MessageTypeProto[mediaType].fromObject({
|
|
197
|
-
url: mediaUrl,
|
|
197
|
+
url: handle ? undefined : mediaUrl,
|
|
198
198
|
directPath,
|
|
199
|
-
mediaKey,
|
|
200
|
-
fileEncSha256,
|
|
199
|
+
mediaKey: mediaKey,
|
|
200
|
+
fileEncSha256: fileEncSha256,
|
|
201
201
|
fileSha256,
|
|
202
202
|
fileLength,
|
|
203
|
-
mediaKeyTimestamp: unixTimestampSeconds(),
|
|
203
|
+
mediaKeyTimestamp: handle ? undefined : generics_1.unixTimestampSeconds(),
|
|
204
204
|
...uploadData,
|
|
205
205
|
media: undefined
|
|
206
206
|
})
|
|
207
|
-
})
|
|
207
|
+
})
|
|
208
|
+
|
|
208
209
|
if (uploadData.ptv) {
|
|
209
|
-
obj.ptvMessage = obj.videoMessage
|
|
210
|
-
delete obj.videoMessage
|
|
210
|
+
obj.ptvMessage = obj.videoMessage
|
|
211
|
+
delete obj.videoMessage
|
|
211
212
|
}
|
|
213
|
+
|
|
212
214
|
if (cacheableKey) {
|
|
213
|
-
logger?.debug({ cacheableKey }, 'set cache')
|
|
214
|
-
|
|
215
|
+
logger?.debug({ cacheableKey }, 'set cache')
|
|
216
|
+
options.mediaCache.set(cacheableKey, Types_1.WAProto.Message.encode(obj).finish())
|
|
215
217
|
}
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
218
|
+
|
|
219
|
+
return obj
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
const prepareDisappearingMessageSettingContent = (expiration) => {
|
|
220
223
|
const content = {
|
|
221
224
|
ephemeralMessage: {
|
|
222
225
|
message: {
|
|
223
226
|
protocolMessage: {
|
|
224
|
-
type: WAProto.Message.ProtocolMessage.Type.EPHEMERAL_SETTING,
|
|
225
|
-
ephemeralExpiration
|
|
227
|
+
type: Types_1.WAProto.Message.ProtocolMessage.Type.EPHEMERAL_SETTING,
|
|
228
|
+
ephemeralExpiration: expiration ? expiration : 0
|
|
226
229
|
}
|
|
227
230
|
}
|
|
228
231
|
}
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
return Types_1.WAProto.Message.fromObject(content)
|
|
235
|
+
}
|
|
236
|
+
|
|
232
237
|
/**
|
|
233
238
|
* Generate forwarded message content like WA does
|
|
234
239
|
* @param message the message to forward
|
|
235
240
|
* @param options.forceForward will show the message as forwarded even if it is from you
|
|
236
241
|
*/
|
|
237
|
-
|
|
238
|
-
let content = message.message
|
|
242
|
+
const generateForwardMessageContent = (message, forceForward) => {
|
|
243
|
+
let content = message.message
|
|
244
|
+
|
|
239
245
|
if (!content) {
|
|
240
|
-
throw new Boom('no content in message', { statusCode: 400 })
|
|
246
|
+
throw new boom_1.Boom('no content in message', { statusCode: 400 })
|
|
241
247
|
}
|
|
248
|
+
|
|
242
249
|
// hacky copy
|
|
243
|
-
content = normalizeMessageContent(content)
|
|
244
|
-
content = proto.Message.decode(proto.Message.encode(content).finish())
|
|
245
|
-
|
|
246
|
-
let
|
|
247
|
-
score
|
|
250
|
+
content = normalizeMessageContent(content)
|
|
251
|
+
content = WAProto_1.proto.Message.decode(WAProto_1.proto.Message.encode(content).finish())
|
|
252
|
+
|
|
253
|
+
let key = Object.keys(content)[0]
|
|
254
|
+
let score = content[key].contextInfo?.forwardingScore || 0
|
|
255
|
+
|
|
256
|
+
if (forceForward) score += forceForward ? forceForward : 1
|
|
257
|
+
|
|
248
258
|
if (key === 'conversation') {
|
|
249
|
-
content.extendedTextMessage = { text: content[key] }
|
|
250
|
-
delete content.conversation
|
|
251
|
-
key = 'extendedTextMessage'
|
|
259
|
+
content.extendedTextMessage = { text: content[key] }
|
|
260
|
+
delete content.conversation
|
|
261
|
+
key = 'extendedTextMessage'
|
|
252
262
|
}
|
|
253
|
-
|
|
263
|
+
|
|
254
264
|
if (score > 0) {
|
|
255
|
-
|
|
265
|
+
content[key].contextInfo = { forwardingScore: score, isForwarded: true }
|
|
256
266
|
}
|
|
267
|
+
|
|
257
268
|
else {
|
|
258
|
-
|
|
269
|
+
content[key].contextInfo = {}
|
|
259
270
|
}
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
271
|
+
|
|
272
|
+
return content
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
const generateWAMessageContent = async (message, options) => {
|
|
276
|
+
let m = {}
|
|
265
277
|
if ('text' in message) {
|
|
266
|
-
const extContent = { text: message.text }
|
|
267
|
-
let urlInfo = message.linkPreview
|
|
278
|
+
const extContent = { text: message.text }
|
|
279
|
+
let urlInfo = message.linkPreview
|
|
280
|
+
|
|
268
281
|
if (typeof urlInfo === 'undefined') {
|
|
269
|
-
urlInfo = await generateLinkPreviewIfRequired(message.text, options.getUrlInfo, options.logger)
|
|
282
|
+
urlInfo = await generateLinkPreviewIfRequired(message.text, options.getUrlInfo, options.logger)
|
|
270
283
|
}
|
|
284
|
+
|
|
271
285
|
if (urlInfo) {
|
|
272
|
-
extContent.
|
|
273
|
-
extContent.
|
|
274
|
-
extContent.
|
|
275
|
-
extContent.
|
|
276
|
-
extContent.
|
|
277
|
-
|
|
286
|
+
extContent.canonicalUrl = urlInfo['canonical-url']
|
|
287
|
+
extContent.matchedText = urlInfo['matched-text']
|
|
288
|
+
extContent.jpegThumbnail = urlInfo.jpegThumbnail
|
|
289
|
+
extContent.description = urlInfo.description
|
|
290
|
+
extContent.title = urlInfo.title
|
|
291
|
+
extContent.previewType = 0
|
|
292
|
+
const img = urlInfo.highQualityThumbnail
|
|
293
|
+
|
|
278
294
|
if (img) {
|
|
279
|
-
extContent.thumbnailDirectPath = img.directPath
|
|
280
|
-
extContent.mediaKey = img.mediaKey
|
|
281
|
-
extContent.mediaKeyTimestamp = img.mediaKeyTimestamp
|
|
282
|
-
extContent.thumbnailWidth = img.width
|
|
283
|
-
extContent.thumbnailHeight = img.height
|
|
284
|
-
extContent.thumbnailSha256 = img.fileSha256
|
|
285
|
-
extContent.thumbnailEncSha256 = img.fileEncSha256
|
|
295
|
+
extContent.thumbnailDirectPath = img.directPath
|
|
296
|
+
extContent.mediaKey = img.mediaKey
|
|
297
|
+
extContent.mediaKeyTimestamp = img.mediaKeyTimestamp
|
|
298
|
+
extContent.thumbnailWidth = img.width
|
|
299
|
+
extContent.thumbnailHeight = img.height
|
|
300
|
+
extContent.thumbnailSha256 = img.fileSha256
|
|
301
|
+
extContent.thumbnailEncSha256 = img.fileEncSha256
|
|
286
302
|
}
|
|
287
303
|
}
|
|
304
|
+
|
|
288
305
|
if (options.backgroundColor) {
|
|
289
|
-
extContent.backgroundArgb = await assertColor(options.backgroundColor)
|
|
306
|
+
extContent.backgroundArgb = await assertColor(options.backgroundColor)
|
|
290
307
|
}
|
|
308
|
+
|
|
309
|
+
if (options.textColor) {
|
|
310
|
+
extContent.textArgb = await assertColor(options.textColor)
|
|
311
|
+
}
|
|
312
|
+
|
|
291
313
|
if (options.font) {
|
|
292
|
-
extContent.font = options.font
|
|
314
|
+
extContent.font = options.font
|
|
293
315
|
}
|
|
294
|
-
|
|
316
|
+
|
|
317
|
+
extContent.contextInfo = {
|
|
318
|
+
...(message.contextInfo || {}),
|
|
319
|
+
...(message.mentions ? { mentionedJid: message.mentions } : {})
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
m.extendedTextMessage = extContent
|
|
295
323
|
}
|
|
324
|
+
|
|
296
325
|
else if ('contacts' in message) {
|
|
297
|
-
const contactLen = message.contacts.contacts.length
|
|
326
|
+
const contactLen = message.contacts.contacts.length
|
|
327
|
+
|
|
328
|
+
let contactMessage
|
|
329
|
+
|
|
298
330
|
if (!contactLen) {
|
|
299
|
-
throw new Boom('require atleast 1 contact', { statusCode: 400 })
|
|
331
|
+
throw new boom_1.Boom('require atleast 1 contact', { statusCode: 400 })
|
|
300
332
|
}
|
|
333
|
+
|
|
301
334
|
if (contactLen === 1) {
|
|
302
|
-
|
|
335
|
+
contactMessage = {
|
|
336
|
+
contactMessage: Types_1.WAProto.Message.ContactMessage.fromObject(message.contacts.contacts[0])
|
|
337
|
+
}
|
|
303
338
|
}
|
|
339
|
+
|
|
304
340
|
else {
|
|
305
|
-
|
|
341
|
+
contactMessage = {
|
|
342
|
+
contactsArrayMessage: Types_1.WAProto.Message.ContactsArrayMessage.fromObject(message.contacts)
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
const [type] = Object.keys(contactMessage)
|
|
347
|
+
|
|
348
|
+
contactMessage[type].contextInfo = {
|
|
349
|
+
...(message.contextInfo || {}),
|
|
350
|
+
...(message.mentions ? { mentionedJid: message.mentions } : {})
|
|
306
351
|
}
|
|
352
|
+
|
|
353
|
+
m = contactMessage
|
|
307
354
|
}
|
|
355
|
+
|
|
308
356
|
else if ('location' in message) {
|
|
309
|
-
|
|
357
|
+
let locationMessage
|
|
358
|
+
|
|
359
|
+
if (message.live) {
|
|
360
|
+
locationMessage = {
|
|
361
|
+
liveLocationMessage: Types_1.WAProto.Message.LiveLocationMessage.fromObject(message.location)
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
else {
|
|
366
|
+
locationMessage = {
|
|
367
|
+
locationMessage: Types_1.WAProto.Message.LocationMessage.fromObject(message.location)
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
const [type] = Object.keys(locationMessage)
|
|
372
|
+
|
|
373
|
+
locationMessage[type].contextInfo = {
|
|
374
|
+
...(message.contextInfo || {}),
|
|
375
|
+
...(message.mentions ? { mentionedJid: message.mentions } : {})
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
m = locationMessage
|
|
310
379
|
}
|
|
380
|
+
|
|
311
381
|
else if ('react' in message) {
|
|
312
382
|
if (!message.react.senderTimestampMs) {
|
|
313
|
-
message.react.senderTimestampMs = Date.now()
|
|
383
|
+
message.react.senderTimestampMs = Date.now()
|
|
314
384
|
}
|
|
315
|
-
|
|
385
|
+
|
|
386
|
+
m.reactionMessage = Types_1.WAProto.Message.ReactionMessage.fromObject(message.react)
|
|
316
387
|
}
|
|
388
|
+
|
|
317
389
|
else if ('delete' in message) {
|
|
318
390
|
m.protocolMessage = {
|
|
319
391
|
key: message.delete,
|
|
320
|
-
type: WAProto.Message.ProtocolMessage.Type.REVOKE
|
|
321
|
-
}
|
|
322
|
-
}
|
|
392
|
+
type: Types_1.WAProto.Message.ProtocolMessage.Type.REVOKE
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
|
|
323
396
|
else if ('forward' in message) {
|
|
324
|
-
|
|
397
|
+
const mess = generateForwardMessageContent(message.forward, message.force)
|
|
398
|
+
const [type] = Object.keys(mess)
|
|
399
|
+
|
|
400
|
+
mess[type].contextInfo = {
|
|
401
|
+
...(message.contextInfo || {}),
|
|
402
|
+
...(message.mentions ? { mentionedJid: message.mentions } : {})
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
m = mess
|
|
325
406
|
}
|
|
407
|
+
|
|
326
408
|
else if ('disappearingMessagesInChat' in message) {
|
|
327
|
-
const exp = typeof message.disappearingMessagesInChat === 'boolean'
|
|
328
|
-
?
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
: message.disappearingMessagesInChat;
|
|
332
|
-
m = prepareDisappearingMessageSettingContent(exp);
|
|
409
|
+
const exp = typeof message.disappearingMessagesInChat === 'boolean' ?
|
|
410
|
+
(message.disappearingMessagesInChat ? Defaults_1.WA_DEFAULT_EPHEMERAL : 0) :
|
|
411
|
+
message.disappearingMessagesInChat
|
|
412
|
+
m = prepareDisappearingMessageSettingContent(exp)
|
|
333
413
|
}
|
|
414
|
+
|
|
334
415
|
else if ('groupInvite' in message) {
|
|
335
|
-
|
|
336
|
-
m.groupInviteMessage
|
|
337
|
-
|
|
338
|
-
m.groupInviteMessage.
|
|
339
|
-
m.groupInviteMessage.
|
|
340
|
-
m.groupInviteMessage.
|
|
341
|
-
|
|
342
|
-
|
|
416
|
+
m.messageContextInfo = {}
|
|
417
|
+
m.groupInviteMessage = {}
|
|
418
|
+
|
|
419
|
+
m.groupInviteMessage.inviteCode = message.groupInvite.code
|
|
420
|
+
m.groupInviteMessage.inviteExpiration = message.groupInvite.expiration
|
|
421
|
+
m.groupInviteMessage.caption = message.groupInvite.caption
|
|
422
|
+
m.groupInviteMessage.groupJid = message.groupInvite.jid
|
|
423
|
+
m.groupInviteMessage.groupName = message.groupInvite.name
|
|
424
|
+
m.groupInviteMessage.contextInfo = message.contextInfo
|
|
425
|
+
|
|
343
426
|
if (options.getProfilePicUrl) {
|
|
344
|
-
const pfpUrl = await options.getProfilePicUrl(message.groupInvite.jid
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
}
|
|
427
|
+
const pfpUrl = await options.getProfilePicUrl(message.groupInvite.jid)
|
|
428
|
+
const { thumbnail } = await messages_media_1.generateThumbnail(pfpUrl, 'image')
|
|
429
|
+
m.groupInviteMessage.jpegThumbnail = thumbnail
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
m.groupInviteMessage.contextInfo = {
|
|
433
|
+
...(message.contextInfo || {}),
|
|
434
|
+
...(message.mentions ? { mentionedJid: message.mentions } : {})
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
else if ('adminInvite' in message) {
|
|
439
|
+
m.messageContextInfo = {}
|
|
440
|
+
m.newsletterAdminInviteMessage = {}
|
|
441
|
+
|
|
442
|
+
m.newsletterAdminInviteMessage.newsletterJid = message.adminInvite.jid
|
|
443
|
+
m.newsletterAdminInviteMessage.newsletterName= message.adminInvite.name
|
|
444
|
+
m.newsletterAdminInviteMessage.caption = message.adminInvite.caption
|
|
445
|
+
m.newsletterAdminInviteMessage.inviteExpiration = message.adminInvite.expiration
|
|
446
|
+
m.newsletterAdminInviteMessage.contextInfo = message.contextInfo
|
|
447
|
+
|
|
448
|
+
if (options.getProfilePicUrl) {
|
|
449
|
+
const pfpUrl = await options.getProfilePicUrl(message.adminInvite.jid)
|
|
450
|
+
const { thumbnail } = await messages_media_1.generateThumbnail(pfpUrl, 'image')
|
|
451
|
+
m.newsletterAdminInviteMessage.jpegThumbnail = thumbnail
|
|
352
452
|
}
|
|
453
|
+
|
|
454
|
+
m.newsletterAdminInviteMessage.contextInfo = {
|
|
455
|
+
...(message.contextInfo || {}),
|
|
456
|
+
...(message.mentions ? { mentionedJid: message.mentions } : {})
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
else if ('pin' in message) {
|
|
461
|
+
m.pinInChatMessage = {}
|
|
462
|
+
m.messageContextInfo = {}
|
|
463
|
+
|
|
464
|
+
m.pinInChatMessage.key = message.pin.key
|
|
465
|
+
m.pinInChatMessage.type = message.pin?.type || 1
|
|
466
|
+
m.pinInChatMessage.senderTimestampMs = message.pin?.time || Date.now()
|
|
467
|
+
m.messageContextInfo.messageAddOnDurationInSecs = message.pin.type === 1 ? message.pin.time || 86400 : 0
|
|
468
|
+
m.messageContextInfo.messageAddOnExpiryType = WAProto_1.proto.MessageContextInfo.MessageAddonExpiryType.STATIC
|
|
353
469
|
}
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
m.
|
|
357
|
-
|
|
358
|
-
m.
|
|
359
|
-
m.
|
|
360
|
-
m.
|
|
470
|
+
|
|
471
|
+
else if ('keep' in message) {
|
|
472
|
+
m.keepInChatMessage = {}
|
|
473
|
+
|
|
474
|
+
m.keepInChatMessage.key = message.keep.key
|
|
475
|
+
m.keepInChatMessage.keepType = message.keep?.type || 1
|
|
476
|
+
m.keepInChatMessage.timestampMs = message.keep?.time || Date.now()
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
else if ('call' in message) {
|
|
480
|
+
m.messageContextInfo = {}
|
|
481
|
+
m.scheduledCallCreationMessage = {}
|
|
482
|
+
|
|
483
|
+
m.scheduledCallCreationMessage.scheduledTimestampMs = message.call?.time || Date.now()
|
|
484
|
+
m.scheduledCallCreationMessage.callType = message.call?.type || 1
|
|
485
|
+
m.scheduledCallCreationMessage.title = message.call?.name || 'Call Creation'
|
|
486
|
+
|
|
487
|
+
m.scheduledCallCreationMessage.contextInfo = {
|
|
488
|
+
...(message.contextInfo || {}),
|
|
489
|
+
...(message.mentions ? { mentionedJid: message.mentions } : {})
|
|
490
|
+
}
|
|
361
491
|
}
|
|
492
|
+
|
|
493
|
+
else if ('paymentInvite' in message) {
|
|
494
|
+
m.messageContextInfo = {}
|
|
495
|
+
m.paymentInviteMessage = {}
|
|
496
|
+
|
|
497
|
+
m.paymentInviteMessage.expiryTimestamp = message.paymentInvite?.expiry || 0
|
|
498
|
+
m.paymentInviteMessage.serviceType = message.paymentInvite?.type || 2
|
|
499
|
+
|
|
500
|
+
m.paymentInviteMessage.contextInfo = {
|
|
501
|
+
...(message.contextInfo || {}),
|
|
502
|
+
...(message.mentions ? { mentionedJid: message.mentions } : {})
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
|
|
362
506
|
else if ('buttonReply' in message) {
|
|
363
507
|
switch (message.type) {
|
|
508
|
+
case 'list':
|
|
509
|
+
m.listResponseMessage = {
|
|
510
|
+
title: message.buttonReply.title,
|
|
511
|
+
description: message.buttonReply.description,
|
|
512
|
+
singleSelectReply: {
|
|
513
|
+
selectedRowId: message.buttonReply.rowId
|
|
514
|
+
},
|
|
515
|
+
lisType: WAProto_1.proto.Message.ListResponseMessage.ListType.SINGLE_SELECT
|
|
516
|
+
}
|
|
517
|
+
break
|
|
364
518
|
case 'template':
|
|
365
519
|
m.templateButtonReplyMessage = {
|
|
366
520
|
selectedDisplayText: message.buttonReply.displayText,
|
|
367
521
|
selectedId: message.buttonReply.id,
|
|
368
522
|
selectedIndex: message.buttonReply.index
|
|
369
|
-
}
|
|
370
|
-
break
|
|
523
|
+
}
|
|
524
|
+
break
|
|
371
525
|
case 'plain':
|
|
372
526
|
m.buttonsResponseMessage = {
|
|
373
527
|
selectedButtonId: message.buttonReply.id,
|
|
374
528
|
selectedDisplayText: message.buttonReply.displayText,
|
|
375
|
-
type: proto.Message.ButtonsResponseMessage.Type.DISPLAY_TEXT
|
|
376
|
-
}
|
|
377
|
-
break
|
|
529
|
+
type: WAProto_1.proto.Message.ButtonsResponseMessage.Type.DISPLAY_TEXT
|
|
530
|
+
}
|
|
531
|
+
break
|
|
532
|
+
case 'interactive':
|
|
533
|
+
m.interactiveResponseMessage = {
|
|
534
|
+
body: {
|
|
535
|
+
text: message.buttonReply.displayText,
|
|
536
|
+
format: WAProto_1.proto.Message.InteractiveResponseMessage.Body.Format.EXTENSIONS_1
|
|
537
|
+
},
|
|
538
|
+
nativeFlowResponseMessage: {
|
|
539
|
+
name: message.buttonReply.nativeFlows.name,
|
|
540
|
+
paramsJson: message.buttonReply.nativeFlows.paramsJson,
|
|
541
|
+
version: message.buttonReply.nativeFlows.version
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
break
|
|
378
545
|
}
|
|
379
546
|
}
|
|
547
|
+
|
|
380
548
|
else if ('ptv' in message && message.ptv) {
|
|
381
|
-
const { videoMessage } = await prepareWAMessageMedia({ video: message.video }, options)
|
|
382
|
-
|
|
549
|
+
const { videoMessage } = await prepareWAMessageMedia({ video: message.video }, options)
|
|
550
|
+
|
|
551
|
+
m.ptvMessage = videoMessage
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
else if ('order' in message) {
|
|
555
|
+
m.orderMessage = Types_1.WAProto.Message.OrderMessage.fromObject(message.order)
|
|
556
|
+
|
|
557
|
+
m.orderMessage.contextInfo = {
|
|
558
|
+
...(message.contextInfo || {}),
|
|
559
|
+
...(message.mentions ? { mentionedJid: message.mentions } : {})
|
|
560
|
+
}
|
|
383
561
|
}
|
|
562
|
+
|
|
563
|
+
else if ('event' in message) {
|
|
564
|
+
m.eventMessage = Types_1.WAProto.Message.EventMessage.fromObject(message.event)
|
|
565
|
+
|
|
566
|
+
if (!message.event.startTime) {
|
|
567
|
+
m.eventMessage.startTime = generics_1.unixTimestampSeconds()
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
m.eventMessage.contextInfo = {
|
|
571
|
+
...(message.contextInfo || {}),
|
|
572
|
+
...(message.mentions ? { mentionedJid: message.mentions } : {})
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
|
|
384
576
|
else if ('product' in message) {
|
|
385
|
-
const { imageMessage } = await prepareWAMessageMedia({ image: message.product.productImage }, options)
|
|
386
|
-
|
|
577
|
+
const { imageMessage } = await prepareWAMessageMedia({ image: message.product.productImage }, options)
|
|
578
|
+
|
|
579
|
+
m.productMessage = Types_1.WAProto.Message.ProductMessage.fromObject({
|
|
387
580
|
...message,
|
|
388
581
|
product: {
|
|
389
582
|
...message.product,
|
|
390
|
-
productImage: imageMessage
|
|
583
|
+
productImage: imageMessage,
|
|
391
584
|
}
|
|
392
|
-
})
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
m.eventMessage = {};
|
|
399
|
-
const startTime = Math.floor(message.event.startDate.getTime() / 1000);
|
|
400
|
-
if (message.event.call && options.getCallLink) {
|
|
401
|
-
const token = await options.getCallLink(message.event.call, { startTime });
|
|
402
|
-
m.eventMessage.joinLink = (message.event.call === 'audio' ? CALL_AUDIO_PREFIX : CALL_VIDEO_PREFIX) + token;
|
|
403
|
-
}
|
|
404
|
-
m.messageContextInfo = {
|
|
405
|
-
// encKey
|
|
406
|
-
messageSecret: message.event.messageSecret || randomBytes(32)
|
|
407
|
-
};
|
|
408
|
-
m.eventMessage.name = message.event.name;
|
|
409
|
-
m.eventMessage.description = message.event.description;
|
|
410
|
-
m.eventMessage.startTime = startTime;
|
|
411
|
-
m.eventMessage.endTime = message.event.endDate ? message.event.endDate.getTime() / 1000 : undefined;
|
|
412
|
-
m.eventMessage.isCanceled = message.event.isCancelled ?? false;
|
|
413
|
-
m.eventMessage.extraGuestsAllowed = message.event.extraGuestsAllowed;
|
|
414
|
-
m.eventMessage.isScheduleCall = message.event.isScheduleCall ?? false;
|
|
415
|
-
m.eventMessage.location = message.event.location;
|
|
585
|
+
})
|
|
586
|
+
|
|
587
|
+
m.productMessage.contextInfo = {
|
|
588
|
+
...(message.contextInfo || {}),
|
|
589
|
+
...(message.mentions ? { mentionedJid: message.mentions } : {})
|
|
590
|
+
}
|
|
416
591
|
}
|
|
592
|
+
|
|
593
|
+
else if ('pollResult' in message) {
|
|
594
|
+
if (!Array.isArray(message.pollResult.values)) {
|
|
595
|
+
throw new boom_1.Boom('Invalid pollResult values', { statusCode: 400 })
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
const pollResultSnapshotMessage = {
|
|
599
|
+
name: message.pollResult.name,
|
|
600
|
+
pollVotes: message.pollResult.values.map(([optionName, optionVoteCount]) => ({
|
|
601
|
+
optionName,
|
|
602
|
+
optionVoteCount
|
|
603
|
+
}))
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
pollResultSnapshotMessage.contextInfo = {
|
|
607
|
+
...(message.contextInfo || {}),
|
|
608
|
+
...(message.mentions ? { mentionedJid: message.mentions } : {})
|
|
609
|
+
}
|
|
610
|
+
|
|
611
|
+
m.pollResultSnapshotMessage = pollResultSnapshotMessage
|
|
612
|
+
}
|
|
613
|
+
|
|
417
614
|
else if ('poll' in message) {
|
|
418
|
-
(_a = message.poll).selectableCount || (_a.selectableCount = 0);
|
|
419
|
-
(_b = message.poll).toAnnouncementGroup || (_b.toAnnouncementGroup = false);
|
|
420
615
|
if (!Array.isArray(message.poll.values)) {
|
|
421
|
-
throw new Boom('Invalid poll values', { statusCode: 400 })
|
|
616
|
+
throw new boom_1.Boom('Invalid poll values', { statusCode: 400 })
|
|
422
617
|
}
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
})
|
|
618
|
+
|
|
619
|
+
if (message.poll.selectableCount < 0
|
|
620
|
+
|| message.poll.selectableCount > message.poll.values.length) {
|
|
621
|
+
throw new boom_1.Boom(`poll.selectableCount in poll should be >= 0 and <= ${message.poll.values.length}`, { statusCode: 400 })
|
|
427
622
|
}
|
|
428
|
-
|
|
429
|
-
// encKey
|
|
430
|
-
messageSecret: message.poll.messageSecret || randomBytes(32)
|
|
431
|
-
};
|
|
623
|
+
|
|
432
624
|
const pollCreationMessage = {
|
|
433
625
|
name: message.poll.name,
|
|
434
|
-
selectableOptionsCount: message.poll
|
|
435
|
-
options: message.poll.values.map(optionName => ({ optionName }))
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
626
|
+
selectableOptionsCount: message.poll?.selectableCount || 0,
|
|
627
|
+
options: message.poll.values.map(optionName => ({ optionName })),
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
pollCreationMessage.contextInfo = {
|
|
631
|
+
...(message.contextInfo || {}),
|
|
632
|
+
...(message.mentions ? { mentionedJid: message.mentions } : {})
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
if(message.poll?.toAnnouncementGroup) {
|
|
636
|
+
m.pollCreationMessageV2 = pollCreationMessage
|
|
637
|
+
} else {
|
|
638
|
+
if(message.poll.selectableCount > 0) {
|
|
639
|
+
m.pollCreationMessageV3 = pollCreationMessage
|
|
640
|
+
} else {
|
|
641
|
+
m.pollCreationMessage = pollCreationMessage
|
|
642
|
+
}
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
|
|
646
|
+
else if ('payment' in message) {
|
|
647
|
+
const requestPaymentMessage = {
|
|
648
|
+
amount: {
|
|
649
|
+
currencyCode: message.payment?.currency || 'IDR',
|
|
650
|
+
offset: message.payment?.offset || 0,
|
|
651
|
+
value: message.payment?.amount || 999999999
|
|
652
|
+
},
|
|
653
|
+
expiryTimestamp: message.payment?.expiry || 0,
|
|
654
|
+
amount1000: message.payment?.amount || 999999999 * 1000,
|
|
655
|
+
currencyCodeIso4217: message.payment?.currency || 'IDR',
|
|
656
|
+
requestFrom: message.payment?.from || '0@s.whatsapp.net',
|
|
657
|
+
noteMessage: {
|
|
658
|
+
extendedTextMessage: {
|
|
659
|
+
text: message.payment?.note || 'Notes'
|
|
660
|
+
}
|
|
661
|
+
},
|
|
662
|
+
background: {
|
|
663
|
+
placeholderArgb: message.payment?.image?.placeholderArgb || 4278190080,
|
|
664
|
+
textArgb: message.payment?.image?.textArgb || 4294967295,
|
|
665
|
+
subtextArgb: message.payment?.image?.subtextArgb || 4294967295,
|
|
666
|
+
type: 1
|
|
667
|
+
}
|
|
668
|
+
}
|
|
669
|
+
|
|
670
|
+
requestPaymentMessage.noteMessage.extendedTextMessage.contextInfo = {
|
|
671
|
+
...(message.contextInfo || {}),
|
|
672
|
+
...(message.mentions ? { mentionedJid: message.mentions } : {})
|
|
440
673
|
}
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
674
|
+
|
|
675
|
+
m.requestPaymentMessage = requestPaymentMessage
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
else if ('stickerPack' in message) {
|
|
679
|
+
const { stickers, cover, name, publisher, packId, description } = message.stickerPack
|
|
680
|
+
|
|
681
|
+
const coverBuffer = await messages_media_1.toBuffer((await messages_media_1.getStream(cover)).stream)
|
|
682
|
+
const imageDataHash = crypto_2.sha256(coverBuffer).toString('base64')
|
|
683
|
+
|
|
684
|
+
const [coverUploadResult, ...stickerUploadResults] = await Promise.all([
|
|
685
|
+
prepareWAMessageMedia({ image: coverBuffer }, { ...options, mediaTypeOverride: 'image' }),
|
|
686
|
+
...stickers.map(s => prepareWAMessageMedia({ sticker: s.data }, { ...options, mediaTypeOverride: 'sticker' }))
|
|
687
|
+
])
|
|
688
|
+
|
|
689
|
+
const stickerPackId = packId || generics_1.generateMessageID()
|
|
690
|
+
const coverImage = coverUploadResult.imageMessage
|
|
691
|
+
|
|
692
|
+
const stickerPackSize = stickerUploadResults.reduce((acc, s) => acc + (s.stickerMessage?.fileLength ? +s.stickerMessage.fileLength : 0), 0)
|
|
693
|
+
|
|
694
|
+
m.stickerPackMessage = {
|
|
695
|
+
name,
|
|
696
|
+
publisher,
|
|
697
|
+
stickerPackId,
|
|
698
|
+
packDescription: description,
|
|
699
|
+
stickerPackOrigin: WAProto_1.proto.Message.StickerPackMessage.StickerPackOrigin.THIRD_PARTY,
|
|
700
|
+
stickerPackSize,
|
|
701
|
+
stickers: stickerUploadResults.map((uploadResult, i) => {
|
|
702
|
+
const stickerMsg = uploadResult.stickerMessage
|
|
703
|
+
const fileSha256B64 = Buffer.from(stickerMsg.fileSha256).toString('base64')
|
|
704
|
+
|
|
705
|
+
return {
|
|
706
|
+
fileName: `${fileSha256B64}.webp`,
|
|
707
|
+
mimetype: stickerMsg.mimetype,
|
|
708
|
+
isAnimated: stickerMsg.isAnimated,
|
|
709
|
+
emojis: stickers[i].emojis || [],
|
|
710
|
+
accessibilityLabel: stickers[i].accessibilityLabel
|
|
711
|
+
}
|
|
712
|
+
}),
|
|
713
|
+
fileSha256: coverImage.fileSha256,
|
|
714
|
+
fileEncSha256: coverImage.fileEncSha256,
|
|
715
|
+
mediaKey: coverImage.mediaKey,
|
|
716
|
+
directPath: coverImage.directPath,
|
|
717
|
+
fileLength: coverImage.fileLength,
|
|
718
|
+
mediaKeyTimestamp: coverImage.mediaKeyTimestamp,
|
|
719
|
+
trayIconFileName: `${stickerPackId}.png`,
|
|
720
|
+
imageDataHash,
|
|
721
|
+
thumbnailDirectPath: coverImage.directPath,
|
|
722
|
+
thumbnailFileSha256: coverImage.fileSha256,
|
|
723
|
+
thumbnailFileEncSha256: coverImage.fileEncSha256,
|
|
724
|
+
thumbnailHeight: coverImage.height,
|
|
725
|
+
thumbnailWidth: coverImage.width
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
m.stickerPackMessage.contextInfo = {
|
|
729
|
+
...(message.contextInfo || {}),
|
|
730
|
+
...(message.mentions ? { mentionedJid: message.mentions } : {})
|
|
450
731
|
}
|
|
451
|
-
|
|
452
|
-
|
|
732
|
+
}
|
|
733
|
+
|
|
734
|
+
else if ('sharePhoneNumber' in message) {
|
|
453
735
|
m.protocolMessage = {
|
|
454
|
-
type:
|
|
455
|
-
}
|
|
736
|
+
type: Types_1.WAProto.Message.ProtocolMessage.Type.SHARE_PHONE_NUMBER
|
|
737
|
+
}
|
|
456
738
|
}
|
|
739
|
+
|
|
457
740
|
else if ('requestPhoneNumber' in message) {
|
|
458
|
-
m.requestPhoneNumberMessage = {}
|
|
741
|
+
m.requestPhoneNumberMessage = {}
|
|
459
742
|
}
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
743
|
+
|
|
744
|
+
else {
|
|
745
|
+
const mess = await prepareWAMessageMedia(message, options)
|
|
746
|
+
const [type] = Object.keys(mess)
|
|
747
|
+
|
|
748
|
+
mess[type].contextInfo = {
|
|
749
|
+
...(message.contextInfo || {}),
|
|
750
|
+
...(message.mentions ? { mentionedJid: message.mentions } : {})
|
|
751
|
+
}
|
|
752
|
+
|
|
753
|
+
m = mess
|
|
754
|
+
}
|
|
755
|
+
|
|
756
|
+
if ('sections' in message && !!message.sections) {
|
|
757
|
+
const listMessage = {
|
|
758
|
+
title: message.title,
|
|
759
|
+
buttonText: message.buttonText,
|
|
760
|
+
footerText: message.footer,
|
|
761
|
+
description: message.text,
|
|
762
|
+
sections: message.sections,
|
|
763
|
+
listType: WAProto_1.proto.Message.ListMessage.ListType.SINGLE_SELECT
|
|
764
|
+
}
|
|
765
|
+
|
|
766
|
+
listMessage.contextInfo = {
|
|
767
|
+
...(message.contextInfo || {}),
|
|
768
|
+
...(message.mentions ? { mentionedJid: message.mentions } : {})
|
|
769
|
+
}
|
|
770
|
+
|
|
771
|
+
m = { listMessage }
|
|
772
|
+
}
|
|
773
|
+
|
|
774
|
+
else if ('productList' in message && !!message.productList) {
|
|
775
|
+
const thumbnail = message.thumbnail ? await messages_media_1.generateThumbnail(message.thumbnail, 'image') : null
|
|
776
|
+
|
|
777
|
+
const listMessage = {
|
|
778
|
+
title: message.title,
|
|
779
|
+
buttonText: message.buttonText,
|
|
780
|
+
footerText: message.footer,
|
|
781
|
+
description: message.text,
|
|
782
|
+
productListInfo: {
|
|
783
|
+
productSections: message.productList,
|
|
784
|
+
headerImage: {
|
|
785
|
+
productId: message.productList[0].products[0].productId,
|
|
786
|
+
jpegThumbnail: thumbnail?.thumbnail || null
|
|
787
|
+
},
|
|
788
|
+
businessOwnerJid: message.businessOwnerJid
|
|
789
|
+
},
|
|
790
|
+
listType: WAProto_1.proto.Message.ListMessage.ListType.PRODUCT_LIST
|
|
791
|
+
}
|
|
792
|
+
|
|
793
|
+
listMessage.contextInfo = {
|
|
794
|
+
...(message.contextInfo || {}),
|
|
795
|
+
...(message.mentions ? { mentionedJid: message.mentions } : {})
|
|
796
|
+
}
|
|
797
|
+
|
|
798
|
+
m = { listMessage }
|
|
799
|
+
}
|
|
800
|
+
|
|
801
|
+
else if ('buttons' in message && !!message.buttons) {
|
|
802
|
+
const buttonsMessage = {
|
|
803
|
+
buttons: message.buttons.map(b => ({ ...b, type: WAProto_1.proto.Message.ButtonsMessage.Button.Type.RESPONSE }))
|
|
804
|
+
}
|
|
805
|
+
|
|
806
|
+
if ('text' in message) {
|
|
807
|
+
buttonsMessage.contentText = message.text
|
|
808
|
+
buttonsMessage.headerType = WAProto_1.proto.Message.ButtonsMessage.HeaderType.EMPTY
|
|
809
|
+
}
|
|
810
|
+
|
|
811
|
+
else {
|
|
812
|
+
if ('caption' in message) {
|
|
813
|
+
buttonsMessage.contentText = message.caption
|
|
468
814
|
}
|
|
469
|
-
|
|
815
|
+
|
|
816
|
+
const type = Object.keys(m)[0].replace('Message', '').toUpperCase()
|
|
817
|
+
|
|
818
|
+
buttonsMessage.headerType = WAProto_1.proto.Message.ButtonsMessage.HeaderType[type]
|
|
819
|
+
|
|
820
|
+
Object.assign(buttonsMessage, m)
|
|
821
|
+
}
|
|
822
|
+
|
|
823
|
+
if ('footer' in message && !!message.footer) {
|
|
824
|
+
buttonsMessage.footerText = message.footer
|
|
825
|
+
}
|
|
826
|
+
|
|
827
|
+
if ('title' in message && !!message.title) {
|
|
828
|
+
buttonsMessage.text = message.title
|
|
829
|
+
buttonsMessage.headerType = WAProto_1.proto.Message.ButtonsMessage.HeaderType.TEXT
|
|
830
|
+
}
|
|
831
|
+
|
|
832
|
+
buttonsMessage.contextInfo = {
|
|
833
|
+
...(message.contextInfo || {}),
|
|
834
|
+
...(message.mentions ? { mentionedJid: message.mentions } : {})
|
|
835
|
+
}
|
|
836
|
+
|
|
837
|
+
m = { buttonsMessage }
|
|
470
838
|
}
|
|
471
|
-
|
|
472
|
-
|
|
839
|
+
|
|
840
|
+
else if ('templateButtons' in message && !!message.templateButtons) {
|
|
841
|
+
const hydratedTemplate = {
|
|
842
|
+
hydratedButtons: message.templateButtons
|
|
843
|
+
}
|
|
844
|
+
|
|
845
|
+
if ('text' in message) {
|
|
846
|
+
hydratedTemplate.hydratedContentText = message.text
|
|
847
|
+
}
|
|
848
|
+
|
|
849
|
+
else {
|
|
850
|
+
if ('caption' in message) {
|
|
851
|
+
hydratedTemplate.hydratedContentText = message.caption
|
|
852
|
+
}
|
|
853
|
+
|
|
854
|
+
Object.assign(msg, m)
|
|
855
|
+
}
|
|
856
|
+
|
|
857
|
+
if ('footer' in message && !!message.footer) {
|
|
858
|
+
hydratedTemplate.hydratedFooterText = message.footer
|
|
859
|
+
}
|
|
860
|
+
|
|
861
|
+
hydratedTemplate.contextInfo = {
|
|
862
|
+
...(message.contextInfo || {}),
|
|
863
|
+
...(message.mentions ? { mentionedJid: message.mentions } : {})
|
|
864
|
+
}
|
|
865
|
+
|
|
866
|
+
m = { templateMessage: { hydratedTemplate }}
|
|
473
867
|
}
|
|
474
|
-
|
|
475
|
-
|
|
868
|
+
|
|
869
|
+
else if ('interactiveButtons' in message && !!message.interactiveButtons) {
|
|
870
|
+
const interactiveMessage = {
|
|
871
|
+
nativeFlowMessage: {
|
|
872
|
+
buttons: message.interactiveButtons
|
|
873
|
+
}
|
|
874
|
+
}
|
|
875
|
+
|
|
876
|
+
if ('text' in message) {
|
|
877
|
+
interactiveMessage.body = {
|
|
878
|
+
text: message.text
|
|
879
|
+
},
|
|
880
|
+
interactiveMessage.header = {
|
|
881
|
+
title: message.title,
|
|
882
|
+
subtitle: message.subtitle,
|
|
883
|
+
hasMediaAttachment: false
|
|
884
|
+
}
|
|
885
|
+
}
|
|
886
|
+
|
|
887
|
+
else {
|
|
888
|
+
if ('caption' in message) {
|
|
889
|
+
interactiveMessage.body = {
|
|
890
|
+
text: message.caption
|
|
891
|
+
}
|
|
892
|
+
|
|
893
|
+
interactiveMessage.header = {
|
|
894
|
+
title: message.title,
|
|
895
|
+
subtitle: message.subtitle,
|
|
896
|
+
hasMediaAttachment: message.hasMediaAttachment ? message.hasMediaAttachment : false,
|
|
897
|
+
...Object.assign(interactiveMessage, m)
|
|
898
|
+
}
|
|
899
|
+
}
|
|
900
|
+
}
|
|
901
|
+
|
|
902
|
+
if ('footer' in message && !!message.footer) {
|
|
903
|
+
interactiveMessage.footer = {
|
|
904
|
+
text: message.footer
|
|
905
|
+
}
|
|
906
|
+
}
|
|
907
|
+
|
|
908
|
+
interactiveMessage.contextInfo = {
|
|
909
|
+
...(message.contextInfo || {}),
|
|
910
|
+
...(message.mentions ? { mentionedJid: message.mentions } : {})
|
|
911
|
+
}
|
|
912
|
+
|
|
913
|
+
m = { interactiveMessage }
|
|
914
|
+
}
|
|
915
|
+
|
|
916
|
+
else if ('shop' in message && !!message.shop) {
|
|
917
|
+
const interactiveMessage = {
|
|
918
|
+
shopStorefrontMessage: {
|
|
919
|
+
surface: message.shop.surface,
|
|
920
|
+
id: message.shop.id
|
|
921
|
+
}
|
|
922
|
+
}
|
|
923
|
+
|
|
924
|
+
if ('text' in message) {
|
|
925
|
+
interactiveMessage.body = {
|
|
926
|
+
text: message.text
|
|
927
|
+
},
|
|
928
|
+
interactiveMessage.header = {
|
|
929
|
+
title: message.title,
|
|
930
|
+
subtitle: message.subtitle,
|
|
931
|
+
hasMediaAttachment: false
|
|
932
|
+
}
|
|
933
|
+
}
|
|
934
|
+
|
|
935
|
+
else {
|
|
936
|
+
if ('caption' in message) {
|
|
937
|
+
interactiveMessage.body = {
|
|
938
|
+
text: message.caption
|
|
939
|
+
}
|
|
940
|
+
|
|
941
|
+
interactiveMessage.header = {
|
|
942
|
+
title: message.title,
|
|
943
|
+
subtitle: message.subtitle,
|
|
944
|
+
hasMediaAttachment: message.hasMediaAttachment ? message.hasMediaAttachment : false,
|
|
945
|
+
...Object.assign(interactiveMessage, m)
|
|
946
|
+
}
|
|
947
|
+
}
|
|
948
|
+
}
|
|
949
|
+
|
|
950
|
+
if ('footer' in message && !!message.footer) {
|
|
951
|
+
interactiveMessage.footer = {
|
|
952
|
+
text: message.footer
|
|
953
|
+
}
|
|
954
|
+
}
|
|
955
|
+
|
|
956
|
+
interactiveMessage.contextInfo = {
|
|
957
|
+
...(message.contextInfo || {}),
|
|
958
|
+
...(message.mentions ? { mentionedJid: message.mentions } : {})
|
|
959
|
+
}
|
|
960
|
+
|
|
961
|
+
m = { interactiveMessage }
|
|
962
|
+
}
|
|
963
|
+
|
|
964
|
+
else if ('collection' in message && !!message.collection) {
|
|
965
|
+
const interactiveMessage = {
|
|
966
|
+
collectionMessage: {
|
|
967
|
+
bizJid: message.collection.bizJid,
|
|
968
|
+
id: message.collection.id,
|
|
969
|
+
messageVersion: message?.collection?.version
|
|
970
|
+
}
|
|
971
|
+
}
|
|
972
|
+
|
|
973
|
+
if ('text' in message) {
|
|
974
|
+
interactiveMessage.body = {
|
|
975
|
+
text: message.text
|
|
976
|
+
},
|
|
977
|
+
interactiveMessage.header = {
|
|
978
|
+
title: message.title,
|
|
979
|
+
subtitle: message.subtitle,
|
|
980
|
+
hasMediaAttachment: false
|
|
981
|
+
}
|
|
982
|
+
}
|
|
983
|
+
|
|
984
|
+
else {
|
|
985
|
+
if ('caption' in message) {
|
|
986
|
+
interactiveMessage.body = {
|
|
987
|
+
text: message.caption
|
|
988
|
+
}
|
|
989
|
+
interactiveMessage.header = {
|
|
990
|
+
title: message.title,
|
|
991
|
+
subtitle: message.subtitle,
|
|
992
|
+
hasMediaAttachment: message.hasMediaAttachment ? message.hasMediaAttachment : false,
|
|
993
|
+
...Object.assign(interactiveMessage, m)
|
|
994
|
+
}
|
|
995
|
+
}
|
|
996
|
+
}
|
|
997
|
+
|
|
998
|
+
if ('footer' in message && !message.footer) {
|
|
999
|
+
interactiveMessage.footer = {
|
|
1000
|
+
text: message.footer
|
|
1001
|
+
}
|
|
1002
|
+
}
|
|
1003
|
+
|
|
1004
|
+
interactiveMessage.contextInfo = {
|
|
1005
|
+
...(message.contextInfo || {}),
|
|
1006
|
+
...(message.mentions ? { mentionedJid: message.mentions } : {})
|
|
1007
|
+
}
|
|
1008
|
+
|
|
1009
|
+
m = { interactiveMessage }
|
|
476
1010
|
}
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
const
|
|
480
|
-
|
|
481
|
-
|
|
1011
|
+
|
|
1012
|
+
else if ('cards' in message && !!message.cards) {
|
|
1013
|
+
const slides = await Promise.all(message.cards.map(async (slide) => {
|
|
1014
|
+
const { image, video, product, title, body, footer, buttons } = slide
|
|
1015
|
+
let header
|
|
1016
|
+
|
|
1017
|
+
if (product) {
|
|
1018
|
+
const { imageMessage } = await prepareWAMessageMedia({ image: product.productImage, ...options }, options)
|
|
1019
|
+
header = {
|
|
1020
|
+
productMessage: {
|
|
1021
|
+
product: {
|
|
1022
|
+
...product,
|
|
1023
|
+
productImage: imageMessage,
|
|
1024
|
+
},
|
|
1025
|
+
...slide
|
|
1026
|
+
}
|
|
1027
|
+
}
|
|
1028
|
+
}
|
|
1029
|
+
|
|
1030
|
+
else if (image) {
|
|
1031
|
+
header = await prepareWAMessageMedia({ image: image, ...options }, options)
|
|
1032
|
+
}
|
|
1033
|
+
|
|
1034
|
+
else if (video) {
|
|
1035
|
+
header = await prepareWAMessageMedia({ video: video, ...options }, options)
|
|
1036
|
+
}
|
|
1037
|
+
|
|
1038
|
+
const msg = {
|
|
1039
|
+
header: {
|
|
1040
|
+
title,
|
|
1041
|
+
hasMediaAttachment: true,
|
|
1042
|
+
...header
|
|
1043
|
+
},
|
|
1044
|
+
body: {
|
|
1045
|
+
text: body
|
|
1046
|
+
},
|
|
1047
|
+
footer: {
|
|
1048
|
+
text: footer
|
|
1049
|
+
},
|
|
1050
|
+
nativeFlowMessage: {
|
|
1051
|
+
buttons,
|
|
1052
|
+
}
|
|
1053
|
+
}
|
|
1054
|
+
|
|
1055
|
+
return msg
|
|
1056
|
+
}))
|
|
1057
|
+
|
|
1058
|
+
const interactiveMessage = {
|
|
1059
|
+
carouselMessage: {
|
|
1060
|
+
cards: slides
|
|
1061
|
+
}
|
|
1062
|
+
}
|
|
1063
|
+
|
|
1064
|
+
if ('text' in message) {
|
|
1065
|
+
interactiveMessage.body = {
|
|
1066
|
+
text: message.text
|
|
1067
|
+
},
|
|
1068
|
+
interactiveMessage.header = {
|
|
1069
|
+
title: message.title,
|
|
1070
|
+
subtitle: message.subtitle,
|
|
1071
|
+
hasMediaAttachment: false
|
|
1072
|
+
}
|
|
1073
|
+
}
|
|
1074
|
+
|
|
1075
|
+
if ('footer' in message && !!message.footer) {
|
|
1076
|
+
interactiveMessage.footer = {
|
|
1077
|
+
text: message.footer
|
|
1078
|
+
}
|
|
482
1079
|
}
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
}
|
|
1080
|
+
|
|
1081
|
+
interactiveMessage.contextInfo = {
|
|
1082
|
+
...(message.contextInfo || {}),
|
|
1083
|
+
...(message.mentions ? { mentionedJid: message.mentions } : {})
|
|
487
1084
|
}
|
|
1085
|
+
|
|
1086
|
+
m = { interactiveMessage }
|
|
488
1087
|
}
|
|
1088
|
+
|
|
1089
|
+
if ('ephemeral' in message && !!message.ephemeral) {
|
|
1090
|
+
m = { ephemeralMessage: { message: m } }
|
|
1091
|
+
}
|
|
1092
|
+
|
|
1093
|
+
if ('viewOnce' in message && !!message.viewOnce) {
|
|
1094
|
+
m = { viewOnceMessageV2: { message: m } }
|
|
1095
|
+
}
|
|
1096
|
+
|
|
1097
|
+
if ('viewOnceExt' in message && !!message.viewOnceExt) {
|
|
1098
|
+
m = { viewOnceMessageV2Extension: { message: m } }
|
|
1099
|
+
}
|
|
1100
|
+
|
|
489
1101
|
if ('edit' in message) {
|
|
490
1102
|
m = {
|
|
491
1103
|
protocolMessage: {
|
|
492
1104
|
key: message.edit,
|
|
493
1105
|
editedMessage: m,
|
|
494
1106
|
timestampMs: Date.now(),
|
|
495
|
-
type: WAProto.Message.ProtocolMessage.Type.MESSAGE_EDIT
|
|
1107
|
+
type: Types_1.WAProto.Message.ProtocolMessage.Type.MESSAGE_EDIT
|
|
496
1108
|
}
|
|
497
|
-
};
|
|
498
|
-
}
|
|
499
|
-
if ('contextInfo' in message && !!message.contextInfo) {
|
|
500
|
-
const messageType = Object.keys(m)[0];
|
|
501
|
-
const key = m[messageType];
|
|
502
|
-
if ('contextInfo' in key && !!key.contextInfo) {
|
|
503
|
-
key.contextInfo = { ...key.contextInfo, ...message.contextInfo };
|
|
504
|
-
}
|
|
505
|
-
else if (key) {
|
|
506
|
-
key.contextInfo = message.contextInfo;
|
|
507
1109
|
}
|
|
508
1110
|
}
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
1111
|
+
|
|
1112
|
+
return Types_1.WAProto.Message.fromObject(m)
|
|
1113
|
+
}
|
|
1114
|
+
|
|
1115
|
+
const generateWAMessageFromContent = (jid, message, options) => {
|
|
514
1116
|
if (!options.timestamp) {
|
|
515
|
-
options.timestamp = new Date()
|
|
1117
|
+
options.timestamp = new Date()
|
|
516
1118
|
}
|
|
517
|
-
|
|
518
|
-
const
|
|
519
|
-
const
|
|
520
|
-
const
|
|
521
|
-
|
|
1119
|
+
|
|
1120
|
+
const innerMessage = normalizeMessageContent(message)
|
|
1121
|
+
const key = getContentType(innerMessage)
|
|
1122
|
+
const timestamp = generics_1.unixTimestampSeconds(options.timestamp)
|
|
1123
|
+
const { quoted, userJid } = options
|
|
1124
|
+
|
|
1125
|
+
if (quoted && !WABinary_1.isJidNewsletter(jid)) {
|
|
522
1126
|
const participant = quoted.key.fromMe
|
|
523
|
-
? userJid
|
|
524
|
-
: quoted.participant || quoted.key.participant || quoted.key.remoteJid
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
1127
|
+
? userJid
|
|
1128
|
+
: quoted.participant || quoted.key.participant || quoted.key.remoteJid
|
|
1129
|
+
|
|
1130
|
+
let quotedMsg = normalizeMessageContent(quoted.message)
|
|
1131
|
+
const msgType = getContentType(quotedMsg)
|
|
1132
|
+
|
|
1133
|
+
quotedMsg = WAProto_1.proto.Message.fromObject({ [msgType]: quotedMsg[msgType] })
|
|
1134
|
+
|
|
1135
|
+
const quotedContent = quotedMsg[msgType]
|
|
1136
|
+
|
|
530
1137
|
if (typeof quotedContent === 'object' && quotedContent && 'contextInfo' in quotedContent) {
|
|
531
|
-
delete quotedContent.contextInfo
|
|
532
|
-
}
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
1138
|
+
delete quotedContent.contextInfo
|
|
1139
|
+
}
|
|
1140
|
+
|
|
1141
|
+
let requestPayment
|
|
1142
|
+
|
|
1143
|
+
if (key === 'requestPaymentMessage') {
|
|
1144
|
+
if (innerMessage?.requestPaymentMessage && innerMessage?.requestPaymentMessage?.noteMessage?.extendedTextMessage) {
|
|
1145
|
+
requestPayment = innerMessage?.requestPaymentMessage?.noteMessage?.extendedTextMessage
|
|
1146
|
+
} else if (innerMessage?.requestPaymentMessage && innerMessage?.requestPaymentMessage?.noteMessage?.stickerMessage) {
|
|
1147
|
+
requestPayment = innerMessage.requestPaymentMessage?.noteMessage?.stickerMessage
|
|
1148
|
+
}
|
|
1149
|
+
}
|
|
1150
|
+
|
|
1151
|
+
const contextInfo = (key === 'requestPaymentMessage' ? requestPayment?.contextInfo : innerMessage[key].contextInfo) || {}
|
|
1152
|
+
|
|
1153
|
+
contextInfo.participant = WABinary_1.jidNormalizedUser(participant)
|
|
1154
|
+
contextInfo.stanzaId = quoted.key.id
|
|
1155
|
+
contextInfo.quotedMessage = quotedMsg
|
|
1156
|
+
|
|
539
1157
|
if (jid !== quoted.key.remoteJid) {
|
|
540
|
-
contextInfo.remoteJid = quoted.key.remoteJid
|
|
1158
|
+
contextInfo.remoteJid = quoted.key.remoteJid
|
|
541
1159
|
}
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
1160
|
+
|
|
1161
|
+
if (key === 'requestPaymentMessage' && requestPayment) {
|
|
1162
|
+
requestPayment.contextInfo = contextInfo
|
|
1163
|
+
} else {
|
|
1164
|
+
innerMessage[key].contextInfo = contextInfo
|
|
545
1165
|
}
|
|
546
1166
|
}
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
!!options?.ephemeralExpiration &&
|
|
550
|
-
// and it's not a protocol message -- delete, toggle disappear message
|
|
551
|
-
key !== 'protocolMessage' &&
|
|
552
|
-
// already not converted to disappearing message
|
|
1167
|
+
|
|
1168
|
+
if (key !== 'protocolMessage' &&
|
|
553
1169
|
key !== 'ephemeralMessage' &&
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
1170
|
+
!WABinary_1.isJidNewsletter(jid)) {
|
|
1171
|
+
message.messageContextInfo = {
|
|
1172
|
+
messageSecret: crypto_1.randomBytes(32),
|
|
1173
|
+
...message.messageContextInfo
|
|
1174
|
+
}
|
|
557
1175
|
innerMessage[key].contextInfo = {
|
|
558
1176
|
...(innerMessage[key].contextInfo || {}),
|
|
559
|
-
expiration: options.ephemeralExpiration
|
|
560
|
-
|
|
561
|
-
};
|
|
1177
|
+
expiration: options.ephemeralExpiration ? options.ephemeralExpiration : 0
|
|
1178
|
+
}
|
|
562
1179
|
}
|
|
563
|
-
|
|
1180
|
+
|
|
1181
|
+
message = Types_1.WAProto.Message.fromObject(message)
|
|
1182
|
+
|
|
564
1183
|
const messageJSON = {
|
|
565
1184
|
key: {
|
|
566
1185
|
remoteJid: jid,
|
|
567
1186
|
fromMe: true,
|
|
568
|
-
id: options?.messageId ||
|
|
1187
|
+
id: options?.messageId || generics_1.generateMessageID()
|
|
569
1188
|
},
|
|
570
1189
|
message: message,
|
|
571
1190
|
messageTimestamp: timestamp,
|
|
572
1191
|
messageStubParameters: [],
|
|
573
|
-
participant: isJidGroup(jid) || isJidStatusBroadcast(jid) ? userJid : undefined,
|
|
574
|
-
status: WAMessageStatus.PENDING
|
|
575
|
-
}
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
}
|
|
584
|
-
|
|
585
|
-
|
|
1192
|
+
participant: WABinary_1.isJidGroup(jid) || WABinary_1.isJidStatusBroadcast(jid) ? userJid : undefined,
|
|
1193
|
+
status: Types_1.WAMessageStatus.PENDING
|
|
1194
|
+
}
|
|
1195
|
+
|
|
1196
|
+
return Types_1.WAProto.WebMessageInfo.fromObject(messageJSON)
|
|
1197
|
+
}
|
|
1198
|
+
|
|
1199
|
+
const generateWAMessage = async (jid, content, options) => {
|
|
1200
|
+
options.logger = options?.logger?.child({ msgId: options.messageId })
|
|
1201
|
+
|
|
1202
|
+
return generateWAMessageFromContent(jid, await generateWAMessageContent(content, { newsletter: WABinary_1.isJidNewsletter(jid), ...options }), options)
|
|
1203
|
+
}
|
|
1204
|
+
|
|
1205
|
+
const getContentType = (content) => {
|
|
586
1206
|
if (content) {
|
|
587
|
-
const keys = Object.keys(content)
|
|
588
|
-
const key = keys.find(k => (k === 'conversation' || k.
|
|
589
|
-
|
|
1207
|
+
const keys = Object.keys(content)
|
|
1208
|
+
const key = keys.find(k => (k === 'conversation' || k.endsWith('Message') || k.endsWith('V2') || k.endsWith('V3') || k.endsWith('V4') || k.endsWith('V5')) && k !== 'senderKeyDistributionMessage' && k !== 'messageContextInfo')
|
|
1209
|
+
|
|
1210
|
+
return key
|
|
590
1211
|
}
|
|
591
|
-
}
|
|
1212
|
+
}
|
|
1213
|
+
|
|
592
1214
|
/**
|
|
593
1215
|
* Normalizes ephemeral, view once messages to regular message content
|
|
594
1216
|
* Eg. image messages in ephemeral messages, in view once messages etc.
|
|
595
1217
|
* @param content
|
|
596
1218
|
* @returns
|
|
597
1219
|
*/
|
|
598
|
-
|
|
1220
|
+
const normalizeMessageContent = (content) => {
|
|
599
1221
|
if (!content) {
|
|
600
|
-
return undefined
|
|
1222
|
+
return undefined
|
|
601
1223
|
}
|
|
602
|
-
|
|
1224
|
+
|
|
603
1225
|
for (let i = 0; i < 5; i++) {
|
|
604
|
-
const inner = getFutureProofMessage(content)
|
|
1226
|
+
const inner = getFutureProofMessage(content)
|
|
605
1227
|
if (!inner) {
|
|
606
|
-
break
|
|
1228
|
+
break
|
|
607
1229
|
}
|
|
608
|
-
|
|
1230
|
+
|
|
1231
|
+
content = inner.message
|
|
609
1232
|
}
|
|
610
|
-
|
|
1233
|
+
|
|
1234
|
+
return content
|
|
1235
|
+
|
|
611
1236
|
function getFutureProofMessage(message) {
|
|
612
|
-
return (
|
|
613
|
-
|
|
614
|
-
message
|
|
615
|
-
message
|
|
616
|
-
message
|
|
617
|
-
message
|
|
618
|
-
|
|
619
|
-
|
|
1237
|
+
return (
|
|
1238
|
+
(message === null || message === void 0 ? void 0 : message.editedMessage)
|
|
1239
|
+
|| (message === null || message === void 0 ? void 0 : message.statusAddYours)
|
|
1240
|
+
|| (message === null || message === void 0 ? void 0 : message.botTaskMessage)
|
|
1241
|
+
|| (message === null || message === void 0 ? void 0 : message.eventCoverImage)
|
|
1242
|
+
|| (message === null || message === void 0 ? void 0 : message.questionMessage)
|
|
1243
|
+
|| (message === null || message === void 0 ? void 0 : message.viewOnceMessage)
|
|
1244
|
+
|| (message === null || message === void 0 ? void 0 : message.botInvokeMessage)
|
|
1245
|
+
|| (message === null || message === void 0 ? void 0 : message.ephemeralMessage)
|
|
1246
|
+
|| (message === null || message === void 0 ? void 0 : message.lottieStickerMessage)
|
|
1247
|
+
|| (message === null || message === void 0 ? void 0 : message.groupStatusMessage)
|
|
1248
|
+
|| (message === null || message === void 0 ? void 0 : message.limitSharingMessage)
|
|
1249
|
+
|| (message === null || message === void 0 ? void 0 : message.viewOnceMessageV2)
|
|
1250
|
+
|| (message === null || message === void 0 ? void 0 : message.botForwardedMessage)
|
|
1251
|
+
|| (message === null || message === void 0 ? void 0 : message.statusMentionMessage)
|
|
1252
|
+
|| (message === null || message === void 0 ? void 0 : message.groupStatusMessageV2)
|
|
1253
|
+
|| (message === null || message === void 0 ? void 0 : message.pollCreationMessageV4)
|
|
1254
|
+
|| (message === null || message === void 0 ? void 0 : message.pollCreationMessageV5)
|
|
1255
|
+
|| (message === null || message === void 0 ? void 0 : message.associatedChildMessage)
|
|
1256
|
+
|| (message === null || message === void 0 ? void 0 : message.groupMentionedMessage)
|
|
1257
|
+
|| (message === null || message === void 0 ? void 0 : message.groupStatusMentionMessage)
|
|
1258
|
+
|| (message === null || message === void 0 ? void 0 : message.viewOnceMessageV2Extension)
|
|
1259
|
+
|| (message === null || message === void 0 ? void 0 : message.documentWithCaptionMessage)
|
|
1260
|
+
|| (message === null || message === void 0 ? void 0 : message.pollCreationOptionImageMessage))
|
|
1261
|
+
}
|
|
1262
|
+
}
|
|
1263
|
+
|
|
620
1264
|
/**
|
|
621
1265
|
* Extract the true message content from a message
|
|
622
1266
|
* Eg. extracts the inner message from a disappearing message/view once message
|
|
623
1267
|
*/
|
|
624
|
-
|
|
625
|
-
const
|
|
626
|
-
|
|
627
|
-
|
|
1268
|
+
const extractMessageContent = (content) => {
|
|
1269
|
+
const extractFromButtonsMessage = (msg) => {
|
|
1270
|
+
const header = typeof msg.header === 'object' && msg.header !== null
|
|
1271
|
+
|
|
1272
|
+
if (header ? msg.header?.imageMessage : msg.imageMessage) {
|
|
1273
|
+
return { imageMessage: header ? msg.header.imageMessage : msg.imageMessage }
|
|
628
1274
|
}
|
|
629
|
-
|
|
630
|
-
|
|
1275
|
+
|
|
1276
|
+
else if (header ? msg.header?.documentMessage : msg.documentMessage) {
|
|
1277
|
+
return { documentMessage: header ? msg.header.documentMessage : msg.documentMessage }
|
|
631
1278
|
}
|
|
632
|
-
|
|
633
|
-
|
|
1279
|
+
|
|
1280
|
+
else if (header ? msg.header?.videoMessage : msg.videoMessage) {
|
|
1281
|
+
return { videoMessage: header ? msg.header.videoMessage: msg.videoMessage }
|
|
634
1282
|
}
|
|
635
|
-
|
|
636
|
-
|
|
1283
|
+
|
|
1284
|
+
else if (header ? msg.header?.locationMessage : msg.locationMessage) {
|
|
1285
|
+
return { locationMessage: header ? msg.header.locationMessage : msg.locationMessage }
|
|
637
1286
|
}
|
|
1287
|
+
|
|
1288
|
+
else if (header ? msg.header?.productMessage : msg.productMessage) {
|
|
1289
|
+
return { productMessage: header ? msg.header.productMessage : msg.productMessage }
|
|
1290
|
+
}
|
|
1291
|
+
|
|
638
1292
|
else {
|
|
639
1293
|
return {
|
|
640
|
-
conversation: 'contentText' in msg
|
|
641
|
-
|
|
1294
|
+
conversation: 'contentText' in msg
|
|
1295
|
+
? msg.contentText
|
|
1296
|
+
: ('hydratedContentText' in msg ? msg.hydratedContentText : 'body' in msg ? msg.body.text : '')
|
|
1297
|
+
}
|
|
642
1298
|
}
|
|
643
|
-
}
|
|
644
|
-
|
|
1299
|
+
}
|
|
1300
|
+
|
|
1301
|
+
content = normalizeMessageContent(content)
|
|
1302
|
+
|
|
645
1303
|
if (content?.buttonsMessage) {
|
|
646
|
-
return
|
|
1304
|
+
return extractFromButtonsMessage(content.buttonsMessage)
|
|
1305
|
+
}
|
|
1306
|
+
|
|
1307
|
+
if (content?.interactiveMessage) {
|
|
1308
|
+
return extractFromButtonsMessage(content.interactiveMessage)
|
|
647
1309
|
}
|
|
1310
|
+
|
|
1311
|
+
if (content?.templateMessage?.interactiveMessageTemplate) {
|
|
1312
|
+
return extractFromButtonsMessage(content?.templateMessage?.interactiveMessageTemplate)
|
|
1313
|
+
}
|
|
1314
|
+
|
|
648
1315
|
if (content?.templateMessage?.hydratedFourRowTemplate) {
|
|
649
|
-
return
|
|
1316
|
+
return extractFromButtonsMessage(content?.templateMessage?.hydratedFourRowTemplate)
|
|
650
1317
|
}
|
|
1318
|
+
|
|
651
1319
|
if (content?.templateMessage?.hydratedTemplate) {
|
|
652
|
-
return
|
|
1320
|
+
return extractFromButtonsMessage(content?.templateMessage?.hydratedTemplate)
|
|
653
1321
|
}
|
|
1322
|
+
|
|
654
1323
|
if (content?.templateMessage?.fourRowTemplate) {
|
|
655
|
-
return
|
|
1324
|
+
return extractFromButtonsMessage(content?.templateMessage?.fourRowTemplate)
|
|
656
1325
|
}
|
|
657
|
-
|
|
658
|
-
|
|
1326
|
+
|
|
1327
|
+
return content
|
|
1328
|
+
}
|
|
1329
|
+
|
|
659
1330
|
/**
|
|
660
1331
|
* Returns the device predicted by message ID
|
|
661
1332
|
*/
|
|
662
|
-
|
|
663
|
-
? '
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
: /^(3F|.{18}$)/.test(id)
|
|
669
|
-
? 'desktop'
|
|
670
|
-
: 'unknown';
|
|
1333
|
+
const getDevice = (id) => /^3A.{18}$/.test(id) ? 'ios' :
|
|
1334
|
+
/^3E.{20}$/.test(id) ? 'web' :
|
|
1335
|
+
/^(.{21}|.{32})$/.test(id) ? 'android' :
|
|
1336
|
+
/^(3F|.{18}$)/.test(id) ? 'desktop' :
|
|
1337
|
+
'baileys'
|
|
1338
|
+
|
|
671
1339
|
/** Upserts a receipt in the message */
|
|
672
|
-
|
|
673
|
-
msg.userReceipt = msg.userReceipt || []
|
|
674
|
-
const recp = msg.userReceipt.find(m => m.userJid === receipt.userJid)
|
|
1340
|
+
const updateMessageWithReceipt = (msg, receipt) => {
|
|
1341
|
+
msg.userReceipt = msg.userReceipt || []
|
|
1342
|
+
const recp = msg.userReceipt.find(m => m.userJid === receipt.userJid)
|
|
1343
|
+
|
|
675
1344
|
if (recp) {
|
|
676
|
-
Object.assign(recp, receipt)
|
|
1345
|
+
Object.assign(recp, receipt)
|
|
677
1346
|
}
|
|
1347
|
+
|
|
678
1348
|
else {
|
|
679
|
-
msg.userReceipt.push(receipt)
|
|
1349
|
+
msg.userReceipt.push(receipt)
|
|
680
1350
|
}
|
|
681
|
-
}
|
|
1351
|
+
}
|
|
1352
|
+
|
|
682
1353
|
/** Update the message with a new reaction */
|
|
683
|
-
|
|
684
|
-
const authorID = getKeyAuthor(reaction.key)
|
|
685
|
-
const reactions = (msg.reactions || [])
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
1354
|
+
const updateMessageWithReaction = (msg, reaction) => {
|
|
1355
|
+
const authorID = generics_1.getKeyAuthor(reaction.key)
|
|
1356
|
+
const reactions = (msg.reactions || [])
|
|
1357
|
+
.filter(r => generics_1.getKeyAuthor(r.key) !== authorID)
|
|
1358
|
+
|
|
1359
|
+
reaction.text = reaction.text || ''
|
|
1360
|
+
reactions.push(reaction)
|
|
1361
|
+
msg.reactions = reactions
|
|
1362
|
+
}
|
|
1363
|
+
|
|
690
1364
|
/** Update the message with a new poll update */
|
|
691
|
-
|
|
692
|
-
const authorID = getKeyAuthor(update.pollUpdateMessageKey)
|
|
693
|
-
const
|
|
1365
|
+
const updateMessageWithPollUpdate = (msg, update) => {
|
|
1366
|
+
const authorID = generics_1.getKeyAuthor(update.pollUpdateMessageKey)
|
|
1367
|
+
const votes = (msg.pollUpdates || [])
|
|
1368
|
+
.filter(r => generics_1.getKeyAuthor(r.pollUpdateMessageKey) !== authorID)
|
|
1369
|
+
|
|
694
1370
|
if (update.vote?.selectedOptions?.length) {
|
|
695
|
-
|
|
1371
|
+
votes.push(update)
|
|
696
1372
|
}
|
|
697
|
-
|
|
698
|
-
|
|
1373
|
+
|
|
1374
|
+
msg.pollUpdates = votes
|
|
1375
|
+
}
|
|
1376
|
+
|
|
699
1377
|
/**
|
|
700
1378
|
* Aggregates all poll updates in a poll.
|
|
701
1379
|
* @param msg the poll creation message
|
|
702
1380
|
* @param meId your jid
|
|
703
1381
|
* @returns A list of options & their voters
|
|
704
1382
|
*/
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
1383
|
+
function getAggregateVotesInPollMessage({ message, pollUpdates }, meId) {
|
|
1384
|
+
message = normalizeMessageContent(message)
|
|
1385
|
+
|
|
1386
|
+
const opts = message?.pollCreationMessage?.options || message?.pollCreationMessageV2?.options || message?.pollCreationMessageV3?.options || []
|
|
1387
|
+
|
|
710
1388
|
const voteHashMap = opts.reduce((acc, opt) => {
|
|
711
|
-
const hash = sha256(Buffer.from(opt.optionName || '')).toString()
|
|
1389
|
+
const hash = crypto_2.sha256(Buffer.from(opt.optionName || '')).toString()
|
|
712
1390
|
acc[hash] = {
|
|
713
1391
|
name: opt.optionName || '',
|
|
714
1392
|
voters: []
|
|
715
|
-
}
|
|
716
|
-
|
|
717
|
-
|
|
1393
|
+
}
|
|
1394
|
+
|
|
1395
|
+
return acc
|
|
1396
|
+
}, {})
|
|
1397
|
+
|
|
718
1398
|
for (const update of pollUpdates || []) {
|
|
719
|
-
const { vote } = update
|
|
1399
|
+
const { vote } = update
|
|
1400
|
+
|
|
720
1401
|
if (!vote) {
|
|
721
|
-
continue
|
|
1402
|
+
continue
|
|
722
1403
|
}
|
|
1404
|
+
|
|
723
1405
|
for (const option of vote.selectedOptions || []) {
|
|
724
|
-
const hash = option.toString()
|
|
725
|
-
let data = voteHashMap[hash]
|
|
1406
|
+
const hash = option.toString()
|
|
1407
|
+
let data = voteHashMap[hash]
|
|
1408
|
+
|
|
726
1409
|
if (!data) {
|
|
727
1410
|
voteHashMap[hash] = {
|
|
728
1411
|
name: 'Unknown',
|
|
729
1412
|
voters: []
|
|
730
|
-
}
|
|
731
|
-
|
|
1413
|
+
}
|
|
1414
|
+
|
|
1415
|
+
data = voteHashMap[hash]
|
|
732
1416
|
}
|
|
733
|
-
|
|
1417
|
+
|
|
1418
|
+
voteHashMap[hash].voters.push(generics_1.getKeyAuthor(update.pollUpdateMessageKey, meId))
|
|
734
1419
|
}
|
|
735
1420
|
}
|
|
736
|
-
|
|
1421
|
+
|
|
1422
|
+
return Object.values(voteHashMap)
|
|
737
1423
|
}
|
|
1424
|
+
|
|
738
1425
|
/** Given a list of message keys, aggregates them by chat & sender. Useful for sending read receipts in bulk */
|
|
739
|
-
|
|
740
|
-
const keyMap = {}
|
|
1426
|
+
const aggregateMessageKeysNotFromMe = (keys) => {
|
|
1427
|
+
const keyMap = {}
|
|
1428
|
+
|
|
741
1429
|
for (const { remoteJid, id, participant, fromMe } of keys) {
|
|
742
1430
|
if (!fromMe) {
|
|
743
|
-
const uqKey = `${remoteJid}:${participant || ''}
|
|
1431
|
+
const uqKey = `${remoteJid}:${participant || ''}`
|
|
1432
|
+
|
|
744
1433
|
if (!keyMap[uqKey]) {
|
|
745
1434
|
keyMap[uqKey] = {
|
|
746
1435
|
jid: remoteJid,
|
|
747
1436
|
participant: participant,
|
|
748
1437
|
messageIds: []
|
|
749
|
-
}
|
|
1438
|
+
}
|
|
750
1439
|
}
|
|
751
|
-
|
|
1440
|
+
|
|
1441
|
+
keyMap[uqKey].messageIds.push(id)
|
|
752
1442
|
}
|
|
753
1443
|
}
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
1444
|
+
|
|
1445
|
+
return Object.values(keyMap)
|
|
1446
|
+
}
|
|
1447
|
+
|
|
1448
|
+
const REUPLOAD_REQUIRED_STATUS = [410, 404]
|
|
1449
|
+
|
|
757
1450
|
/**
|
|
758
1451
|
* Downloads the given message. Throws an error if it's not a media message
|
|
759
1452
|
*/
|
|
760
|
-
|
|
1453
|
+
const downloadMediaMessage = async (message, type, options, ctx) => {
|
|
761
1454
|
const result = await downloadMsg().catch(async (error) => {
|
|
762
|
-
if (ctx &&
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
1455
|
+
if (ctx && axios_1.default.isAxiosError(error) && // check if the message requires a reupload
|
|
1456
|
+
REUPLOAD_REQUIRED_STATUS.includes(error.response?.status)) {
|
|
1457
|
+
ctx.logger.info({ key: message.key }, 'sending reupload media request...')
|
|
1458
|
+
|
|
766
1459
|
// request reupload
|
|
767
|
-
message = await ctx.reuploadRequest(message)
|
|
768
|
-
|
|
769
|
-
|
|
1460
|
+
message = await ctx.reuploadRequest(message)
|
|
1461
|
+
|
|
1462
|
+
const result = await downloadMsg()
|
|
1463
|
+
|
|
1464
|
+
return result
|
|
770
1465
|
}
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
1466
|
+
|
|
1467
|
+
throw error
|
|
1468
|
+
})
|
|
1469
|
+
|
|
1470
|
+
return result
|
|
1471
|
+
|
|
774
1472
|
async function downloadMsg() {
|
|
775
|
-
const mContent = extractMessageContent(message.message)
|
|
1473
|
+
const mContent = extractMessageContent(message.message)
|
|
1474
|
+
|
|
776
1475
|
if (!mContent) {
|
|
777
|
-
throw new Boom('No message present', { statusCode: 400, data: message })
|
|
1476
|
+
throw new boom_1.Boom('No message present', { statusCode: 400, data: message })
|
|
778
1477
|
}
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
1478
|
+
|
|
1479
|
+
const contentType = getContentType(mContent)
|
|
1480
|
+
let mediaType = contentType?.replace('Message', '')
|
|
1481
|
+
const media = contentType === 'productMessage' ? mContent[contentType]?.product?.productImage : mContent[contentType]
|
|
1482
|
+
|
|
782
1483
|
if (!media || typeof media !== 'object' || (!('url' in media) && !('thumbnailDirectPath' in media))) {
|
|
783
|
-
throw new Boom(`"${contentType}" message is not a media message`)
|
|
1484
|
+
throw new boom_1.Boom(`"${contentType}" message is not a media message`)
|
|
784
1485
|
}
|
|
785
|
-
|
|
1486
|
+
|
|
1487
|
+
let download
|
|
1488
|
+
|
|
786
1489
|
if ('thumbnailDirectPath' in media && !('url' in media)) {
|
|
787
1490
|
download = {
|
|
788
1491
|
directPath: media.thumbnailDirectPath,
|
|
789
1492
|
mediaKey: media.mediaKey
|
|
790
|
-
}
|
|
791
|
-
mediaType = 'thumbnail-link'
|
|
1493
|
+
}
|
|
1494
|
+
mediaType = 'thumbnail-link'
|
|
792
1495
|
}
|
|
1496
|
+
|
|
793
1497
|
else {
|
|
794
|
-
download = media
|
|
1498
|
+
download = media
|
|
795
1499
|
}
|
|
796
|
-
|
|
1500
|
+
|
|
1501
|
+
const stream = await messages_media_1.downloadContentFromMessage(download, mediaType, options)
|
|
1502
|
+
|
|
797
1503
|
if (type === 'buffer') {
|
|
798
|
-
const bufferArray = []
|
|
1504
|
+
const bufferArray = []
|
|
1505
|
+
|
|
799
1506
|
for await (const chunk of stream) {
|
|
800
|
-
bufferArray.push(chunk)
|
|
1507
|
+
bufferArray.push(chunk)
|
|
801
1508
|
}
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
1509
|
+
|
|
1510
|
+
return Buffer.concat(bufferArray)
|
|
1511
|
+
}
|
|
1512
|
+
|
|
1513
|
+
return stream
|
|
1514
|
+
}
|
|
1515
|
+
}
|
|
1516
|
+
|
|
1517
|
+
/** Checks whether the given message is a media message if it is returns the inner content */
|
|
1518
|
+
const assertMediaContent = (content) => {
|
|
1519
|
+
content = extractMessageContent(content)
|
|
1520
|
+
|
|
1521
|
+
const mediaContent = content?.documentMessage
|
|
1522
|
+
|| content?.imageMessage
|
|
1523
|
+
|| content?.videoMessage
|
|
1524
|
+
|| content?.audioMessage
|
|
1525
|
+
|| content?.stickerMessage
|
|
1526
|
+
|
|
815
1527
|
if (!mediaContent) {
|
|
816
|
-
throw new Boom('given message is not a media message', { statusCode: 400, data: content })
|
|
1528
|
+
throw new boom_1.Boom('given message is not a media message', { statusCode: 400, data: content })
|
|
817
1529
|
}
|
|
818
|
-
return mediaContent
|
|
819
|
-
}
|
|
820
|
-
|
|
1530
|
+
return mediaContent
|
|
1531
|
+
}
|
|
1532
|
+
|
|
1533
|
+
/**
|
|
1534
|
+
* this is an experimental patch to make buttons work
|
|
1535
|
+
* Don't know how it works, but it does for now
|
|
1536
|
+
*/
|
|
1537
|
+
const patchMessageForMdIfRequired = (message) => {
|
|
1538
|
+
if (message?.buttonsMessage ||
|
|
1539
|
+
message?.templateMessage ||
|
|
1540
|
+
message?.listMessage ||
|
|
1541
|
+
message?.interactiveMessage?.nativeFlowMesaage
|
|
1542
|
+
) {
|
|
1543
|
+
message = {
|
|
1544
|
+
viewOnceMessageV2Extension: {
|
|
1545
|
+
message: {
|
|
1546
|
+
messageContextInfo: {
|
|
1547
|
+
deviceListMetadataVersion: 2,
|
|
1548
|
+
deviceListMetadata: {}
|
|
1549
|
+
},
|
|
1550
|
+
...message
|
|
1551
|
+
}
|
|
1552
|
+
}
|
|
1553
|
+
}
|
|
1554
|
+
}
|
|
1555
|
+
return message
|
|
1556
|
+
}
|
|
1557
|
+
|
|
1558
|
+
module.exports = {
|
|
1559
|
+
extractUrlFromText,
|
|
1560
|
+
generateLinkPreviewIfRequired,
|
|
1561
|
+
prepareWAMessageMedia,
|
|
1562
|
+
prepareDisappearingMessageSettingContent,
|
|
1563
|
+
generateForwardMessageContent,
|
|
1564
|
+
generateWAMessageContent,
|
|
1565
|
+
generateWAMessageFromContent,
|
|
1566
|
+
generateWAMessage,
|
|
1567
|
+
getContentType,
|
|
1568
|
+
normalizeMessageContent,
|
|
1569
|
+
extractMessageContent,
|
|
1570
|
+
getDevice,
|
|
1571
|
+
updateMessageWithReceipt,
|
|
1572
|
+
updateMessageWithReaction,
|
|
1573
|
+
updateMessageWithPollUpdate,
|
|
1574
|
+
getAggregateVotesInPollMessage,
|
|
1575
|
+
aggregateMessageKeysNotFromMe,
|
|
1576
|
+
downloadMediaMessage,
|
|
1577
|
+
assertMediaContent,
|
|
1578
|
+
patchMessageForMdIfRequired
|
|
1579
|
+
}
|