@fer2809fl/baileys 7.0.1 → 7.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (350) hide show
  1. package/README.md +322 -578
  2. package/WAProto/WAProto.proto +916 -360
  3. package/WAProto/fix-imports.js +18 -22
  4. package/WAProto/index.d.ts +15471 -8638
  5. package/WAProto/index.js +80576 -45941
  6. package/lib/Defaults/index.d.ts +14 -18
  7. package/lib/Defaults/index.js +111 -115
  8. package/lib/Signal/libsignal.js +22 -31
  9. package/lib/Signal/lid-mapping.d.ts +0 -4
  10. package/lib/Signal/lid-mapping.js +0 -6
  11. package/lib/Socket/business.d.ts +8 -75
  12. package/lib/Socket/business.js +1 -0
  13. package/lib/Socket/chats.d.ts +0 -6
  14. package/lib/Socket/chats.js +3 -67
  15. package/lib/Socket/communities.d.ts +641 -336
  16. package/lib/Socket/communities.js +3 -6
  17. package/lib/Socket/dugong.d.ts +130 -0
  18. package/lib/Socket/dugong.js +772 -0
  19. package/lib/Socket/groups.d.ts +18 -23
  20. package/lib/Socket/groups.js +88 -168
  21. package/lib/Socket/index.d.ts +631 -322
  22. package/lib/Socket/index.js +12 -9
  23. package/lib/Socket/messages-recv.d.ts +52 -84
  24. package/lib/Socket/messages-recv.js +193 -677
  25. package/lib/Socket/messages-send.d.ts +643 -262
  26. package/lib/Socket/messages-send.js +1559 -1359
  27. package/lib/Socket/mex.d.ts +0 -1
  28. package/lib/Socket/mex.js +8 -22
  29. package/lib/Socket/native-buttons.js +231 -0
  30. package/lib/Socket/newsletter.d.ts +27 -42
  31. package/lib/Socket/newsletter.js +439 -402
  32. package/lib/Socket/socket.d.ts +2 -6
  33. package/lib/Socket/socket.js +47 -39
  34. package/lib/Types/Auth.d.ts +0 -1
  35. package/lib/Types/Bussines.d.ts +34 -22
  36. package/lib/Types/Call.d.ts +1 -1
  37. package/lib/Types/Chat.d.ts +0 -1
  38. package/lib/Types/Contact.d.ts +0 -2
  39. package/lib/Types/Events.d.ts +1 -20
  40. package/lib/Types/GroupMetadata.d.ts +1 -4
  41. package/lib/Types/Message.d.ts +348 -354
  42. package/lib/Types/Message.js +0 -4
  43. package/lib/Types/{Mex.d.ts → Newsletter.d.ts} +7 -17
  44. package/lib/Types/{Mex.js → Newsletter.js} +5 -3
  45. package/lib/Types/Signal.d.ts +1 -12
  46. package/lib/Types/Socket.d.ts +148 -135
  47. package/lib/Types/State.d.ts +0 -65
  48. package/lib/Types/State.js +0 -43
  49. package/lib/Types/index.d.ts +52 -52
  50. package/lib/Types/index.js +30 -23
  51. package/lib/Utils/auth-utils.d.ts +0 -5
  52. package/lib/Utils/auth-utils.js +0 -12
  53. package/lib/Utils/browser-utils.js +0 -1
  54. package/lib/Utils/crypto.d.ts +12 -12
  55. package/lib/Utils/decode-wa-message.d.ts +0 -18
  56. package/lib/Utils/decode-wa-message.js +0 -34
  57. package/lib/Utils/event-buffer.d.ts +0 -2
  58. package/lib/Utils/generics.d.ts +2 -3
  59. package/lib/Utils/generics.js +1 -10
  60. package/lib/Utils/history.d.ts +0 -2
  61. package/lib/Utils/history.js +9 -12
  62. package/lib/Utils/identity-change-handler.d.ts +0 -7
  63. package/lib/Utils/identity-change-handler.js +0 -1
  64. package/lib/Utils/index.d.ts +23 -30
  65. package/lib/Utils/index.js +3 -9
  66. package/lib/Utils/link-preview.js +2 -2
  67. package/lib/Utils/message-retry-manager.d.ts +0 -5
  68. package/lib/Utils/message-retry-manager.js +11 -11
  69. package/lib/Utils/messages-media.d.ts +13 -45
  70. package/lib/Utils/messages-media.js +98 -293
  71. package/lib/Utils/messages.d.ts +3 -16
  72. package/lib/Utils/messages.js +1123 -1219
  73. package/lib/Utils/noise-handler.d.ts +1 -1
  74. package/lib/Utils/process-message.js +1 -103
  75. package/lib/Utils/rich-messages.d.ts +277 -0
  76. package/lib/Utils/rich-messages.js +1144 -0
  77. package/lib/Utils/signal.d.ts +0 -13
  78. package/lib/Utils/signal.js +0 -42
  79. package/lib/Utils/sticker-pack.d.ts +10 -0
  80. package/lib/Utils/sticker-pack.js +111 -0
  81. package/lib/Utils/sync-action-utils.js +0 -1
  82. package/lib/Utils/tc-token-utils.d.ts +1 -26
  83. package/lib/Utils/tc-token-utils.js +5 -151
  84. package/lib/Utils/validate-connection.d.ts +0 -1
  85. package/lib/Utils/validate-connection.js +3 -13
  86. package/lib/WABinary/decode.d.ts +1 -1
  87. package/lib/WABinary/generic-utils.d.ts +3 -1
  88. package/lib/WABinary/generic-utils.js +78 -0
  89. package/lib/WABinary/jid-utils.d.ts +0 -11
  90. package/lib/WABinary/jid-utils.js +0 -33
  91. package/lib/WAM/encode.d.ts +1 -1
  92. package/lib/WAUSync/Protocols/USyncContactProtocol.js +3 -26
  93. package/lib/WAUSync/Protocols/index.d.ts +0 -1
  94. package/lib/WAUSync/USyncQuery.d.ts +0 -1
  95. package/lib/WAUSync/USyncQuery.js +1 -1
  96. package/lib/WAUSync/USyncUser.d.ts +0 -4
  97. package/lib/WAUSync/USyncUser.js +0 -8
  98. package/lib/index.d.ts +1 -1
  99. package/lib/index.js +1 -4
  100. package/package.json +27 -31
  101. package/LICENSE +0 -21
  102. package/engine-requirements.js +0 -10
  103. package/lib/Defaults/index.d.ts.map +0 -1
  104. package/lib/Defaults/index.js.map +0 -1
  105. package/lib/Signal/Group/ciphertext-message.d.ts.map +0 -1
  106. package/lib/Signal/Group/ciphertext-message.js.map +0 -1
  107. package/lib/Signal/Group/group-session-builder.d.ts.map +0 -1
  108. package/lib/Signal/Group/group-session-builder.js.map +0 -1
  109. package/lib/Signal/Group/group_cipher.d.ts.map +0 -1
  110. package/lib/Signal/Group/group_cipher.js.map +0 -1
  111. package/lib/Signal/Group/index.d.ts.map +0 -1
  112. package/lib/Signal/Group/index.js.map +0 -1
  113. package/lib/Signal/Group/keyhelper.d.ts.map +0 -1
  114. package/lib/Signal/Group/keyhelper.js.map +0 -1
  115. package/lib/Signal/Group/sender-chain-key.d.ts.map +0 -1
  116. package/lib/Signal/Group/sender-chain-key.js.map +0 -1
  117. package/lib/Signal/Group/sender-key-distribution-message.d.ts.map +0 -1
  118. package/lib/Signal/Group/sender-key-distribution-message.js.map +0 -1
  119. package/lib/Signal/Group/sender-key-message.d.ts.map +0 -1
  120. package/lib/Signal/Group/sender-key-message.js.map +0 -1
  121. package/lib/Signal/Group/sender-key-name.d.ts.map +0 -1
  122. package/lib/Signal/Group/sender-key-name.js.map +0 -1
  123. package/lib/Signal/Group/sender-key-record.d.ts.map +0 -1
  124. package/lib/Signal/Group/sender-key-record.js.map +0 -1
  125. package/lib/Signal/Group/sender-key-state.d.ts.map +0 -1
  126. package/lib/Signal/Group/sender-key-state.js.map +0 -1
  127. package/lib/Signal/Group/sender-message-key.d.ts.map +0 -1
  128. package/lib/Signal/Group/sender-message-key.js.map +0 -1
  129. package/lib/Signal/libsignal.d.ts.map +0 -1
  130. package/lib/Signal/libsignal.js.map +0 -1
  131. package/lib/Signal/lid-mapping.d.ts.map +0 -1
  132. package/lib/Signal/lid-mapping.js.map +0 -1
  133. package/lib/Socket/Client/index.d.ts.map +0 -1
  134. package/lib/Socket/Client/index.js.map +0 -1
  135. package/lib/Socket/Client/types.d.ts.map +0 -1
  136. package/lib/Socket/Client/types.js.map +0 -1
  137. package/lib/Socket/Client/websocket.d.ts.map +0 -1
  138. package/lib/Socket/Client/websocket.js.map +0 -1
  139. package/lib/Socket/business.d.ts.map +0 -1
  140. package/lib/Socket/business.js.map +0 -1
  141. package/lib/Socket/chats.d.ts.map +0 -1
  142. package/lib/Socket/chats.js.map +0 -1
  143. package/lib/Socket/communities.d.ts.map +0 -1
  144. package/lib/Socket/communities.js.map +0 -1
  145. package/lib/Socket/groups.d.ts.map +0 -1
  146. package/lib/Socket/groups.js.map +0 -1
  147. package/lib/Socket/index.d.ts.map +0 -1
  148. package/lib/Socket/index.js.map +0 -1
  149. package/lib/Socket/messages-recv.d.ts.map +0 -1
  150. package/lib/Socket/messages-recv.js.map +0 -1
  151. package/lib/Socket/messages-send.d.ts.map +0 -1
  152. package/lib/Socket/messages-send.js.map +0 -1
  153. package/lib/Socket/mex.d.ts.map +0 -1
  154. package/lib/Socket/mex.js.map +0 -1
  155. package/lib/Socket/newsletter.d.ts.map +0 -1
  156. package/lib/Socket/newsletter.js.map +0 -1
  157. package/lib/Socket/smgss.d.ts +0 -119
  158. package/lib/Socket/smgss.d.ts.map +0 -1
  159. package/lib/Socket/smgss.js +0 -453
  160. package/lib/Socket/smgss.js.map +0 -1
  161. package/lib/Socket/socket.d.ts.map +0 -1
  162. package/lib/Socket/socket.js.map +0 -1
  163. package/lib/Store/index.d.ts +0 -4
  164. package/lib/Store/index.d.ts.map +0 -1
  165. package/lib/Store/index.js +0 -4
  166. package/lib/Store/index.js.map +0 -1
  167. package/lib/Store/make-in-memory-store.d.ts +0 -132
  168. package/lib/Store/make-in-memory-store.d.ts.map +0 -1
  169. package/lib/Store/make-in-memory-store.js +0 -450
  170. package/lib/Store/make-in-memory-store.js.map +0 -1
  171. package/lib/Store/make-ordered-dictionary.d.ts +0 -14
  172. package/lib/Store/make-ordered-dictionary.d.ts.map +0 -1
  173. package/lib/Store/make-ordered-dictionary.js +0 -80
  174. package/lib/Store/make-ordered-dictionary.js.map +0 -1
  175. package/lib/Store/object-repository.d.ts +0 -13
  176. package/lib/Store/object-repository.d.ts.map +0 -1
  177. package/lib/Store/object-repository.js +0 -24
  178. package/lib/Store/object-repository.js.map +0 -1
  179. package/lib/Types/Auth.d.ts.map +0 -1
  180. package/lib/Types/Auth.js.map +0 -1
  181. package/lib/Types/Bussines.d.ts.map +0 -1
  182. package/lib/Types/Bussines.js.map +0 -1
  183. package/lib/Types/Call.d.ts.map +0 -1
  184. package/lib/Types/Call.js.map +0 -1
  185. package/lib/Types/Chat.d.ts.map +0 -1
  186. package/lib/Types/Chat.js.map +0 -1
  187. package/lib/Types/Contact.d.ts.map +0 -1
  188. package/lib/Types/Contact.js.map +0 -1
  189. package/lib/Types/Events.d.ts.map +0 -1
  190. package/lib/Types/Events.js.map +0 -1
  191. package/lib/Types/GroupMetadata.d.ts.map +0 -1
  192. package/lib/Types/GroupMetadata.js.map +0 -1
  193. package/lib/Types/Label.d.ts.map +0 -1
  194. package/lib/Types/Label.js.map +0 -1
  195. package/lib/Types/LabelAssociation.d.ts.map +0 -1
  196. package/lib/Types/LabelAssociation.js.map +0 -1
  197. package/lib/Types/Message.d.ts.map +0 -1
  198. package/lib/Types/Message.js.map +0 -1
  199. package/lib/Types/Mex.d.ts.map +0 -1
  200. package/lib/Types/Mex.js.map +0 -1
  201. package/lib/Types/Product.d.ts.map +0 -1
  202. package/lib/Types/Product.js.map +0 -1
  203. package/lib/Types/Signal.d.ts.map +0 -1
  204. package/lib/Types/Signal.js.map +0 -1
  205. package/lib/Types/Socket.d.ts.map +0 -1
  206. package/lib/Types/Socket.js.map +0 -1
  207. package/lib/Types/State.d.ts.map +0 -1
  208. package/lib/Types/State.js.map +0 -1
  209. package/lib/Types/USync.d.ts.map +0 -1
  210. package/lib/Types/USync.js.map +0 -1
  211. package/lib/Types/index.d.ts.map +0 -1
  212. package/lib/Types/index.js.map +0 -1
  213. package/lib/Utils/auth-utils.d.ts.map +0 -1
  214. package/lib/Utils/auth-utils.js.map +0 -1
  215. package/lib/Utils/browser-utils.d.ts.map +0 -1
  216. package/lib/Utils/browser-utils.js.map +0 -1
  217. package/lib/Utils/business.d.ts.map +0 -1
  218. package/lib/Utils/business.js.map +0 -1
  219. package/lib/Utils/button-handler.d.ts +0 -28
  220. package/lib/Utils/button-handler.d.ts.map +0 -1
  221. package/lib/Utils/button-handler.js +0 -140
  222. package/lib/Utils/button-handler.js.map +0 -1
  223. package/lib/Utils/chat-utils.d.ts.map +0 -1
  224. package/lib/Utils/chat-utils.js.map +0 -1
  225. package/lib/Utils/companion-reg-client-utils.d.ts.map +0 -1
  226. package/lib/Utils/companion-reg-client-utils.js.map +0 -1
  227. package/lib/Utils/crypto.d.ts.map +0 -1
  228. package/lib/Utils/crypto.js.map +0 -1
  229. package/lib/Utils/decode-wa-message.d.ts.map +0 -1
  230. package/lib/Utils/decode-wa-message.js.map +0 -1
  231. package/lib/Utils/event-buffer.d.ts.map +0 -1
  232. package/lib/Utils/event-buffer.js.map +0 -1
  233. package/lib/Utils/generics.d.ts.map +0 -1
  234. package/lib/Utils/generics.js.map +0 -1
  235. package/lib/Utils/history.d.ts.map +0 -1
  236. package/lib/Utils/history.js.map +0 -1
  237. package/lib/Utils/identity-change-handler.d.ts.map +0 -1
  238. package/lib/Utils/identity-change-handler.js.map +0 -1
  239. package/lib/Utils/index.d.ts.map +0 -1
  240. package/lib/Utils/index.js.map +0 -1
  241. package/lib/Utils/interactive.d.ts +0 -60
  242. package/lib/Utils/interactive.d.ts.map +0 -1
  243. package/lib/Utils/interactive.js +0 -224
  244. package/lib/Utils/interactive.js.map +0 -1
  245. package/lib/Utils/link-preview.d.ts.map +0 -1
  246. package/lib/Utils/link-preview.js.map +0 -1
  247. package/lib/Utils/logger.d.ts.map +0 -1
  248. package/lib/Utils/logger.js.map +0 -1
  249. package/lib/Utils/lt-hash.d.ts.map +0 -1
  250. package/lib/Utils/lt-hash.js.map +0 -1
  251. package/lib/Utils/make-mutex.d.ts.map +0 -1
  252. package/lib/Utils/make-mutex.js.map +0 -1
  253. package/lib/Utils/message-composer.d.ts +0 -93
  254. package/lib/Utils/message-composer.d.ts.map +0 -1
  255. package/lib/Utils/message-composer.js +0 -311
  256. package/lib/Utils/message-composer.js.map +0 -1
  257. package/lib/Utils/message-retry-manager.d.ts.map +0 -1
  258. package/lib/Utils/message-retry-manager.js.map +0 -1
  259. package/lib/Utils/messages-media.d.ts.map +0 -1
  260. package/lib/Utils/messages-media.js.map +0 -1
  261. package/lib/Utils/messages-newsletter.d.ts +0 -74
  262. package/lib/Utils/messages-newsletter.d.ts.map +0 -1
  263. package/lib/Utils/messages-newsletter.js +0 -128
  264. package/lib/Utils/messages-newsletter.js.map +0 -1
  265. package/lib/Utils/messages.d.ts.map +0 -1
  266. package/lib/Utils/messages.js.map +0 -1
  267. package/lib/Utils/noise-handler.d.ts.map +0 -1
  268. package/lib/Utils/noise-handler.js.map +0 -1
  269. package/lib/Utils/offline-node-processor.d.ts.map +0 -1
  270. package/lib/Utils/offline-node-processor.js.map +0 -1
  271. package/lib/Utils/pre-key-manager.d.ts.map +0 -1
  272. package/lib/Utils/pre-key-manager.js.map +0 -1
  273. package/lib/Utils/process-message.d.ts.map +0 -1
  274. package/lib/Utils/process-message.js.map +0 -1
  275. package/lib/Utils/reporting-utils.d.ts.map +0 -1
  276. package/lib/Utils/reporting-utils.js.map +0 -1
  277. package/lib/Utils/shortcake-crypto.d.ts +0 -36
  278. package/lib/Utils/shortcake-crypto.d.ts.map +0 -1
  279. package/lib/Utils/shortcake-crypto.js +0 -71
  280. package/lib/Utils/shortcake-crypto.js.map +0 -1
  281. package/lib/Utils/shortcake.d.ts +0 -36
  282. package/lib/Utils/shortcake.d.ts.map +0 -1
  283. package/lib/Utils/shortcake.js +0 -162
  284. package/lib/Utils/shortcake.js.map +0 -1
  285. package/lib/Utils/signal.d.ts.map +0 -1
  286. package/lib/Utils/signal.js.map +0 -1
  287. package/lib/Utils/stanza-ack.d.ts.map +0 -1
  288. package/lib/Utils/stanza-ack.js.map +0 -1
  289. package/lib/Utils/sync-action-utils.d.ts.map +0 -1
  290. package/lib/Utils/sync-action-utils.js.map +0 -1
  291. package/lib/Utils/tc-token-utils.d.ts.map +0 -1
  292. package/lib/Utils/tc-token-utils.js.map +0 -1
  293. package/lib/Utils/use-multi-file-auth-state.d.ts.map +0 -1
  294. package/lib/Utils/use-multi-file-auth-state.js.map +0 -1
  295. package/lib/Utils/use-single-file-auth-state.d.ts +0 -6
  296. package/lib/Utils/use-single-file-auth-state.d.ts.map +0 -1
  297. package/lib/Utils/use-single-file-auth-state.js +0 -111
  298. package/lib/Utils/use-single-file-auth-state.js.map +0 -1
  299. package/lib/Utils/use-sqlite-auth-state.d.ts +0 -14
  300. package/lib/Utils/use-sqlite-auth-state.d.ts.map +0 -1
  301. package/lib/Utils/use-sqlite-auth-state.js +0 -107
  302. package/lib/Utils/use-sqlite-auth-state.js.map +0 -1
  303. package/lib/Utils/validate-connection.d.ts.map +0 -1
  304. package/lib/Utils/validate-connection.js.map +0 -1
  305. package/lib/WABinary/constants.d.ts.map +0 -1
  306. package/lib/WABinary/constants.js.map +0 -1
  307. package/lib/WABinary/decode.d.ts.map +0 -1
  308. package/lib/WABinary/decode.js.map +0 -1
  309. package/lib/WABinary/encode.d.ts.map +0 -1
  310. package/lib/WABinary/encode.js.map +0 -1
  311. package/lib/WABinary/generic-utils.d.ts.map +0 -1
  312. package/lib/WABinary/generic-utils.js.map +0 -1
  313. package/lib/WABinary/index.d.ts.map +0 -1
  314. package/lib/WABinary/index.js.map +0 -1
  315. package/lib/WABinary/jid-utils.d.ts.map +0 -1
  316. package/lib/WABinary/jid-utils.js.map +0 -1
  317. package/lib/WABinary/types.d.ts.map +0 -1
  318. package/lib/WABinary/types.js.map +0 -1
  319. package/lib/WAM/BinaryInfo.d.ts.map +0 -1
  320. package/lib/WAM/BinaryInfo.js.map +0 -1
  321. package/lib/WAM/constants.d.ts.map +0 -1
  322. package/lib/WAM/constants.js.map +0 -1
  323. package/lib/WAM/encode.d.ts.map +0 -1
  324. package/lib/WAM/encode.js.map +0 -1
  325. package/lib/WAM/index.d.ts.map +0 -1
  326. package/lib/WAM/index.js.map +0 -1
  327. package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts.map +0 -1
  328. package/lib/WAUSync/Protocols/USyncContactProtocol.js.map +0 -1
  329. package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts.map +0 -1
  330. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js.map +0 -1
  331. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts.map +0 -1
  332. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js.map +0 -1
  333. package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts.map +0 -1
  334. package/lib/WAUSync/Protocols/USyncStatusProtocol.js.map +0 -1
  335. package/lib/WAUSync/Protocols/USyncUsernameProtocol.d.ts.map +0 -1
  336. package/lib/WAUSync/Protocols/USyncUsernameProtocol.js.map +0 -1
  337. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts.map +0 -1
  338. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js.map +0 -1
  339. package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts.map +0 -1
  340. package/lib/WAUSync/Protocols/UsyncLIDProtocol.js.map +0 -1
  341. package/lib/WAUSync/Protocols/index.d.ts.map +0 -1
  342. package/lib/WAUSync/Protocols/index.js.map +0 -1
  343. package/lib/WAUSync/USyncQuery.d.ts.map +0 -1
  344. package/lib/WAUSync/USyncQuery.js.map +0 -1
  345. package/lib/WAUSync/USyncUser.d.ts.map +0 -1
  346. package/lib/WAUSync/USyncUser.js.map +0 -1
  347. package/lib/WAUSync/index.d.ts.map +0 -1
  348. package/lib/WAUSync/index.js.map +0 -1
  349. package/lib/index.d.ts.map +0 -1
  350. package/lib/index.js.map +0 -1
