@fer2809fl/baileys 7.0.2 → 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 (222) hide show
  1. package/README.md +100 -20
  2. package/lib/Defaults/index.js +2 -1
  3. package/lib/Signal/libsignal.js +19 -0
  4. package/lib/Socket/business.d.ts +213 -532
  5. package/lib/Socket/business.js +359 -401
  6. package/lib/Socket/chats.d.ts +16 -2
  7. package/lib/Socket/chats.js +247 -40
  8. package/lib/Socket/groups.d.ts +16 -0
  9. package/lib/Socket/groups.js +101 -18
  10. package/lib/Socket/messages-recv.js +18 -1
  11. package/lib/Socket/newsletter.js +3 -3
  12. package/lib/Socket/socket.js +50 -6
  13. package/lib/Types/Newsletter.d.ts +13 -4
  14. package/lib/Types/Newsletter.js +12 -2
  15. package/lib/Utils/chat-utils.d.ts +34 -4
  16. package/lib/Utils/chat-utils.js +80 -20
  17. package/lib/Utils/companion-reg-client-utils.d.ts +17 -0
  18. package/lib/Utils/companion-reg-client-utils.js +35 -0
  19. package/lib/Utils/event-buffer.js +49 -1
  20. package/lib/Utils/index.js +1 -0
  21. package/lib/Utils/message-retry-manager.js +40 -0
  22. package/lib/WAUSync/Protocols/USyncUsernameProtocol.d.ts +10 -0
  23. package/lib/WAUSync/Protocols/USyncUsernameProtocol.js +25 -0
  24. package/lib/WAUSync/Protocols/index.js +1 -0
  25. package/lib/WAUSync/USyncQuery.js +5 -1
  26. package/package.json +6 -6
  27. package/lib/Defaults/index.d.ts.map +0 -1
  28. package/lib/Defaults/index.js.map +0 -1
  29. package/lib/Signal/Group/ciphertext-message.d.ts.map +0 -1
  30. package/lib/Signal/Group/ciphertext-message.js.map +0 -1
  31. package/lib/Signal/Group/group-session-builder.d.ts.map +0 -1
  32. package/lib/Signal/Group/group-session-builder.js.map +0 -1
  33. package/lib/Signal/Group/group_cipher.d.ts.map +0 -1
  34. package/lib/Signal/Group/group_cipher.js.map +0 -1
  35. package/lib/Signal/Group/index.d.ts.map +0 -1
  36. package/lib/Signal/Group/index.js.map +0 -1
  37. package/lib/Signal/Group/keyhelper.d.ts.map +0 -1
  38. package/lib/Signal/Group/keyhelper.js.map +0 -1
  39. package/lib/Signal/Group/sender-chain-key.d.ts.map +0 -1
  40. package/lib/Signal/Group/sender-chain-key.js.map +0 -1
  41. package/lib/Signal/Group/sender-key-distribution-message.d.ts.map +0 -1
  42. package/lib/Signal/Group/sender-key-distribution-message.js.map +0 -1
  43. package/lib/Signal/Group/sender-key-message.d.ts.map +0 -1
  44. package/lib/Signal/Group/sender-key-message.js.map +0 -1
  45. package/lib/Signal/Group/sender-key-name.d.ts.map +0 -1
  46. package/lib/Signal/Group/sender-key-name.js.map +0 -1
  47. package/lib/Signal/Group/sender-key-record.d.ts.map +0 -1
  48. package/lib/Signal/Group/sender-key-record.js.map +0 -1
  49. package/lib/Signal/Group/sender-key-state.d.ts.map +0 -1
  50. package/lib/Signal/Group/sender-key-state.js.map +0 -1
  51. package/lib/Signal/Group/sender-message-key.d.ts.map +0 -1
  52. package/lib/Signal/Group/sender-message-key.js.map +0 -1
  53. package/lib/Signal/libsignal.d.ts.map +0 -1
  54. package/lib/Signal/libsignal.js.map +0 -1
  55. package/lib/Signal/lid-mapping.d.ts.map +0 -1
  56. package/lib/Signal/lid-mapping.js.map +0 -1
  57. package/lib/Socket/Client/index.d.ts.map +0 -1
  58. package/lib/Socket/Client/index.js.map +0 -1
  59. package/lib/Socket/Client/types.d.ts.map +0 -1
  60. package/lib/Socket/Client/types.js.map +0 -1
  61. package/lib/Socket/Client/websocket.d.ts.map +0 -1
  62. package/lib/Socket/Client/websocket.js.map +0 -1
  63. package/lib/Socket/business.d.ts.map +0 -1
  64. package/lib/Socket/business.js.map +0 -1
  65. package/lib/Socket/chats.d.ts.map +0 -1
  66. package/lib/Socket/chats.js.map +0 -1
  67. package/lib/Socket/communities.d.ts.map +0 -1
  68. package/lib/Socket/communities.js.map +0 -1
  69. package/lib/Socket/dugong.d.ts.map +0 -1
  70. package/lib/Socket/dugong.js.map +0 -1
  71. package/lib/Socket/groups.d.ts.map +0 -1
  72. package/lib/Socket/groups.js.map +0 -1
  73. package/lib/Socket/index.d.ts.map +0 -1
  74. package/lib/Socket/index.js.map +0 -1
  75. package/lib/Socket/messages-recv.d.ts.map +0 -1
  76. package/lib/Socket/messages-recv.js.map +0 -1
  77. package/lib/Socket/messages-send.d.ts.map +0 -1
  78. package/lib/Socket/messages-send.js.map +0 -1
  79. package/lib/Socket/mex.d.ts.map +0 -1
  80. package/lib/Socket/mex.js.map +0 -1
  81. package/lib/Socket/newsletter.d.ts.map +0 -1
  82. package/lib/Socket/newsletter.js.map +0 -1
  83. package/lib/Socket/socket.d.ts.map +0 -1
  84. package/lib/Socket/socket.js.map +0 -1
  85. package/lib/Types/Auth.d.ts.map +0 -1
  86. package/lib/Types/Auth.js.map +0 -1
  87. package/lib/Types/Bussines.d.ts.map +0 -1
  88. package/lib/Types/Bussines.js.map +0 -1
  89. package/lib/Types/Call.d.ts.map +0 -1
  90. package/lib/Types/Call.js.map +0 -1
  91. package/lib/Types/Chat.d.ts.map +0 -1
  92. package/lib/Types/Chat.js.map +0 -1
  93. package/lib/Types/Contact.d.ts.map +0 -1
  94. package/lib/Types/Contact.js.map +0 -1
  95. package/lib/Types/Events.d.ts.map +0 -1
  96. package/lib/Types/Events.js.map +0 -1
  97. package/lib/Types/GroupMetadata.d.ts.map +0 -1
  98. package/lib/Types/GroupMetadata.js.map +0 -1
  99. package/lib/Types/Label.d.ts.map +0 -1
  100. package/lib/Types/Label.js.map +0 -1
  101. package/lib/Types/LabelAssociation.d.ts.map +0 -1
  102. package/lib/Types/LabelAssociation.js.map +0 -1
  103. package/lib/Types/Message.d.ts.map +0 -1
  104. package/lib/Types/Message.js.map +0 -1
  105. package/lib/Types/Newsletter.d.ts.map +0 -1
  106. package/lib/Types/Newsletter.js.map +0 -1
  107. package/lib/Types/Product.d.ts.map +0 -1
  108. package/lib/Types/Product.js.map +0 -1
  109. package/lib/Types/Signal.d.ts.map +0 -1
  110. package/lib/Types/Signal.js.map +0 -1
  111. package/lib/Types/Socket.d.ts.map +0 -1
  112. package/lib/Types/Socket.js.map +0 -1
  113. package/lib/Types/State.d.ts.map +0 -1
  114. package/lib/Types/State.js.map +0 -1
  115. package/lib/Types/USync.d.ts.map +0 -1
  116. package/lib/Types/USync.js.map +0 -1
  117. package/lib/Types/index.d.ts.map +0 -1
  118. package/lib/Types/index.js.map +0 -1
  119. package/lib/Utils/auth-utils.d.ts.map +0 -1
  120. package/lib/Utils/auth-utils.js.map +0 -1
  121. package/lib/Utils/browser-utils.d.ts.map +0 -1
  122. package/lib/Utils/browser-utils.js.map +0 -1
  123. package/lib/Utils/business.d.ts.map +0 -1
  124. package/lib/Utils/business.js.map +0 -1
  125. package/lib/Utils/chat-utils.d.ts.map +0 -1
  126. package/lib/Utils/chat-utils.js.map +0 -1
  127. package/lib/Utils/crypto.d.ts.map +0 -1
  128. package/lib/Utils/crypto.js.map +0 -1
  129. package/lib/Utils/decode-wa-message.d.ts.map +0 -1
  130. package/lib/Utils/decode-wa-message.js.map +0 -1
  131. package/lib/Utils/event-buffer.d.ts.map +0 -1
  132. package/lib/Utils/event-buffer.js.map +0 -1
  133. package/lib/Utils/generics.d.ts.map +0 -1
  134. package/lib/Utils/generics.js.map +0 -1
  135. package/lib/Utils/history.d.ts.map +0 -1
  136. package/lib/Utils/history.js.map +0 -1
  137. package/lib/Utils/identity-change-handler.d.ts.map +0 -1
  138. package/lib/Utils/identity-change-handler.js.map +0 -1
  139. package/lib/Utils/index.d.ts.map +0 -1
  140. package/lib/Utils/index.js.map +0 -1
  141. package/lib/Utils/link-preview.d.ts.map +0 -1
  142. package/lib/Utils/link-preview.js.map +0 -1
  143. package/lib/Utils/logger.d.ts.map +0 -1
  144. package/lib/Utils/logger.js.map +0 -1
  145. package/lib/Utils/lt-hash.d.ts.map +0 -1
  146. package/lib/Utils/lt-hash.js.map +0 -1
  147. package/lib/Utils/make-mutex.d.ts.map +0 -1
  148. package/lib/Utils/make-mutex.js.map +0 -1
  149. package/lib/Utils/message-retry-manager.d.ts.map +0 -1
  150. package/lib/Utils/message-retry-manager.js.map +0 -1
  151. package/lib/Utils/messages-media.d.ts.map +0 -1
  152. package/lib/Utils/messages-media.js.map +0 -1
  153. package/lib/Utils/messages.d.ts.map +0 -1
  154. package/lib/Utils/messages.js.map +0 -1
  155. package/lib/Utils/noise-handler.d.ts.map +0 -1
  156. package/lib/Utils/noise-handler.js.map +0 -1
  157. package/lib/Utils/offline-node-processor.d.ts.map +0 -1
  158. package/lib/Utils/offline-node-processor.js.map +0 -1
  159. package/lib/Utils/pre-key-manager.d.ts.map +0 -1
  160. package/lib/Utils/pre-key-manager.js.map +0 -1
  161. package/lib/Utils/process-message.d.ts.map +0 -1
  162. package/lib/Utils/process-message.js.map +0 -1
  163. package/lib/Utils/reporting-utils.d.ts.map +0 -1
  164. package/lib/Utils/reporting-utils.js.map +0 -1
  165. package/lib/Utils/rich-messages.d.ts.map +0 -1
  166. package/lib/Utils/rich-messages.js.map +0 -1
  167. package/lib/Utils/signal.d.ts.map +0 -1
  168. package/lib/Utils/signal.js.map +0 -1
  169. package/lib/Utils/stanza-ack.d.ts.map +0 -1
  170. package/lib/Utils/stanza-ack.js.map +0 -1
  171. package/lib/Utils/sync-action-utils.d.ts.map +0 -1
  172. package/lib/Utils/sync-action-utils.js.map +0 -1
  173. package/lib/Utils/tc-token-utils.d.ts.map +0 -1
  174. package/lib/Utils/tc-token-utils.js.map +0 -1
  175. package/lib/Utils/use-multi-file-auth-state.d.ts.map +0 -1
  176. package/lib/Utils/use-multi-file-auth-state.js.map +0 -1
  177. package/lib/Utils/validate-connection.d.ts.map +0 -1
  178. package/lib/Utils/validate-connection.js.map +0 -1
  179. package/lib/WABinary/constants.d.ts.map +0 -1
  180. package/lib/WABinary/constants.js.map +0 -1
  181. package/lib/WABinary/decode.d.ts.map +0 -1
  182. package/lib/WABinary/decode.js.map +0 -1
  183. package/lib/WABinary/encode.d.ts.map +0 -1
  184. package/lib/WABinary/encode.js.map +0 -1
  185. package/lib/WABinary/generic-utils.d.ts.map +0 -1
  186. package/lib/WABinary/generic-utils.js.map +0 -1
  187. package/lib/WABinary/index.d.ts.map +0 -1
  188. package/lib/WABinary/index.js.map +0 -1
  189. package/lib/WABinary/jid-utils.d.ts.map +0 -1
  190. package/lib/WABinary/jid-utils.js.map +0 -1
  191. package/lib/WABinary/types.d.ts.map +0 -1
  192. package/lib/WABinary/types.js.map +0 -1
  193. package/lib/WAM/BinaryInfo.d.ts.map +0 -1
  194. package/lib/WAM/BinaryInfo.js.map +0 -1
  195. package/lib/WAM/constants.d.ts.map +0 -1
  196. package/lib/WAM/constants.js.map +0 -1
  197. package/lib/WAM/encode.d.ts.map +0 -1
  198. package/lib/WAM/encode.js.map +0 -1
  199. package/lib/WAM/index.d.ts.map +0 -1
  200. package/lib/WAM/index.js.map +0 -1
  201. package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts.map +0 -1
  202. package/lib/WAUSync/Protocols/USyncContactProtocol.js.map +0 -1
  203. package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts.map +0 -1
  204. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js.map +0 -1
  205. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts.map +0 -1
  206. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js.map +0 -1
  207. package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts.map +0 -1
  208. package/lib/WAUSync/Protocols/USyncStatusProtocol.js.map +0 -1
  209. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts.map +0 -1
  210. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js.map +0 -1
  211. package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts.map +0 -1
  212. package/lib/WAUSync/Protocols/UsyncLIDProtocol.js.map +0 -1
  213. package/lib/WAUSync/Protocols/index.d.ts.map +0 -1
  214. package/lib/WAUSync/Protocols/index.js.map +0 -1
  215. package/lib/WAUSync/USyncQuery.d.ts.map +0 -1
  216. package/lib/WAUSync/USyncQuery.js.map +0 -1
  217. package/lib/WAUSync/USyncUser.d.ts.map +0 -1
  218. package/lib/WAUSync/USyncUser.js.map +0 -1
  219. package/lib/WAUSync/index.d.ts.map +0 -1
  220. package/lib/WAUSync/index.js.map +0 -1
  221. package/lib/index.d.ts.map +0 -1
  222. package/lib/index.js.map +0 -1
