@fer2809fl/baileys 1.4.7 → 7.0.0-rc13

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 (479) hide show
  1. package/LICENSE +21 -674
  2. package/README.md +579 -309
  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 -51
  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 +9 -21
  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 +972 -0
  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 +239 -136
  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 +140 -0
  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 -17
  258. package/lib/Utils/index.d.ts.map +1 -0
  259. package/lib/Utils/index.js +30 -33
  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 +224 -0
  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 +420 -194
  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 +23 -27
  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 +9 -11
  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 +45 -65
  454. package/WAProto/index.ts.ts +0 -53473
  455. package/WAProto/n +0 -1
  456. package/lib/Defaults/baileys-version.json +0 -3
  457. package/lib/Defaults/n +0 -1
  458. package/lib/Signal/Group/queue-job.d.ts +0 -1
  459. package/lib/Signal/Group/queue-job.js +0 -57
  460. package/lib/Signal/n +0 -1
  461. package/lib/Socket/Client/n +0 -1
  462. package/lib/Socket/n +0 -1
  463. package/lib/Socket/setup.js +0 -480
  464. package/lib/Socket/setup.ts +0 -622
  465. package/lib/Socket/usync.d.ts +0 -36
  466. package/lib/Socket/usync.js +0 -70
  467. package/lib/Store/n +0 -1
  468. package/lib/Types/Newsletter.d.ts +0 -79
  469. package/lib/Types/Newsletter.js +0 -18
  470. package/lib/Types/n +0 -1
  471. package/lib/Utils/baileys-event-stream.d.ts +0 -16
  472. package/lib/Utils/baileys-event-stream.js +0 -63
  473. package/lib/Utils/n +0 -1
  474. package/lib/WABinary/jid-utils.js.bak +0 -83
  475. package/lib/WABinary/n +0 -1
  476. package/lib/WAM/n +0 -1
  477. package/lib/WAUSync/Protocols/n +0 -1
  478. package/lib/WAUSync/n +0 -1
  479. package/lib/n +0 -1
package/README.md CHANGED
@@ -1,424 +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="200" style="border-radius: 20px;"/>
3
+ # ASTA-BOTS
4
4
 