package/README.md CHANGED
@@ -1,694 +1,438 @@
1
1
  <div align="center">
2
2
 
3
- # ASTA-BOTS
3
+ <img src="https://raw.githubusercontent.com/Fer2809fl/Baileys/refs/heads/main/lib/Baileys.jpeg" alt="Baileys" width="500" style="border-radius: 20px;"/>
4
4
 
5
- ### Librería de WhatsApp Web para bots, en TypeScript
5
+ # @fer2809fl/baileys
6
+ ### API de WhatsApp Web para Node.js
6
7
 
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)
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)
11
12
 
12
- </div>
13
-
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:
80
-
81
- ```bash
82
- npm install github:TU-USUARIO/asta-bots
83
- ```
84
-
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.
88
-
89
- Una vez instalada, importala en tu proyecto:
90
-
91
- ```ts
92
- import makeWASocket from 'baileys'
93
- ```
94
-
95
- ## Inicio rápido
96
-
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).
98
-
99
- ### Vinculación de la cuenta
100
-
101
- ASTA-BOTS soporta los **2 métodos de vinculación** que ofrece WhatsApp:
102
-
103
- #### 1. Con código QR
104
-
105
- ```ts
106
- import makeWASocket, { useMultiFileAuthState } from 'baileys'
107
-
108
- async function iniciar() {
109
- const { state, saveCreds } = await useMultiFileAuthState('sesion')
110
-
111
- const sock = makeWASocket({
112
- auth: state,
113
- printQRInTerminal: true
114
- })
115
-
116
- sock.ev.on('creds.update', saveCreds)
117
-
118
- sock.ev.on('connection.update', (update) => {
119
- console.log(update)
120
- })
121
- }
122
-
123
- iniciar()
124
- ```
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)
139
- }
140
- ```
141
-
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".
143
-
144
- ### Guardado de credenciales
145
-
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:
147
-
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 |
153
-
154
- Ejemplo con SQLite:
155
-
156
- ```ts
157
- import makeWASocket, { useSqliteAuthState } from 'baileys'
158
-
159
- const { state, saveCreds } = await useSqliteAuthState({ dbPath: 'sesion.db' })
13
+ *Conéctate a WhatsApp Web directamente desde Node.js sin navegadores ni Selenium*
160
14
 