package/README.md CHANGED
@@ -16,7 +16,54 @@
16
16
 
17
17
  ---
18
18
 
19
- ## 🆕 Novedades — v1.9.0
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.
50
+
51
+ ---
52
+
53
+
54
+
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.
61
+
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.
63
+
64
+ ---
65
+
66
+ ## 🆕 Novedades — v7.0.1
20
67
 
21
68
  ### ✅ Nuevas funciones añadidas
22
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:
@@ -61,7 +108,7 @@ yarn add github:Fer2809fl/Baileys
61
108
  ```json
62
109
  {
63
110
  "dependencies": {
64
- "@fer2809fl/baileys": "^1.9.0"
111
+ "@fer2809fl/baileys": "^1.11.0"
65
112
  }
66
113
  }
67
114
  ```
@@ -77,29 +124,29 @@ Paquete npm: [npmjs.com/package/@fer2809fl/baileys](https://www.npmjs.com/packag
77
124
  const { makeWASocket, useMultiFileAuthState } = require('@fer2809fl/baileys')
78
125
 
79
126
  async function startBot() {
80
- const { state, saveCreds } = await useMultiFileAuthState('session-mymelody')
127
+ const { state, saveCreds } = await useMultiFileAuthState('session-myfer')
81
128
 
82
- const melody = makeWASocket({
129
+ const fer = makeWASocket({
83
130
  auth: state,
84
131
  printQRInTerminal: true,
85
132
  generateHighQualityLinkPreview: true // recomendado para que las previews se vean mejor
86
133
  })
87
134
 
88
- melody.ev.on('connection.update', ({ connection }) => {
135
+ fer.ev.on('connection.update', ({ connection }) => {
89
136
  if (connection === 'open') console.log('✅ ¡Conectado con éxito!')
90
137
  if (connection === 'close') console.log('❌ Conexión cerrada, reconectando...')
91
138
  })
92
139
 
93
- melody.ev.on('messages.upsert', async ({ messages }) => {
140
+ fer.ev.on('messages.upsert', async ({ messages }) => {
94
141
  const m = messages[0]
95
142
  if (!m.message) return
96
143
 
97
- await melody.sendMessage(m.key.remoteJid, {
98
- text: '¡Hola! Soy un bot de Delta!'
144
+ await fer.sendMessage(m.key.remoteJid, {
145
+ text: '¡Hola! Soy un bot de Fer!'
99
146
  })
100
147
  })
101
148
 
102
- melody.ev.on('creds.update', saveCreds)
149
+ fer.ev.on('creds.update', saveCreds)
103
150
  }
104
151
 
105
152
  startBot()
@@ -109,7 +156,7 @@ startBot()
109
156
 
110
157
  ## 🔘 Botones Interactivos *(actualizado en v1.9.0)*
111
158
 
112
- 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, `melody` en los ejemplos).
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).
113
160
 
114
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.
115
162
 
@@ -118,7 +165,7 @@ Todos aceptan al final un objeto `extra` opcional (`footer`, `image`, `video`, `
118
165
  ### ⚡ `sendQuickReplyButtons` — Botones de Respuesta Rápida
119
166
 
120
167
  ```javascript
121
- await melody.sendQuickReplyButtons(
168
+ await fer.sendQuickReplyButtons(
122
169
  jid,
123
170
  '🎮 *MENÚ DE OPCIONES*\n\n¿Qué deseas hacer?',
124
171
  [
@@ -136,7 +183,7 @@ await melody.sendQuickReplyButtons(
136
183
  Genera solo la tarjeta de previsualización (imagen, título, descripción) del link del botón.
137
184
 
138
185
  ```javascript
139
- await melody.sendUrlButton(
186
+ await fer.sendUrlButton(
140
187
  jid,
141
188
  '🔗 *ENLACES IMPORTANTES*\n\nVisita nuestro repositorio oficial:',
142
189
  '🌐 Ver GitHub', // etiqueta del botón
@@ -149,7 +196,7 @@ await melody.sendUrlButton(
149
196
  ### 📞 `sendCallButton` — Botón de Llamada
150
197
 
151
198
  ```javascript
152
- await melody.sendCallButton(
199
+ await fer.sendCallButton(
153
200
  jid,
154
201
  '📞 *SOPORTE TÉCNICO*\n\n¿Necesitas ayuda? Llámanos:',
155
202
  '📞 Llamar Ahora', // etiqueta del botón
@@ -162,7 +209,7 @@ await melody.sendCallButton(
162
209
  ### 📋 `sendCopyButton` — Botón Copiar
163
210
 
164
211
  ```javascript
165
- await melody.sendCopyButton(
212
+ await fer.sendCopyButton(
166
213
  jid,
167
214
  '📋 *CÓDIGO DE INSTALACIÓN*\n\nEjecuta este comando en tu terminal:',
168
215
  '📋 Copiar Comando', // etiqueta del botón
@@ -175,7 +222,7 @@ await melody.sendCopyButton(
175
222
  ### ⏰ `sendReminderButton` — Botón de Recordatorio
176
223
 
177
224
  ```javascript
178
- await melody.sendReminderButton(
225
+ await fer.sendReminderButton(
179
226
  jid,
180
227
  '⏰ *RECORDATORIO*\n\nActiva un aviso para no olvidarlo:',
181
228
  '⏰ Recordarme'
@@ -187,7 +234,7 @@ await melody.sendReminderButton(
187
234
  ### 📋 `sendListButton` — Menú Desplegable (Lista)
188
235
 
189
236
  ```javascript
190
- await melody.sendListButton(
237
+ await fer.sendListButton(
191
238
  jid,
192
239
  '📋 *SELECCIONA UNA OPCIÓN*',
193
240
  'Menú Principal', // título del botón que abre la lista
@@ -219,7 +266,7 @@ await melody.sendListButton(
219
266
  Para armar cualquier combinación libre de tipos (o alguno que no tenga método propio) en un solo mensaje.
220
267
 
221
268
  ```javascript
222
- await melody.sendMixedButtons(
269
+ await fer.sendMixedButtons(
223
270
  jid,
224
271
  '🎯 *PANEL DE CONTROL*\n\nSelecciona una acción rápida:',
225
272
  [
@@ -237,7 +284,7 @@ await melody.sendMixedButtons(
237
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.
238
285
 
239
286
  ```javascript
240
- await melody.sendLinkPreview(
287
+ await fer.sendLinkPreview(
241
288
  jid,
242
289
  '¡Mirá esto! 👀',
243
290
  'https://github.com/Fer2809fl/Baileys'
@@ -247,7 +294,7 @@ await melody.sendLinkPreview(
247
294
  Si el texto ya trae el link adentro, no hace falta pasarlo aparte:
248
295
 
249
296
  ```javascript
250
- await melody.sendLinkPreview(
297
+ await fer.sendLinkPreview(
251
298
  jid,
252
299
  'Repo oficial: https://github.com/Fer2809fl/Baileys'
253
300
  )
@@ -256,7 +303,7 @@ await melody.sendLinkPreview(
256
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:
257
304
 
258
305
  ```javascript
259
- await melody.sendUrlButton(jid, texto, '🌐 Ver más', url, { preview: false })
306
+ await fer.sendUrlButton(jid, texto, '🌐 Ver más', url, { preview: false })
260
307
  ```
261
308
 
262
309
  ---
@@ -332,6 +379,39 @@ export default handler
332
379
 
333
380
  ---
334
381
 
382
+ ## 👑 Admins y resolución de JID/LID *(nuevo en v1.10.0)*
383
+
384
+ No hace falta comparar `jid`/`@lid`/número a mano contra `groupMetadata`: usá estas funciones directo desde el socket.
385
+
386
+ ```javascript
387
+ // ¿Es admin del grupo? (acepta jid normal o @lid, resuelve solo)
388
+ const esAdmin = await fer.isGroupAdmin(m.chat, m.sender)
389
+
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' }, ...]
393
+
394
+ // Resolver un @lid puntual (mención, quoted, etc.) a su número real
395
+ const numeroReal = await fer.resolveParticipantJid(m.chat, mentionedJid)
396
+
397
+ // groupMetadata con cache de 30s (se invalida solo con altas/bajas/promociones reales)
398
+ const meta = await fer.groupMetadataCached(m.chat)
399
+ ```
400
+
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
411
+ ```
412
+
413
+ ---
414
+
335
415
  ## ✨ Características
336
416
 
337
417
  ### General
@@ -2,7 +2,7 @@ import { proto } from "../../WAProto/index.js";
2
2
  import { makeLibSignalRepository } from "../Signal/libsignal.js";
3
3
  import { Browsers } from "../Utils/browser-utils.js";
4
4
  import logger from "../Utils/logger.js";
5
- const version = [2, 3000, 1035194821];
5
+ const version = [2, 3000, 1043857760];
6
6
  export const UNAUTHORIZED_CODES = [401, 403, 419];
7
7
  export const DEFAULT_ORIGIN = "https://web.whatsapp.com";
8
8
  export const CALL_VIDEO_PREFIX = "https://call.whatsapp.com/video/";
@@ -43,6 +43,7 @@ export const PROCESSABLE_HISTORY_TYPES = [
43
43
  proto.HistorySync.HistorySyncType.NON_BLOCKING_DATA,
44
44
  proto.HistorySync.HistorySyncType.INITIAL_STATUS_V3,
45
45
  ];
46
+ export const HISTORY_SYNC_PAUSED_TIMEOUT_MS = 120000;
46
47
  export const DEFAULT_CONNECTION_CONFIG = {
47
48
  version: version,
48
49
  browser: Browsers.macOS("Chrome"),
@@ -136,6 +136,25 @@ export function makeLibSignalRepository(auth, logger, pnToLIDFunc) {
136
136
  await cipher.initOutgoing(session);
137
137
  }, jid);
138
138
  },
139
+ async hasSenderKey({ group, meId }) {
140
+ const senderName = jidToSignalSenderKeyName(group, meId).toString();
141
+ const { [senderName]: key } = await auth.keys.get('sender-key', [senderName]);
142
+ return !!key;
143
+ },
144
+ async getSessionInfo(jid) {
145
+ const addr = jidToSignalProtocolAddress(jid).toString();
146
+ const session = (await storage.loadSession(addr));
147
+ if (!session) {
148
+ return null;
149
+ }
150
+ const open = session.getOpenSession?.();
151
+ const baseKey = open?.indexInfo?.baseKey;
152
+ const registrationId = open?.registrationId;
153
+ if (!baseKey || typeof registrationId !== 'number') {
154
+ return null;
155
+ }
156
+ return { baseKey: new Uint8Array(baseKey), registrationId };
157
+ },
139
158
  jidToSignalProtocolAddress(jid) {
140
159
  return jidToSignalProtocolAddress(jid).toString();
141
160
  },