@fer2809fl/baileys 1.4.9 → 7.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (481) hide show
  1. package/LICENSE +21 -674
  2. package/README.md +556 -523
  3. package/WAProto/GenerateStatics.sh +3 -4
  4. package/WAProto/WAProto.proto +1215 -511
  5. package/WAProto/fix-imports.js +85 -0
  6. package/WAProto/index.d.ts +4347 -45387
  7. package/WAProto/index.js +65475 -137445
  8. package/engine-requirements.js +10 -0
  9. package/lib/Defaults/index.d.ts +34 -18
  10. package/lib/Defaults/index.d.ts.map +1 -0
  11. package/lib/Defaults/index.js +95 -67
  12. package/lib/Defaults/index.js.map +1 -0
  13. package/lib/Signal/Group/ciphertext-message.d.ts +1 -0
  14. package/lib/Signal/Group/ciphertext-message.d.ts.map +1 -0
  15. package/lib/Signal/Group/ciphertext-message.js +2 -5
  16. package/lib/Signal/Group/ciphertext-message.js.map +1 -0
  17. package/lib/Signal/Group/group-session-builder.d.ts +4 -3
  18. package/lib/Signal/Group/group-session-builder.d.ts.map +1 -0
  19. package/lib/Signal/Group/group-session-builder.js +7 -41
  20. package/lib/Signal/Group/group-session-builder.js.map +1 -0
  21. package/lib/Signal/Group/group_cipher.d.ts +4 -4
  22. package/lib/Signal/Group/group_cipher.d.ts.map +1 -0
  23. package/lib/Signal/Group/group_cipher.js +37 -60
  24. package/lib/Signal/Group/group_cipher.js.map +1 -0
  25. package/lib/Signal/Group/index.d.ts +12 -11
  26. package/lib/Signal/Group/index.d.ts.map +1 -0
  27. package/lib/Signal/Group/index.js +12 -57
  28. package/lib/Signal/Group/index.js.map +1 -0
  29. package/lib/Signal/Group/keyhelper.d.ts +2 -1
  30. package/lib/Signal/Group/keyhelper.d.ts.map +1 -0
  31. package/lib/Signal/Group/keyhelper.js +7 -44
  32. package/lib/Signal/Group/keyhelper.js.map +1 -0
  33. package/lib/Signal/Group/sender-chain-key.d.ts +3 -2
  34. package/lib/Signal/Group/sender-chain-key.d.ts.map +1 -0
  35. package/lib/Signal/Group/sender-chain-key.js +7 -15
  36. package/lib/Signal/Group/sender-chain-key.js.map +1 -0
  37. package/lib/Signal/Group/sender-key-distribution-message.d.ts +2 -1
  38. package/lib/Signal/Group/sender-key-distribution-message.d.ts.map +1 -0
  39. package/lib/Signal/Group/sender-key-distribution-message.js +8 -11
  40. package/lib/Signal/Group/sender-key-distribution-message.js.map +1 -0
  41. package/lib/Signal/Group/sender-key-message.d.ts +2 -1
  42. package/lib/Signal/Group/sender-key-message.d.ts.map +1 -0
  43. package/lib/Signal/Group/sender-key-message.js +9 -12
  44. package/lib/Signal/Group/sender-key-message.js.map +1 -0
  45. package/lib/Signal/Group/sender-key-name.d.ts +1 -0
  46. package/lib/Signal/Group/sender-key-name.d.ts.map +1 -0
  47. package/lib/Signal/Group/sender-key-name.js +2 -5
  48. package/lib/Signal/Group/sender-key-name.js.map +1 -0
  49. package/lib/Signal/Group/sender-key-record.d.ts +3 -2
  50. package/lib/Signal/Group/sender-key-record.d.ts.map +1 -0
  51. package/lib/Signal/Group/sender-key-record.js +12 -37
  52. package/lib/Signal/Group/sender-key-record.js.map +1 -0
  53. package/lib/Signal/Group/sender-key-state.d.ts +7 -6
  54. package/lib/Signal/Group/sender-key-state.d.ts.map +1 -0
  55. package/lib/Signal/Group/sender-key-state.js +27 -42
  56. package/lib/Signal/Group/sender-key-state.js.map +1 -0
  57. package/lib/Signal/Group/sender-message-key.d.ts +1 -0
  58. package/lib/Signal/Group/sender-message-key.d.ts.map +1 -0
  59. package/lib/Signal/Group/sender-message-key.js +4 -7
  60. package/lib/Signal/Group/sender-message-key.js.map +1 -0
  61. package/lib/Signal/libsignal.d.ts +5 -3
  62. package/lib/Signal/libsignal.d.ts.map +1 -0
  63. package/lib/Signal/libsignal.js +347 -90
  64. package/lib/Signal/libsignal.js.map +1 -0
  65. package/lib/Signal/lid-mapping.d.ts +23 -0
  66. package/lib/Signal/lid-mapping.d.ts.map +1 -0
  67. package/lib/Signal/lid-mapping.js +277 -0
  68. package/lib/Signal/lid-mapping.js.map +1 -0
  69. package/lib/Socket/Client/index.d.ts +3 -2
  70. package/lib/Socket/Client/index.d.ts.map +1 -0
  71. package/lib/Socket/Client/index.js +3 -18
  72. package/lib/Socket/Client/index.js.map +1 -0
  73. package/lib/Socket/Client/types.d.ts +4 -4
  74. package/lib/Socket/Client/types.d.ts.map +1 -0
  75. package/lib/Socket/Client/types.js +4 -6
  76. package/lib/Socket/Client/types.js.map +1 -0
  77. package/lib/Socket/Client/websocket.d.ts +3 -3
  78. package/lib/Socket/Client/websocket.d.ts.map +1 -0
  79. package/lib/Socket/Client/websocket.js +21 -78
  80. package/lib/Socket/Client/websocket.js.map +1 -0
  81. package/lib/Socket/business.d.ts +205 -93
  82. package/lib/Socket/business.d.ts.map +1 -0
  83. package/lib/Socket/business.js +162 -43
  84. package/lib/Socket/business.js.map +1 -0
  85. package/lib/Socket/chats.d.ts +77 -28
  86. package/lib/Socket/chats.d.ts.map +1 -0
  87. package/lib/Socket/chats.js +639 -248
  88. package/lib/Socket/chats.js.map +1 -0
  89. package/lib/Socket/communities.d.ts +340 -0
  90. package/lib/Socket/communities.d.ts.map +1 -0
  91. package/lib/Socket/communities.js +434 -0
  92. package/lib/Socket/communities.js.map +1 -0
  93. package/lib/Socket/groups.d.ts +93 -46
  94. package/lib/Socket/groups.d.ts.map +1 -0
  95. package/lib/Socket/groups.js +260 -102
  96. package/lib/Socket/groups.js.map +1 -0
  97. package/lib/Socket/index.d.ts +253 -98
  98. package/lib/Socket/index.d.ts.map +1 -0
  99. package/lib/Socket/index.js +11 -9
  100. package/lib/Socket/index.js.map +1 -0
  101. package/lib/Socket/messages-recv.d.ts +192 -83
  102. package/lib/Socket/messages-recv.d.ts.map +1 -0
  103. package/lib/Socket/messages-recv.js +1314 -559
  104. package/lib/Socket/messages-recv.js.map +1 -0
  105. package/lib/Socket/messages-send.d.ts +190 -75
  106. package/lib/Socket/messages-send.d.ts.map +1 -0
  107. package/lib/Socket/messages-send.js +937 -581
  108. package/lib/Socket/messages-send.js.map +1 -0
  109. package/lib/Socket/mex.d.ts +4 -0
  110. package/lib/Socket/mex.d.ts.map +1 -0
  111. package/lib/Socket/mex.js +62 -0
  112. package/lib/Socket/mex.js.map +1 -0
  113. package/lib/Socket/newsletter.d.ts +129 -73
  114. package/lib/Socket/newsletter.d.ts.map +1 -0
  115. package/lib/Socket/newsletter.js +373 -222
  116. package/lib/Socket/newsletter.js.map +1 -0
  117. package/lib/Socket/smgss.d.ts +119 -0
  118. package/lib/Socket/smgss.d.ts.map +1 -0
  119. package/lib/Socket/smgss.js +453 -0
  120. package/lib/Socket/smgss.js.map +1 -0
  121. package/lib/Socket/socket.d.ts +59 -270
  122. package/lib/Socket/socket.d.ts.map +1 -0
  123. package/lib/Socket/socket.js +738 -326
  124. package/lib/Socket/socket.js.map +1 -0
  125. package/lib/Store/index.d.ts +4 -2
  126. package/lib/Store/index.d.ts.map +1 -0
  127. package/lib/Store/index.js +4 -8
  128. package/lib/Store/index.js.map +1 -0
  129. package/lib/Store/make-in-memory-store.d.ts +74 -60
  130. package/lib/Store/make-in-memory-store.d.ts.map +1 -0
  131. package/lib/Store/make-in-memory-store.js +130 -119
  132. package/lib/Store/make-in-memory-store.js.map +1 -0
  133. package/lib/Store/make-ordered-dictionary.d.ts +4 -3
  134. package/lib/Store/make-ordered-dictionary.d.ts.map +1 -0
  135. package/lib/Store/make-ordered-dictionary.js +5 -6
  136. package/lib/Store/make-ordered-dictionary.js.map +1 -0
  137. package/lib/Store/object-repository.d.ts +6 -3
  138. package/lib/Store/object-repository.d.ts.map +1 -0
  139. package/lib/Store/object-repository.js +2 -5
  140. package/lib/Store/object-repository.js.map +1 -0
  141. package/lib/Types/Auth.d.ts +19 -5
  142. package/lib/Types/Auth.d.ts.map +1 -0
  143. package/lib/Types/Auth.js +2 -2
  144. package/lib/Types/Auth.js.map +1 -0
  145. package/lib/Types/Bussines.d.ts +25 -0
  146. package/lib/Types/Bussines.d.ts.map +1 -0
  147. package/lib/Types/Bussines.js +2 -0
  148. package/lib/Types/Bussines.js.map +1 -0
  149. package/lib/Types/Call.d.ts +3 -1
  150. package/lib/Types/Call.d.ts.map +1 -0
  151. package/lib/Types/Call.js +2 -2
  152. package/lib/Types/Call.js.map +1 -0
  153. package/lib/Types/Chat.d.ts +24 -9
  154. package/lib/Types/Chat.d.ts.map +1 -0
  155. package/lib/Types/Chat.js +8 -4
  156. package/lib/Types/Chat.js.map +1 -0
  157. package/lib/Types/Contact.d.ts +7 -4
  158. package/lib/Types/Contact.d.ts.map +1 -0
  159. package/lib/Types/Contact.js +2 -2
  160. package/lib/Types/Contact.js.map +1 -0
  161. package/lib/Types/Events.d.ts +90 -33
  162. package/lib/Types/Events.d.ts.map +1 -0
  163. package/lib/Types/Events.js +2 -2
  164. package/lib/Types/Events.js.map +1 -0
  165. package/lib/Types/GroupMetadata.d.ts +16 -9
  166. package/lib/Types/GroupMetadata.d.ts.map +1 -0
  167. package/lib/Types/GroupMetadata.js +2 -2
  168. package/lib/Types/GroupMetadata.js.map +1 -0
  169. package/lib/Types/Label.d.ts +12 -0
  170. package/lib/Types/Label.d.ts.map +1 -0
  171. package/lib/Types/Label.js +3 -5
  172. package/lib/Types/Label.js.map +1 -0
  173. package/lib/Types/LabelAssociation.d.ts +1 -0
  174. package/lib/Types/LabelAssociation.d.ts.map +1 -0
  175. package/lib/Types/LabelAssociation.js +3 -5
  176. package/lib/Types/LabelAssociation.js.map +1 -0
  177. package/lib/Types/Message.d.ts +176 -148
  178. package/lib/Types/Message.d.ts.map +1 -0
  179. package/lib/Types/Message.js +15 -7
  180. package/lib/Types/Message.js.map +1 -0
  181. package/lib/Types/Mex.d.ts +154 -0
  182. package/lib/Types/Mex.d.ts.map +1 -0
  183. package/lib/Types/Mex.js +39 -0
  184. package/lib/Types/Mex.js.map +1 -0
  185. package/lib/Types/Product.d.ts +2 -1
  186. package/lib/Types/Product.d.ts.map +1 -0
  187. package/lib/Types/Product.js +2 -2
  188. package/lib/Types/Product.js.map +1 -0
  189. package/lib/Types/Signal.d.ts +32 -2
  190. package/lib/Types/Signal.d.ts.map +1 -0
  191. package/lib/Types/Signal.js +2 -2
  192. package/lib/Types/Signal.js.map +1 -0
  193. package/lib/Types/Socket.d.ts +46 -20
  194. package/lib/Types/Socket.d.ts.map +1 -0
  195. package/lib/Types/Socket.js +3 -2
  196. package/lib/Types/Socket.js.map +1 -0
  197. package/lib/Types/State.d.ts +79 -2
  198. package/lib/Types/State.d.ts.map +1 -0
  199. package/lib/Types/State.js +56 -2
  200. package/lib/Types/State.js.map +1 -0
  201. package/lib/Types/USync.d.ts +3 -2
  202. package/lib/Types/USync.d.ts.map +1 -0
  203. package/lib/Types/USync.js +2 -2
  204. package/lib/Types/USync.js.map +1 -0
  205. package/lib/Types/index.d.ts +16 -14
  206. package/lib/Types/index.d.ts.map +1 -0
  207. package/lib/Types/index.js +15 -31
  208. package/lib/Types/index.js.map +1 -0
  209. package/lib/Utils/auth-utils.d.ts +10 -4
  210. package/lib/Utils/auth-utils.d.ts.map +1 -0
  211. package/lib/Utils/auth-utils.js +242 -151
  212. package/lib/Utils/auth-utils.js.map +1 -0
  213. package/lib/Utils/browser-utils.d.ts +4 -0
  214. package/lib/Utils/browser-utils.d.ts.map +1 -0
  215. package/lib/Utils/browser-utils.js +29 -0
  216. package/lib/Utils/browser-utils.js.map +1 -0
  217. package/lib/Utils/business.d.ts +3 -2
  218. package/lib/Utils/business.d.ts.map +1 -0
  219. package/lib/Utils/business.js +66 -69
  220. package/lib/Utils/business.js.map +1 -0
  221. package/lib/Utils/button-handler.d.ts +28 -0
  222. package/lib/Utils/button-handler.d.ts.map +1 -0
  223. package/lib/Utils/button-handler.js +79 -90
  224. package/lib/Utils/button-handler.js.map +1 -0
  225. package/lib/Utils/chat-utils.d.ts +42 -12
  226. package/lib/Utils/chat-utils.d.ts.map +1 -0
  227. package/lib/Utils/chat-utils.js +380 -238
  228. package/lib/Utils/chat-utils.js.map +1 -0
  229. package/lib/Utils/companion-reg-client-utils.d.ts +17 -0
  230. package/lib/Utils/companion-reg-client-utils.d.ts.map +1 -0
  231. package/lib/Utils/companion-reg-client-utils.js +35 -0
  232. package/lib/Utils/companion-reg-client-utils.js.map +1 -0
  233. package/lib/Utils/crypto.d.ts +11 -14
  234. package/lib/Utils/crypto.d.ts.map +1 -0
  235. package/lib/Utils/crypto.js +41 -116
  236. package/lib/Utils/crypto.js.map +1 -0
  237. package/lib/Utils/decode-wa-message.d.ts +36 -5
  238. package/lib/Utils/decode-wa-message.d.ts.map +1 -0
  239. package/lib/Utils/decode-wa-message.js +173 -63
  240. package/lib/Utils/decode-wa-message.js.map +1 -0
  241. package/lib/Utils/event-buffer.d.ts +8 -7
  242. package/lib/Utils/event-buffer.d.ts.map +1 -0
  243. package/lib/Utils/event-buffer.js +174 -70
  244. package/lib/Utils/event-buffer.js.map +1 -0
  245. package/lib/Utils/generics.d.ts +20 -17
  246. package/lib/Utils/generics.d.ts.map +1 -0
  247. package/lib/Utils/generics.js +159 -207
  248. package/lib/Utils/generics.js.map +1 -0
  249. package/lib/Utils/history.d.ts +16 -11
  250. package/lib/Utils/history.d.ts.map +1 -0
  251. package/lib/Utils/history.js +93 -53
  252. package/lib/Utils/history.js.map +1 -0
  253. package/lib/Utils/identity-change-handler.d.ts +44 -0
  254. package/lib/Utils/identity-change-handler.d.ts.map +1 -0
  255. package/lib/Utils/identity-change-handler.js +50 -0
  256. package/lib/Utils/identity-change-handler.js.map +1 -0
  257. package/lib/Utils/index.d.ts +30 -18
  258. package/lib/Utils/index.d.ts.map +1 -0
  259. package/lib/Utils/index.js +30 -34
  260. package/lib/Utils/index.js.map +1 -0
  261. package/lib/Utils/interactive.d.ts +60 -0
  262. package/lib/Utils/interactive.d.ts.map +1 -0
  263. package/lib/Utils/interactive.js +87 -117
  264. package/lib/Utils/interactive.js.map +1 -0
  265. package/lib/Utils/link-preview.d.ts +4 -4
  266. package/lib/Utils/link-preview.d.ts.map +1 -0
  267. package/lib/Utils/link-preview.js +17 -58
  268. package/lib/Utils/link-preview.js.map +1 -0
  269. package/lib/Utils/logger.d.ts +8 -6
  270. package/lib/Utils/logger.d.ts.map +1 -0
  271. package/lib/Utils/logger.js +3 -10
  272. package/lib/Utils/logger.js.map +1 -0
  273. package/lib/Utils/lt-hash.d.ts +8 -12
  274. package/lib/Utils/lt-hash.d.ts.map +1 -0
  275. package/lib/Utils/lt-hash.js +3 -46
  276. package/lib/Utils/lt-hash.js.map +1 -0
  277. package/lib/Utils/make-mutex.d.ts +2 -0
  278. package/lib/Utils/make-mutex.d.ts.map +1 -0
  279. package/lib/Utils/make-mutex.js +24 -34
  280. package/lib/Utils/make-mutex.js.map +1 -0
  281. package/lib/Utils/message-composer.d.ts +93 -0
  282. package/lib/Utils/message-composer.d.ts.map +1 -0
  283. package/lib/Utils/message-composer.js +311 -0
  284. package/lib/Utils/message-composer.js.map +1 -0
  285. package/lib/Utils/message-retry-manager.d.ts +115 -0
  286. package/lib/Utils/message-retry-manager.d.ts.map +1 -0
  287. package/lib/Utils/message-retry-manager.js +265 -0
  288. package/lib/Utils/message-retry-manager.js.map +1 -0
  289. package/lib/Utils/messages-media.d.ts +82 -40
  290. package/lib/Utils/messages-media.d.ts.map +1 -0
  291. package/lib/Utils/messages-media.js +674 -677
  292. package/lib/Utils/messages-media.js.map +1 -0
  293. package/lib/Utils/messages-newsletter.d.ts +74 -0
  294. package/lib/Utils/messages-newsletter.d.ts.map +1 -0
  295. package/lib/Utils/messages-newsletter.js +128 -0
  296. package/lib/Utils/messages-newsletter.js.map +1 -0
  297. package/lib/Utils/messages.d.ts +38 -14
  298. package/lib/Utils/messages.d.ts.map +1 -0
  299. package/lib/Utils/messages.js +835 -602
  300. package/lib/Utils/messages.js.map +1 -0
  301. package/lib/Utils/noise-handler.d.ts +9 -8
  302. package/lib/Utils/noise-handler.d.ts.map +1 -0
  303. package/lib/Utils/noise-handler.js +149 -98
  304. package/lib/Utils/noise-handler.js.map +1 -0
  305. package/lib/Utils/offline-node-processor.d.ts +17 -0
  306. package/lib/Utils/offline-node-processor.d.ts.map +1 -0
  307. package/lib/Utils/offline-node-processor.js +40 -0
  308. package/lib/Utils/offline-node-processor.js.map +1 -0
  309. package/lib/Utils/pre-key-manager.d.ts +28 -0
  310. package/lib/Utils/pre-key-manager.d.ts.map +1 -0
  311. package/lib/Utils/pre-key-manager.js +106 -0
  312. package/lib/Utils/pre-key-manager.js.map +1 -0
  313. package/lib/Utils/process-message.d.ts +30 -12
  314. package/lib/Utils/process-message.d.ts.map +1 -0
  315. package/lib/Utils/process-message.js +438 -230
  316. package/lib/Utils/process-message.js.map +1 -0
  317. package/lib/Utils/reporting-utils.d.ts +11 -0
  318. package/lib/Utils/reporting-utils.d.ts.map +1 -0
  319. package/lib/Utils/reporting-utils.js +258 -0
  320. package/lib/Utils/reporting-utils.js.map +1 -0
  321. package/lib/Utils/shortcake-crypto.d.ts +36 -0
  322. package/lib/Utils/shortcake-crypto.d.ts.map +1 -0
  323. package/lib/Utils/shortcake-crypto.js +71 -0
  324. package/lib/Utils/shortcake-crypto.js.map +1 -0
  325. package/lib/Utils/shortcake.d.ts +36 -0
  326. package/lib/Utils/shortcake.d.ts.map +1 -0
  327. package/lib/Utils/shortcake.js +162 -0
  328. package/lib/Utils/shortcake.js.map +1 -0
  329. package/lib/Utils/signal.d.ts +20 -6
  330. package/lib/Utils/signal.d.ts.map +1 -0
  331. package/lib/Utils/signal.js +112 -64
  332. package/lib/Utils/signal.js.map +1 -0
  333. package/lib/Utils/stanza-ack.d.ts +11 -0
  334. package/lib/Utils/stanza-ack.d.ts.map +1 -0
  335. package/lib/Utils/stanza-ack.js +38 -0
  336. package/lib/Utils/stanza-ack.js.map +1 -0
  337. package/lib/Utils/sync-action-utils.d.ts +19 -0
  338. package/lib/Utils/sync-action-utils.d.ts.map +1 -0
  339. package/lib/Utils/sync-action-utils.js +49 -0
  340. package/lib/Utils/sync-action-utils.js.map +1 -0
  341. package/lib/Utils/tc-token-utils.d.ts +37 -0
  342. package/lib/Utils/tc-token-utils.d.ts.map +1 -0
  343. package/lib/Utils/tc-token-utils.js +164 -0
  344. package/lib/Utils/tc-token-utils.js.map +1 -0
  345. package/lib/Utils/use-multi-file-auth-state.d.ts +2 -1
  346. package/lib/Utils/use-multi-file-auth-state.d.ts.map +1 -0
  347. package/lib/Utils/use-multi-file-auth-state.js +40 -64
  348. package/lib/Utils/use-multi-file-auth-state.js.map +1 -0
  349. package/lib/Utils/use-single-file-auth-state.d.ts +6 -0
  350. package/lib/Utils/use-single-file-auth-state.d.ts.map +1 -0
  351. package/lib/Utils/use-single-file-auth-state.js +111 -0
  352. package/lib/Utils/use-single-file-auth-state.js.map +1 -0
  353. package/lib/Utils/use-sqlite-auth-state.d.ts +14 -0
  354. package/lib/Utils/use-sqlite-auth-state.d.ts.map +1 -0
  355. package/lib/Utils/use-sqlite-auth-state.js +107 -0
  356. package/lib/Utils/use-sqlite-auth-state.js.map +1 -0
  357. package/lib/Utils/validate-connection.d.ts +5 -3
  358. package/lib/Utils/validate-connection.d.ts.map +1 -0
  359. package/lib/Utils/validate-connection.js +82 -101
  360. package/lib/Utils/validate-connection.js.map +1 -0
  361. package/lib/WABinary/constants.d.ts +1 -0
  362. package/lib/WABinary/constants.d.ts.map +1 -0
  363. package/lib/WABinary/constants.js +10 -12
  364. package/lib/WABinary/constants.js.map +1 -0
  365. package/lib/WABinary/decode.d.ts +2 -1
  366. package/lib/WABinary/decode.d.ts.map +1 -0
  367. package/lib/WABinary/decode.js +49 -52
  368. package/lib/WABinary/decode.js.map +1 -0
  369. package/lib/WABinary/encode.d.ts +2 -1
  370. package/lib/WABinary/encode.d.ts.map +1 -0
  371. package/lib/WABinary/encode.js +19 -49
  372. package/lib/WABinary/encode.js.map +1 -0
  373. package/lib/WABinary/generic-utils.d.ts +5 -4
  374. package/lib/WABinary/generic-utils.d.ts.map +1 -0
  375. package/lib/WABinary/generic-utils.js +46 -43
  376. package/lib/WABinary/generic-utils.js.map +1 -0
  377. package/lib/WABinary/index.d.ts +6 -5
  378. package/lib/WABinary/index.d.ts.map +1 -0
  379. package/lib/WABinary/index.js +6 -21
  380. package/lib/WABinary/index.js.map +1 -0
  381. package/lib/WABinary/jid-utils.d.ts +32 -10
  382. package/lib/WABinary/jid-utils.d.ts.map +1 -0
  383. package/lib/WABinary/jid-utils.js +103 -59
  384. package/lib/WABinary/jid-utils.js.map +1 -0
  385. package/lib/WABinary/types.d.ts +2 -1
  386. package/lib/WABinary/types.d.ts.map +1 -0
  387. package/lib/WABinary/types.js +2 -2
  388. package/lib/WABinary/types.js.map +1 -0
  389. package/lib/WAM/BinaryInfo.d.ts +2 -1
  390. package/lib/WAM/BinaryInfo.d.ts.map +1 -0
  391. package/lib/WAM/BinaryInfo.js +2 -5
  392. package/lib/WAM/BinaryInfo.js.map +1 -0
  393. package/lib/WAM/constants.d.ts +5 -3
  394. package/lib/WAM/constants.d.ts.map +1 -0
  395. package/lib/WAM/constants.js +19071 -11568
  396. package/lib/WAM/constants.js.map +1 -0
  397. package/lib/WAM/encode.d.ts +2 -1
  398. package/lib/WAM/encode.d.ts.map +1 -0
  399. package/lib/WAM/encode.js +17 -22
  400. package/lib/WAM/encode.js.map +1 -0
  401. package/lib/WAM/index.d.ts +4 -3
  402. package/lib/WAM/index.d.ts.map +1 -0
  403. package/lib/WAM/index.js +4 -19
  404. package/lib/WAM/index.js.map +1 -0
  405. package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts +4 -3
  406. package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts.map +1 -0
  407. package/lib/WAUSync/Protocols/USyncContactProtocol.js +33 -13
  408. package/lib/WAUSync/Protocols/USyncContactProtocol.js.map +1 -0
  409. package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts +3 -2
  410. package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts.map +1 -0
  411. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +11 -14
  412. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js.map +1 -0
  413. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts +3 -2
  414. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts.map +1 -0
  415. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +8 -11
  416. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js.map +1 -0
  417. package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts +3 -2
  418. package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts.map +1 -0
  419. package/lib/WAUSync/Protocols/USyncStatusProtocol.js +9 -13
  420. package/lib/WAUSync/Protocols/USyncStatusProtocol.js.map +1 -0
  421. package/lib/WAUSync/Protocols/USyncUsernameProtocol.d.ts +10 -0
  422. package/lib/WAUSync/Protocols/USyncUsernameProtocol.d.ts.map +1 -0
  423. package/lib/WAUSync/Protocols/USyncUsernameProtocol.js +25 -0
  424. package/lib/WAUSync/Protocols/USyncUsernameProtocol.js.map +1 -0
  425. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts +4 -3
  426. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts.map +1 -0
  427. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js +20 -22
  428. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js.map +1 -0
  429. package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts +5 -3
  430. package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts.map +1 -0
  431. package/lib/WAUSync/Protocols/UsyncLIDProtocol.js +13 -8
  432. package/lib/WAUSync/Protocols/UsyncLIDProtocol.js.map +1 -0
  433. package/lib/WAUSync/Protocols/index.d.ts +6 -4
  434. package/lib/WAUSync/Protocols/index.d.ts.map +1 -0
  435. package/lib/WAUSync/Protocols/index.js +6 -20
  436. package/lib/WAUSync/Protocols/index.js.map +1 -0
  437. package/lib/WAUSync/USyncQuery.d.ts +6 -4
  438. package/lib/WAUSync/USyncQuery.d.ts.map +1 -0
  439. package/lib/WAUSync/USyncQuery.js +44 -35
  440. package/lib/WAUSync/USyncQuery.js.map +1 -0
  441. package/lib/WAUSync/USyncUser.d.ts +10 -5
  442. package/lib/WAUSync/USyncUser.d.ts.map +1 -0
  443. package/lib/WAUSync/USyncUser.js +10 -5
  444. package/lib/WAUSync/USyncUser.js.map +1 -0
  445. package/lib/WAUSync/index.d.ts +4 -3
  446. package/lib/WAUSync/index.d.ts.map +1 -0
  447. package/lib/WAUSync/index.js +4 -19
  448. package/lib/WAUSync/index.js.map +1 -0
  449. package/lib/index.d.ts +12 -15
  450. package/lib/index.d.ts.map +1 -0
  451. package/lib/index.js +15 -48
  452. package/lib/index.js.map +1 -0
  453. package/package.json +44 -64
  454. package/WAProto/index.ts.ts +0 -53473
  455. package/WAProto/n +0 -1
  456. package/lib/Baileys.jpeg +0 -0
  457. package/lib/Defaults/baileys-version.json +0 -3
  458. package/lib/Defaults/n +0 -1
  459. package/lib/Signal/Group/queue-job.d.ts +0 -1
  460. package/lib/Signal/Group/queue-job.js +0 -57
  461. package/lib/Signal/n +0 -1
  462. package/lib/Socket/Client/n +0 -1
  463. package/lib/Socket/n +0 -1
  464. package/lib/Socket/setup.js +0 -480
  465. package/lib/Socket/setup.ts +0 -622
  466. package/lib/Socket/usync.d.ts +0 -36
  467. package/lib/Socket/usync.js +0 -70
  468. package/lib/Store/n +0 -1
  469. package/lib/Types/Newsletter.d.ts +0 -79
  470. package/lib/Types/Newsletter.js +0 -18
  471. package/lib/Types/n +0 -1
  472. package/lib/Utils/baileys-event-stream.d.ts +0 -16
  473. package/lib/Utils/baileys-event-stream.js +0 -63
  474. package/lib/Utils/error-handler.js +0 -37
  475. package/lib/Utils/n +0 -1
  476. package/lib/WABinary/jid-utils.js.bak +0 -83
  477. package/lib/WABinary/n +0 -1
  478. package/lib/WAM/n +0 -1
  479. package/lib/WAUSync/Protocols/n +0 -1
  480. package/lib/WAUSync/n +0 -1
  481. package/lib/n +0 -1