161
- const sock = makeWASocket({ auth: state })
162
- sock.ev.on('creds.update', saveCreds)
163
- ```
15
+ </div>
164
16
 
165
- ## Métodos de mensajería
17
+ ---
166
18
 
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.
19
+ ## 🆕 Novedades v7.0.3
20
+
21
+ Actualización de estabilidad y sincronización con las últimas mejoras del protocolo de WhatsApp Web.
22
+
23
+ ### ✅ Nuevas funciones añadidas
24
+ - **`withUsernameProtocol()`** en `USyncQuery` — permite sincronizar contactos por *username* de WhatsApp (la nueva forma de identificar cuentas, además del número de teléfono):
25
+ ```javascript
26
+ const result = await sock.executeUSyncQuery(
27
+ new USyncQuery().withUsernameProtocol().withUser(new USyncUser().withPhone('+123...'))
28
+ )
29
+ ```
30
+ - **`sock.fetchAccountReachoutTimelock()`** — consulta si tu cuenta tiene alguna restricción activa para iniciar chats nuevos, y hasta cuándo dura.
31
+ - **`sock.fetchNewChatMessageCap()`** — consulta el límite de mensajes que puedes enviar a chats/números nuevos (cupo anti-spam de WhatsApp).
32
+ - **`sock.registerSocketEndHandler(handler)`** — registra una función que se ejecuta automáticamente cada vez que la conexión se cierra (útil para limpieza de recursos propios sin tener que escuchar `connection.update` a mano).
33
+ - **Nuevo formato de código QR de emparejamiento** — el QR ahora incluye el identificador de plataforma del companion, igual que el WhatsApp Web oficial (mejora la tasa de éxito al vincular).
34
+
35
+ ### 🐛 Correcciones de estabilidad y memoria
36
+ - **Fuga de memoria en el buffer de eventos** — se agregó limpieza real de timers, cachés y listeners al cerrar una conexión (`ev.destroy()`), evitando que la memoria crezca con reconexiones frecuentes.
37
+ - **Loop de reintentos por fallas de descifrado (MAC)** — se agregó detección de colisión de "base key" en reintentos de mensajes: si WhatsApp reenvía el mismo mensaje repetidamente por un fallo de sesión, la librería ahora detecta el patrón y fuerza una sesión nueva en vez de reintentar indefinidamente.
38
+ - **Duplicados al sincronizar historial de grupos** — se corrigió el merge de "participantes que salieron" (`pastParticipants`) para no duplicar entradas cuando WhatsApp envía el historial en varios paquetes.
39
+ - **IDs de consulta de canales (newsletters) desactualizados** — los IDs internos de `FOLLOW`/`UNFOLLOW` de canales estaban vencidos y podían empezar a fallar silenciosamente; se actualizaron a los vigentes.
40
+ - **Versión de protocolo de WhatsApp Web actualizada** — reduce el riesgo de desconexiones forzadas por versión obsoleta.
41
+ - **Dependencias actualizadas**: `libsignal` ahora se instala desde npm (antes requería `git` instalado en el servidor), `whatsapp-rust-bridge`, `protobufjs` y otras al día.
42
+
43
+ > Nota: las funciones de auto-follow de canales, el motor de envío de mensajes (`sendMessage` y helpers internos) y el manejo avanzado de negocios (`business.js`) son personalizaciones propias de este fork — se mantuvieron intactas durante esta actualización.
44
+
45
+ ### 🔧 Fusión profunda adicional
46
+ - **`chats.js` reconstruido sobre la base oficial**: recuperación automática de sincronización de estado cuando falta una clave (antes fallaba silenciosamente), resolución correcta de bloqueo de contactos por LID/PN, y tracking de finalización de sincronización de historial.
47
+ - **`groups.js` reconstruido**: mejor resolución de LID/PN en metadata de grupos + tus funciones `isGroupAdmin`, `getGroupAdmins`, `resolveParticipantJid`, `groupMetadataCached` intactas.
48
+ - **`business.js` alineado al oficial** (era funcionalmente idéntico, solo cambiaba el estilo del código).
49
+ - **Endpoint de canales actualizado**: WhatsApp movió `newsletterFollow`/`newsletterUnfollow` a un endpoint nuevo (`_v2`); se actualizó, incluyendo tu sistema de auto-follow interno, para que siga funcionando.
168
50
 
169
- Formatos de JID más comunes:
51
+ ---
170
52
 
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
53
 
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
54
 
181
- ### `sendMessage` el método principal
55
+ ### Nuevas funciones añadidas
56
+ - **Detección de admins y resolución de JID/LID 100% nativa** — Antes, cada bot tenía que reimplementar a mano la comparación de `jid`, `@lid` y número de teléfono contra `groupMetadata` para saber si alguien es admin. Ahora esa lógica vive directamente en el socket:
57
+ - `isGroupAdmin(chatId, jid)` — `true`/`false` si ese participante (venga como número o como `@lid`) es admin o superadmin del grupo.
58
+ - `getGroupAdmins(chatId)` — lista de admins del grupo, ya resueltos a su jid de número de teléfono real (nunca `@lid`).
59
+ - `resolveParticipantJid(chatIdOrParticipants, jid)` — convierte cualquier `@lid` a su número real. Primero busca en los participantes del grupo; si no encuentra coincidencia, usa el mapeo LID↔PN nativo de WhatsApp (`signalRepository.lidMapping`) en vez de adivinar.
60
+ - `groupMetadataCached(chatId)` — igual que `groupMetadata`, pero con cache de 30s que se invalida solo apenas hay un alta, baja, ascenso o descenso real de participantes (via `group-participants.update`), para no golpear a WhatsApp en cada mensaje.
182
61
 
183
- ```ts
184
- await sock.sendMessage(jid, contenido, opciones)
185
- ```
62
+ Esto es lo mismo que antes hacían los bots "a mano" con `groupMetadata` + comparaciones manuales de `id`/`lid`/`phoneNumber`, pero ahora resuelto por la librería, con cache y con el mapeo oficial de WhatsApp como respaldo.
186
63
 
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.
64
+ ---
194
65
 
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.
66
+ ## 🆕 Novedades v7.0.1
196
67
 
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.
68
+ ### Nuevas funciones añadidas
69
+ - **Botones nativos reales** — Se agregaron métodos directos en el socket para enviar botones interactivos de WhatsApp (native flow), reemplazando el viejo formato `buttons: [{text, id}]` que ya no renderiza en WhatsApp:
70
+ - `sendQuickReplyButtons` — Botones de respuesta rápida
71
+ - `sendUrlButton` — Botón que abre un enlace
72
+ - `sendCallButton` — Botón para iniciar una llamada
73
+ - `sendCopyButton` — Botón que copia texto al portapapeles
74
+ - `sendReminderButton` — Botón de recordatorio
75
+ - `sendListButton` — Menú desplegable con secciones y filas
76
+ - `sendMixedButtons` — Combinación libre de varios tipos en un solo mensaje
77
+ - **Previsualización automática de links** — `sendLinkPreview` y todos los botones de arriba arman solos la tarjeta grande (imagen + título + descripción) de cualquier URL que detecten en el texto, con el mismo motor que usa WhatsApp para los links normales.
198
78
 
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.
79
+ ### 🐛 Correcciones
80
+ - **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.
200
81
 
201
- ### Mensajes de texto
82
+ ---
202
83
 
203
- ```ts
204
- await sock.sendMessage(jid, { text: 'Hola, esto es ASTA-BOTS 👋' })
205
- ```
84
+ ## ⚠️ Nota Importante
206
85
 
207
- Con vista previa de enlace desactivada:
86
+ Esta librería está basada en Baileys. No está afiliada ni aprobada oficialmente por WhatsApp.
208
87
 
209
- ```ts
210
- await sock.sendMessage(jid, { text: 'Mirá esto: https://ejemplo.com', linkPreview: null })
211
- ```
88
+ > **@fer2809fl/baileys** y su desarrollador no se hacen responsables por el mal uso de esta librería.
89
+ > Úsala de forma responsable nada de spam ni actividades maliciosas.
212
90
 
213
- Citando un mensaje:
91
+ ---
214
92
 
215
- ```ts
216
- await sock.sendMessage(jid, { text: 'Respondiendo a tu mensaje' }, { quoted: mensajeOriginal })
217
- ```
93
+ ## 📦 Instalación
218
94
 
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
- })
95
+ **Opción 1 — Desde npm (recomendado)**
96
+ ```bash
97
+ npm install @fer2809fl/baileys
98
+ yarn add @fer2809fl/baileys
240
99
  ```
241
100
 
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, ... }
101
+ **Opción 2 Desde GitHub directamente**
102
+ ```bash
103
+ npm install github:Fer2809fl/Baileys
104
+ yarn add github:Fer2809fl/Baileys
254
105
  ```
255
106
 
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' }]
107
+ **En tu package.json**
108
+ ```json
109
+ {
110
+ "dependencies": {
111
+ "@fer2809fl/baileys": "^1.11.0"
271
112
  }
272
- })
273
- ```
274
-
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 }
281
- })
282
-
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' })
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
- ]
306
- })
113
+ }
307
114
  ```