5
- # @Fer280809/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/@whiskeysockets/baileys?color=blueviolet&label=version)](https://github.com/Fer280809/Baileys)
9
- [![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
10
- [![Node.js](https://img.shields.io/badge/node-%3E%3D14-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
- ## ⚠️ Nota Importante
81
+ ```bash
82
+ npm install github:TU-USUARIO/asta-bots
83
+ ```
20
84
 
21
- Esta librería está basada en Baileys. No está afiliada ni aprobada oficialmente por WhatsApp.
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.
22
88
 
23
- > **@Fer280809/Baileys** y su desarrollador no se hacen responsables por el mal uso de esta librería.
24
- > Úsala de forma responsable — nada de spam ni actividades maliciosas.
89
+ Una vez instalada, importala en tu proyecto:
25
90
 
26
- ---
91
+ ```ts
92
+ import makeWASocket from 'baileys'
93
+ ```
27
94
 
28
- ## 📦 Instalación
95
+ ## Inicio rápido
29
96
 
30
- Puedes instalarla de dos formas, ambas funcionan igual:
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).
31
98
 
32
- ```bash
33
- # Con el paquete de este repo
34
- npm install @fer280809/Baileys
35
- yarn add @fer280809/Baileys
99
+ ### Vinculación de la cuenta
36
100
 
37
- # Con el paquete original de whiskeysockets
38
- npm install @whiskeysockets/baileys
39
- yarn add @whiskeysockets/baileys
101
+ ASTA-BOTS soporta los **2 métodos de vinculación** que ofrece WhatsApp:
40
102
 
41
- # Versión de desarrollo (última del repo)
42
- npm install github:Fer280809/Baileys
43
- yarn add github:Fer280809/Baileys
44
- ```
103
+ #### 1. Con código QR
45
104
 
46
- ---
105
+ ```ts
106
+ import makeWASocket, { useMultiFileAuthState } from 'baileys'
47
107
 
48
- ## Inicio Rápido
108
+ async function iniciar() {
109
+ const { state, saveCreds } = await useMultiFileAuthState('sesion')
49
110
 
50
- ### JavaScript
51
- ```javascript
52
- const { makeWASocket, useMultiFileAuthState } = require('@Fer280809/Baileys')
111
+ const sock = makeWASocket({
112
+ auth: state,
113
+ printQRInTerminal: true
114
+ })
53
115
 
54
- async function startBot() {
55
- const { state, saveCreds } = await useMultiFileAuthState('session-mymelody')
56
-
57
- const melody = makeWASocket({
58
- auth: state,
59
- printQRInTerminal: true
60
- })
116
+ sock.ev.on('creds.update', saveCreds)
61
117
 
62
- melody.ev.on('connection.update', ({ connection }) => {
63
- if (connection === 'open') console.log('✅ ¡Conectado con éxito!')
64
- if (connection === 'close') console.log('❌ Conexión cerrada, reconectando...')
65
- })
118
+ sock.ev.on('connection.update', (update) => {
119
+ console.log(update)
120
+ })
121
+ }
66
122
 
67
- melody.ev.on('messages.upsert', async ({ messages }) => {
68
- const m = messages[0]
69
- if (!m.message) return
123
+ iniciar()
124
+ ```
70
125
 
71
- await melody.sendMessage(m.key.remoteJid, {
72
- text: '¡Hola! Soy un bot de Delta!'
73
- })
74
- })
126
+ Al iniciar, se imprime un código QR en la terminal que hay que escanear desde WhatsApp (Dispositivos vinculados → Vincular un dispositivo).
75
127
 
76
- melody.ev.on('creds.update', saveCreds)
77
- }
128
+ #### 2. Con código de emparejamiento
78
129
 
79
- startBot()
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)
139
+ }
80
140
  ```
81
141
 
82
- ### TypeScript
83
- ```typescript
84
- import makeWASocket, { useMultiFileAuthState, DisconnectReason } from '@Fer280809/Baileys'
85
- import { Boom } from '@hapi/boom'
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".
86
143
 
87
- async function startBot(): Promise<void> {
88
- const { state, saveCreds } = await useMultiFileAuthState('session-mymelody')
89
-
90
- const melody = makeWASocket({
91
- auth: state,
92
- printQRInTerminal: true
93
- })
144
+ ### Guardado de credenciales
94
145
 
95
- melody.ev.on('connection.update', ({ connection, lastDisconnect }) => {
96
- if (connection === 'close') {
97
- const shouldReconnect = (lastDisconnect?.error as Boom)?.output?.statusCode !== DisconnectReason.loggedOut
98
- if (shouldReconnect) startBot()
99
- }
100
- if (connection === 'open') console.log('✅ ¡Conectado!')
101
- })
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:
102
147
 
103
- melody.ev.on('messages.upsert', async ({ messages }) => {
104
- const m = messages[0]
105
- if (!m.message) return
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 |
106
153
 
107
- await melody.sendMessage(m.key.remoteJid!, {
108
- text: '¡Hola! Soy un bot de Delta!'
109
- })
110
- })
154
+ Ejemplo con SQLite:
111
155
 
112
- melody.ev.on('creds.update', saveCreds)
113
- }
156
+ ```ts
157
+ import makeWASocket, { useSqliteAuthState } from 'baileys'
158
+
159
+ const { state, saveCreds } = await useSqliteAuthState({ dbPath: 'sesion.db' })
114
160
 
115
- startBot()
161
+ const sock = makeWASocket({ auth: state })
162
+ sock.ev.on('creds.update', saveCreds)
116
163
  ```
117
164
 
118
- ---
165
+ ## Métodos de mensajería
119
166
 
120
- ## Características
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.
121
168
 
122
- ### General
123
- - 🚀 Optimizado para mayor velocidad y estabilidad
124
- - 📸 Mensajes multimedia (imágenes, video, audio, documentos)
125
- - 🤖 Comandos personalizados fáciles de implementar
126
- - 👥 Soporte para grupos y chats privados
127
- - 🔘 Mensajes interactivos con botones y listas
169
+ Formatos de JID más comunes:
128
170
 
129
- ### Técnicas
130
- - ⚡ Sin Selenium — Conexión directa vía WebSocket
131
- - 💾 Super eficiente Bajo consumo de RAM
132
- - 📱 Soporte multi-dispositivo — Compatible con WhatsApp Web
133
- - 🔷 Totalmente tipado TypeScript y JavaScript
134
- - 🔄 Reconexión automática ante desconexiones
135
- - 🔐 Sesiones persistentes guardadas localmente
136
- - 🌐 API completa de WhatsApp Web
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` |
137
178
 
138
- ---
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.
180
+
181
+ ### `sendMessage` — el método principal
182
+
183
+ ```ts
184
+ await sock.sendMessage(jid, contenido, opciones)
185
+ ```
139
186
 
140
- ## 📖 Uso Básico
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.
141
194
 
142
- ### Inicializar el bot
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.
143
196
 
144
- ```javascript
145
- // JavaScript
146
- const { makeWASocket, useMultiFileAuthState } = require('@Fer280809/Baileys')
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.
147
198
 
148
- const { state, saveCreds } = await useMultiFileAuthState('session-mymelody')
149
- const melody = makeWASocket({ auth: state, printQRInTerminal: true })
150
- melody.ev.on('creds.update', saveCreds)
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.
200
+
201
+ ### Mensajes de texto
202
+
203
+ ```ts
204
+ await sock.sendMessage(jid, { text: 'Hola, esto es ASTA-BOTS 👋' })
151
205
  ```
152
206
 
153
- ```typescript
154
- // TypeScript
155
- import makeWASocket, { useMultiFileAuthState } from '@Fer280809/Baileys'
207
+ Con vista previa de enlace desactivada:
156
208
 
157
- const { state, saveCreds } = await useMultiFileAuthState('session-mymelody')
158
- const melody = makeWASocket({ auth: state, printQRInTerminal: true })
159
- melody.ev.on('creds.update', saveCreds)
209
+ ```ts
210
+ await sock.sendMessage(jid, { text: 'Mirá esto: https://ejemplo.com', linkPreview: null })
160
211
  ```
161
212
 
162
- ### Enviar mensajes
213
+ Citando un mensaje:
163
214
 
164
- ```javascript
165
- // Texto simple
166
- await melody.sendMessage(jid, { text: '¡Hola mundo!' })
215
+ ```ts
216
+ await sock.sendMessage(jid, { text: 'Respondiendo a tu mensaje' }, { quoted: mensajeOriginal })
217
+ ```
167
218
 
168
- // Imagen con caption
169
- await melody.sendMessage(jid, {
170
- image: { url: './images/mymelody.jpg' },
171
- caption: '¡Mira mi nueva foto!'
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'
172
239
  })
240
+ ```
173
241
 
174
- // Video con caption
175
- await melody.sendMessage(jid, {
176
- video: { url: './videos/clip.mp4' },
177
- caption: '¡Nuevo video!'
242
+ > `WAMediaUpload` acepta una URL (`{ url: '...' }`), un `Buffer` o un `Stream`, tanto para archivos locales como remotos.
243
+
244
+ ### Procesar medios sin enviarlos
245
+
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:
247
+
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, ... }
254
+ ```
255
+
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' }
178
264
  })
179
265
 
180
- // Audio (PTT = nota de voz)
181
- await melody.sendMessage(jid, {
182
- audio: { url: './audio/nota.mp3' },
183
- mimetype: 'audio/mp4',
184
- ptt: true
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
+ }
185
272
  })
273
+ ```
186
274
 
187
- // Sticker
188
- await melody.sendMessage(jid, {
189
- sticker: { url: './stickers/melody.webp' }
275
+ ### Encuestas, reacciones y respuestas a botones
276
+
277
+ ```ts
278
+ // Encuesta
279
+ await sock.sendMessage(jid, {
280
+ poll: { name: '¿Cuál prefieres?', values: ['Opción A', 'Opción B'], selectableCount: 1 }
190
281
  })
191
282
 
192
- // Documento
193
- await melody.sendMessage(jid, {
194
- document: { url: './archivo.pdf' },
195
- mimetype: 'application/pdf',
196
- fileName: 'archivo.pdf'
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: '', id: 'btn_si', index: 0 }, type: 'plain' })
288
+ ```
289
+
290
+ ### Botones, listas, templates y carousel
291
+
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.
293
+
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
+ ]
197
306
  })
307
+ ```
198
308
 
199
- // Reaccionar a un mensaje
200
- await melody.sendMessage(jid, {
201
- react: { text: '💖', key: m.key }
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
+ ]
202
328
  })
203
329
  ```
204
330
 
205
- ---
331
+ **Template buttons** (formato legado — solo se renderiza en WhatsApp Web, Desktop e iOS):
206
332
 
207
- ## 🤖 Comandos Personalizados
208
-
209
- ### JavaScript
210
- ```javascript
211
- melody.ev.on('messages.upsert', async ({ messages }) => {
212
- const m = messages[0]
213
- const body = m.message?.conversation
214
- || m.message?.extendedTextMessage?.text
215
- || ''
216
-
217
- const prefix = '!'
218
- if (!body.startsWith(prefix)) return
219
-
220
- const [cmd, ...args] = body.slice(prefix.length).trim().split(' ')
221
-
222
- switch (cmd.toLowerCase()) {
223
- case 'hola':
224
- await melody.sendMessage(m.key.remoteJid, {
225
- text: '¡Hola! Soy Delta, ¿en qué puedo ayudarte?'
226
- })
227
- break
228
-
229
- case 'ping':
230
- await melody.sendMessage(m.key.remoteJid, {
231
- text: '🏓 Pong!'
232
- })
233
- break
234
-
235
- case 'stickers':
236
- await melody.sendMessage(m.key.remoteJid, {
237
- text: '¡Aquí tienes stickers lindos!'
238
- })
239
- break
240
-
241
- default:
242
- await melody.sendMessage(m.key.remoteJid, {
243
- text: `Comando desconocido: ${cmd}`
244
- })
245
- }
333
+ ```ts
334
+ await sock.sendMessage(jid, {
335
+ text: 'Confirmá tu pedido',
336
+ templateButtons: [
337
+ { text: '', id: 'yes' },
338
+ { text: 'Visitar', url: 'https://ejemplo.com' },
339
+ { text: 'Llamar', call: '+50488888888' }
340
+ ]
246
341
  })
247
342
  ```
248
343
 
249
- ### TypeScript
250
- ```typescript
251
- melody.ev.on('messages.upsert', async ({ messages }) => {
252
- const m = messages[0]
253
- const body: string = m.message?.conversation
254
- ?? m.message?.extendedTextMessage?.text
255
- ?? ''
256
-
257
- const prefix = '!'
258
- if (!body.startsWith(prefix)) return
259
-
260
- const [cmd, ...args]: string[] = body.slice(prefix.length).trim().split(' ')
261
-
262
- const commands: Record<string, () => Promise<void>> = {
263
- hola: async () => {
264
- await melody.sendMessage(m.key.remoteJid!, {
265
- text: '¡Hola! Soy My Melody, ¿en qué puedo ayudarte?'
266
- })
267
- },
268
- ping: async () => {
269
- await melody.sendMessage(m.key.remoteJid!, { text: '🏓 Pong!' })
270
- },
271
- info: async () => {
272
- await melody.sendMessage(m.key.remoteJid!, {
273
- text: `📌 JID: ${m.key.remoteJid}\n👤 Sender: ${m.key.participant ?? m.key.remoteJid}`
274
- })
275
- }
276
- }
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
+ ```
277
358
 
278
- await commands[cmd.toLowerCase()]?.()
359
+ **Carousel** (varias cards, cada una con su propio header y botones):
360
+
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
+ ]
279
367
  })
280
368
  ```
281
369
 
282
- ---
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
+ ```
283
398
 
284
- ## ⚙️ Configuración Avanzada
399
+ Ejemplo de álbum:
285
400
 
286
- ### JavaScript
287
- ```javascript
288
- const melody = makeWASocket({
289
- auth: state,
290
- printQRInTerminal: true,
291
- markOnlineOnConnect: false,
292
- browser: ["Delta", "Chrome", "1.0.0"],
293
- logger: require('pino')({ level: 'silent' }),
294
- syncFullHistory: false,
295
- generateHighQualityLinkPreview: true
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
+ ]
296
408
  })
297
409
  ```
298
410
 
299
- ### TypeScript
300
- ```typescript
301
- import pino from 'pino'
411
+ ### Mensajes "raw" (proto armado a mano)
302
412
 
303
- const melody = makeWASocket({
304
- auth: state,
305
- printQRInTerminal: true,
306
- markOnlineOnConnect: false,
307
- browser: ["Delta", "Chrome", "1.0.0"] as [string, string, string],
308
- logger: pino({ level: 'silent' }),
309
- syncFullHistory: false,
310
- generateHighQualityLinkPreview: true
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' }
311
419
  })
312
420
  ```
313
421
 
314
- ---
422
+ Es una salida de emergencia para power users; para el 99% de los casos alcanza con los métodos normales de `sendMessage`.
315
423
 
316
- ## 🛠️ Funciones Útiles
424
+ ### Editar, eliminar, reenviar y fijar
317
425
 
318
- ### Broadcast a múltiples chats
319
- ```javascript
320
- async function broadcastMessage(jids, message) {
321
- for (const jid of jids) {
322
- await melody.sendMessage(jid, { text: message })
323
- await new Promise(r => setTimeout(r, 1000)) // delay para evitar ban
324
- }
325
- }
426
+ ```ts
427
+ // Editar un mensaje ya enviado
428
+ await sock.sendMessage(jid, { text: 'Texto corregido', edit: mensajeAnterior.key })
429
+
430
+ // Eliminar (para todos)
431
+ await sock.sendMessage(jid, { delete: mensaje.key })
432
+
433
+ // Reenviar un mensaje
434
+ await sock.sendMessage(jid, { forward: mensajeOriginal })
435
+
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 })
326
438
  ```
327
439
 
328
- ### Descargar medios recibidos
329
- ```javascript
330
- const { downloadMediaMessage } = require('@Fer280809/Baileys')
440
+ ### Mensajes enriquecidos
331
441
 
332
- melody.ev.on('messages.upsert', async ({ messages }) => {
333
- const m = messages[0]
334
- if (!m.message?.imageMessage) return
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.
335
443
 
336
- const buffer = await downloadMediaMessage(m, 'buffer', {})
337
- require('fs').writeFileSync('./imagen_recibida.jpg', buffer)
338
- console.log('✅ Imagen guardada')
339
- })
444
+ **`sendTable`** envía una tabla con encabezados y filas:
445
+
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
+ ```
456
+
457
+ **`sendList`** — envía una lista simple de elementos:
458
+
459
+ ```ts
460
+ await sock.sendList(jid, 'Tareas pendientes', ['Comprar pan', 'Enviar reporte', 'Llamar al cliente'])
340
461
  ```
341
462
 
342
- ### Obtener info de un grupo
343
- ```javascript
344
- const metadata = await melody.groupMetadata(jid)
345
- console.log('Nombre:', metadata.subject)
346
- console.log('Participantes:', metadata.participants.length)
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.
464
+
465
+ **`sendCodeBlock`** envía código con resaltado de sintaxis (soporta `javascript`, `typescript`, `python`, entre otros):
466
+
467
+ ```ts
468
+ await sock.sendCodeBlock(jid, 'console.log("Hola mundo")', undefined, { language: 'javascript', title: 'Ejemplo' })
347
469
  ```
348
470
 
349
- ### Mencionar usuarios en un grupo
350
- ```javascript
351
- await melody.sendMessage(jid, {
352
- text: '@1234567890 ¡Hola!',
353
- mentions: ['1234567890@s.whatsapp.net']
471
+ **`sendLatex`** envía una o más expresiones matemáticas en formato LaTeX:
472
+
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}' }]
354
477
  })
355
478
  ```
356
479
 
357
- ---
480
+ **`sendRichMessage`** — envía una combinación libre de sub-mensajes (texto, tabla, código, LaTeX, imágenes) en un solo mensaje:
358
481
 
359
- ## 📘 TypeScript — Tipos Personalizados
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
+ ```
360
488
 
361
- ```typescript
362
- import makeWASocket, { WASocket, proto } from '@Fer280809/Baileys'
489
+ **`captureUnifiedResponse`** / **`sendUnifiedResponse`** — permiten capturar la respuesta enriquecida de un mensaje recibido y reenviarla o reutilizarla tal cual:
363
490
 
364
- // Tipo para un mensaje con datos del remitente
365
- type MessageWithSender = proto.IWebMessageInfo & {
366
- senderName?: string
367
- isGroup?: boolean
491
+ ```ts
492
+ const capturado = sock.captureUnifiedResponse(mensajeRecibido.message)
493
+ if (capturado) {
494
+ await sock.sendUnifiedResponse(otroJid, undefined, capturado)
368
495
  }
496
+ ```
369
497
 
370
- // Función tipada para procesar mensajes
371
- async function processMessage(
372
- sock: WASocket,
373
- msg: MessageWithSender
374
- ): Promise<void> {
375
- const jid = msg.key.remoteJid!
376
- const text = msg.message?.conversation ?? ''
377
-
378
- if (text === '!tipo') {
379
- await sock.sendMessage(jid, {
380
- text: `Tipo de chat: ${msg.isGroup ? 'Grupo' : 'Privado'}`
381
- })
382
- }
383
- }
498
+ **`updateMediaMessage`** re-sube un archivo multimedia cuyo enlace venció, para poder reenviarlo:
499
+
500
+ ```ts
501
+ await sock.updateMediaMessage(mensajeConMediaVencido)
384
502
  ```
385
503
 
386
- ---
504
+ ### Marcar un mensaje como generado por IA
387
505
 
388
- ## 📁 Estructura Recomendada del Proyecto
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:
389
507
 
508
+ ```ts
509
+ await sock.sendMessage(jid, { text: 'Esta respuesta la generó un modelo de IA', ai: true })
390
510
  ```
391
- mi-bot/
392
- ├── index.js # Entrada principal
393
- ├── config.js # Configuración general
394
- ├── commands/
395
- │ ├── hola.js
396
- │ ├── ping.js
397
- │ └── stickers.js
398
- ├── events/
399
- │ ├── messages.js
400
- │ └── connection.js
401
- ├── utils/
402
- │ └── helpers.js
403
- └── session-mymelody/ # Sesión guardada automáticamente
511
+
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.
513
+
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
+ )
404
523
  ```
405
524
 
406
- ---
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.
407
529
 
408
- ## 🔗 Links
530
+ ### Recibos, lectura y presencia
409
531
 
410
- - 📦 Repositorio: [github.com/Fer280809/Baileys](https://github.com/Fer280809/Baileys)
411
- - 🐛 Issues: [github.com/Fer280809/Baileys/issues](https://github.com/Fer280809/Baileys/issues)
412
532
 
413
- ---
533
+ ```ts
534
+ // Marcar mensajes como leídos (doble check azul)
535
+ await sock.readMessages([mensaje.key])
414
536
 
415
- <div align="center">
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)
545
+ ```
546
+
547
+ ## Grupos, comunidades y canales
548
+
549
+ ASTA-BOTS conserva toda la funcionalidad estándar de Baileys para administrar grupos, comunidades (grupos con subgrupos) y canales de difusión (newsletters):
550
+
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')
559
+ ```
560
+
561
+ ## Perfil, privacidad y negocios
562
+
563
+ ```ts
564
+ await sock.updateProfileName('Mi Bot')
565
+ await sock.updateProfileStatus('Disponible 24/7')
566
+ await sock.updateProfilePicture(jid, { url: './avatar.jpg' })
567
+
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({ ... })
573
+ ```
574
+
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'
416
591
 
417
- Desarrollado con 🤍 por [Fer280809](https://github.com/Fer280809)
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)
611
+ ```
612
+
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])
629
+ ```
630
+
631
+ ### Sistema de botones de conveniencia
632
+
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:
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
+ ])
645
+ ```
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')
670
+ ```
671
+
672
+ ## Aviso legal
673
+
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.
675
+
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.
677
+
678
+ ## Créditos
679
+
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.
681
+
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. 🙌
418
686
 
419
687
  ---
420
688
 
421
- ## Creditos a Melody-Xz
689
+ <div align="center">Hecho con 💙 por <b>ASTA-BOTS</b></div>
422
690
 
691
+ ## créditos
692
+
693
+ this-xys/bails
423
694
 
424
- </div>