package/README.md CHANGED
@@ -1,661 +1,694 @@
1
1
  <div align="center">
2
2
 
3
- <img src="https://raw.githubusercontent.com/Fer2809fl/Baileys/refs/heads/main/lib/Baileys.jpeg" alt="Baileys" width="500" style="border-radius: 20px;"/>
3
+ # ASTA-BOTS
4
4
 
5
- # @fer2809fl/baileys
6
- ### API de WhatsApp Web para Node.js
5
+ ### Librería de WhatsApp Web para bots, en TypeScript
7
6
 
8
- [![npm version](https://img.shields.io/npm/v/@fer2809fl/baileys?color=blueviolet&label=version)](https://www.npmjs.com/package/@fer2809fl/baileys)
9
- [![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
10
- [![Node.js](https://img.shields.io/badge/node-%3E%3D20-brightgreen)](https://nodejs.org)
11
- [![TypeScript](https://img.shields.io/badge/TypeScript-supported-blue)](https://www.typescriptlang.org)
12
-
13
- *Conéctate a WhatsApp Web directamente desde Node.js sin navegadores ni Selenium*
7
+ ![Node](https://img.shields.io/badge/node-%3E%3D20.0.0-brightgreen)
8
+ ![License](https://img.shields.io/badge/license-MIT-blue)
9
+ ![TypeScript](https://img.shields.io/badge/-TypeScript-3178C6?logo=typescript&logoColor=white)
10
+ ![ASTA-BOTS](https://img.shields.io/badge/⚡-ASTA--BOTS-00FFFF)
14
11
 
15
12
  </div>
16
13
 
17
- ---
14
+ <br/>
15
+
16
+ > [!NOTE]
17
+ > ASTA-BOTS no requiere Selenium, Puppeteer ni ningún navegador para funcionar. Se conecta directamente a WhatsApp Web mediante un **WebSocket**, lo que la hace mucho más liviana en consumo de RAM y CPU en comparación con soluciones basadas en navegador.
18
+
19
+ ## Índice
20
+
21
+ - [¿Qué es ASTA-BOTS?](#qué-es-asta-bots)
22
+ - [Características](#características)
23
+ - [Instalación](#instalación)
24
+ - [Inicio rápido](#inicio-rápido)
25
+ - [Vinculación de la cuenta](#vinculación-de-la-cuenta)
26
+ - [Guardado de credenciales](#guardado-de-credenciales)
27
+ - [Métodos de mensajería](#métodos-de-mensajería)
28
+ - [`sendMessage`](#sendmessage-el-método-principal)
29
+ - [Mensajes de texto](#mensajes-de-texto)
30
+ - [Mensajes multimedia](#mensajes-multimedia)
31
+ - [Procesar medios sin enviarlos](#procesar-medios-sin-enviarlos)
32
+ - [Ubicación y contactos](#ubicación-y-contactos)
33
+ - [Encuestas, reacciones y respuestas a botones](#encuestas-reacciones-y-respuestas-a-botones)
34
+ - [Botones, listas, templates y carousel](#botones-listas-templates-y-carousel)
35
+ - [Mensajes crudos (smgss): pagos, productos, álbumes, eventos y más](#mensajes-crudos-smgss-pagos-productos-álbumes-eventos-y-más)
36
+ - [Mensajes "raw" (proto armado a mano)](#mensajes-raw-proto-armado-a-mano)
37
+ - [Editar, eliminar, reenviar y fijar](#editar-eliminar-reenviar-y-fijar)
38
+ - [Mensajes enriquecidos](#mensajes-enriquecidos)
39
+ - [Marcar un mensaje como generado por IA](#marcar-un-mensaje-como-generado-por-ia)
40
+ - [Estados (historias)](#estados-historias)
41
+ - [Recibos, lectura y presencia](#recibos-lectura-y-presencia)
42
+ - [Grupos, comunidades y canales](#grupos-comunidades-y-canales)
43
+ - [Perfil, privacidad y negocios](#perfil-privacidad-y-negocios)
44
+ - [Store (caché en memoria)](#store-caché-en-memoria)
45
+ - [Utilidades ASTA-BOTS](#utilidades-asta-bots)
46
+ - [`resolveJid`: resolución automática de JID](#resolvejid-resolución-automática-de-jid)
47
+ - [Sistema de botones de conveniencia](#sistema-de-botones-de-conveniencia)
48
+ - [Código de vinculación de marca](#código-de-vinculación-de-marca)
49
+ - [Aviso legal](#aviso-legal)
50
+ - [Créditos](#créditos)
51
+
52
+ ## ¿Qué es ASTA-BOTS?
53
+
54
+ **ASTA-BOTS** es una librería para conectarse a WhatsApp Web de forma directa, sin depender de un navegador ni de librerías de automatización como Selenium o Puppeteer. Toda la comunicación con WhatsApp ocurre a través de un **WebSocket**, tal como lo hace la propia versión web de WhatsApp, lo que se traduce en una librería rápida y liviana en recursos.
55
+
56
+ Es un fork de **Baileys**, y conserva casi toda su base: el protocolo, el cifrado, la arquitectura del socket y el manejo de credenciales. Además, incorpora algunos métodos para enviar mensajes con contenido enriquecido (tablas, listas, código y LaTeX), botones/listas/carousel nativos de WhatsApp, un dispatcher para contenido avanzado (pagos, productos, álbumes, eventos), y utilidades propias de **ASTA-BOTS** para resolución automática de JID y botones de conveniencia — más detalle en las secciones correspondientes.
57
+
58
+ Este README está enfocado principalmente en explicar **cómo enviar cada tipo de mensaje**, ya que es lo que más se necesita a la hora de integrar la librería en un proyecto real.
59
+
60
+ ## Características
61
+
62
+ - 🔌 Conexión directa por WebSocket, sin navegador de por medio.
63
+ - 💬 Envío de todo tipo de mensajes: texto, imágenes, video, audio, notas de voz, documentos, stickers, ubicación, contactos, encuestas y más.
64
+ - 🔘 Botones, listas de selección, templates y carousel (interactive/native_flow), con el nodo `biz` necesario para que WhatsApp los acepte y renderice.
65
+ - ⚡ **Resolución automática de JID** (`resolveJid`): detecta el destinatario de un comando por citado, mención o argumento, sin pasar el número a mano.
66
+ - ⚡ **Helpers de botones listos para usar** (`sendQuickReplyButtons`, `sendUrlButton`, `sendListMenu`, etc.) y un detector de respuestas de botón (`setupButtonHandler`) para enrutarlas directo a tus comandos.
67
+ - 💳 Contenido avanzado vía `smgss`: pedidos de pago, cards de producto, álbumes, eventos, resultados de encuesta e historias por grupo.
68
+ - 🖼️ Procesamiento de medios (`resize`, `convert`, `toSticker`, `compress`, `metadata`) sobre cualquier `Buffer`, sin necesidad de enviarlo.
69
+ - 🛠️ Salida de emergencia `raw: true` para mandar un mensaje armado a mano cuando ningún builder alcanza.
70
+ - 🧩 Métodos para enviar mensajes enriquecidos: tablas, listas, código y LaTeX.
71
+ - 🤖 Marca de "generado por IA" en mensajes de chats individuales.
72
+ - 📸 Publicación de estados (historias) con notificación por menciones, tanto a contactos individuales como a grupos.
73
+ - 👥 Administración completa de grupos, comunidades y canales de difusión.
74
+ - 🔐 2 métodos de vinculación: código QR o código de emparejamiento (con código de marca **`ASTABOTS`** por defecto).
75
+ - 🗂️ 3 formas de guardar credenciales: por archivos múltiples, un solo archivo o SQLite.
76
+
77
+ ## Instalación
78
+
79
+ Instalación directa desde GitHub:
18
80
 
19
- ## 🆕 Novedades — v1.8.9
81
+ ```bash
82
+ npm install github:TU-USUARIO/asta-bots
83
+ ```
20
84
 
21
- ### Nuevas funciones añadidas
22
- - **Botones interactivos** — Se agregaron funciones nativas para enviar botones de WhatsApp:
23
- - `sendCopyButton` Botón que copia texto al portapapeles
24
- - `sendUrlButton` — Botón que abre un enlace en el navegador
25
- - `sendQuickReplyButtons` — Botones de respuesta rápida
26
- - `sendCallButton` — Botón para iniciar una llamada telefónica
27
- - `sendListMenu` — Menú desplegable con secciones y filas
28
- - `sendInteractiveMessage` — Combinación de botones mixtos (URL + Copiar + Rápido)
85
+ > Cambia `TU-USUARIO/asta-bots` por la ruta de tu propio repositorio de ASTA-BOTS en GitHub.
86
+ >
87
+ > **Requisito:** Node.js **20** o superior.
29
88
 
30
- ### 🐛 Correcciones
31
- - **Error en macOS** — Se reparó un bug crítico que impedía iniciar sesión correctamente en dispositivos Mac. El proceso de pairing/QR ahora funciona de forma estable en macOS.
89
+ Una vez instalada, importala en tu proyecto:
32
90
 
33
- ---
91
+ ```ts
92
+ import makeWASocket from 'baileys'
93
+ ```
34
94
 
35
- ## ⚠️ Nota Importante
95
+ ## Inicio rápido
36
96
 
37
- Esta librería está basada en Baileys. No está afiliada ni aprobada oficialmente por WhatsApp.
97
+ Para conectar una cuenta de WhatsApp a ASTA-BOTS hacen falta dos cosas: **cómo se guardan las credenciales de la sesión** y **cómo se vincula el dispositivo** (que puede ser con código QR o con código de emparejamiento).
38
98
 
39
- > **@fer2809fl/baileys** y su desarrollador no se hacen responsables por el mal uso de esta librería.
40
- > Úsala de forma responsable — nada de spam ni actividades maliciosas.
99
+ ### Vinculación de la cuenta
41
100
 
42
- ---
101
+ ASTA-BOTS soporta los **2 métodos de vinculación** que ofrece WhatsApp:
43
102
 
44
- ## 📦 Instalación
103
+ #### 1. Con código QR
45
104
 
46
- Puedes instalarla de varias formas, todas funcionan igual:
105
+ ```ts
106
+ import makeWASocket, { useMultiFileAuthState } from 'baileys'
47
107
 
48
- **Opción 1 — Desde npm (recomendado)**
49
- ```bash
50
- npm install @fer2809fl/baileys
51
- yarn add @fer2809fl/baileys
52
- ```
108
+ async function iniciar() {
109
+ const { state, saveCreds } = await useMultiFileAuthState('sesion')
53
110
 
54
- **Opción 2 Desde GitHub directamente**
55
- ```bash
56
- npm install github:Fer2809fl/Baileys
57
- yarn add github:Fer2809fl/Baileys
58
- ```
111
+ const sock = makeWASocket({
112
+ auth: state,
113
+ printQRInTerminal: true
114
+ })
59
115
 
60
- **Opción 3 — También funciona con el paquete original**
61
- ```bash
62
- npm install @whiskeysockets/baileys
63
- yarn add @whiskeysockets/baileys
64
- ```
116
+ sock.ev.on('creds.update', saveCreds)
65
117
 
66
- **Opción — En tu package.json** (elige una de estas formas):
67
- ```json
68
- {
69
- "dependencies": {
70
- "@fer2809fl/baileys": "^1.8.9"
71
- }
118
+ sock.ev.on('connection.update', (update) => {
119
+ console.log(update)
120
+ })
72
121
  }
122
+
123
+ iniciar()
73
124
  ```
74
- ```json
75
- {
76
- "dependencies": {
77
- "@whiskeysockets/baileys": "github:Fer2809fl/Baileys"
78
- }
125
+
126
+ Al iniciar, se imprime un código QR en la terminal que hay que escanear desde WhatsApp (Dispositivos vinculados → Vincular un dispositivo).
127
+
128
+ #### 2. Con código de emparejamiento
129
+
130
+ ```ts
131
+ const sock = makeWASocket({
132
+ auth: state,
133
+ printQRInTerminal: false
134
+ })
135
+
136
+ if (!sock.authState?.creds?.registered) {
137
+ const codigo = await sock.requestPairingCode('5215512345678') // número con código de país, sin +
138
+ console.log('Tu código de emparejamiento es:', codigo)
79
139
  }
80
140
  ```
81
141
 
82
- ---
142
+ En este caso, en vez de escanear un QR, WhatsApp te muestra en el celular un código de 8 caracteres que hay que ingresar desde la opción "Vincular con número de teléfono".
83
143
 
84
- ## Inicio Rápido
144
+ ### Guardado de credenciales
85
145
 
86
- ### JavaScript
87
- ```javascript
88
- const { makeWASocket, useMultiFileAuthState } = require('@fer2809fl/baileys')
146
+ Una vez vinculada la cuenta, ASTA-BOTS necesita persistir las credenciales para no tener que volver a escanear el QR o pedir el código cada vez. Hay **3 formas** de hacerlo, todas exportadas por la librería:
89
147
 
90
- async function startBot() {
91
- const { state, saveCreds } = await useMultiFileAuthState('session-mymelody')
92
-
93
- const melody = makeWASocket({
94
- auth: state,
95
- printQRInTerminal: true
96
- })
148
+ | Método | Cómo guarda los datos | Cuándo conviene |
149
+ |---|---|---|
150
+ | `useMultiFileAuthState('carpeta')` | Un archivo por cada clave, dentro de una carpeta | Uso por defecto, ideal para desarrollo y bots simples |
151
+ | `useSingleFileAuthState('archivo.json')` | Todo en un único archivo JSON | Cuando querés portar la sesión fácilmente como un solo archivo |
152
+ | `useSqliteAuthState({ dbPath: 'sesion.db' })` | En una base de datos SQLite (requiere `better-sqlite3`) | Bots con mucho volumen de claves o que necesitan acceso concurrente |
97
153
 
98
- melody.ev.on('connection.update', ({ connection }) => {
99
- if (connection === 'open') console.log('✅ ¡Conectado con éxito!')
100
- if (connection === 'close') console.log('❌ Conexión cerrada, reconectando...')
101
- })
154
+ Ejemplo con SQLite:
102
155
 
103
- melody.ev.on('messages.upsert', async ({ messages }) => {
104
- const m = messages[0]
105
- if (!m.message) return
156
+ ```ts
157
+ import makeWASocket, { useSqliteAuthState } from 'baileys'
106
158
 
107
- await melody.sendMessage(m.key.remoteJid, {
108
- text: '¡Hola! Soy un bot de Delta!'
109
- })
110
- })
159
+ const { state, saveCreds } = await useSqliteAuthState({ dbPath: 'sesion.db' })
111
160
 
112
- melody.ev.on('creds.update', saveCreds)
113
- }
161
+ const sock = makeWASocket({ auth: state })
162
+ sock.ev.on('creds.update', saveCreds)
163
+ ```
164
+
165
+ ## Métodos de mensajería
166
+
167
+ Todos los métodos de envío viven dentro del objeto `sock` que devuelve `makeWASocket()`. La firma general es siempre parecida: reciben el **JID** (identificador del chat) y el contenido del mensaje.
168
+
169
+ Formatos de JID más comunes:
170
+
171
+ | Tipo de chat | Formato de JID |
172
+ |---|---|
173
+ | Contacto individual | `5215512345678@s.whatsapp.net` |
174
+ | Grupo | `1234567890@g.us` |
175
+ | Canal de difusión (newsletter) | `1234567890@newsletter` |
176
+ | Estado (historia) | `status@broadcast` |
177
+ | Identificador LID | `123456789@lid` |
178
+
179
+ > **¿Qué es un LID?** Es un identificador que WhatsApp usa como capa de privacidad: en ciertos contextos (por ejemplo, dentro de comunidades) un contacto no se identifica con su número de teléfono (`@s.whatsapp.net`) sino con un `@lid`, un ID que no revela el número real. ASTA-BOTS mantiene internamente una tabla de equivalencias entre el LID y el número de teléfono real (`LIDMappingStore`) para poder cifrar y enviar los mensajes correctamente sin que tengas que hacer nada manualmente. Si necesitás revisarlo, `isLidUser(jid)` te dice si un JID es de tipo LID.
114
180
 
115
- startBot()
181
+ ### `sendMessage` — el método principal
182
+
183
+ ```ts
184
+ await sock.sendMessage(jid, contenido, opciones)
116
185
  ```
117
186
 
118
- ### TypeScript
119
- ```typescript
120
- import makeWASocket, { useMultiFileAuthState, DisconnectReason } from '@fer2809fl/baileys'
121
- import { Boom } from '@hapi/boom'
187
+ - **`jid`** *(string)*: destinatario del mensaje (contacto, grupo, canal o `status@broadcast` para estados).
188
+ - **`contenido`** *(`AnyMessageContent`)*: define qué tipo de mensaje se envía (texto, imagen, video, encuesta, botones, etc. — ver detalle abajo).
189
+ - **`opciones`** *(`MiscMessageGenerationOptions`, opcional)*: permite, entre otras cosas:
190
+ - `quoted`: el mensaje al que se responde (citar).
191
+ - `messageId`: forzar un ID de mensaje propio.
192
+ - `ephemeralExpiration`: duración de los mensajes efímeros.
193
+ - `mediaUploadTimeoutMs`: tiempo máximo para subir archivos.
122
194
 
123
- async function startBot(): Promise<void> {
124
- const { state, saveCreds } = await useMultiFileAuthState('session-mymelody')
125
-
126
- const melody = makeWASocket({
127
- auth: state,
128
- printQRInTerminal: true
129
- })
195
+ Todos los métodos de envío devuelven una promesa que se resuelve con el mensaje ya construido y enviado (`WAMessage`), el cual podés guardar para citarlo, editarlo o eliminarlo más adelante.
130
196
 
131
- melody.ev.on('connection.update', ({ connection, lastDisconnect }) => {
132
- if (connection === 'close') {
133
- const shouldReconnect = (lastDisconnect?.error as Boom)?.output?.statusCode !== DisconnectReason.loggedOut
134
- if (shouldReconnect) startBot()
135
- }
136
- if (connection === 'open') console.log('✅ ¡Conectado!')
137
- })
197
+ El resto de los métodos de esta sección (`sendTable`, `sendList`, `sendCodeBlock`, etc.) son en realidad **atajos**: por debajo construyen el `contenido` correcto y llaman a `relayMessage` por vos, para que no tengas que armar la estructura del mensaje a mano.
138
198
 
139
- melody.ev.on('messages.upsert', async ({ messages }) => {
140
- const m = messages[0]
141
- if (!m.message) return
199
+ > Si el `contenido` incluye botones, lista, template o carousel, `sendMessage` agrega automáticamente el nodo `biz` que WhatsApp exige para aceptarlos y renderizarlos — no hace falta que hagas nada extra para eso.
142
200
 
143
- await melody.sendMessage(m.key.remoteJid!, {
144
- text: '¡Hola! Soy un bot de Delta!'
145
- })
146
- })
201
+ ### Mensajes de texto
147
202
 
148
- melody.ev.on('creds.update', saveCreds)
149
- }
203
+ ```ts
204
+ await sock.sendMessage(jid, { text: 'Hola, esto es ASTA-BOTS 👋' })
205
+ ```
150
206
 
151
- startBot()
207
+ Con vista previa de enlace desactivada:
208
+
209
+ ```ts
210
+ await sock.sendMessage(jid, { text: 'Mirá esto: https://ejemplo.com', linkPreview: null })
152
211
  ```
153
212
 
154
- ---
213
+ Citando un mensaje:
155
214
 
156
- ## ✨ Características
157
-
158
- ### General
159
- - 🚀 Optimizado para mayor velocidad y estabilidad
160
- - 📸 Mensajes multimedia (imágenes, video, audio, documentos)
161
- - 🤖 Comandos personalizados fáciles de implementar
162
- - 👥 Soporte para grupos y chats privados
163
- - 🔘 **Mensajes interactivos con botones, listas y más** *(nuevo en v1.8.9)*
164
-
165
- ### Técnicas
166
- - ⚡ Sin Selenium — Conexión directa vía WebSocket
167
- - 💾 Super eficiente — Bajo consumo de RAM
168
- - 📱 Soporte multi-dispositivo — Compatible con WhatsApp Web
169
- - 🔷 Totalmente tipado — TypeScript y JavaScript
170
- - 🔄 Reconexión automática ante desconexiones
171
- - 🔐 Sesiones persistentes guardadas localmente
172
- - 🌐 API completa de WhatsApp Web
173
- - 🍎 **Compatible con macOS** — Error de pairing reparado *(fix en v1.8.9)*
215
+ ```ts
216
+ await sock.sendMessage(jid, { text: 'Respondiendo a tu mensaje' }, { quoted: mensajeOriginal })
217
+ ```
174
218
 
175
- ---
219
+ ### Mensajes multimedia
220
+
221
+ | Tipo | Campo | Ejemplo |
222
+ |---|---|---|
223
+ | Imagen | `image` | `{ image: { url: './foto.jpg' }, caption: 'Mirá esto' }` |
224
+ | Video | `video` | `{ video: { url: './video.mp4' }, caption: 'Un video', gifPlayback: false }` |
225
+ | Nota de voz | `audio` + `ptt: true` | `{ audio: { url: './audio.mp3' }, ptt: true }` |
226
+ | Audio normal | `audio` | `{ audio: { url: './cancion.mp3' }, mimetype: 'audio/mp4' }` |
227
+ | Video nota (círculo) | `video` + `ptv: true` | `{ video: { url: './nota.mp4' }, ptv: true }` |
228
+ | Sticker | `sticker` | `{ sticker: { url: './sticker.webp' } }` |
229
+ | Documento | `document` | `{ document: { url: './archivo.pdf' }, mimetype: 'application/pdf', fileName: 'informe.pdf' }` |
230
+ | Paquete de stickers | `stickerPack` | `{ stickerPack: { name: 'Mi pack', cover: {...}, stickers: [...] } }` |
231
+ | Álbum (varias fotos/videos) | `album` | `{ album: { images: [...], videos: [...] } }` |
232
+
233
+ Ejemplo completo:
234
+
235
+ ```ts
236
+ await sock.sendMessage(jid, {
237
+ image: { url: './foto.jpg' },
238
+ caption: 'Foto enviada desde ASTA-BOTS'
239
+ })
240
+ ```
176
241
 
177
- ## 🔘 Botones Interactivos *(nuevo en v1.8.9)*
242
+ > `WAMediaUpload` acepta una URL (`{ url: '...' }`), un `Buffer` o un `Stream`, tanto para archivos locales como remotos.
178
243
 
179
- Desde la versión **1.8.9** puedes importar y usar funciones nativas para enviar botones interactivos de WhatsApp.
244
+ ### Procesar medios sin enviarlos
180
245
 
181
- ### Importar las funciones
246
+ Además de enviar, el socket expone helpers para procesar imágenes y video directamente sobre un `Buffer`, sin que eso implique mandar ningún mensaje:
182
247
 
183
- ```javascript
184
- // JavaScript (CommonJS)
185
- const {
186
- sendCopyButton,
187
- sendUrlButton,
188
- sendQuickReplyButtons,
189
- sendCallButton,
190
- sendListMenu,
191
- sendInteractiveMessage
192
- } = require('@fer2809fl/baileys')
248
+ ```ts
249
+ const redimensionada = await sock.resize(buffer, 512, 512, { quality: 80 })
250
+ const convertida = await sock.convert(buffer, { to: 'webp' })
251
+ const sticker = await sock.toSticker(buffer, { quality: 80 })
252
+ const comprimida = await sock.compress(buffer, { quality: 50 })
253
+ const info = await sock.metadata(buffer) // { size, mimetype, width, height, duration, ... }
193
254
  ```
194
255
 
195
- ```typescript
196
- // TypeScript / ESM
197
- import {
198
- sendCopyButton,
199
- sendUrlButton,
200
- sendQuickReplyButtons,
201
- sendCallButton,
202
- sendListMenu,
203
- sendInteractiveMessage
204
- } from '@fer2809fl/baileys'
256
+ Usan `sharp` (si está instalado) y caen a `ffmpeg`/`ffprobe` para lo que `sharp` no soporta (video). No afectan la velocidad de la conexión ni del envío de mensajes — son solo utilidades de conveniencia para procesar archivos.
257
+
258
+ ### Ubicación y contactos
259
+
260
+ ```ts
261
+ // Ubicación
262
+ await sock.sendMessage(jid, {
263
+ location: { degreesLatitude: 19.4326, degreesLongitude: -99.1332, name: 'CDMX' }
264
+ })
265
+
266
+ // Contacto (vCard)
267
+ await sock.sendMessage(jid, {
268
+ contacts: {
269
+ displayName: 'Soporte',
270
+ contacts: [{ vcard: 'BEGIN:VCARD\nVERSION:3.0\nFN:Soporte\nTEL:+521234567890\nEND:VCARD' }]
271
+ }
272
+ })
205
273
  ```
206
274
 
207
- ---
275
+ ### Encuestas, reacciones y respuestas a botones
208
276
 
209
- ### 📋 `sendCopyButton` — Botón Copiar
210
- Muestra un botón que al tocarlo copia un texto al portapapeles del usuario.
277
+ ```ts
278
+ // Encuesta
279
+ await sock.sendMessage(jid, {
280
+ poll: { name: '¿Cuál prefieres?', values: ['Opción A', 'Opción B'], selectableCount: 1 }
281
+ })
211
282
 
212
- ```javascript
213
- await sendCopyButton(
214
- conn,
215
- jid,
216
- '📋 *CÓDIGO DE INSTALACIÓN*\n\nEjecuta este comando en tu terminal:',
217
- 'npm install asta-bot', // texto que se copiará
218
- '📋 Copiar Comando' // etiqueta del botón
219
- )
283
+ // Reacción a un mensaje
284
+ await sock.sendMessage(jid, { react: { text: '🔥', key: mensaje.key } })
285
+
286
+ // Respuesta a un botón / lista (uso interno al procesar interacciones)
287
+ await sock.sendMessage(jid, { buttonReply: { displayText: 'Sí', id: 'btn_si', index: 0 }, type: 'plain' })
220
288
  ```
221
289
 
222
- ---
290
+ ### Botones, listas, templates y carousel
223
291
 
224
- ### 🔗 `sendUrlButton` Botón URL
225
- Abre un enlace en el navegador al tocar el botón.
292
+ ASTA-BOTS puede armar botones nativos (`native_flow`), listas de selección, templates legados y carousel directamente desde `sock.sendMessage`, sin tener que construir el protobuf a mano. En todos los casos se agrega automáticamente el nodo `biz` necesario para que WhatsApp los acepte.
226
293
 
227
- ```javascript
228
- await sendUrlButton(
229
- conn,
230
- jid,
231
- '🔗 *ENLACES IMPORTANTES*\n\nVisita nuestro repositorio oficial:',
232
- 'https://github.com/Fer2809fl/Asta_bot', // URL de destino
233
- '🌐 Ver GitHub' // etiqueta del botón
234
- )
294
+ **Botones** — soporta respuesta rápida (`id`), enlace (`url`), llamada (`call`), copiar texto (`copy`), una mini-lista embebida (`sections`), un flow crudo (`name` + `paramsJson`), o un botón ya armado con `nativeFlowInfo` (por ejemplo, reenviado de otro lado) — en ese caso se respeta tal cual viene:
295
+
296
+ ```ts
297
+ await sock.sendMessage(jid, {
298
+ text: 'Elegí una opción',
299
+ footer: 'Powered by ASTA-BOTS',
300
+ buttons: [
301
+ { text: 'Visitar sitio', url: 'https://ejemplo.com' },
302
+ { text: 'Llamar', call: '+50488888888' },
303
+ { text: 'Copiar código', copy: 'ABC123' },
304
+ { text: 'Responder', id: 'opt_1' }
305
+ ]
306
+ })
235
307
  ```
236
308
 
237
- ---
309
+ > `buttons`/`sections`/`templateButtons`/`nativeFlow`/`cards` se evalúan **antes** que `text` en el armado interno del mensaje, así que combinar `text` (el cuerpo) junto con cualquiera de estos tipos funciona sin que el texto se coma al resto del contenido.
310
+
311
+ **Lista de selección única:**
312
+
313
+ ```ts
314
+ await sock.sendMessage(jid, {
315
+ description: 'Elegí un producto del catálogo',
316
+ title: 'Catálogo',
317
+ buttonText: 'Ver opciones',
318
+ footer: 'ASTA-BOTS',
319
+ sections: [
320
+ {
321
+ title: 'Sección 1',
322
+ rows: [
323
+ { title: 'Producto A', rowId: 'a' },
324
+ { title: 'Producto B', rowId: 'b' }
325
+ ]
326
+ }
327
+ ]
328
+ })
329
+ ```
238
330
 
239
- ### `sendQuickReplyButtons`Botones de Respuesta Rápida
240
- Muestra varios botones de respuesta rápida debajo del mensaje.
241
-
242
- ```javascript
243
- await sendQuickReplyButtons(
244
- conn,
245
- jid,
246
- '🎮 *MENÚ DE OPCIONES*\n\n¿Qué deseas hacer?',
247
- [
248
- { id: 'menu', text: '📋 Ver Menú' },
249
- { id: 'info', text: 'ℹ️ Información' },
250
- { id: 'owner', text: '👑 Owner' }
251
- ]
252
- )
331
+ **Template buttons** (formato legado solo se renderiza en WhatsApp Web, Desktop e iOS):
332
+
333
+ ```ts
334
+ await sock.sendMessage(jid, {
335
+ text: 'Confirmá tu pedido',
336
+ templateButtons: [
337
+ { text: 'Sí', id: 'yes' },
338
+ { text: 'Visitar', url: 'https://ejemplo.com' },
339
+ { text: 'Llamar', call: '+50488888888' }
340
+ ]
341
+ })
253
342
  ```
254
343
 
255
- ---
344
+ **Interactive message genérico** (`nativeFlow`), con header de imagen/video/documento:
345
+
346
+ ```ts
347
+ await sock.sendMessage(jid, {
348
+ image: { url: 'https://ejemplo.com/foto.jpg' },
349
+ caption: 'Mirá esto',
350
+ title: 'Título',
351
+ subtitle: 'Subtítulo',
352
+ footer: 'ASTA-BOTS',
353
+ nativeFlow: [
354
+ { text: 'Ver más', url: 'https://ejemplo.com' }
355
+ ]
356
+ })
357
+ ```
256
358
 
257
- ### 📞 `sendCallButton` Botón de Llamada
258
- Inicia una llamada al número indicado al tocar el botón.
359
+ **Carousel** (varias cards, cada una con su propio header y botones):
259
360
 
260
- ```javascript
261
- await sendCallButton(
262
- conn,
263
- jid,
264
- '📞 *SOPORTE TÉCNICO*\n\n¿Necesitas ayuda? Llámanos:',
265
- '+5214183357841', // número de teléfono
266
- '📞 Llamar Ahora' // etiqueta del botón
267
- )
361
+ ```ts
362
+ await sock.sendMessage(jid, {
363
+ cards: [
364
+ { image: { url: 'https://ejemplo.com/1.jpg' }, caption: 'Carta 1', nativeFlow: [{ text: 'Comprar', id: 'buy_1' }] },
365
+ { image: { url: 'https://ejemplo.com/2.jpg' }, caption: 'Carta 2', nativeFlow: [{ text: 'Comprar', id: 'buy_2' }] }
366
+ ]
367
+ })
268
368
  ```
269
369
 
270
- ---
370
+ ### Mensajes crudos (smgss): pagos, productos, álbumes, eventos y más
371
+
372
+ Para contenido que no tiene un atajo declarativo simple, ASTA-BOTS incluye un dispatcher (`smgss`) que reconoce el contenido a partir de su forma y lo arma internamente. Se usa igual que cualquier otro contenido, pasándolo directo a `sock.sendMessage(jid, contenido)`:
373
+
374
+ | Contenido | Qué hace |
375
+ |---|---|
376
+ | `{ requestPaymentMessage: {...} }` | Pedido de pago, con nota de texto o sticker adjunto opcional. |
377
+ | `{ productMessage: {...} }` | Card de un producto individual (imagen, precio, descripción). |
378
+ | `{ interactiveButtons: [...] }` | Botones declarativos con header de imagen/video/documento/ubicación/producto. |
379
+ | `{ interactiveMessage: {...} }` | Interactive message armado a mano (media header + botones nativos propios). |
380
+ | `{ interactiveMessage: { carouselMessage: {...} } }` | Carousel armado a mano, con cards en formato de proto crudo. |
381
+ | `{ albumMessage: [...] }` o `{ album: [...] }` | Álbum: manda el contenedor y después cada foto/video asociado. |
382
+ | `{ eventMessage: {...} }` | Evento de WhatsApp (nombre, descripción, fecha, ubicación, link para unirse). |
383
+ | `{ pollResultMessage: {...} }` | Snapshot de resultados de una encuesta. |
384
+ | `{ groupStatusMessage: {...} }` | Historia visible solo para un grupo puntual (distinto al estado normal). |
385
+
386
+ Ejemplo de pedido de pago:
387
+
388
+ ```ts
389
+ await sock.sendMessage(jid, {
390
+ requestPaymentMessage: {
391
+ amount: 50000, // en la unidad mínima de la moneda (ej. centavos)
392
+ currency: 'USD',
393
+ from: '0@s.whatsapp.net',
394
+ note: 'Pago por el servicio de este mes'
395
+ }
396
+ })
397
+ ```
271
398
 
272
- ### 📋 `sendListMenu` — Menú Desplegable (Lista)
273
- Muestra un menú con secciones y opciones seleccionables.
274
-
275
- ```javascript
276
- await sendListMenu(
277
- conn,
278
- jid,
279
- '📋 *SELECCIONA UNA OPCIÓN*',
280
- 'Menú Principal', // título del botón que abre la lista
281
- [
282
- {
283
- title: '📱 COMANDOS BÁSICOS',
284
- rows: [
285
- { id: '#menu', title: '📋 Menú', description: 'Ver todos los comandos' },
286
- { id: '#ping', title: '🏓 Ping', description: 'Ver latencia del bot' },
287
- { id: '#owner', title: '👑 Owner', description: 'Info del creador' }
288
- ]
289
- },
290
- {
291
- title: '🎮 COMANDOS DE GRUPO',
292
- rows: [
293
- { id: '#add', title: '➕ Agregar', description: 'Agregar usuario al grupo' },
294
- { id: '#kick', title: '👢 Expulsar', description: 'Expulsar usuario del grupo' },
295
- { id: '#promote', title: '⭐ Promover', description: 'Dar admin a un usuario' }
296
- ]
297
- },
298
- {
299
- title: '🔧 CONFIGURACIÓN',
300
- rows: [
301
- { id: '#sinprefix', title: '⚙️ Sin Prefijo', description: 'Activar/desactivar prefijo' },
302
- { id: '#antilink', title: '🔗 Anti Link', description: 'Bloquear enlaces' }
303
- ]
304
- }
305
- ]
306
- )
399
+ Ejemplo de álbum:
400
+
401
+ ```ts
402
+ await sock.sendMessage(jid, {
403
+ album: [
404
+ { image: { url: './foto1.jpg' } },
405
+ { image: { url: './foto2.jpg' } },
406
+ { video: { url: './video1.mp4' } }
407
+ ]
408
+ })
307
409
  ```
308
410
 
309
- ---
411
+ ### Mensajes "raw" (proto armado a mano)
310
412
 
311
- ### 🎯 `sendInteractiveMessage`Múltiples Botones Mixtos
312
- Combina distintos tipos de botones en un solo mensaje.
313
-
314
- ```javascript
315
- await sendInteractiveMessage(
316
- conn,
317
- jid,
318
- '🎯 *PANEL DE CONTROL*\n\nSelecciona una acción rápida:',
319
- [
320
- { type: 'url', text: '🌐 GitHub', value: 'https://github.com/Fer2809fl/Asta_bot' },
321
- { type: 'copy', text: '📋 Comando Inicio', value: 'npm start' },
322
- { type: 'quick', text: '📋 Ver Menú', value: 'menu' }
323
- ]
324
- )
413
+ Para casos que ningún builder cubre todavía, se puede pasar el contenido del mensaje ya armado como protobuf, agregando `raw: true`. ASTA-BOTS no lo interpreta ni lo transforma lo manda tal cual:
414
+
415
+ ```ts
416
+ await sock.sendMessage(jid, {
417
+ raw: true,
418
+ extendedTextMessage: { text: 'Mensaje armado a mano' }
419
+ })
325
420
  ```
326
421
 
327
- ---
422
+ Es una salida de emergencia para power users; para el 99% de los casos alcanza con los métodos normales de `sendMessage`.
328
423
 
329
- ### Plugin de ejemplo completo
330
-
331
- Aquí un plugin listo para usar en tu bot con todos los tipos de botones:
332
-
333
- ```javascript
334
- // plugins/botones.js
335
- import {
336
- sendCopyButton,
337
- sendUrlButton,
338
- sendQuickReplyButtons,
339
- sendCallButton,
340
- sendListMenu,
341
- sendInteractiveMessage
342
- } from '@fer2809fl/baileys'
343
-
344
- let handler = async (m, { conn, usedPrefix }) => {
345
-
346
- // #boton1 — Botón Copiar
347
- if (m.text === `${usedPrefix}boton1`) {
348
- await sendCopyButton(conn, m.chat,
349
- '📋 *CÓDIGO DE INSTALACIÓN*\n\nEjecuta este comando en tu terminal:',
350
- 'npm install asta-bot',
351
- '📋 Copiar Comando'
352
- )
353
- }
424
+ ### Editar, eliminar, reenviar y fijar
354
425
 
355
- // #boton2 — Botón URL
356
- else if (m.text === `${usedPrefix}boton2`) {
357
- await sendUrlButton(conn, m.chat,
358
- '🔗 *ENLACES IMPORTANTES*\n\nVisita nuestro repositorio oficial:',
359
- 'https://github.com/Fer2809fl/Asta_bot',
360
- '🌐 Ver GitHub'
361
- )
362
- }
426
+ ```ts
427
+ // Editar un mensaje ya enviado
428
+ await sock.sendMessage(jid, { text: 'Texto corregido', edit: mensajeAnterior.key })
363
429
 
364
- // #boton3 Botones de Respuesta Rápida
365
- else if (m.text === `${usedPrefix}boton3`) {
366
- await sendQuickReplyButtons(conn, m.chat,
367
- '🎮 *MENÚ DE OPCIONES*\n\n¿Qué deseas hacer?',
368
- [
369
- { id: 'menu', text: '📋 Ver Menú' },
370
- { id: 'info', text: 'ℹ️ Información' },
371
- { id: 'owner', text: '👑 Owner' }
372
- ]
373
- )
374
- }
430
+ // Eliminar (para todos)
431
+ await sock.sendMessage(jid, { delete: mensaje.key })
375
432
 
376
- // #boton4 Botón de Llamada
377
- else if (m.text === `${usedPrefix}boton4`) {
378
- await sendCallButton(conn, m.chat,
379
- '📞 *SOPORTE TÉCNICO*\n\n¿Necesitas ayuda? Llámanos:',
380
- '+5214183357841',
381
- '📞 Llamar Ahora'
382
- )
383
- }
433
+ // Reenviar un mensaje
434
+ await sock.sendMessage(jid, { forward: mensajeOriginal })
384
435
 
385
- // #boton5 Lista Desplegable
386
- else if (m.text === `${usedPrefix}boton5`) {
387
- await sendListMenu(conn, m.chat,
388
- '📋 *SELECCIONA UNA OPCIÓN*',
389
- 'Menú Principal',
390
- [
391
- {
392
- title: '📱 COMANDOS BÁSICOS',
393
- rows: [
394
- { id: '#menu', title: '📋 Menú', description: 'Ver todos los comandos' },
395
- { id: '#ping', title: '🏓 Ping', description: 'Ver latencia del bot' },
396
- { id: '#owner', title: '👑 Owner', description: 'Info del creador' }
397
- ]
398
- },
399
- {
400
- title: '🎮 COMANDOS DE GRUPO',
401
- rows: [
402
- { id: '#add', title: '➕ Agregar', description: 'Agregar usuario al grupo' },
403
- { id: '#kick', title: '👢 Expulsar', description: 'Expulsar usuario del grupo' },
404
- { id: '#promote', title: '⭐ Promover', description: 'Dar admin a un usuario' }
405
- ]
406
- },
407
- {
408
- title: '🔧 CONFIGURACIÓN',
409
- rows: [
410
- { id: '#sinprefix', title: '⚙️ Sin Prefijo', description: 'Activar/desactivar prefijo' },
411
- { id: '#antilink', title: '🔗 Anti Link', description: 'Bloquear enlaces' }
412
- ]
413
- }
414
- ]
415
- )
416
- }
436
+ // Fijar un mensaje en el chat (24h, 7 días o 30 días)
437
+ await sock.sendMessage(jid, { pin: mensaje.key, type: 1, time: 86400 })
438
+ ```
417
439
 
418
- // #boton6 — Botones Mixtos
419
- else if (m.text === `${usedPrefix}boton6`) {
420
- await sendInteractiveMessage(conn, m.chat,
421
- '🎯 *PANEL DE CONTROL*\n\nSelecciona una acción rápida:',
422
- [
423
- { type: 'url', text: '🌐 GitHub', value: 'https://github.com/Fer2809fl/Asta_bot' },
424
- { type: 'copy', text: '📋 Comando Inicio', value: 'npm start' },
425
- { type: 'quick', text: '📋 Ver Menú', value: 'menu' }
426
- ]
427
- )
428
- }
440
+ ### Mensajes enriquecidos
429
441
 
430
- // #botones Ayuda
431
- else if (m.text === `${usedPrefix}botones`) {
432
- await conn.reply(m.chat,
433
- `🧪 *COMANDOS DE PRUEBA - BOTONES INTERACTIVOS*\n\n` +
434
- `┌✦ *BOTÓN COPIAR*\n` +
435
- `│ ${usedPrefix}boton1 - Botón que copia texto\n│\n` +
436
- `├✦ *BOTÓN URL*\n` +
437
- `│ ${usedPrefix}boton2 - Botón que abre enlace\n│\n` +
438
- `├✦ *BOTONES RÁPIDOS*\n` +
439
- `│ ${usedPrefix}boton3 - Botones de respuesta\n│\n` +
440
- `├✦ *BOTÓN LLAMADA*\n` +
441
- `│ ${usedPrefix}boton4 - Botón para llamar\n│\n` +
442
- `├✦ *LISTA DESPLEGABLE*\n` +
443
- `│ ${usedPrefix}boton5 - Menú con opciones\n│\n` +
444
- `└✦ *MÚLTIPLES BOTONES*\n` +
445
- ` ${usedPrefix}boton6 - Combinación de botones\n\n` +
446
- `✨ *Prueba cada uno y mira cómo funcionan!*`, m)
447
- }
448
- }
442
+ Estos métodos permiten enviar contenido "enriquecido" reutilizando el mismo formato interno que WhatsApp usa para las respuestas de Meta AI (tablas, código con resaltado de sintaxis, LaTeX, etc.), sin tener que armar el protobuf a mano.
449
443
 
450
- handler.command = ['boton1', 'boton2', 'boton3', 'boton4', 'boton5', 'boton6', 'botones']
451
- handler.help = ['boton1', 'boton2', 'boton3', 'boton4', 'boton5', 'boton6', 'botones']
452
- handler.tags = ['test']
444
+ **`sendTable`** envía una tabla con encabezados y filas:
453
445
 
454
- export default handler
446
+ ```ts
447
+ await sock.sendTable(
448
+ jid,
449
+ 'Precios',
450
+ ['Producto', 'Precio'],
451
+ [['Café', '$50'], ['Té', '$40']],
452
+ undefined,
453
+ { footer: 'Precios sujetos a cambio' }
454
+ )
455
455
  ```
456
456
 
457
- ---
457
+ **`sendList`** — envía una lista simple de elementos:
458
458
 
459
- ## 📖 Uso Básico
459
+ ```ts
460
+ await sock.sendList(jid, 'Tareas pendientes', ['Comprar pan', 'Enviar reporte', 'Llamar al cliente'])
461
+ ```
460
462
 
461
- ### Inicializar el bot
463
+ > No confundir con la lista de selección de WhatsApp (`sections`) explicada en [Botones, listas, templates y carousel](#botones-listas-templates-y-carousel) — `sendList` arma un mensaje enriquecido de solo lectura, no una lista interactiva con opciones seleccionables.
462
464
 
463
- ```javascript
464
- // JavaScript
465
- const { makeWASocket, useMultiFileAuthState } = require('@fer2809fl/baileys')
465
+ **`sendCodeBlock`** — envía código con resaltado de sintaxis (soporta `javascript`, `typescript`, `python`, entre otros):
466
466
 
467
- const { state, saveCreds } = await useMultiFileAuthState('session-mymelody')
468
- const melody = makeWASocket({ auth: state, printQRInTerminal: true })
469
- melody.ev.on('creds.update', saveCreds)
467
+ ```ts
468
+ await sock.sendCodeBlock(jid, 'console.log("Hola mundo")', undefined, { language: 'javascript', title: 'Ejemplo' })
470
469
  ```
471
470
 
472
- ```typescript
473
- // TypeScript
474
- import makeWASocket, { useMultiFileAuthState } from '@fer2809fl/baileys'
471
+ **`sendLatex`** — envía una o más expresiones matemáticas en formato LaTeX:
475
472
 
476
- const { state, saveCreds } = await useMultiFileAuthState('session-mymelody')
477
- const melody = makeWASocket({ auth: state, printQRInTerminal: true })
478
- melody.ev.on('creds.update', saveCreds)
473
+ ```ts
474
+ await sock.sendLatex(jid, undefined, {
475
+ text: 'La fórmula cuadrática es:',
476
+ expressions: [{ latexExpression: 'x = \\frac{-b \\pm \\sqrt{b^2-4ac}}{2a}' }]
477
+ })
479
478
  ```
480
479
 
481
- ### Enviar mensajes
480
+ **`sendRichMessage`** envía una combinación libre de sub-mensajes (texto, tabla, código, LaTeX, imágenes) en un solo mensaje:
482
481
 
483
- ```javascript
484
- // Texto simple
485
- await melody.sendMessage(jid, { text: '¡Hola mundo!' })
482
+ ```ts
483
+ await sock.sendRichMessage(jid, [
484
+ { messageType: RichSubMessageType.TEXT, messageText: 'Resultado del análisis:' },
485
+ { messageType: RichSubMessageType.TABLE, tableMetadata: { title: 'Datos', rows: [...] } }
486
+ ])
487
+ ```
486
488
 
487
- // Imagen con caption
488
- await melody.sendMessage(jid, {
489
- image: { url: './images/mymelody.jpg' },
490
- caption: '¡Mira mi nueva foto!'
491
- })
489
+ **`captureUnifiedResponse`** / **`sendUnifiedResponse`** — permiten capturar la respuesta enriquecida de un mensaje recibido y reenviarla o reutilizarla tal cual:
492
490
 
493
- // Video con caption
494
- await melody.sendMessage(jid, {
495
- video: { url: './videos/clip.mp4' },
496
- caption: '¡Nuevo video!'
497
- })
491
+ ```ts
492
+ const capturado = sock.captureUnifiedResponse(mensajeRecibido.message)
493
+ if (capturado) {
494
+ await sock.sendUnifiedResponse(otroJid, undefined, capturado)
495
+ }
496
+ ```
498
497
 
499
- // Audio (PTT = nota de voz)
500
- await melody.sendMessage(jid, {
501
- audio: { url: './audio/nota.mp3' },
502
- mimetype: 'audio/mp4',
503
- ptt: true
504
- })
498
+ **`updateMediaMessage`** re-sube un archivo multimedia cuyo enlace venció, para poder reenviarlo:
505
499
 
506
- // Sticker
507
- await melody.sendMessage(jid, {
508
- sticker: { url: './stickers/melody.webp' }
509
- })
500
+ ```ts
501
+ await sock.updateMediaMessage(mensajeConMediaVencido)
502
+ ```
510
503
 
511
- // Documento
512
- await melody.sendMessage(jid, {
513
- document: { url: './archivo.pdf' },
514
- mimetype: 'application/pdf',
515
- fileName: 'archivo.pdf'
516
- })
504
+ ### Marcar un mensaje como generado por IA
517
505
 
518
- // Reaccionar a un mensaje
519
- await melody.sendMessage(jid, {
520
- react: { text: '💖', key: m.key }
521
- })
506
+ Cualquier mensaje regular (texto, imagen, video, etc.) puede llevar la etiqueta/icono de "generado por IA" que WhatsApp muestra junto al mensaje, agregando la propiedad `ai: true` al contenido:
507
+
508
+ ```ts
509
+ await sock.sendMessage(jid, { text: 'Esta respuesta la generó un modelo de IA', ai: true })
522
510
  ```
523
511
 
524
- ---
512
+ > ⚠️ Esta marca **solo funciona en chats individuales** (no en grupos). Si se intenta usar `ai: true` en un grupo, ASTA-BOTS lanza un error indicando que el icono de IA solo está permitido en chats privados.
525
513
 
526
- ## 🤖 Comandos Personalizados
527
-
528
- ### JavaScript
529
- ```javascript
530
- melody.ev.on('messages.upsert', async ({ messages }) => {
531
- const m = messages[0]
532
- const body = m.message?.conversation
533
- || m.message?.extendedTextMessage?.text
534
- || ''
535
-
536
- const prefix = '!'
537
- if (!body.startsWith(prefix)) return
538
-
539
- const [cmd, ...args] = body.slice(prefix.length).trim().split(' ')
540
-
541
- switch (cmd.toLowerCase()) {
542
- case 'hola':
543
- await melody.sendMessage(m.key.remoteJid, {
544
- text: '¡Hola! Soy Delta, ¿en qué puedo ayudarte?'
545
- })
546
- break
547
- case 'ping':
548
- await melody.sendMessage(m.key.remoteJid, { text: '🏓 Pong!' })
549
- break
550
- default:
551
- await melody.sendMessage(m.key.remoteJid, {
552
- text: `Comando desconocido: ${cmd}`
553
- })
554
- }
555
- })
514
+ ### Estados (historias)
515
+
516
+ `sendStatusWhatsApp` publica un estado (historia) en tu cuenta. A diferencia de `sendMessage`, este método está pensado para trabajar junto con **menciones**: el segundo parámetro es un arreglo de JIDs (contactos o grupos) a los que se les notifica que fueron mencionados en el estado.
517
+
518
+ ```ts
519
+ await sock.sendStatusWhatsApp(
520
+ { text: 'Nuevo estado 🚀', backgroundColor: '#25D366' },
521
+ [contactoJid, grupoJid] // se les notifica el estado como mención
522
+ )
556
523
  ```
557
524
 
558
- ---
525
+ - Si se pasa un JID de **contacto individual**, recibe la notificación de mención de estado como corresponde a un chat privado.
526
+ - Si se pasa un JID de **grupo**, el grupo entero recibe una única notificación de mención de estado a nivel de grupo (no se le manda una notificación repetida a cada miembro por separado).
527
+ - Si no se pasa ningún JID, el estado no se publica ya que requiere pasar las menciones necesarias.
528
+ - Para contenido multimedia (imagen, video, audio) en el estado, se pueden combinar los mismos campos que en `sendMessage` (`image`, `video`, `audio`), y ASTA-BOTS ajusta automáticamente el color de fondo y la fuente cuando corresponde.
559
529
 
560
- ## ⚙️ Configuración Avanzada
530
+ ### Recibos, lectura y presencia
561
531
 
562
- ```javascript
563
- const melody = makeWASocket({
564
- auth: state,
565
- printQRInTerminal: true,
566
- markOnlineOnConnect: false,
567
- browser: ["Delta", "Chrome", "1.0.0"],
568
- logger: require('pino')({ level: 'silent' }),
569
- syncFullHistory: false,
570
- generateHighQualityLinkPreview: true
571
- })
532
+
533
+ ```ts
534
+ // Marcar mensajes como leídos (doble check azul)
535
+ await sock.readMessages([mensaje.key])
536
+
537
+ // Enviar un recibo manualmente
538
+ await sock.sendReceipt(jid, participante, [id], 'read')
539
+
540
+ // Actualizar presencia (escribiendo, grabando audio, en línea)
541
+ await sock.sendPresenceUpdate('composing', jid) // 'available' | 'unavailable' | 'composing' | 'recording' | 'paused'
542
+
543
+ // Suscribirse a la presencia de un contacto
544
+ await sock.presenceSubscribe(jid)
572
545
  ```
573
546
 
574
- ---
547
+ ## Grupos, comunidades y canales
575
548
 
576
- ## 🛠️ Funciones Útiles
549
+ ASTA-BOTS conserva toda la funcionalidad estándar de Baileys para administrar grupos, comunidades (grupos con subgrupos) y canales de difusión (newsletters):
577
550
 
578
- ### Broadcast a múltiples chats
579
- ```javascript
580
- async function broadcastMessage(jids, message) {
581
- for (const jid of jids) {
582
- await melody.sendMessage(jid, { text: message })
583
- await new Promise(r => setTimeout(r, 1000)) // delay para evitar ban
584
- }
585
- }
551
+ ```ts
552
+ await sock.groupCreate('Mi grupo', [jid1, jid2])
553
+ await sock.groupParticipantsUpdate(jid, [participante], 'add') // 'add' | 'remove' | 'promote' | 'demote'
554
+ await sock.groupInviteCode(jid)
555
+
556
+ await sock.communityCreate('Mi comunidad', 'Descripción')
557
+
558
+ await sock.newsletterCreate('Mi canal', 'Descripción del canal')
586
559
  ```
587
560
 
588
- ### Descargar medios recibidos
589
- ```javascript
590
- const { downloadMediaMessage } = require('@fer2809fl/baileys')
561
+ ## Perfil, privacidad y negocios
591
562
 
592
- melody.ev.on('messages.upsert', async ({ messages }) => {
593
- const m = messages[0]
594
- if (!m.message?.imageMessage) return
563
+ ```ts
564
+ await sock.updateProfileName('Mi Bot')
565
+ await sock.updateProfileStatus('Disponible 24/7')
566
+ await sock.updateProfilePicture(jid, { url: './avatar.jpg' })
595
567
 
596
- const buffer = await downloadMediaMessage(m, 'buffer', {})
597
- require('fs').writeFileSync('./imagen_recibida.jpg', buffer)
598
- console.log('✅ Imagen guardada')
599
- })
568
+ await sock.updateBlockStatus(jid, 'block') // o 'unblock'
569
+
570
+ // API de negocios (catálogo, pedidos)
571
+ await sock.getCatalog({ jid })
572
+ await sock.productCreate({ ... })
600
573
  ```
601
574
 
602
- ### Obtener info de un grupo
603
- ```javascript
604
- const metadata = await melody.groupMetadata(jid)
605
- console.log('Nombre:', metadata.subject)
606
- console.log('Participantes:', metadata.participants.length)
575
+ ## Store (caché en memoria)
576
+
577
+ El **Store** es un caché en memoria de chats, contactos, mensajes y metadata de grupos, que se va llenando solo a medida que van llegando eventos (`sock.ev`). El Baileys oficial más reciente **eliminó este módulo** de la librería; en ASTA-BOTS se mantiene disponible porque resuelve un problema muy común al hacer un bot: no depender de volver a pedirle todo a WhatsApp (mensaje anterior, foto de perfil, metadata de un grupo) cada vez que se necesita.
578
+
579
+ ### ¿Cuándo conviene usarlo?
580
+
581
+ - Si tu bot necesita **buscar mensajes anteriores** (por ejemplo, para citar o reenviar algo que no tenés a mano).
582
+ - Si querés **listar los chats o contactos** sin tener que reconstruirlos manualmente desde los eventos.
583
+ - Si hacés muchas consultas de `groupMetadata` o `profilePictureUrl` y no querés golpear la API de WhatsApp cada vez.
584
+
585
+ Si tu bot es simple y solo responde a mensajes entrantes sin necesitar historial, podés omitirlo sin problema; el store consume RAM porque guarda todo en memoria.
586
+
587
+ ### Uso
588
+
589
+ ```ts
590
+ import makeWASocket, { makeInMemoryStore, useMultiFileAuthState } from 'baileys'
591
+
592
+ const store = makeInMemoryStore({})
593
+ store.readFromFile('./store.json') // opcional: cargar datos guardados de una corrida anterior
594
+
595
+ const { state, saveCreds } = await useMultiFileAuthState('sesion')
596
+ const sock = makeWASocket({ auth: state })
597
+
598
+ store.bind(sock.ev) // conecta el store a todos los eventos del socket
599
+
600
+ sock.ev.on('creds.update', saveCreds)
601
+
602
+ // Guardar el store a disco cada cierto tiempo
603
+ setInterval(() => {
604
+ store.writeToFile('./store.json')
605
+ }, 10_000)
606
+
607
+ // Ejemplos de consulta
608
+ const chats = store.chats.all()
609
+ const contacto = store.contacts['5215512345678@s.whatsapp.net']
610
+ const mensaje = await store.loadMessage(jid, mensajeId)
607
611
  ```
608
612
 
609
- ### Mencionar usuarios en un grupo
610
- ```javascript
611
- await melody.sendMessage(jid, {
612
- text: '@1234567890 ¡Hola!',
613
- mentions: ['1234567890@s.whatsapp.net']
614
- })
613
+ ## Utilidades ASTA-BOTS
614
+
615
+ Estas utilidades son propias de **ASTA-BOTS** y no existen en el Baileys original: nacieron para resolver lo más repetitivo al armar un bot de comandos.
616
+
617
+ ### `resolveJid`: resolución automática de JID
618
+
619
+ Detecta el JID objetivo de un comando sin que tengas que pasarlo a mano, siguiendo esta prioridad: **mensaje citado → primera mención → argumento numérico → remitente**.
620
+
621
+ ```ts
622
+ import { resolveJid } from 'baileys'
623
+
624
+ // .ban (respondiendo a alguien) → toma el citado
625
+ // .ban @usuario → toma la mención
626
+ // .ban 5216141234567 → toma el argumento
627
+ // .ban → cae al remitente
628
+ const targetJid = resolveJid(m, args[0])
615
629
  ```
616
630
 
617
- ---
631
+ ### Sistema de botones de conveniencia
618
632
 
619
- ## 📁 Estructura Recomendada del Proyecto
633
+ Además del soporte nativo de `sock.sendMessage` (ver [Botones, listas, templates y carousel](#botones-listas-templates-y-carousel)), ASTA-BOTS trae funciones listas para usar cuando querés algo rápido sin armar el objeto del mensaje:
620
634
 
635
+ ```ts
636
+ import { sendQuickReplyButtons, setupButtonHandler } from 'baileys'
637
+
638
+ // Engancha el detector de respuestas de botón una sola vez, al iniciar
639
+ setupButtonHandler(sock, plugins, db)
640
+
641
+ await sendQuickReplyButtons(sock, jid, '¿Qué querés hacer?', [
642
+ { text: '📋 Menú', id: 'menu' },
643
+ { text: '⚙️ Ajustes', id: 'settings' }
644
+ ])
621
645
  ```
622
- mi-bot/
623
- ├── index.js # Entrada principal
624
- ├── config.js # Configuración general
625
- ├── commands/
626
- │ ├── hola.js
627
- │ ├── ping.js
628
- │ ├── stickers.js
629
- │ └── botones.js
630
- ├── events/
631
- │ ├── messages.js
632
- │ └── connection.js
633
- ├── utils/
634
- │ └── helpers.js
635
- └── session-mymelody/ # Sesión guardada automáticamente
646
+
647
+ | Función | Qué hace |
648
+ |---|---|
649
+ | `sendCopyButton` | Botón que copia texto al portapapeles |
650
+ | `sendUrlButton` | Botón de enlace |
651
+ | `sendQuickReplyButtons` | Botones de respuesta rápida |
652
+ | `sendCallButton` | Botón de llamada |
653
+ | `sendListMenu` | Lista desplegable con secciones |
654
+ | `sendInteractiveMessage` | Combinación de varios tipos de botón |
655
+ | `handleButtonResponse` | Detecta y ejecuta el comando de un botón presionado |
656
+ | `setupButtonHandler` | Engancha el detector de botones al socket sin pisar tu handler de mensajes |
657
+
658
+ Todas caen a texto plano automáticamente si WhatsApp rechaza el mensaje interactivo.
659
+
660
+ ### Código de vinculación de marca
661
+
662
+ Al pedir un código de emparejamiento sin especificar uno propio, ASTA-BOTS usa por defecto el código de marca **`ASTABOTS`** (8 caracteres, cumple el requisito de WhatsApp):
663
+
664
+ ```ts
665
+ const code = await sock.requestPairingCode('5216141234567')
666
+ // code === 'ASTABOTS'
667
+
668
+ // o con tu propio código de 8 caracteres:
669
+ const code2 = await sock.requestPairingCode('5216141234567', 'MIPROPIO')
636
670
  ```
637
671
 
638
- ---
672
+ ## Aviso legal
639
673
 
640
- ## 📝 Historial de Versiones
674
+ Este proyecto no está afiliado, asociado, autorizado ni respaldado de ninguna forma por WhatsApp Inc. ni por Meta. "WhatsApp" y las marcas relacionadas son propiedad de sus respectivos dueños.
641
675
 
642
- | Versión | Cambios |
643
- |---------|---------|
644
- | **1.8.9** | ✅ Botones interactivos (`sendCopyButton`, `sendUrlButton`, `sendQuickReplyButtons`, `sendCallButton`, `sendListMenu`, `sendInteractiveMessage`) — 🐛 Fix error de pairing en macOS |
645
- | 1.4.5 | Versión estable anterior |
676
+ El uso de esta librería es responsabilidad exclusiva de quien la implementa. Se recomienda no usarla para spam, mensajería masiva no solicitada ni cualquier práctica que viole los Términos de Servicio de WhatsApp.
646
677
 
647
- ---
678
+ ## Créditos
648
679
 
649
- ## 🔗 Links
680
+ **ASTA-BOTS** es un fork de **[Baileys](https://github.com/WhiskeySockets/Baileys)**, la librería original mantenida por la comunidad de **WhiskeySockets**. Gran parte de la base de este proyecto —el manejo del protocolo de WhatsApp Web, el cifrado, la arquitectura del socket y la mayoría del código— proviene de ese trabajo original.
650
681
 
651
- - 📦 npm: [npmjs.com/package/@fer2809fl/baileys](https://www.npmjs.com/package/@fer2809fl/baileys)
652
- - 💻 Repositorio: [github.com/Fer2809fl/Baileys](https://github.com/Fer2809fl/Baileys)
653
- - 🐛 Issues: [github.com/Fer2809fl/Baileys/issues](https://github.com/Fer2809fl/Baileys/issues)
682
+ - Repositorio oficial: https://github.com/WhiskeySockets/Baileys
683
+ - Licencia: MIT
684
+
685
+ Si esta librería te resulta útil, considerá también dar reconocimiento y apoyo al proyecto original que es de this-xys/bails. 🙌
654
686
 
655
687
  ---
656
688
 
657
- <div align="center">
689
+ <div align="center">Hecho con 💙 por <b>ASTA-BOTS</b></div>
658
690
 
659
- Desarrollado con 🤍 por [Fer2809fl](https://github.com/Fer2809fl)
691
+ ## créditos
692
+
693
+ this-xys/bails
660
694
 
661
- </div>