308
115
 
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
- ```
116
+ Repositorio: [github.com/Fer2809fl/Baileys](https://github.com/Fer2809fl/Baileys)
117
+ Paquete npm: [npmjs.com/package/@fer2809fl/baileys](https://www.npmjs.com/package/@fer2809fl/baileys)
330
118
 
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
- })
342
- ```
119
+ ---
343
120
 
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
- ```
121
+ ## Inicio Rápido
358
122
 
359
- **Carousel** (varias cards, cada una con su propio header y botones):
123
+ ```javascript
124
+ const { makeWASocket, useMultiFileAuthState } = require('@fer2809fl/baileys')
360
125
 
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
- })
368
- ```
126
+ async function startBot() {
127
+ const { state, saveCreds } = await useMultiFileAuthState('session-myfer')
369
128
 
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
- ```
129
+ const fer = makeWASocket({
130
+ auth: state,
131
+ printQRInTerminal: true,
132
+ generateHighQualityLinkPreview: true // recomendado para que las previews se vean mejor
133
+ })
398
134
 
399
- Ejemplo de álbum:
135
+ fer.ev.on('connection.update', ({ connection }) => {
136
+ if (connection === 'open') console.log('✅ ¡Conectado con éxito!')
137
+ if (connection === 'close') console.log('❌ Conexión cerrada, reconectando...')
138
+ })
400
139
 
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
- })
409
- ```
140
+ fer.ev.on('messages.upsert', async ({ messages }) => {
141
+ const m = messages[0]
142
+ if (!m.message) return
410
143
 
411
- ### Mensajes "raw" (proto armado a mano)
144
+ await fer.sendMessage(m.key.remoteJid, {
145
+ text: '¡Hola! Soy un bot de Fer!'
146
+ })
147
+ })
412
148
 
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:
149
+ fer.ev.on('creds.update', saveCreds)
150
+ }
414
151
 
415
- ```ts
416
- await sock.sendMessage(jid, {
417
- raw: true,
418
- extendedTextMessage: { text: 'Mensaje armado a mano' }
419
- })
152
+ startBot()
420
153
  ```
421
154
 
422
- Es una salida de emergencia para power users; para el 99% de los casos alcanza con los métodos normales de `sendMessage`.
155
+ ---
423
156
 
424
- ### Editar, eliminar, reenviar y fijar
157
+ ## 🔘 Botones Interactivos *(actualizado en v1.9.0)*
425
158
 
426
- ```ts
427
- // Editar un mensaje ya enviado
428
- await sock.sendMessage(jid, { text: 'Texto corregido', edit: mensajeAnterior.key })
159
+ A diferencia de otras librerías, acá **no se importan funciones sueltas**: los botones son métodos que ya están directamente en el socket que devuelve `makeWASocket`. Solo llamalos desde `sock` (o como hayas nombrado tu conexión, `fer` en los ejemplos).
429
160
 
