@neelegirl/baileys 1.5.2 → 1.5.4
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 +26 -18
- package/WAProto/GenerateStatics.sh +3 -0
- package/WAProto/WAProto.proto +291 -665
- package/WAProto/fix-imports.js +29 -0
- package/WAProto/index.d.ts +2297 -48040
- package/WAProto/index.js +45500 -140101
- package/engine-requirements.js +10 -0
- package/lib/Defaults/index.d.ts +58 -64
- package/lib/Defaults/index.d.ts.map +1 -0
- package/lib/Defaults/index.js +74 -96
- package/lib/Defaults/index.js.map +1 -0
- package/lib/Signal/Group/ciphertext-message.d.ts +10 -0
- package/lib/Signal/Group/ciphertext-message.d.ts.map +1 -0
- package/lib/Signal/Group/ciphertext-message.js +12 -0
- package/lib/Signal/Group/ciphertext-message.js.map +1 -0
- package/lib/Signal/Group/group-session-builder.d.ts +15 -0
- package/lib/Signal/Group/group-session-builder.d.ts.map +1 -0
- package/lib/Signal/Group/group-session-builder.js +30 -0
- package/lib/Signal/Group/group-session-builder.js.map +1 -0
- package/lib/Signal/Group/group_cipher.d.ts +17 -0
- package/lib/Signal/Group/group_cipher.d.ts.map +1 -0
- package/lib/Signal/Group/group_cipher.js +82 -0
- package/lib/Signal/Group/group_cipher.js.map +1 -0
- package/lib/Signal/Group/index.d.ts +12 -0
- package/lib/Signal/Group/index.d.ts.map +1 -0
- package/lib/Signal/Group/index.js +12 -0
- package/lib/Signal/Group/index.js.map +1 -0
- package/lib/Signal/Group/keyhelper.d.ts +11 -0
- package/lib/Signal/Group/keyhelper.d.ts.map +1 -0
- package/lib/Signal/Group/keyhelper.js +18 -0
- package/lib/Signal/Group/keyhelper.js.map +1 -0
- package/lib/Signal/Group/sender-chain-key.d.ts +14 -0
- package/lib/Signal/Group/sender-chain-key.d.ts.map +1 -0
- package/lib/Signal/Group/sender-chain-key.js +26 -0
- package/lib/Signal/Group/sender-chain-key.js.map +1 -0
- package/lib/Signal/Group/sender-key-distribution-message.d.ts +17 -0
- package/lib/Signal/Group/sender-key-distribution-message.d.ts.map +1 -0
- package/lib/Signal/Group/sender-key-distribution-message.js +63 -0
- package/lib/Signal/Group/sender-key-distribution-message.js.map +1 -0
- package/lib/Signal/Group/sender-key-message.d.ts +19 -0
- package/lib/Signal/Group/sender-key-message.d.ts.map +1 -0
- package/lib/Signal/Group/sender-key-message.js +66 -0
- package/lib/Signal/Group/sender-key-message.js.map +1 -0
- package/lib/Signal/Group/sender-key-name.d.ts +18 -0
- package/lib/Signal/Group/sender-key-name.d.ts.map +1 -0
- package/lib/Signal/Group/sender-key-name.js +48 -0
- package/lib/Signal/Group/sender-key-name.js.map +1 -0
- package/lib/Signal/Group/sender-key-record.d.ts +31 -0
- package/lib/Signal/Group/sender-key-record.d.ts.map +1 -0
- package/lib/Signal/Group/sender-key-record.js +41 -0
- package/lib/Signal/Group/sender-key-record.js.map +1 -0
- package/lib/Signal/Group/sender-key-state.d.ts +39 -0
- package/lib/Signal/Group/sender-key-state.d.ts.map +1 -0
- package/lib/Signal/Group/sender-key-state.js +84 -0
- package/lib/Signal/Group/sender-key-state.js.map +1 -0
- package/lib/Signal/Group/sender-message-key.d.ts +12 -0
- package/lib/Signal/Group/sender-message-key.d.ts.map +1 -0
- package/lib/Signal/{WASignalGroup/sender_message_key.js → Group/sender-message-key.js} +3 -16
- package/lib/Signal/Group/sender-message-key.js.map +1 -0
- package/lib/Signal/libsignal.d.ts +5 -4
- package/lib/Signal/libsignal.d.ts.map +1 -0
- package/lib/Signal/libsignal.js +292 -112
- package/lib/Signal/libsignal.js.map +1 -0
- package/lib/Signal/lid-mapping.d.ts +23 -0
- package/lib/Signal/lid-mapping.d.ts.map +1 -0
- package/lib/Signal/lid-mapping.js +171 -0
- package/lib/Signal/lid-mapping.js.map +1 -0
- package/lib/Socket/Client/index.d.ts +3 -2
- package/lib/Socket/Client/index.d.ts.map +1 -0
- package/lib/Socket/Client/index.js +3 -22
- package/lib/Socket/Client/index.js.map +1 -0
- package/lib/Socket/Client/types.d.ts +15 -15
- package/lib/Socket/Client/types.d.ts.map +1 -0
- package/lib/Socket/Client/types.js +8 -15
- package/lib/Socket/Client/types.js.map +1 -0
- package/lib/Socket/Client/websocket.d.ts +12 -12
- package/lib/Socket/Client/websocket.d.ts.map +1 -0
- package/lib/Socket/Client/websocket.js +24 -36
- package/lib/Socket/Client/websocket.js.map +1 -0
- package/lib/Socket/business.d.ts +178 -177
- package/lib/Socket/business.d.ts.map +1 -0
- package/lib/Socket/business.js +179 -71
- package/lib/Socket/business.js.map +1 -0
- package/lib/Socket/chats.d.ts +93 -93
- package/lib/Socket/chats.d.ts.map +1 -0
- package/lib/Socket/chats.js +474 -625
- package/lib/Socket/chats.js.map +1 -0
- package/lib/Socket/communities.d.ts +83 -62
- package/lib/Socket/communities.d.ts.map +1 -0
- package/lib/Socket/communities.js +412 -414
- package/lib/Socket/communities.js.map +1 -0
- package/lib/Socket/groups.d.ts +118 -112
- package/lib/Socket/groups.d.ts.map +1 -0
- package/lib/Socket/groups.js +146 -171
- package/lib/Socket/groups.js.map +1 -0
- package/lib/Socket/index.d.ts +222 -182
- package/lib/Socket/index.d.ts.map +1 -0
- package/lib/Socket/index.js +12 -17
- package/lib/Socket/index.js.map +1 -0
- package/lib/Socket/messages-recv.d.ts +165 -169
- package/lib/Socket/messages-recv.d.ts.map +1 -0
- package/lib/Socket/messages-recv.js +1185 -1721
- package/lib/Socket/messages-recv.js.map +1 -0
- package/lib/Socket/messages-send.d.ts +161 -159
- package/lib/Socket/messages-send.d.ts.map +1 -0
- package/lib/Socket/messages-send.js +650 -991
- package/lib/Socket/messages-send.js.map +1 -0
- package/lib/Socket/mex.d.ts +1 -0
- package/lib/Socket/mex.d.ts.map +1 -0
- package/lib/Socket/mex.js +4 -9
- package/lib/Socket/mex.js.map +1 -0
- package/lib/Socket/newsletter.d.ts +139 -139
- package/lib/Socket/newsletter.d.ts.map +1 -0
- package/lib/Socket/newsletter.js +153 -258
- package/lib/Socket/newsletter.js.map +1 -0
- package/lib/Socket/socket.d.ts +42 -36
- package/lib/Socket/socket.d.ts.map +1 -0
- package/lib/Socket/socket.js +623 -507
- package/lib/Socket/socket.js.map +1 -0
- package/lib/Types/Auth.d.ts +87 -96
- package/lib/Types/Auth.d.ts.map +1 -0
- package/lib/Types/Auth.js +2 -3
- package/lib/Types/Auth.js.map +1 -0
- package/lib/Types/Bussines.d.ts +25 -0
- package/lib/Types/Bussines.d.ts.map +1 -0
- package/lib/Types/Bussines.js +2 -0
- package/lib/Types/Bussines.js.map +1 -0
- package/lib/Types/Call.d.ts +13 -13
- package/lib/Types/Call.d.ts.map +1 -0
- package/lib/Types/Call.js +2 -3
- package/lib/Types/Call.js.map +1 -0
- package/lib/Types/Chat.d.ts +79 -94
- package/lib/Types/Chat.d.ts.map +1 -0
- package/lib/Types/Chat.js +8 -9
- package/lib/Types/Chat.js.map +1 -0
- package/lib/Types/Contact.d.ts +13 -9
- package/lib/Types/Contact.d.ts.map +1 -0
- package/lib/Types/Contact.js +2 -3
- package/lib/Types/Contact.js.map +1 -0
- package/lib/Types/Events.d.ts +152 -179
- package/lib/Types/Events.d.ts.map +1 -0
- package/lib/Types/Events.js +2 -3
- package/lib/Types/Events.js.map +1 -0
- package/lib/Types/GroupMetadata.d.ts +49 -48
- package/lib/Types/GroupMetadata.d.ts.map +1 -0
- package/lib/Types/GroupMetadata.js +2 -3
- package/lib/Types/GroupMetadata.js.map +1 -0
- package/lib/Types/Label.d.ts +13 -14
- package/lib/Types/Label.d.ts.map +1 -0
- package/lib/Types/Label.js +24 -30
- package/lib/Types/Label.js.map +1 -0
- package/lib/Types/LabelAssociation.d.ts +15 -20
- package/lib/Types/LabelAssociation.d.ts.map +1 -0
- package/lib/Types/LabelAssociation.js +6 -12
- package/lib/Types/LabelAssociation.js.map +1 -0
- package/lib/Types/Message.d.ts +234 -404
- package/lib/Types/Message.d.ts.map +1 -0
- package/lib/Types/Message.js +11 -13
- package/lib/Types/Message.js.map +1 -0
- package/lib/Types/Newsletter.d.ts +130 -104
- package/lib/Types/Newsletter.d.ts.map +1 -0
- package/lib/Types/Newsletter.js +31 -40
- package/lib/Types/Newsletter.js.map +1 -0
- package/lib/Types/Product.d.ts +58 -71
- package/lib/Types/Product.d.ts.map +1 -0
- package/lib/Types/Product.js +2 -3
- package/lib/Types/Product.js.map +1 -0
- package/lib/Types/Signal.d.ts +63 -55
- package/lib/Types/Signal.d.ts.map +1 -0
- package/lib/Types/Signal.js +2 -3
- package/lib/Types/Signal.js.map +1 -0
- package/lib/Types/Socket.d.ts +78 -65
- package/lib/Types/Socket.d.ts.map +1 -0
- package/lib/Types/Socket.js +3 -3
- package/lib/Types/Socket.js.map +1 -0
- package/lib/Types/State.d.ts +17 -19
- package/lib/Types/State.d.ts.map +1 -0
- package/lib/Types/State.js +13 -14
- package/lib/Types/State.js.map +1 -0
- package/lib/Types/USync.d.ts +8 -8
- package/lib/Types/USync.d.ts.map +1 -0
- package/lib/Types/USync.js +2 -3
- package/lib/Types/USync.js.map +1 -0
- package/lib/Types/index.d.ts +47 -61
- package/lib/Types/index.d.ts.map +1 -0
- package/lib/Types/index.js +26 -48
- package/lib/Types/index.js.map +1 -0
- package/lib/Utils/auth-utils.d.ts +8 -10
- package/lib/Utils/auth-utils.d.ts.map +1 -0
- package/lib/Utils/auth-utils.js +206 -154
- package/lib/Utils/auth-utils.js.map +1 -0
- package/lib/Utils/baileys-event-stream.d.ts +6 -7
- package/lib/Utils/baileys-event-stream.d.ts.map +1 -0
- package/lib/Utils/baileys-event-stream.js +29 -43
- package/lib/Utils/baileys-event-stream.js.map +1 -0
- package/lib/Utils/browser-utils.d.ts +4 -0
- package/lib/Utils/browser-utils.d.ts.map +1 -0
- package/lib/Utils/browser-utils.js +28 -0
- package/lib/Utils/browser-utils.js.map +1 -0
- package/lib/Utils/business.d.ts +14 -20
- package/lib/Utils/business.d.ts.map +1 -0
- package/lib/Utils/business.js +110 -134
- package/lib/Utils/business.js.map +1 -0
- package/lib/Utils/chat-utils.d.ts +57 -69
- package/lib/Utils/chat-utils.d.ts.map +1 -0
- package/lib/Utils/chat-utils.js +362 -380
- package/lib/Utils/chat-utils.js.map +1 -0
- package/lib/Utils/crypto.d.ts +30 -45
- package/lib/Utils/crypto.d.ts.map +1 -0
- package/lib/Utils/crypto.js +141 -178
- package/lib/Utils/crypto.js.map +1 -0
- package/lib/Utils/decode-wa-message.d.ts +42 -35
- package/lib/Utils/decode-wa-message.d.ts.map +1 -0
- package/lib/Utils/decode-wa-message.js +176 -150
- package/lib/Utils/decode-wa-message.js.map +1 -0
- package/lib/Utils/event-buffer.d.ts +12 -17
- package/lib/Utils/event-buffer.d.ts.map +1 -0
- package/lib/Utils/event-buffer.js +269 -286
- package/lib/Utils/event-buffer.js.map +1 -0
- package/lib/Utils/generics.d.ts +60 -99
- package/lib/Utils/generics.d.ts.map +1 -0
- package/lib/Utils/generics.js +244 -487
- package/lib/Utils/generics.js.map +1 -0
- package/lib/Utils/history.d.ts +18 -22
- package/lib/Utils/history.d.ts.map +1 -0
- package/lib/Utils/history.js +54 -80
- package/lib/Utils/history.js.map +1 -0
- package/lib/Utils/index.d.ts +20 -19
- package/lib/Utils/index.d.ts.map +1 -0
- package/lib/Utils/index.js +19 -39
- package/lib/Utils/index.js.map +1 -0
- package/lib/Utils/link-preview.d.ts +12 -14
- package/lib/Utils/link-preview.d.ts.map +1 -0
- package/lib/Utils/link-preview.js +40 -75
- package/lib/Utils/link-preview.js.map +1 -0
- package/lib/Utils/logger.d.ts +10 -11
- package/lib/Utils/logger.d.ts.map +1 -0
- package/lib/Utils/logger.js +3 -7
- package/lib/Utils/logger.js.map +1 -0
- package/lib/Utils/lt-hash.d.ts +12 -13
- package/lib/Utils/lt-hash.d.ts.map +1 -0
- package/lib/Utils/lt-hash.js +27 -37
- package/lib/Utils/lt-hash.js.map +1 -0
- package/lib/Utils/make-mutex.d.ts +6 -7
- package/lib/Utils/make-mutex.d.ts.map +1 -0
- package/lib/Utils/make-mutex.js +20 -29
- package/lib/Utils/make-mutex.js.map +1 -0
- package/lib/Utils/message-retry-manager.d.ts +82 -0
- package/lib/Utils/message-retry-manager.d.ts.map +1 -0
- package/lib/Utils/message-retry-manager.js +149 -0
- package/lib/Utils/message-retry-manager.js.map +1 -0
- package/lib/Utils/messages-media.d.ts +87 -102
- package/lib/Utils/messages-media.d.ts.map +1 -0
- package/lib/Utils/messages-media.js +427 -570
- package/lib/Utils/messages-media.js.map +1 -0
- package/lib/Utils/messages.d.ts +37 -64
- package/lib/Utils/messages.d.ts.map +1 -0
- package/lib/Utils/messages.js +511 -1270
- package/lib/Utils/messages.js.map +1 -0
- package/lib/Utils/noise-handler.d.ts +18 -18
- package/lib/Utils/noise-handler.d.ts.map +1 -0
- package/lib/Utils/noise-handler.js +101 -109
- package/lib/Utils/noise-handler.js.map +1 -0
- package/lib/Utils/pre-key-manager.d.ts +28 -0
- package/lib/Utils/pre-key-manager.d.ts.map +1 -0
- package/lib/Utils/pre-key-manager.js +106 -0
- package/lib/Utils/pre-key-manager.js.map +1 -0
- package/lib/Utils/process-message.d.ts +25 -32
- package/lib/Utils/process-message.d.ts.map +1 -0
- package/lib/Utils/process-message.js +266 -281
- package/lib/Utils/process-message.js.map +1 -0
- package/lib/Utils/signal.d.ts +24 -32
- package/lib/Utils/signal.d.ts.map +1 -0
- package/lib/Utils/signal.js +98 -105
- package/lib/Utils/signal.js.map +1 -0
- package/lib/Utils/use-multi-file-auth-state.d.ts +5 -10
- package/lib/Utils/use-multi-file-auth-state.d.ts.map +1 -0
- package/lib/Utils/use-multi-file-auth-state.js +69 -186
- package/lib/Utils/use-multi-file-auth-state.js.map +1 -0
- package/lib/Utils/validate-connection.d.ts +11 -13
- package/lib/Utils/validate-connection.d.ts.map +1 -0
- package/lib/Utils/validate-connection.js +124 -116
- package/lib/Utils/validate-connection.js.map +1 -0
- package/lib/WABinary/constants.d.ts +25 -27
- package/lib/WABinary/constants.d.ts.map +1 -0
- package/lib/WABinary/constants.js +1277 -1292
- package/lib/WABinary/constants.js.map +1 -0
- package/lib/WABinary/decode.d.ts +7 -9
- package/lib/WABinary/decode.d.ts.map +1 -0
- package/lib/WABinary/decode.js +139 -189
- package/lib/WABinary/decode.js.map +1 -0
- package/lib/WABinary/encode.d.ts +3 -3
- package/lib/WABinary/encode.d.ts.map +1 -0
- package/lib/WABinary/encode.js +105 -154
- package/lib/WABinary/encode.js.map +1 -0
- package/lib/WABinary/generic-utils.d.ts +14 -27
- package/lib/WABinary/generic-utils.d.ts.map +1 -0
- package/lib/WABinary/generic-utils.js +62 -102
- package/lib/WABinary/generic-utils.js.map +1 -0
- package/lib/WABinary/index.d.ts +6 -5
- package/lib/WABinary/index.d.ts.map +1 -0
- package/lib/WABinary/index.js +6 -25
- package/lib/WABinary/index.js.map +1 -0
- package/lib/WABinary/jid-utils.d.ts +41 -46
- package/lib/WABinary/jid-utils.d.ts.map +1 -0
- package/lib/WABinary/jid-utils.js +84 -80
- package/lib/WABinary/jid-utils.js.map +1 -0
- package/lib/WABinary/types.d.ts +10 -13
- package/lib/WABinary/types.d.ts.map +1 -0
- package/lib/WABinary/types.js +2 -3
- package/lib/WABinary/types.js.map +1 -0
- package/lib/WAM/BinaryInfo.d.ts +8 -15
- package/lib/WAM/BinaryInfo.d.ts.map +1 -0
- package/lib/WAM/BinaryInfo.js +7 -14
- package/lib/WAM/BinaryInfo.js.map +1 -0
- package/lib/WAM/constants.d.ts +30 -37
- package/lib/WAM/constants.d.ts.map +1 -0
- package/lib/WAM/constants.js +19193 -11711
- package/lib/WAM/constants.js.map +1 -0
- package/lib/WAM/encode.d.ts +3 -3
- package/lib/WAM/encode.d.ts.map +1 -0
- package/lib/WAM/encode.js +95 -110
- package/lib/WAM/encode.js.map +1 -0
- package/lib/WAM/index.d.ts +4 -3
- package/lib/WAM/index.d.ts.map +1 -0
- package/lib/WAM/index.js +4 -23
- package/lib/WAM/index.js.map +1 -0
- package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts +9 -9
- package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts.map +1 -0
- package/lib/WAUSync/Protocols/USyncContactProtocol.js +12 -19
- package/lib/WAUSync/Protocols/USyncContactProtocol.js.map +1 -0
- package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts +19 -22
- package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts.map +1 -0
- package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +18 -26
- package/lib/WAUSync/Protocols/USyncDeviceProtocol.js.map +1 -0
- package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts +11 -12
- package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts.map +1 -0
- package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +12 -20
- package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js.map +1 -0
- package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts +11 -12
- package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts.map +1 -0
- package/lib/WAUSync/Protocols/USyncStatusProtocol.js +16 -24
- package/lib/WAUSync/Protocols/USyncStatusProtocol.js.map +1 -0
- package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts +26 -0
- package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts.map +1 -0
- package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js +51 -0
- package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js.map +1 -0
- package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts +10 -0
- package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts.map +1 -0
- package/lib/WAUSync/Protocols/UsyncLIDProtocol.js +29 -0
- package/lib/WAUSync/Protocols/UsyncLIDProtocol.js.map +1 -0
- package/lib/WAUSync/Protocols/index.d.ts +5 -6
- package/lib/WAUSync/Protocols/index.d.ts.map +1 -0
- package/lib/WAUSync/Protocols/index.js +5 -26
- package/lib/WAUSync/Protocols/index.js.map +1 -0
- package/lib/WAUSync/USyncQuery.d.ts +26 -28
- package/lib/WAUSync/USyncQuery.d.ts.map +1 -0
- package/lib/WAUSync/USyncQuery.js +64 -62
- package/lib/WAUSync/USyncQuery.js.map +1 -0
- package/lib/WAUSync/USyncUser.d.ts +11 -10
- package/lib/WAUSync/USyncUser.d.ts.map +1 -0
- package/lib/WAUSync/USyncUser.js +12 -19
- package/lib/WAUSync/USyncUser.js.map +1 -0
- package/lib/WAUSync/index.d.ts +4 -3
- package/lib/WAUSync/index.d.ts.map +1 -0
- package/lib/WAUSync/index.js +4 -23
- package/lib/WAUSync/index.js.map +1 -0
- package/lib/index.d.ts +10 -11
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +11 -33
- package/lib/index.js.map +1 -0
- package/package.json +48 -43
- package/lib/Defaults/baileys-version.json +0 -3
- package/lib/Defaults/phonenumber-mcc.json +0 -223
- package/lib/Signal/WASignalGroup/GroupProtocol.js +0 -1909
- package/lib/Signal/WASignalGroup/ciphertext_message.js +0 -16
- package/lib/Signal/WASignalGroup/generate-proto.sh +0 -1
- package/lib/Signal/WASignalGroup/group.proto +0 -42
- package/lib/Signal/WASignalGroup/group_cipher.js +0 -120
- package/lib/Signal/WASignalGroup/group_session_builder.js +0 -46
- package/lib/Signal/WASignalGroup/index.js +0 -6
- package/lib/Signal/WASignalGroup/keyhelper.js +0 -21
- package/lib/Signal/WASignalGroup/protobufs.js +0 -3
- package/lib/Signal/WASignalGroup/queue_job.js +0 -69
- package/lib/Signal/WASignalGroup/readme.md +0 -6
- package/lib/Signal/WASignalGroup/sender_chain_key.js +0 -50
- package/lib/Signal/WASignalGroup/sender_key_distribution_message.js +0 -78
- package/lib/Signal/WASignalGroup/sender_key_message.js +0 -92
- package/lib/Signal/WASignalGroup/sender_key_name.js +0 -70
- package/lib/Signal/WASignalGroup/sender_key_record.js +0 -56
- package/lib/Signal/WASignalGroup/sender_key_state.js +0 -129
- package/lib/Socket/Client/abstract-socket-client.d.ts +0 -15
- package/lib/Socket/Client/abstract-socket-client.js +0 -13
- package/lib/Socket/Client/mobile-socket-client.d.ts +0 -12
- package/lib/Socket/Client/mobile-socket-client.js +0 -65
- package/lib/Socket/registration.d.ts +0 -266
- package/lib/Socket/registration.js +0 -166
- package/lib/Socket/usync.d.ts +0 -37
- package/lib/Socket/usync.js +0 -83
- package/lib/Store/index.d.ts +0 -4
- package/lib/Store/index.js +0 -24
- package/lib/Store/make-cache-manager-store.d.ts +0 -14
- package/lib/Store/make-cache-manager-store.js +0 -90
- package/lib/Store/make-in-memory-store.d.ts +0 -123
- package/lib/Store/make-in-memory-store.js +0 -429
- package/lib/Store/make-ordered-dictionary.d.ts +0 -12
- package/lib/Store/make-ordered-dictionary.js +0 -86
- package/lib/Store/object-repository.d.ts +0 -10
- package/lib/Store/object-repository.js +0 -31
- package/lib/Types/MexUpdates.d.ts +0 -9
- package/lib/Types/MexUpdates.js +0 -18
- package/lib/Utils/use-mongo-file-auth-state.d.ts +0 -6
- package/lib/Utils/use-mongo-file-auth-state.js +0 -84
- package/lib/Utils/use-single-file-auth-state.d.ts +0 -13
- package/lib/Utils/use-single-file-auth-state.js +0 -80
- package/lib/WAUSync/Protocols/USyncBotProfileProtocol.d.ts +0 -28
- package/lib/WAUSync/Protocols/USyncBotProfileProtocol.js +0 -69
- package/lib/WAUSync/Protocols/USyncLIDProtocol.d.ts +0 -9
- package/lib/WAUSync/Protocols/USyncLIDProtocol.js +0 -30
package/lib/Utils/messages.js
CHANGED
|
@@ -1,1579 +1,820 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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
|
-
|
|
1
|
+
import { Boom } from '@hapi/boom';
|
|
2
|
+
import { randomBytes } from 'crypto';
|
|
3
|
+
import { promises as fs } from 'fs';
|
|
4
|
+
import {} from 'stream';
|
|
5
|
+
import { proto } from '../../WAProto/index.js';
|
|
6
|
+
import { CALL_AUDIO_PREFIX, CALL_VIDEO_PREFIX, MEDIA_KEYS, URL_REGEX, WA_DEFAULT_EPHEMERAL } from '../Defaults/index.js';
|
|
7
|
+
import { WAMessageStatus, WAProto } from '../Types/index.js';
|
|
8
|
+
import { isJidGroup, isJidNewsletter, isJidStatusBroadcast, jidNormalizedUser } from '../WABinary/index.js';
|
|
9
|
+
import { sha256 } from './crypto.js';
|
|
10
|
+
import { generateMessageIDV2, getKeyAuthor, unixTimestampSeconds } from './generics.js';
|
|
11
|
+
import { downloadContentFromMessage, encryptedStream, generateThumbnail, getAudioDuration, getAudioWaveform, getRawMediaUploadData } from './messages-media.js';
|
|
21
12
|
const MIMETYPE_MAP = {
|
|
22
13
|
image: 'image/jpeg',
|
|
23
14
|
video: 'video/mp4',
|
|
24
15
|
document: 'application/pdf',
|
|
25
|
-
audio: 'audio/ogg codecs=opus',
|
|
16
|
+
audio: 'audio/ogg; codecs=opus',
|
|
26
17
|
sticker: 'image/webp',
|
|
27
18
|
'product-catalog-image': 'image/jpeg'
|
|
28
|
-
}
|
|
29
|
-
|
|
19
|
+
};
|
|
30
20
|
const MessageTypeProto = {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
}
|
|
37
|
-
|
|
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
|
+
};
|
|
38
27
|
/**
|
|
39
28
|
* Uses a regex to test whether the string contains a URL, and returns the URL if it does.
|
|
40
29
|
* @param text eg. hello https://google.com
|
|
41
30
|
* @returns the URL, eg. https://google.com
|
|
42
31
|
*/
|
|
43
|
-
const extractUrlFromText = (text) => text.match(
|
|
44
|
-
|
|
45
|
-
const
|
|
46
|
-
const url = extractUrlFromText(text)
|
|
47
|
-
|
|
32
|
+
export const extractUrlFromText = (text) => text.match(URL_REGEX)?.[0];
|
|
33
|
+
export const generateLinkPreviewIfRequired = async (text, getUrlInfo, logger) => {
|
|
34
|
+
const url = extractUrlFromText(text);
|
|
48
35
|
if (!!getUrlInfo && url) {
|
|
49
36
|
try {
|
|
50
|
-
const urlInfo = await getUrlInfo(url)
|
|
51
|
-
return urlInfo
|
|
37
|
+
const urlInfo = await getUrlInfo(url);
|
|
38
|
+
return urlInfo;
|
|
52
39
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
logger?.warn({ trace: error.stack }, 'url generation failed')
|
|
40
|
+
catch (error) {
|
|
41
|
+
// ignore if fails
|
|
42
|
+
logger?.warn({ trace: error.stack }, 'url generation failed');
|
|
56
43
|
}
|
|
57
44
|
}
|
|
58
|
-
}
|
|
59
|
-
|
|
45
|
+
};
|
|
60
46
|
const assertColor = async (color) => {
|
|
61
|
-
let assertedColor
|
|
62
|
-
|
|
47
|
+
let assertedColor;
|
|
63
48
|
if (typeof color === 'number') {
|
|
64
|
-
assertedColor = color > 0 ? color : 0xffffffff + Number(color) + 1
|
|
49
|
+
assertedColor = color > 0 ? color : 0xffffffff + Number(color) + 1;
|
|
65
50
|
}
|
|
66
|
-
|
|
67
51
|
else {
|
|
68
|
-
let hex = color.trim().replace('#', '')
|
|
52
|
+
let hex = color.trim().replace('#', '');
|
|
69
53
|
if (hex.length <= 6) {
|
|
70
|
-
hex = 'FF' + hex.padStart(6, '0')
|
|
54
|
+
hex = 'FF' + hex.padStart(6, '0');
|
|
71
55
|
}
|
|
72
|
-
assertedColor = parseInt(hex, 16)
|
|
73
|
-
return assertedColor
|
|
56
|
+
assertedColor = parseInt(hex, 16);
|
|
57
|
+
return assertedColor;
|
|
74
58
|
}
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
const
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
for (const key of Defaults_1.MEDIA_KEYS) {
|
|
59
|
+
};
|
|
60
|
+
export const prepareWAMessageMedia = async (message, options) => {
|
|
61
|
+
const logger = options.logger;
|
|
62
|
+
let mediaType;
|
|
63
|
+
for (const key of MEDIA_KEYS) {
|
|
82
64
|
if (key in message) {
|
|
83
|
-
mediaType = key
|
|
65
|
+
mediaType = key;
|
|
84
66
|
}
|
|
85
67
|
}
|
|
86
|
-
|
|
87
68
|
if (!mediaType) {
|
|
88
|
-
throw new
|
|
69
|
+
throw new Boom('Invalid media type', { statusCode: 400 });
|
|
89
70
|
}
|
|
90
|
-
|
|
91
71
|
const uploadData = {
|
|
92
72
|
...message,
|
|
93
73
|
media: message[mediaType]
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
delete uploadData[mediaType]
|
|
97
|
-
|
|
74
|
+
};
|
|
75
|
+
delete uploadData[mediaType];
|
|
98
76
|
// check if cacheable + generate cache key
|
|
99
77
|
const cacheableKey = typeof uploadData.media === 'object' &&
|
|
100
|
-
|
|
78
|
+
'url' in uploadData.media &&
|
|
101
79
|
!!uploadData.media.url &&
|
|
102
|
-
!!options.mediaCache &&
|
|
103
|
-
|
|
104
|
-
mediaType + ':' + uploadData.media.url.toString())
|
|
105
|
-
|
|
80
|
+
!!options.mediaCache &&
|
|
81
|
+
mediaType + ':' + uploadData.media.url.toString();
|
|
106
82
|
if (mediaType === 'document' && !uploadData.fileName) {
|
|
107
|
-
uploadData.fileName = 'file'
|
|
83
|
+
uploadData.fileName = 'file';
|
|
108
84
|
}
|
|
109
|
-
|
|
110
85
|
if (!uploadData.mimetype) {
|
|
111
|
-
uploadData.mimetype = MIMETYPE_MAP[mediaType]
|
|
86
|
+
uploadData.mimetype = MIMETYPE_MAP[mediaType];
|
|
112
87
|
}
|
|
113
|
-
|
|
114
|
-
// check for cache hit
|
|
115
88
|
if (cacheableKey) {
|
|
116
|
-
const mediaBuff = options.mediaCache.get(cacheableKey)
|
|
89
|
+
const mediaBuff = await options.mediaCache.get(cacheableKey);
|
|
117
90
|
if (mediaBuff) {
|
|
118
|
-
logger?.debug({ cacheableKey }, 'got media cache hit')
|
|
119
|
-
const obj =
|
|
120
|
-
const key = `${mediaType}Message
|
|
121
|
-
Object.assign(obj[key], { ...uploadData, media: undefined })
|
|
122
|
-
return obj
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
(
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
91
|
+
logger?.debug({ cacheableKey }, 'got media cache hit');
|
|
92
|
+
const obj = proto.Message.decode(mediaBuff);
|
|
93
|
+
const key = `${mediaType}Message`;
|
|
94
|
+
Object.assign(obj[key], { ...uploadData, media: undefined });
|
|
95
|
+
return obj;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
const isNewsletter = !!options.jid && isJidNewsletter(options.jid);
|
|
99
|
+
if (isNewsletter) {
|
|
100
|
+
logger?.info({ key: cacheableKey }, 'Preparing raw media for newsletter');
|
|
101
|
+
const { filePath, fileSha256, fileLength } = await getRawMediaUploadData(uploadData.media, options.mediaTypeOverride || mediaType, logger);
|
|
102
|
+
const fileSha256B64 = fileSha256.toString('base64');
|
|
103
|
+
const { mediaUrl, directPath } = await options.upload(filePath, {
|
|
104
|
+
fileEncSha256B64: fileSha256B64,
|
|
105
|
+
mediaType: mediaType,
|
|
106
|
+
timeoutMs: options.mediaUploadTimeoutMs
|
|
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, {
|
|
134
139
|
logger,
|
|
135
140
|
saveOriginalFileIfRequired: requiresOriginalForSomeProcessing,
|
|
136
141
|
opts: options.options
|
|
137
|
-
})
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
const fileEncSha256B64 = (options.newsletter ? fileSha256 : fileEncSha256 !== null && fileEncSha256 ? fileEncSha256 : fileSha256).toString('base64')
|
|
141
|
-
|
|
142
|
-
const [{ mediaUrl, directPath, handle }] = await Promise.all([
|
|
142
|
+
});
|
|
143
|
+
const fileEncSha256B64 = fileEncSha256.toString('base64');
|
|
144
|
+
const [{ mediaUrl, directPath }] = await Promise.all([
|
|
143
145
|
(async () => {
|
|
144
|
-
const result = await options.upload(encFilePath, {
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
146
|
+
const result = await options.upload(encFilePath, {
|
|
147
|
+
fileEncSha256B64,
|
|
148
|
+
mediaType,
|
|
149
|
+
timeoutMs: options.mediaUploadTimeoutMs
|
|
150
|
+
});
|
|
151
|
+
logger?.debug({ mediaType, cacheableKey }, 'uploaded media');
|
|
152
|
+
return result;
|
|
148
153
|
})(),
|
|
149
154
|
(async () => {
|
|
150
155
|
try {
|
|
151
156
|
if (requiresThumbnailComputation) {
|
|
152
|
-
const { thumbnail, originalImageDimensions } = await
|
|
153
|
-
uploadData.jpegThumbnail = thumbnail
|
|
154
|
-
|
|
157
|
+
const { thumbnail, originalImageDimensions } = await generateThumbnail(originalFilePath, mediaType, options);
|
|
158
|
+
uploadData.jpegThumbnail = thumbnail;
|
|
155
159
|
if (!uploadData.width && originalImageDimensions) {
|
|
156
|
-
uploadData.width = originalImageDimensions.width
|
|
157
|
-
uploadData.height = originalImageDimensions.height
|
|
158
|
-
logger?.debug('set dimensions')
|
|
160
|
+
uploadData.width = originalImageDimensions.width;
|
|
161
|
+
uploadData.height = originalImageDimensions.height;
|
|
162
|
+
logger?.debug('set dimensions');
|
|
159
163
|
}
|
|
160
|
-
logger?.debug('generated thumbnail')
|
|
164
|
+
logger?.debug('generated thumbnail');
|
|
161
165
|
}
|
|
162
|
-
|
|
163
166
|
if (requiresDurationComputation) {
|
|
164
|
-
uploadData.seconds = await
|
|
165
|
-
logger?.debug('computed audio duration')
|
|
167
|
+
uploadData.seconds = await getAudioDuration(originalFilePath);
|
|
168
|
+
logger?.debug('computed audio duration');
|
|
166
169
|
}
|
|
167
|
-
|
|
168
170
|
if (requiresWaveformProcessing) {
|
|
169
|
-
uploadData.waveform = await
|
|
170
|
-
logger?.debug('processed waveform')
|
|
171
|
+
uploadData.waveform = await getAudioWaveform(originalFilePath, logger);
|
|
172
|
+
logger?.debug('processed waveform');
|
|
171
173
|
}
|
|
172
|
-
|
|
173
174
|
if (requiresAudioBackground) {
|
|
174
|
-
uploadData.backgroundArgb = await assertColor(options.backgroundColor)
|
|
175
|
-
logger?.debug('computed backgroundColor audio status')
|
|
175
|
+
uploadData.backgroundArgb = await assertColor(options.backgroundColor);
|
|
176
|
+
logger?.debug('computed backgroundColor audio status');
|
|
176
177
|
}
|
|
177
178
|
}
|
|
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.unlink(encFilePath);
|
|
186
186
|
if (originalFilePath) {
|
|
187
|
-
await
|
|
187
|
+
await fs.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 =
|
|
194
|
+
});
|
|
195
|
+
const obj = WAProto.Message.fromObject({
|
|
196
196
|
[`${mediaType}Message`]: MessageTypeProto[mediaType].fromObject({
|
|
197
|
-
url:
|
|
197
|
+
url: mediaUrl,
|
|
198
198
|
directPath,
|
|
199
|
-
mediaKey
|
|
200
|
-
fileEncSha256
|
|
199
|
+
mediaKey,
|
|
200
|
+
fileEncSha256,
|
|
201
201
|
fileSha256,
|
|
202
202
|
fileLength,
|
|
203
|
-
mediaKeyTimestamp:
|
|
203
|
+
mediaKeyTimestamp: unixTimestampSeconds(),
|
|
204
204
|
...uploadData,
|
|
205
205
|
media: undefined
|
|
206
206
|
})
|
|
207
|
-
})
|
|
208
|
-
|
|
207
|
+
});
|
|
209
208
|
if (uploadData.ptv) {
|
|
210
|
-
obj.ptvMessage = obj.videoMessage
|
|
211
|
-
delete obj.videoMessage
|
|
209
|
+
obj.ptvMessage = obj.videoMessage;
|
|
210
|
+
delete obj.videoMessage;
|
|
212
211
|
}
|
|
213
|
-
|
|
214
212
|
if (cacheableKey) {
|
|
215
|
-
logger?.debug({ cacheableKey }, 'set cache')
|
|
216
|
-
options.mediaCache.set(cacheableKey,
|
|
213
|
+
logger?.debug({ cacheableKey }, 'set cache');
|
|
214
|
+
await options.mediaCache.set(cacheableKey, WAProto.Message.encode(obj).finish());
|
|
217
215
|
}
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
const prepareDisappearingMessageSettingContent = (expiration) => {
|
|
216
|
+
return obj;
|
|
217
|
+
};
|
|
218
|
+
export const prepareDisappearingMessageSettingContent = (ephemeralExpiration) => {
|
|
219
|
+
ephemeralExpiration = ephemeralExpiration || 0;
|
|
223
220
|
const content = {
|
|
224
221
|
ephemeralMessage: {
|
|
225
222
|
message: {
|
|
226
223
|
protocolMessage: {
|
|
227
|
-
type:
|
|
228
|
-
ephemeralExpiration
|
|
224
|
+
type: WAProto.Message.ProtocolMessage.Type.EPHEMERAL_SETTING,
|
|
225
|
+
ephemeralExpiration
|
|
229
226
|
}
|
|
230
227
|
}
|
|
231
228
|
}
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
}
|
|
236
|
-
|
|
229
|
+
};
|
|
230
|
+
return WAProto.Message.fromObject(content);
|
|
231
|
+
};
|
|
237
232
|
/**
|
|
238
233
|
* Generate forwarded message content like WA does
|
|
239
234
|
* @param message the message to forward
|
|
240
235
|
* @param options.forceForward will show the message as forwarded even if it is from you
|
|
241
236
|
*/
|
|
242
|
-
const generateForwardMessageContent = (message, forceForward) => {
|
|
243
|
-
let content = message.message
|
|
244
|
-
|
|
237
|
+
export const generateForwardMessageContent = (message, forceForward) => {
|
|
238
|
+
let content = message.message;
|
|
245
239
|
if (!content) {
|
|
246
|
-
throw new
|
|
240
|
+
throw new Boom('no content in message', { statusCode: 400 });
|
|
247
241
|
}
|
|
248
|
-
|
|
249
242
|
// hacky copy
|
|
250
|
-
content = normalizeMessageContent(content)
|
|
251
|
-
content =
|
|
252
|
-
|
|
253
|
-
let
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
if (forceForward) score += forceForward ? forceForward : 1
|
|
257
|
-
|
|
243
|
+
content = normalizeMessageContent(content);
|
|
244
|
+
content = proto.Message.decode(proto.Message.encode(content).finish());
|
|
245
|
+
let key = Object.keys(content)[0];
|
|
246
|
+
let score = content?.[key]?.contextInfo?.forwardingScore || 0;
|
|
247
|
+
score += message.key.fromMe && !forceForward ? 0 : 1;
|
|
258
248
|
if (key === 'conversation') {
|
|
259
|
-
content.extendedTextMessage = { text: content[key] }
|
|
260
|
-
delete content.conversation
|
|
261
|
-
key = 'extendedTextMessage'
|
|
249
|
+
content.extendedTextMessage = { text: content[key] };
|
|
250
|
+
delete content.conversation;
|
|
251
|
+
key = 'extendedTextMessage';
|
|
262
252
|
}
|
|
263
|
-
|
|
253
|
+
const key_ = content?.[key];
|
|
264
254
|
if (score > 0) {
|
|
265
|
-
|
|
255
|
+
key_.contextInfo = { forwardingScore: score, isForwarded: true };
|
|
266
256
|
}
|
|
267
|
-
|
|
268
257
|
else {
|
|
269
|
-
|
|
258
|
+
key_.contextInfo = {};
|
|
270
259
|
}
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
let m = {}
|
|
260
|
+
return content;
|
|
261
|
+
};
|
|
262
|
+
export const generateWAMessageContent = async (message, options) => {
|
|
263
|
+
var _a, _b;
|
|
264
|
+
let m = {};
|
|
277
265
|
if ('text' in message) {
|
|
278
|
-
const extContent = { text: message.text }
|
|
279
|
-
let urlInfo = message.linkPreview
|
|
280
|
-
|
|
266
|
+
const extContent = { text: message.text };
|
|
267
|
+
let urlInfo = message.linkPreview;
|
|
281
268
|
if (typeof urlInfo === 'undefined') {
|
|
282
|
-
urlInfo = await generateLinkPreviewIfRequired(message.text, options.getUrlInfo, options.logger)
|
|
269
|
+
urlInfo = await generateLinkPreviewIfRequired(message.text, options.getUrlInfo, options.logger);
|
|
283
270
|
}
|
|
284
|
-
|
|
285
271
|
if (urlInfo) {
|
|
286
|
-
extContent.
|
|
287
|
-
extContent.
|
|
288
|
-
extContent.
|
|
289
|
-
extContent.
|
|
290
|
-
extContent.
|
|
291
|
-
|
|
292
|
-
const img = urlInfo.highQualityThumbnail
|
|
293
|
-
|
|
272
|
+
extContent.matchedText = urlInfo['matched-text'];
|
|
273
|
+
extContent.jpegThumbnail = urlInfo.jpegThumbnail;
|
|
274
|
+
extContent.description = urlInfo.description;
|
|
275
|
+
extContent.title = urlInfo.title;
|
|
276
|
+
extContent.previewType = 0;
|
|
277
|
+
const img = urlInfo.highQualityThumbnail;
|
|
294
278
|
if (img) {
|
|
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
|
|
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;
|
|
302
286
|
}
|
|
303
287
|
}
|
|
304
|
-
|
|
305
288
|
if (options.backgroundColor) {
|
|
306
|
-
extContent.backgroundArgb = await assertColor(options.backgroundColor)
|
|
289
|
+
extContent.backgroundArgb = await assertColor(options.backgroundColor);
|
|
307
290
|
}
|
|
308
|
-
|
|
309
|
-
if (options.textColor) {
|
|
310
|
-
extContent.textArgb = await assertColor(options.textColor)
|
|
311
|
-
}
|
|
312
|
-
|
|
313
291
|
if (options.font) {
|
|
314
|
-
extContent.font = options.font
|
|
292
|
+
extContent.font = options.font;
|
|
315
293
|
}
|
|
316
|
-
|
|
317
|
-
extContent.contextInfo = {
|
|
318
|
-
...(message.contextInfo || {}),
|
|
319
|
-
...(message.mentions ? { mentionedJid: message.mentions } : {})
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
m.extendedTextMessage = extContent
|
|
294
|
+
m.extendedTextMessage = extContent;
|
|
323
295
|
}
|
|
324
|
-
|
|
325
296
|
else if ('contacts' in message) {
|
|
326
|
-
const contactLen = message.contacts.contacts.length
|
|
327
|
-
|
|
328
|
-
let contactMessage
|
|
329
|
-
|
|
297
|
+
const contactLen = message.contacts.contacts.length;
|
|
330
298
|
if (!contactLen) {
|
|
331
|
-
throw new
|
|
299
|
+
throw new Boom('require atleast 1 contact', { statusCode: 400 });
|
|
332
300
|
}
|
|
333
|
-
|
|
334
301
|
if (contactLen === 1) {
|
|
335
|
-
contactMessage =
|
|
336
|
-
contactMessage: Types_1.WAProto.Message.ContactMessage.fromObject(message.contacts.contacts[0])
|
|
337
|
-
}
|
|
302
|
+
m.contactMessage = WAProto.Message.ContactMessage.create(message.contacts.contacts[0]);
|
|
338
303
|
}
|
|
339
|
-
|
|
340
304
|
else {
|
|
341
|
-
|
|
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 } : {})
|
|
305
|
+
m.contactsArrayMessage = WAProto.Message.ContactsArrayMessage.create(message.contacts);
|
|
351
306
|
}
|
|
352
|
-
|
|
353
|
-
m = contactMessage
|
|
354
307
|
}
|
|
355
|
-
|
|
356
308
|
else if ('location' in message) {
|
|
357
|
-
|
|
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
|
|
309
|
+
m.locationMessage = WAProto.Message.LocationMessage.create(message.location);
|
|
379
310
|
}
|
|
380
|
-
|
|
381
311
|
else if ('react' in message) {
|
|
382
312
|
if (!message.react.senderTimestampMs) {
|
|
383
|
-
message.react.senderTimestampMs = Date.now()
|
|
313
|
+
message.react.senderTimestampMs = Date.now();
|
|
384
314
|
}
|
|
385
|
-
|
|
386
|
-
m.reactionMessage = Types_1.WAProto.Message.ReactionMessage.fromObject(message.react)
|
|
315
|
+
m.reactionMessage = WAProto.Message.ReactionMessage.create(message.react);
|
|
387
316
|
}
|
|
388
|
-
|
|
389
317
|
else if ('delete' in message) {
|
|
390
318
|
m.protocolMessage = {
|
|
391
319
|
key: message.delete,
|
|
392
|
-
type:
|
|
393
|
-
}
|
|
394
|
-
}
|
|
395
|
-
|
|
320
|
+
type: WAProto.Message.ProtocolMessage.Type.REVOKE
|
|
321
|
+
};
|
|
322
|
+
}
|
|
396
323
|
else if ('forward' in message) {
|
|
397
|
-
|
|
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
|
|
324
|
+
m = generateForwardMessageContent(message.forward, message.force);
|
|
406
325
|
}
|
|
407
|
-
|
|
408
326
|
else if ('disappearingMessagesInChat' in message) {
|
|
409
|
-
const exp = typeof message.disappearingMessagesInChat === 'boolean'
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
327
|
+
const exp = typeof message.disappearingMessagesInChat === 'boolean'
|
|
328
|
+
? message.disappearingMessagesInChat
|
|
329
|
+
? WA_DEFAULT_EPHEMERAL
|
|
330
|
+
: 0
|
|
331
|
+
: message.disappearingMessagesInChat;
|
|
332
|
+
m = prepareDisappearingMessageSettingContent(exp);
|
|
413
333
|
}
|
|
414
|
-
|
|
415
334
|
else if ('groupInvite' in message) {
|
|
416
|
-
|
|
417
|
-
m.groupInviteMessage =
|
|
418
|
-
|
|
419
|
-
m.groupInviteMessage.
|
|
420
|
-
m.groupInviteMessage.
|
|
421
|
-
m.groupInviteMessage.
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
m.groupInviteMessage.contextInfo = message.contextInfo
|
|
425
|
-
|
|
335
|
+
m.groupInviteMessage = {};
|
|
336
|
+
m.groupInviteMessage.inviteCode = message.groupInvite.inviteCode;
|
|
337
|
+
m.groupInviteMessage.inviteExpiration = message.groupInvite.inviteExpiration;
|
|
338
|
+
m.groupInviteMessage.caption = message.groupInvite.text;
|
|
339
|
+
m.groupInviteMessage.groupJid = message.groupInvite.jid;
|
|
340
|
+
m.groupInviteMessage.groupName = message.groupInvite.subject;
|
|
341
|
+
//TODO: use built-in interface and get disappearing mode info etc.
|
|
342
|
+
//TODO: cache / use store!?
|
|
426
343
|
if (options.getProfilePicUrl) {
|
|
427
|
-
const pfpUrl = await options.getProfilePicUrl(message.groupInvite.jid)
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
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
|
|
452
|
-
}
|
|
453
|
-
|
|
454
|
-
m.newsletterAdminInviteMessage.contextInfo = {
|
|
455
|
-
...(message.contextInfo || {}),
|
|
456
|
-
...(message.mentions ? { mentionedJid: message.mentions } : {})
|
|
344
|
+
const pfpUrl = await options.getProfilePicUrl(message.groupInvite.jid, 'preview');
|
|
345
|
+
if (pfpUrl) {
|
|
346
|
+
const resp = await fetch(pfpUrl, { method: 'GET', dispatcher: options?.options?.dispatcher });
|
|
347
|
+
if (resp.ok) {
|
|
348
|
+
const buf = Buffer.from(await resp.arrayBuffer());
|
|
349
|
+
m.groupInviteMessage.jpegThumbnail = buf;
|
|
350
|
+
}
|
|
351
|
+
}
|
|
457
352
|
}
|
|
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
|
|
469
353
|
}
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
m.
|
|
473
|
-
|
|
474
|
-
m.
|
|
475
|
-
m.
|
|
476
|
-
m.
|
|
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
|
-
}
|
|
354
|
+
else if ('pin' in message) {
|
|
355
|
+
m.pinInChatMessage = {};
|
|
356
|
+
m.messageContextInfo = {};
|
|
357
|
+
m.pinInChatMessage.key = message.pin;
|
|
358
|
+
m.pinInChatMessage.type = message.type;
|
|
359
|
+
m.pinInChatMessage.senderTimestampMs = Date.now();
|
|
360
|
+
m.messageContextInfo.messageAddOnDurationInSecs = message.type === 1 ? message.time || 86400 : 0;
|
|
491
361
|
}
|
|
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
|
-
|
|
506
362
|
else if ('buttonReply' in message) {
|
|
507
363
|
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
|
|
518
364
|
case 'template':
|
|
519
365
|
m.templateButtonReplyMessage = {
|
|
520
366
|
selectedDisplayText: message.buttonReply.displayText,
|
|
521
367
|
selectedId: message.buttonReply.id,
|
|
522
368
|
selectedIndex: message.buttonReply.index
|
|
523
|
-
}
|
|
524
|
-
break
|
|
369
|
+
};
|
|
370
|
+
break;
|
|
525
371
|
case 'plain':
|
|
526
372
|
m.buttonsResponseMessage = {
|
|
527
373
|
selectedButtonId: message.buttonReply.id,
|
|
528
374
|
selectedDisplayText: message.buttonReply.displayText,
|
|
529
|
-
type:
|
|
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
|
|
375
|
+
type: proto.Message.ButtonsResponseMessage.Type.DISPLAY_TEXT
|
|
376
|
+
};
|
|
377
|
+
break;
|
|
545
378
|
}
|
|
546
379
|
}
|
|
547
|
-
|
|
548
380
|
else if ('ptv' in message && message.ptv) {
|
|
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
|
-
}
|
|
381
|
+
const { videoMessage } = await prepareWAMessageMedia({ video: message.video }, options);
|
|
382
|
+
m.ptvMessage = videoMessage;
|
|
561
383
|
}
|
|
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
|
-
|
|
576
384
|
else if ('product' in message) {
|
|
577
|
-
const { imageMessage } = await prepareWAMessageMedia({ image: message.product.productImage }, options)
|
|
578
|
-
|
|
579
|
-
m.productMessage = Types_1.WAProto.Message.ProductMessage.fromObject({
|
|
385
|
+
const { imageMessage } = await prepareWAMessageMedia({ image: message.product.productImage }, options);
|
|
386
|
+
m.productMessage = WAProto.Message.ProductMessage.create({
|
|
580
387
|
...message,
|
|
581
388
|
product: {
|
|
582
389
|
...message.product,
|
|
583
|
-
productImage: imageMessage
|
|
390
|
+
productImage: imageMessage
|
|
584
391
|
}
|
|
585
|
-
})
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
392
|
+
});
|
|
393
|
+
}
|
|
394
|
+
else if ('listReply' in message) {
|
|
395
|
+
m.listResponseMessage = { ...message.listReply };
|
|
396
|
+
}
|
|
397
|
+
else if ('event' in message) {
|
|
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;
|
|
591
416
|
}
|
|
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
|
-
|
|
614
417
|
else if ('poll' in message) {
|
|
418
|
+
(_a = message.poll).selectableCount || (_a.selectableCount = 0);
|
|
419
|
+
(_b = message.poll).toAnnouncementGroup || (_b.toAnnouncementGroup = false);
|
|
615
420
|
if (!Array.isArray(message.poll.values)) {
|
|
616
|
-
throw new
|
|
421
|
+
throw new Boom('Invalid poll values', { statusCode: 400 });
|
|
617
422
|
}
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
423
|
+
if (message.poll.selectableCount < 0 || message.poll.selectableCount > message.poll.values.length) {
|
|
424
|
+
throw new Boom(`poll.selectableCount in poll should be >= 0 and <= ${message.poll.values.length}`, {
|
|
425
|
+
statusCode: 400
|
|
426
|
+
});
|
|
622
427
|
}
|
|
623
|
-
|
|
428
|
+
m.messageContextInfo = {
|
|
429
|
+
// encKey
|
|
430
|
+
messageSecret: message.poll.messageSecret || randomBytes(32)
|
|
431
|
+
};
|
|
624
432
|
const pollCreationMessage = {
|
|
625
433
|
name: message.poll.name,
|
|
626
|
-
selectableOptionsCount: message.poll
|
|
627
|
-
options: message.poll.values.map(optionName => ({ optionName }))
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
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 } : {})
|
|
434
|
+
selectableOptionsCount: message.poll.selectableCount,
|
|
435
|
+
options: message.poll.values.map(optionName => ({ optionName }))
|
|
436
|
+
};
|
|
437
|
+
if (message.poll.toAnnouncementGroup) {
|
|
438
|
+
// poll v2 is for community announcement groups (single select and multiple)
|
|
439
|
+
m.pollCreationMessageV2 = pollCreationMessage;
|
|
673
440
|
}
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
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 } : {})
|
|
441
|
+
else {
|
|
442
|
+
if (message.poll.selectableCount === 1) {
|
|
443
|
+
//poll v3 is for single select polls
|
|
444
|
+
m.pollCreationMessageV3 = pollCreationMessage;
|
|
445
|
+
}
|
|
446
|
+
else {
|
|
447
|
+
// poll for multiple choice polls
|
|
448
|
+
m.pollCreationMessage = pollCreationMessage;
|
|
449
|
+
}
|
|
731
450
|
}
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
else if ('sharePhoneNumber' in message) {
|
|
451
|
+
}
|
|
452
|
+
else if ('sharePhoneNumber' in message) {
|
|
735
453
|
m.protocolMessage = {
|
|
736
|
-
type:
|
|
737
|
-
}
|
|
454
|
+
type: proto.Message.ProtocolMessage.Type.SHARE_PHONE_NUMBER
|
|
455
|
+
};
|
|
738
456
|
}
|
|
739
|
-
|
|
740
457
|
else if ('requestPhoneNumber' in message) {
|
|
741
|
-
m.requestPhoneNumberMessage = {}
|
|
742
|
-
}
|
|
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
|
|
458
|
+
m.requestPhoneNumberMessage = {};
|
|
754
459
|
}
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
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
|
|
460
|
+
else if ('limitSharing' in message) {
|
|
461
|
+
m.protocolMessage = {
|
|
462
|
+
type: proto.Message.ProtocolMessage.Type.LIMIT_SHARING,
|
|
463
|
+
limitSharing: {
|
|
464
|
+
sharingLimited: message.limitSharing === true,
|
|
465
|
+
trigger: 1,
|
|
466
|
+
limitSharingSettingTimestamp: Date.now(),
|
|
467
|
+
initiatedByMe: true
|
|
814
468
|
}
|
|
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 }
|
|
469
|
+
};
|
|
838
470
|
}
|
|
839
|
-
|
|
840
|
-
|
|
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 }}
|
|
471
|
+
else {
|
|
472
|
+
m = await prepareWAMessageMedia(message, options);
|
|
867
473
|
}
|
|
868
|
-
|
|
869
|
-
|
|
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 }
|
|
474
|
+
if ('viewOnce' in message && !!message.viewOnce) {
|
|
475
|
+
m = { viewOnceMessage: { message: m } };
|
|
1010
476
|
}
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
const
|
|
1014
|
-
|
|
1015
|
-
|
|
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
|
-
}
|
|
477
|
+
if ('mentions' in message && message.mentions?.length) {
|
|
478
|
+
const messageType = Object.keys(m)[0];
|
|
479
|
+
const key = m[messageType];
|
|
480
|
+
if ('contextInfo' in key && !!key.contextInfo) {
|
|
481
|
+
key.contextInfo.mentionedJid = message.mentions;
|
|
1079
482
|
}
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
483
|
+
else if (key) {
|
|
484
|
+
key.contextInfo = {
|
|
485
|
+
mentionedJid: message.mentions
|
|
486
|
+
};
|
|
1084
487
|
}
|
|
1085
|
-
|
|
1086
|
-
m = { interactiveMessage }
|
|
1087
488
|
}
|
|
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
|
-
|
|
1101
489
|
if ('edit' in message) {
|
|
1102
490
|
m = {
|
|
1103
491
|
protocolMessage: {
|
|
1104
492
|
key: message.edit,
|
|
1105
493
|
editedMessage: m,
|
|
1106
494
|
timestampMs: Date.now(),
|
|
1107
|
-
type:
|
|
495
|
+
type: WAProto.Message.ProtocolMessage.Type.MESSAGE_EDIT
|
|
1108
496
|
}
|
|
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;
|
|
1109
507
|
}
|
|
1110
508
|
}
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
509
|
+
return WAProto.Message.create(m);
|
|
510
|
+
};
|
|
511
|
+
export const generateWAMessageFromContent = (jid, message, options) => {
|
|
512
|
+
// set timestamp to now
|
|
513
|
+
// if not specified
|
|
1116
514
|
if (!options.timestamp) {
|
|
1117
|
-
options.timestamp = new Date()
|
|
515
|
+
options.timestamp = new Date();
|
|
1118
516
|
}
|
|
1119
|
-
|
|
1120
|
-
const
|
|
1121
|
-
const
|
|
1122
|
-
const
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
if (quoted && !WABinary_1.isJidNewsletter(jid)) {
|
|
517
|
+
const innerMessage = normalizeMessageContent(message);
|
|
518
|
+
const key = getContentType(innerMessage);
|
|
519
|
+
const timestamp = unixTimestampSeconds(options.timestamp);
|
|
520
|
+
const { quoted, userJid } = options;
|
|
521
|
+
if (quoted && !isJidNewsletter(jid)) {
|
|
1126
522
|
const participant = quoted.key.fromMe
|
|
1127
|
-
? userJid
|
|
1128
|
-
: quoted.participant || quoted.key.participant || quoted.key.remoteJid
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
const quotedContent = quotedMsg[msgType]
|
|
1136
|
-
|
|
523
|
+
? userJid // TODO: Add support for LIDs
|
|
524
|
+
: quoted.participant || quoted.key.participant || quoted.key.remoteJid;
|
|
525
|
+
let quotedMsg = normalizeMessageContent(quoted.message);
|
|
526
|
+
const msgType = getContentType(quotedMsg);
|
|
527
|
+
// strip any redundant properties
|
|
528
|
+
quotedMsg = proto.Message.create({ [msgType]: quotedMsg[msgType] });
|
|
529
|
+
const quotedContent = quotedMsg[msgType];
|
|
1137
530
|
if (typeof quotedContent === 'object' && quotedContent && 'contextInfo' in quotedContent) {
|
|
1138
|
-
delete quotedContent.contextInfo
|
|
1139
|
-
}
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
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
|
-
|
|
531
|
+
delete quotedContent.contextInfo;
|
|
532
|
+
}
|
|
533
|
+
const contextInfo = ('contextInfo' in innerMessage[key] && innerMessage[key]?.contextInfo) || {};
|
|
534
|
+
contextInfo.participant = jidNormalizedUser(participant);
|
|
535
|
+
contextInfo.stanzaId = quoted.key.id;
|
|
536
|
+
contextInfo.quotedMessage = quotedMsg;
|
|
537
|
+
// if a participant is quoted, then it must be a group
|
|
538
|
+
// hence, remoteJid of group must also be entered
|
|
1157
539
|
if (jid !== quoted.key.remoteJid) {
|
|
1158
|
-
contextInfo.remoteJid = quoted.key.remoteJid
|
|
540
|
+
contextInfo.remoteJid = quoted.key.remoteJid;
|
|
1159
541
|
}
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
} else {
|
|
1164
|
-
innerMessage[key].contextInfo = contextInfo
|
|
542
|
+
if (contextInfo && innerMessage[key]) {
|
|
543
|
+
/* @ts-ignore */
|
|
544
|
+
innerMessage[key].contextInfo = contextInfo;
|
|
1165
545
|
}
|
|
1166
546
|
}
|
|
1167
|
-
|
|
1168
|
-
if
|
|
547
|
+
if (
|
|
548
|
+
// if we want to send a disappearing message
|
|
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
|
|
1169
553
|
key !== 'ephemeralMessage' &&
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
...message.messageContextInfo
|
|
1174
|
-
}
|
|
554
|
+
// newsletters don't support ephemeral messages
|
|
555
|
+
!isJidNewsletter(jid)) {
|
|
556
|
+
/* @ts-ignore */
|
|
1175
557
|
innerMessage[key].contextInfo = {
|
|
1176
558
|
...(innerMessage[key].contextInfo || {}),
|
|
1177
|
-
expiration: options.ephemeralExpiration
|
|
1178
|
-
|
|
559
|
+
expiration: options.ephemeralExpiration || WA_DEFAULT_EPHEMERAL
|
|
560
|
+
//ephemeralSettingTimestamp: options.ephemeralOptions.eph_setting_ts?.toString()
|
|
561
|
+
};
|
|
1179
562
|
}
|
|
1180
|
-
|
|
1181
|
-
message = Types_1.WAProto.Message.fromObject(message)
|
|
1182
|
-
|
|
563
|
+
message = WAProto.Message.create(message);
|
|
1183
564
|
const messageJSON = {
|
|
1184
565
|
key: {
|
|
1185
566
|
remoteJid: jid,
|
|
1186
567
|
fromMe: true,
|
|
1187
|
-
id: options?.messageId ||
|
|
568
|
+
id: options?.messageId || generateMessageIDV2()
|
|
1188
569
|
},
|
|
1189
570
|
message: message,
|
|
1190
571
|
messageTimestamp: timestamp,
|
|
1191
572
|
messageStubParameters: [],
|
|
1192
|
-
participant:
|
|
1193
|
-
status:
|
|
1194
|
-
}
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
const getContentType = (content) => {
|
|
573
|
+
participant: isJidGroup(jid) || isJidStatusBroadcast(jid) ? userJid : undefined, // TODO: Add support for LIDs
|
|
574
|
+
status: WAMessageStatus.PENDING
|
|
575
|
+
};
|
|
576
|
+
return WAProto.WebMessageInfo.fromObject(messageJSON);
|
|
577
|
+
};
|
|
578
|
+
export const generateWAMessage = async (jid, content, options) => {
|
|
579
|
+
// ensure msg ID is with every log
|
|
580
|
+
options.logger = options?.logger?.child({ msgId: options.messageId });
|
|
581
|
+
// Pass jid in the options to generateWAMessageContent
|
|
582
|
+
return generateWAMessageFromContent(jid, await generateWAMessageContent(content, { ...options, jid }), options);
|
|
583
|
+
};
|
|
584
|
+
/** Get the key to access the true type of content */
|
|
585
|
+
export const getContentType = (content) => {
|
|
1206
586
|
if (content) {
|
|
1207
|
-
const keys = Object.keys(content)
|
|
1208
|
-
const key = keys.find(k => (k === 'conversation' || k.
|
|
1209
|
-
|
|
1210
|
-
return key
|
|
587
|
+
const keys = Object.keys(content);
|
|
588
|
+
const key = keys.find(k => (k === 'conversation' || k.includes('Message')) && k !== 'senderKeyDistributionMessage');
|
|
589
|
+
return key;
|
|
1211
590
|
}
|
|
1212
|
-
}
|
|
1213
|
-
|
|
591
|
+
};
|
|
1214
592
|
/**
|
|
1215
593
|
* Normalizes ephemeral, view once messages to regular message content
|
|
1216
594
|
* Eg. image messages in ephemeral messages, in view once messages etc.
|
|
1217
595
|
* @param content
|
|
1218
596
|
* @returns
|
|
1219
597
|
*/
|
|
1220
|
-
const normalizeMessageContent = (content) => {
|
|
598
|
+
export const normalizeMessageContent = (content) => {
|
|
1221
599
|
if (!content) {
|
|
1222
|
-
return undefined
|
|
600
|
+
return undefined;
|
|
1223
601
|
}
|
|
1224
|
-
|
|
602
|
+
// set max iterations to prevent an infinite loop
|
|
1225
603
|
for (let i = 0; i < 5; i++) {
|
|
1226
|
-
const inner = getFutureProofMessage(content)
|
|
604
|
+
const inner = getFutureProofMessage(content);
|
|
1227
605
|
if (!inner) {
|
|
1228
|
-
break
|
|
606
|
+
break;
|
|
1229
607
|
}
|
|
1230
|
-
|
|
1231
|
-
content = inner.message
|
|
608
|
+
content = inner.message;
|
|
1232
609
|
}
|
|
1233
|
-
|
|
1234
|
-
return content
|
|
1235
|
-
|
|
610
|
+
return content;
|
|
1236
611
|
function getFutureProofMessage(message) {
|
|
1237
|
-
return (
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
|
|
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
|
-
|
|
612
|
+
return (message?.ephemeralMessage ||
|
|
613
|
+
message?.viewOnceMessage ||
|
|
614
|
+
message?.documentWithCaptionMessage ||
|
|
615
|
+
message?.viewOnceMessageV2 ||
|
|
616
|
+
message?.viewOnceMessageV2Extension ||
|
|
617
|
+
message?.editedMessage);
|
|
618
|
+
}
|
|
619
|
+
};
|
|
1264
620
|
/**
|
|
1265
621
|
* Extract the true message content from a message
|
|
1266
622
|
* Eg. extracts the inner message from a disappearing message/view once message
|
|
1267
623
|
*/
|
|
1268
|
-
const extractMessageContent = (content) => {
|
|
1269
|
-
const
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
if (header ? msg.header?.imageMessage : msg.imageMessage) {
|
|
1273
|
-
return { imageMessage: header ? msg.header.imageMessage : msg.imageMessage }
|
|
624
|
+
export const extractMessageContent = (content) => {
|
|
625
|
+
const extractFromTemplateMessage = (msg) => {
|
|
626
|
+
if (msg.imageMessage) {
|
|
627
|
+
return { imageMessage: msg.imageMessage };
|
|
1274
628
|
}
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
return { documentMessage: header ? msg.header.documentMessage : msg.documentMessage }
|
|
629
|
+
else if (msg.documentMessage) {
|
|
630
|
+
return { documentMessage: msg.documentMessage };
|
|
1278
631
|
}
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
return { videoMessage: header ? msg.header.videoMessage: msg.videoMessage }
|
|
632
|
+
else if (msg.videoMessage) {
|
|
633
|
+
return { videoMessage: msg.videoMessage };
|
|
1282
634
|
}
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
return { locationMessage: header ? msg.header.locationMessage : msg.locationMessage }
|
|
635
|
+
else if (msg.locationMessage) {
|
|
636
|
+
return { locationMessage: msg.locationMessage };
|
|
1286
637
|
}
|
|
1287
|
-
|
|
1288
|
-
else if (header ? msg.header?.productMessage : msg.productMessage) {
|
|
1289
|
-
return { productMessage: header ? msg.header.productMessage : msg.productMessage }
|
|
1290
|
-
}
|
|
1291
|
-
|
|
1292
638
|
else {
|
|
1293
639
|
return {
|
|
1294
|
-
conversation: 'contentText' in msg
|
|
1295
|
-
|
|
1296
|
-
: ('hydratedContentText' in msg ? msg.hydratedContentText : 'body' in msg ? msg.body.text : '')
|
|
1297
|
-
}
|
|
640
|
+
conversation: 'contentText' in msg ? msg.contentText : 'hydratedContentText' in msg ? msg.hydratedContentText : ''
|
|
641
|
+
};
|
|
1298
642
|
}
|
|
1299
|
-
}
|
|
1300
|
-
|
|
1301
|
-
content = normalizeMessageContent(content)
|
|
1302
|
-
|
|
643
|
+
};
|
|
644
|
+
content = normalizeMessageContent(content);
|
|
1303
645
|
if (content?.buttonsMessage) {
|
|
1304
|
-
return
|
|
1305
|
-
}
|
|
1306
|
-
|
|
1307
|
-
if (content?.interactiveMessage) {
|
|
1308
|
-
return extractFromButtonsMessage(content.interactiveMessage)
|
|
646
|
+
return extractFromTemplateMessage(content.buttonsMessage);
|
|
1309
647
|
}
|
|
1310
|
-
|
|
1311
|
-
if (content?.templateMessage?.interactiveMessageTemplate) {
|
|
1312
|
-
return extractFromButtonsMessage(content?.templateMessage?.interactiveMessageTemplate)
|
|
1313
|
-
}
|
|
1314
|
-
|
|
1315
648
|
if (content?.templateMessage?.hydratedFourRowTemplate) {
|
|
1316
|
-
return
|
|
649
|
+
return extractFromTemplateMessage(content?.templateMessage?.hydratedFourRowTemplate);
|
|
1317
650
|
}
|
|
1318
|
-
|
|
1319
651
|
if (content?.templateMessage?.hydratedTemplate) {
|
|
1320
|
-
return
|
|
652
|
+
return extractFromTemplateMessage(content?.templateMessage?.hydratedTemplate);
|
|
1321
653
|
}
|
|
1322
|
-
|
|
1323
654
|
if (content?.templateMessage?.fourRowTemplate) {
|
|
1324
|
-
return
|
|
655
|
+
return extractFromTemplateMessage(content?.templateMessage?.fourRowTemplate);
|
|
1325
656
|
}
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
}
|
|
1329
|
-
|
|
657
|
+
return content;
|
|
658
|
+
};
|
|
1330
659
|
/**
|
|
1331
660
|
* Returns the device predicted by message ID
|
|
1332
661
|
*/
|
|
1333
|
-
const getDevice = (id) => /^3A.{18}$/.test(id)
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
662
|
+
export const getDevice = (id) => /^3A.{18}$/.test(id)
|
|
663
|
+
? 'ios'
|
|
664
|
+
: /^3E.{20}$/.test(id)
|
|
665
|
+
? 'web'
|
|
666
|
+
: /^(.{21}|.{32})$/.test(id)
|
|
667
|
+
? 'android'
|
|
668
|
+
: /^(3F|.{18}$)/.test(id)
|
|
669
|
+
? 'desktop'
|
|
670
|
+
: 'unknown';
|
|
1339
671
|
/** Upserts a receipt in the message */
|
|
1340
|
-
const updateMessageWithReceipt = (msg, receipt) => {
|
|
1341
|
-
msg.userReceipt = msg.userReceipt || []
|
|
1342
|
-
const recp = msg.userReceipt.find(m => m.userJid === receipt.userJid)
|
|
1343
|
-
|
|
672
|
+
export const updateMessageWithReceipt = (msg, receipt) => {
|
|
673
|
+
msg.userReceipt = msg.userReceipt || [];
|
|
674
|
+
const recp = msg.userReceipt.find(m => m.userJid === receipt.userJid);
|
|
1344
675
|
if (recp) {
|
|
1345
|
-
Object.assign(recp, receipt)
|
|
676
|
+
Object.assign(recp, receipt);
|
|
1346
677
|
}
|
|
1347
|
-
|
|
1348
678
|
else {
|
|
1349
|
-
msg.userReceipt.push(receipt)
|
|
679
|
+
msg.userReceipt.push(receipt);
|
|
1350
680
|
}
|
|
1351
|
-
}
|
|
1352
|
-
|
|
681
|
+
};
|
|
1353
682
|
/** Update the message with a new reaction */
|
|
1354
|
-
const updateMessageWithReaction = (msg, reaction) => {
|
|
1355
|
-
const authorID =
|
|
1356
|
-
const reactions = (msg.reactions || [])
|
|
1357
|
-
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
msg.reactions = reactions
|
|
1362
|
-
}
|
|
1363
|
-
|
|
683
|
+
export const updateMessageWithReaction = (msg, reaction) => {
|
|
684
|
+
const authorID = getKeyAuthor(reaction.key);
|
|
685
|
+
const reactions = (msg.reactions || []).filter(r => getKeyAuthor(r.key) !== authorID);
|
|
686
|
+
reaction.text = reaction.text || '';
|
|
687
|
+
reactions.push(reaction);
|
|
688
|
+
msg.reactions = reactions;
|
|
689
|
+
};
|
|
1364
690
|
/** Update the message with a new poll update */
|
|
1365
|
-
const updateMessageWithPollUpdate = (msg, update) => {
|
|
1366
|
-
const authorID =
|
|
1367
|
-
const
|
|
1368
|
-
.filter(r => generics_1.getKeyAuthor(r.pollUpdateMessageKey) !== authorID)
|
|
1369
|
-
|
|
691
|
+
export const updateMessageWithPollUpdate = (msg, update) => {
|
|
692
|
+
const authorID = getKeyAuthor(update.pollUpdateMessageKey);
|
|
693
|
+
const reactions = (msg.pollUpdates || []).filter(r => getKeyAuthor(r.pollUpdateMessageKey) !== authorID);
|
|
1370
694
|
if (update.vote?.selectedOptions?.length) {
|
|
1371
|
-
|
|
695
|
+
reactions.push(update);
|
|
1372
696
|
}
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
}
|
|
1376
|
-
|
|
697
|
+
msg.pollUpdates = reactions;
|
|
698
|
+
};
|
|
1377
699
|
/**
|
|
1378
700
|
* Aggregates all poll updates in a poll.
|
|
1379
701
|
* @param msg the poll creation message
|
|
1380
702
|
* @param meId your jid
|
|
1381
703
|
* @returns A list of options & their voters
|
|
1382
704
|
*/
|
|
1383
|
-
function getAggregateVotesInPollMessage({ message, pollUpdates }, meId) {
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
|
|
1387
|
-
|
|
705
|
+
export function getAggregateVotesInPollMessage({ message, pollUpdates }, meId) {
|
|
706
|
+
const opts = message?.pollCreationMessage?.options ||
|
|
707
|
+
message?.pollCreationMessageV2?.options ||
|
|
708
|
+
message?.pollCreationMessageV3?.options ||
|
|
709
|
+
[];
|
|
1388
710
|
const voteHashMap = opts.reduce((acc, opt) => {
|
|
1389
|
-
const hash =
|
|
711
|
+
const hash = sha256(Buffer.from(opt.optionName || '')).toString();
|
|
1390
712
|
acc[hash] = {
|
|
1391
713
|
name: opt.optionName || '',
|
|
1392
714
|
voters: []
|
|
1393
|
-
}
|
|
1394
|
-
|
|
1395
|
-
|
|
1396
|
-
}, {})
|
|
1397
|
-
|
|
715
|
+
};
|
|
716
|
+
return acc;
|
|
717
|
+
}, {});
|
|
1398
718
|
for (const update of pollUpdates || []) {
|
|
1399
|
-
const { vote } = update
|
|
1400
|
-
|
|
719
|
+
const { vote } = update;
|
|
1401
720
|
if (!vote) {
|
|
1402
|
-
continue
|
|
721
|
+
continue;
|
|
1403
722
|
}
|
|
1404
|
-
|
|
1405
723
|
for (const option of vote.selectedOptions || []) {
|
|
1406
|
-
const hash = option.toString()
|
|
1407
|
-
let data = voteHashMap[hash]
|
|
1408
|
-
|
|
724
|
+
const hash = option.toString();
|
|
725
|
+
let data = voteHashMap[hash];
|
|
1409
726
|
if (!data) {
|
|
1410
727
|
voteHashMap[hash] = {
|
|
1411
728
|
name: 'Unknown',
|
|
1412
729
|
voters: []
|
|
1413
|
-
}
|
|
1414
|
-
|
|
1415
|
-
data = voteHashMap[hash]
|
|
730
|
+
};
|
|
731
|
+
data = voteHashMap[hash];
|
|
1416
732
|
}
|
|
1417
|
-
|
|
1418
|
-
voteHashMap[hash].voters.push(generics_1.getKeyAuthor(update.pollUpdateMessageKey, meId))
|
|
733
|
+
voteHashMap[hash].voters.push(getKeyAuthor(update.pollUpdateMessageKey, meId));
|
|
1419
734
|
}
|
|
1420
735
|
}
|
|
1421
|
-
|
|
1422
|
-
return Object.values(voteHashMap)
|
|
736
|
+
return Object.values(voteHashMap);
|
|
1423
737
|
}
|
|
1424
|
-
|
|
1425
738
|
/** Given a list of message keys, aggregates them by chat & sender. Useful for sending read receipts in bulk */
|
|
1426
|
-
const aggregateMessageKeysNotFromMe = (keys) => {
|
|
1427
|
-
const keyMap = {}
|
|
1428
|
-
|
|
739
|
+
export const aggregateMessageKeysNotFromMe = (keys) => {
|
|
740
|
+
const keyMap = {};
|
|
1429
741
|
for (const { remoteJid, id, participant, fromMe } of keys) {
|
|
1430
742
|
if (!fromMe) {
|
|
1431
|
-
const uqKey = `${remoteJid}:${participant || ''}
|
|
1432
|
-
|
|
743
|
+
const uqKey = `${remoteJid}:${participant || ''}`;
|
|
1433
744
|
if (!keyMap[uqKey]) {
|
|
1434
745
|
keyMap[uqKey] = {
|
|
1435
746
|
jid: remoteJid,
|
|
1436
747
|
participant: participant,
|
|
1437
748
|
messageIds: []
|
|
1438
|
-
}
|
|
749
|
+
};
|
|
1439
750
|
}
|
|
1440
|
-
|
|
1441
|
-
keyMap[uqKey].messageIds.push(id)
|
|
751
|
+
keyMap[uqKey].messageIds.push(id);
|
|
1442
752
|
}
|
|
1443
753
|
}
|
|
1444
|
-
|
|
1445
|
-
|
|
1446
|
-
|
|
1447
|
-
|
|
1448
|
-
const REUPLOAD_REQUIRED_STATUS = [410, 404]
|
|
1449
|
-
|
|
754
|
+
return Object.values(keyMap);
|
|
755
|
+
};
|
|
756
|
+
const REUPLOAD_REQUIRED_STATUS = [410, 404];
|
|
1450
757
|
/**
|
|
1451
758
|
* Downloads the given message. Throws an error if it's not a media message
|
|
1452
759
|
*/
|
|
1453
|
-
const downloadMediaMessage = async (message, type, options, ctx) => {
|
|
760
|
+
export const downloadMediaMessage = async (message, type, options, ctx) => {
|
|
1454
761
|
const result = await downloadMsg().catch(async (error) => {
|
|
1455
|
-
if (ctx &&
|
|
1456
|
-
|
|
1457
|
-
|
|
1458
|
-
|
|
762
|
+
if (ctx &&
|
|
763
|
+
typeof error?.status === 'number' && // treat errors with status as HTTP failures requiring reupload
|
|
764
|
+
REUPLOAD_REQUIRED_STATUS.includes(error.status)) {
|
|
765
|
+
ctx.logger.info({ key: message.key }, 'sending reupload media request...');
|
|
1459
766
|
// request reupload
|
|
1460
|
-
message = await ctx.reuploadRequest(message)
|
|
1461
|
-
|
|
1462
|
-
|
|
1463
|
-
|
|
1464
|
-
return result
|
|
767
|
+
message = await ctx.reuploadRequest(message);
|
|
768
|
+
const result = await downloadMsg();
|
|
769
|
+
return result;
|
|
1465
770
|
}
|
|
1466
|
-
|
|
1467
|
-
|
|
1468
|
-
|
|
1469
|
-
|
|
1470
|
-
return result
|
|
1471
|
-
|
|
771
|
+
throw error;
|
|
772
|
+
});
|
|
773
|
+
return result;
|
|
1472
774
|
async function downloadMsg() {
|
|
1473
|
-
const mContent = extractMessageContent(message.message)
|
|
1474
|
-
|
|
775
|
+
const mContent = extractMessageContent(message.message);
|
|
1475
776
|
if (!mContent) {
|
|
1476
|
-
throw new
|
|
777
|
+
throw new Boom('No message present', { statusCode: 400, data: message });
|
|
1477
778
|
}
|
|
1478
|
-
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
const media = contentType === 'productMessage' ? mContent[contentType]?.product?.productImage : mContent[contentType]
|
|
1482
|
-
|
|
779
|
+
const contentType = getContentType(mContent);
|
|
780
|
+
let mediaType = contentType?.replace('Message', '');
|
|
781
|
+
const media = mContent[contentType];
|
|
1483
782
|
if (!media || typeof media !== 'object' || (!('url' in media) && !('thumbnailDirectPath' in media))) {
|
|
1484
|
-
throw new
|
|
783
|
+
throw new Boom(`"${contentType}" message is not a media message`);
|
|
1485
784
|
}
|
|
1486
|
-
|
|
1487
|
-
let download
|
|
1488
|
-
|
|
785
|
+
let download;
|
|
1489
786
|
if ('thumbnailDirectPath' in media && !('url' in media)) {
|
|
1490
787
|
download = {
|
|
1491
788
|
directPath: media.thumbnailDirectPath,
|
|
1492
789
|
mediaKey: media.mediaKey
|
|
1493
|
-
}
|
|
1494
|
-
mediaType = 'thumbnail-link'
|
|
790
|
+
};
|
|
791
|
+
mediaType = 'thumbnail-link';
|
|
1495
792
|
}
|
|
1496
|
-
|
|
1497
793
|
else {
|
|
1498
|
-
download = media
|
|
794
|
+
download = media;
|
|
1499
795
|
}
|
|
1500
|
-
|
|
1501
|
-
const stream = await messages_media_1.downloadContentFromMessage(download, mediaType, options)
|
|
1502
|
-
|
|
796
|
+
const stream = await downloadContentFromMessage(download, mediaType, options);
|
|
1503
797
|
if (type === 'buffer') {
|
|
1504
|
-
const bufferArray = []
|
|
1505
|
-
|
|
798
|
+
const bufferArray = [];
|
|
1506
799
|
for await (const chunk of stream) {
|
|
1507
|
-
bufferArray.push(chunk)
|
|
800
|
+
bufferArray.push(chunk);
|
|
1508
801
|
}
|
|
1509
|
-
|
|
1510
|
-
|
|
1511
|
-
|
|
1512
|
-
|
|
1513
|
-
|
|
1514
|
-
|
|
1515
|
-
|
|
1516
|
-
|
|
1517
|
-
|
|
1518
|
-
|
|
1519
|
-
|
|
1520
|
-
|
|
1521
|
-
|
|
1522
|
-
|| content?.imageMessage
|
|
1523
|
-
|| content?.videoMessage
|
|
1524
|
-
|| content?.audioMessage
|
|
1525
|
-
|| content?.stickerMessage
|
|
1526
|
-
|
|
802
|
+
return Buffer.concat(bufferArray);
|
|
803
|
+
}
|
|
804
|
+
return stream;
|
|
805
|
+
}
|
|
806
|
+
};
|
|
807
|
+
/** Checks whether the given message is a media message; if it is returns the inner content */
|
|
808
|
+
export const assertMediaContent = (content) => {
|
|
809
|
+
content = extractMessageContent(content);
|
|
810
|
+
const mediaContent = content?.documentMessage ||
|
|
811
|
+
content?.imageMessage ||
|
|
812
|
+
content?.videoMessage ||
|
|
813
|
+
content?.audioMessage ||
|
|
814
|
+
content?.stickerMessage;
|
|
1527
815
|
if (!mediaContent) {
|
|
1528
|
-
throw new
|
|
816
|
+
throw new Boom('given message is not a media message', { statusCode: 400, data: content });
|
|
1529
817
|
}
|
|
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
|
-
}
|
|
818
|
+
return mediaContent;
|
|
819
|
+
};
|
|
820
|
+
//# sourceMappingURL=messages.js.map
|