430
- // Eliminar (para todos)
431
- await sock.sendMessage(jid, { delete: mensaje.key })
161
+ Todos aceptan al final un objeto `extra` opcional (`footer`, `image`, `video`, `document`, `quoted`) y uno de `options` para lo que ya soporta `sendMessage` normalmente.
432
162
 
433
- // Reenviar un mensaje
434
- await sock.sendMessage(jid, { forward: mensajeOriginal })
163
+ ---
435
164
 
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 })
165
+ ### `sendQuickReplyButtons` Botones de Respuesta Rápida
166
+
167
+ ```javascript
168
+ await fer.sendQuickReplyButtons(
169
+ jid,
170
+ '🎮 *MENÚ DE OPCIONES*\n\n¿Qué deseas hacer?',
171
+ [
172
+ { id: 'menu', text: '📋 Ver Menú' },
173
+ { id: 'info', text: 'ℹ️ Información' },
174
+ { id: 'owner', text: '👑 Owner' }
175
+ ]
176
+ )
438
177
  ```
439
178
 
440
- ### Mensajes enriquecidos
179
+ ---
441
180
 
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.
181
+ ### 🔗 `sendUrlButton` Botón URL (con previsualización automática)
443
182
 
444
- **`sendTable`** envía una tabla con encabezados y filas:
183
+ Genera solo la tarjeta de previsualización (imagen, título, descripción) del link del botón.
445
184
 
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' }
185
+ ```javascript
186
+ await fer.sendUrlButton(
187
+ jid,
188
+ '🔗 *ENLACES IMPORTANTES*\n\nVisita nuestro repositorio oficial:',
189
+ '🌐 Ver GitHub', // etiqueta del botón
190
+ 'https://github.com/Fer2809fl/Baileys' // URL de destino
454
191
  )
455
192
  ```
456
193
 
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'])
461
- ```
462
-
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.
194
+ ---
464
195
 
465
- **`sendCodeBlock`** envía código con resaltado de sintaxis (soporta `javascript`, `typescript`, `python`, entre otros):
196
+ ### 📞 `sendCallButton` Botón de Llamada
466
197
 
467
- ```ts
468
- await sock.sendCodeBlock(jid, 'console.log("Hola mundo")', undefined, { language: 'javascript', title: 'Ejemplo' })
198
+ ```javascript
199
+ await fer.sendCallButton(
200
+ jid,
201
+ '📞 *SOPORTE TÉCNICO*\n\n¿Necesitas ayuda? Llámanos:',
202
+ '📞 Llamar Ahora', // etiqueta del botón
203
+ '+5214183357841' // número de teléfono
204
+ )
469
205
  ```
470
206
 
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}' }]
477
- })
478
- ```
207
+ ---
479
208
 
480
- **`sendRichMessage`** envía una combinación libre de sub-mensajes (texto, tabla, código, LaTeX, imágenes) en un solo mensaje:
209
+ ### 📋 `sendCopyButton` Botón Copiar
481
210
 
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
- ])
211
+ ```javascript
212
+ await fer.sendCopyButton(
213
+ jid,
214
+ '📋 *CÓDIGO DE INSTALACIÓN*\n\nEjecuta este comando en tu terminal:',
215
+ '📋 Copiar Comando', // etiqueta del botón
216
+ 'npm install asta-bot' // texto que se copiará
217
+ )
487
218
  ```
488
219
 
489
- **`captureUnifiedResponse`** / **`sendUnifiedResponse`** — permiten capturar la respuesta enriquecida de un mensaje recibido y reenviarla o reutilizarla tal cual:
490
-
491
- ```ts
492
- const capturado = sock.captureUnifiedResponse(mensajeRecibido.message)
493
- if (capturado) {
494
- await sock.sendUnifiedResponse(otroJid, undefined, capturado)
495
- }
496
- ```
220
+ ---
497
221
 
498
- **`updateMediaMessage`** re-sube un archivo multimedia cuyo enlace venció, para poder reenviarlo:
222
+ ### `sendReminderButton` Botón de Recordatorio
499
223
 
500
- ```ts
501
- await sock.updateMediaMessage(mensajeConMediaVencido)
224
+ ```javascript
225
+ await fer.sendReminderButton(
226
+ jid,
227
+ '⏰ *RECORDATORIO*\n\nActiva un aviso para no olvidarlo:',
228
+ '⏰ Recordarme'
229
+ )
502
230
  ```
503
231
 
504
- ### Marcar un mensaje como generado por IA
505
-
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:
232
+ ---
507
233
 
508
- ```ts
509
- await sock.sendMessage(jid, { text: 'Esta respuesta la generó un modelo de IA', ai: true })
234
+ ### 📋 `sendListButton` — Menú Desplegable (Lista)
235
+
236
+ ```javascript
237
+ await fer.sendListButton(
238
+ jid,
239
+ '📋 *SELECCIONA UNA OPCIÓN*',
240
+ 'Menú Principal', // título del botón que abre la lista
241
+ [
242
+ {
243
+ title: '📱 COMANDOS BÁSICOS',
244
+ rows: [
245
+ { id: '#menu', title: '📋 Menú', description: 'Ver todos los comandos' },
246
+ { id: '#ping', title: '🏓 Ping', description: 'Ver latencia del bot' },
247
+ { id: '#owner', title: '👑 Owner', description: 'Info del creador' }
248
+ ]
249
+ },
250
+ {
251
+ title: '🎮 COMANDOS DE GRUPO',
252
+ rows: [
253
+ { id: '#add', title: '➕ Agregar', description: 'Agregar usuario al grupo' },
254
+ { id: '#kick', title: '👢 Expulsar', description: 'Expulsar usuario del grupo' },
255
+ { id: '#promote', title: '⭐ Promover', description: 'Dar admin a un usuario' }
256
+ ]
257
+ }
258
+ ]
259
+ )
510
260
  ```
511
261
 
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.
262
+ ---
513
263
 
514
- ### Estados (historias)
264
+ ### 🎯 `sendMixedButtons` — Múltiples Botones Combinados
515
265
 
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.
266
+ Para armar cualquier combinación libre de tipos (o alguno que no tenga método propio) en un solo mensaje.
517
267
 
518
- ```ts
519
- await sock.sendStatusWhatsApp(
520
- { text: 'Nuevo estado 🚀', backgroundColor: '#25D366' },
521
- [contactoJid, grupoJid] // se les notifica el estado como mención
268
+ ```javascript
269
+ await fer.sendMixedButtons(
270
+ jid,
271
+ '🎯 *PANEL DE CONTROL*\n\nSelecciona una acción rápida:',
272
+ [
273
+ { name: 'cta_url', params: { display_text: '🌐 GitHub', url: 'https://github.com/Fer2809fl/Baileys', merchant_url: 'https://github.com/Fer2809fl/Baileys' } },
274
+ { name: 'cta_copy', params: { display_text: '📋 Comando Inicio', copy_code: 'npm start' } },
275
+ { name: 'quick_reply', params: { display_text: '📋 Ver Menú', id: 'menu' } }
276
+ ]
522
277
  )
523
278
  ```
524
279
 
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.
529
-
530
- ### Recibos, lectura y presencia
531
-
532
-
533
- ```ts
534
- // Marcar mensajes como leídos (doble check azul)
535
- await sock.readMessages([mensaje.key])
280
+ ---
536
281
 
537
- // Enviar un recibo manualmente
538
- await sock.sendReceipt(jid, participante, [id], 'read')
282
+ ## 🖼️ Previsualización de Links *(nuevo en v1.9.0)*
539
283
 
540
- // Actualizar presencia (escribiendo, grabando audio, en línea)
541
- await sock.sendPresenceUpdate('composing', jid) // 'available' | 'unavailable' | 'composing' | 'recording' | 'paused'
284
+ `sendLinkPreview` manda solo texto + una tarjeta grande y prolija con la imagen, título y descripción de cualquier URL — igual que un mensaje normal de WhatsApp con link, pero forzando `renderLargerThumbnail` para que se vea mejor. Sirve para links a fotos, artículos, redes sociales, lo que sea.
542
285
 
543
- // Suscribirse a la presencia de un contacto
544
- await sock.presenceSubscribe(jid)
286
+ ```javascript
287
+ await fer.sendLinkPreview(
288
+ jid,
289
+ '¡Mirá esto! 👀',
290
+ 'https://github.com/Fer2809fl/Baileys'
291
+ )
545
292
  ```
546
293
 
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)
294
+ Si el texto ya trae el link adentro, no hace falta pasarlo aparte:
555
295
 
556
- await sock.communityCreate('Mi comunidad', 'Descripción')
557
-
558
- await sock.newsletterCreate('Mi canal', 'Descripción del canal')
296
+ ```javascript
297
+ await fer.sendLinkPreview(
298
+ jid,
299
+ 'Repo oficial: https://github.com/Fer2809fl/Baileys'
300
+ )
559
301
  ```
560
302
 
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' })
303
+ Esta misma previsualización se activa automáticamente en `sendUrlButton` y en cualquier otro botón si el texto trae un link. Para desactivarla en un envío puntual:
567
304
 
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({ ... })
305
+ ```javascript
306
+ await fer.sendUrlButton(jid, texto, '🌐 Ver más', url, { preview: false })
573
307
  ```
574
308
 
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.
309
+ ---
584
310
 
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.
311
+ ### Plugin de ejemplo completo
586
312
 
587
- ### Uso
313
+ ```javascript
314
+ // plugins/botones.js
315
+ let handler = async (m, { conn, usedPrefix }) => {
588
316
 
589
- ```ts
590
- import makeWASocket, { makeInMemoryStore, useMultiFileAuthState } from 'baileys'
317
+ if (m.text === `${usedPrefix}boton1`) {
318
+ await conn.sendCopyButton(m.chat,
319
+ '📋 *CÓDIGO DE INSTALACIÓN*\n\nEjecuta este comando en tu terminal:',
320
+ '📋 Copiar Comando',
321
+ 'npm install asta-bot'
322
+ )
323
+ }
591
324
 
592
- const store = makeInMemoryStore({})
593
- store.readFromFile('./store.json') // opcional: cargar datos guardados de una corrida anterior
325
+ else if (m.text === `${usedPrefix}boton2`) {
326
+ await conn.sendUrlButton(m.chat,
327
+ '🔗 *ENLACES IMPORTANTES*\n\nVisita nuestro repositorio oficial:',
328
+ '🌐 Ver GitHub',
329
+ 'https://github.com/Fer2809fl/Baileys'
330
+ )
331
+ }
594
332
 
595
- const { state, saveCreds } = await useMultiFileAuthState('sesion')
596
- const sock = makeWASocket({ auth: state })
333
+ else if (m.text === `${usedPrefix}boton3`) {
334
+ await conn.sendQuickReplyButtons(m.chat,
335
+ '🎮 *MENÚ DE OPCIONES*\n\n¿Qué deseas hacer?',
336
+ [
337
+ { id: 'menu', text: '📋 Ver Menú' },
338
+ { id: 'info', text: 'ℹ️ Información' },
339
+ { id: 'owner', text: '👑 Owner' }
340
+ ]
341
+ )
342
+ }
597
343
 
598
- store.bind(sock.ev) // conecta el store a todos los eventos del socket
344
+ else if (m.text === `${usedPrefix}boton4`) {
345
+ await conn.sendCallButton(m.chat,
346
+ '📞 *SOPORTE TÉCNICO*\n\n¿Necesitas ayuda? Llámanos:',
347
+ '📞 Llamar Ahora',
348
+ '+5214183357841'
349
+ )
350
+ }
599
351
 
600
- sock.ev.on('creds.update', saveCreds)
352
+ else if (m.text === `${usedPrefix}boton5`) {
353
+ await conn.sendListButton(m.chat,
354
+ '📋 *SELECCIONA UNA OPCIÓN*',
355
+ 'Menú Principal',
356
+ [
357
+ {
358
+ title: '📱 COMANDOS BÁSICOS',
359
+ rows: [
360
+ { id: '#menu', title: '📋 Menú', description: 'Ver todos los comandos' },
361
+ { id: '#ping', title: '🏓 Ping', description: 'Ver latencia del bot' }
362
+ ]
363
+ }
364
+ ]
365
+ )
366
+ }
601
367
 
602
- // Guardar el store a disco cada cierto tiempo
603
- setInterval(() => {
604
- store.writeToFile('./store.json')
605
- }, 10_000)
368
+ else if (m.text === `${usedPrefix}boton6`) {
369
+ await conn.sendLinkPreview(m.chat,
370
+ '¡Mirá el repo! 👀',
371
+ 'https://github.com/Fer2809fl/Baileys'
372
+ )
373
+ }
374
+ }
606
375
 
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)
376
+ handler.command = ['boton1', 'boton2', 'boton3', 'boton4', 'boton5', 'boton6']
377
+ export default handler
611
378
  ```
612
379
 
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**.
380
+ ---
620
381
 
621
- ```ts
622
- import { resolveJid } from 'baileys'
382
+ ## 👑 Admins y resolución de JID/LID *(nuevo en v1.10.0)*
623
383
 
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
- ```
384
+ No hace falta comparar `jid`/`@lid`/número a mano contra `groupMetadata`: usá estas funciones directo desde el socket.
630
385
 
631
- ### Sistema de botones de conveniencia
386
+ ```javascript
387
+ // ¿Es admin del grupo? (acepta jid normal o @lid, resuelve solo)
388
+ const esAdmin = await fer.isGroupAdmin(m.chat, m.sender)
632
389
 
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:
390
+ // Lista de admins ya resueltos a número (nunca @lid)
391
+ const admins = await fer.getGroupAdmins(m.chat)
392
+ // [{ jid: '521418xxxxxxx@s.whatsapp.net', admin: 'superadmin' }, ...]
634
393
 
635
- ```ts
636
- import { sendQuickReplyButtons, setupButtonHandler } from 'baileys'
394
+ // Resolver un @lid puntual (mención, quoted, etc.) a su número real
395
+ const numeroReal = await fer.resolveParticipantJid(m.chat, mentionedJid)
637
396
 
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
- ])
397
+ // groupMetadata con cache de 30s (se invalida solo con altas/bajas/promociones reales)
398
+ const meta = await fer.groupMetadataCached(m.chat)
645
399
  ```
646
400
 
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')
401
+ ```javascript
402
+ // plugins/admin-only.js
403
+ let handler = async (m, { conn }) => {
404
+ if (!(await conn.isGroupAdmin(m.chat, m.sender))) {
405
+ return conn.sendMessage(m.chat, { text: '🔒 Solo admins pueden usar este comando.' })
406
+ }
407
+ // ...
408
+ }
409
+ handler.command = ['ejemplo']
410
+ export default handler
670
411
  ```
671
412
 
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
413
+ ---
679
414
 
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.
415
+ ## Características
681
416
 
682
- - Repositorio oficial: https://github.com/WhiskeySockets/Baileys
683
- - Licencia: MIT
417
+ ### General
418
+ - 🚀 Optimizado para mayor velocidad y estabilidad
419
+ - 📸 Mensajes multimedia (imágenes, video, audio, documentos)
420
+ - 🔘 **Botones nativos reales, sin imports sueltos** *(v1.9.0)*
421
+ - 🖼️ **Previsualización automática de links en botones y mensajes** *(v1.9.0)*
422
+ - 👥 Soporte para grupos y chats privados
684
423
 
685
- Si esta librería te resulta útil, considerá también dar reconocimiento y apoyo al proyecto original que es de this-xys/bails. 🙌
424
+ ### Técnicas
425
+ - ⚡ Sin Selenium — Conexión directa vía WebSocket
426
+ - 💾 Super eficiente — Bajo consumo de RAM
427
+ - 📱 Soporte multi-dispositivo — Compatible con WhatsApp Web
428
+ - 🔷 Totalmente tipado — TypeScript y JavaScript
429
+ - 🔄 Reconexión automática ante desconexiones
430
+ - 🔐 Sesiones persistentes guardadas localmente
431
+ - 🍎 Compatible con macOS
686
432
 
687
433
  ---
688
434
 
689
- <div align="center">Hecho con 💙 por <b>ASTA-BOTS</b></div>
690
-
691
- ## créditos
692
-
693
- this-xys/bails
435
+ ## 📖 Enlaces
694
436
 
437
+ - Repositorio: [https://github.com/Fer2809fl/Baileys](https://github.com/Fer2809fl/Baileys)
438
+ - Paquete npm: [https://www.npmjs.com/package/@fer2809fl/baileys](https://www.npmjs.com/package/@fer2809fl/baileys)