@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.
- package/README.md +100 -20
- package/lib/Defaults/index.js +2 -1
- package/lib/Signal/libsignal.js +19 -0
- package/lib/Socket/business.d.ts +213 -532
- package/lib/Socket/business.js +359 -401
- package/lib/Socket/chats.d.ts +16 -2
- package/lib/Socket/chats.js +247 -40
- package/lib/Socket/groups.d.ts +16 -0
- package/lib/Socket/groups.js +101 -18
- package/lib/Socket/messages-recv.js +18 -1
- package/lib/Socket/newsletter.js +3 -3
- package/lib/Socket/socket.js +50 -6
- package/lib/Types/Newsletter.d.ts +13 -4
- package/lib/Types/Newsletter.js +12 -2
- package/lib/Utils/chat-utils.d.ts +34 -4
- package/lib/Utils/chat-utils.js +80 -20
- package/lib/Utils/companion-reg-client-utils.d.ts +17 -0
- package/lib/Utils/companion-reg-client-utils.js +35 -0
- package/lib/Utils/event-buffer.js +49 -1
- package/lib/Utils/index.js +1 -0
- package/lib/Utils/message-retry-manager.js +40 -0
- package/lib/WAUSync/Protocols/USyncUsernameProtocol.d.ts +10 -0
- package/lib/WAUSync/Protocols/USyncUsernameProtocol.js +25 -0
- package/lib/WAUSync/Protocols/index.js +1 -0
- package/lib/WAUSync/USyncQuery.js +5 -1
- package/package.json +6 -6
- package/lib/Defaults/index.d.ts.map +0 -1
- package/lib/Defaults/index.js.map +0 -1
- package/lib/Signal/Group/ciphertext-message.d.ts.map +0 -1
- package/lib/Signal/Group/ciphertext-message.js.map +0 -1
- package/lib/Signal/Group/group-session-builder.d.ts.map +0 -1
- package/lib/Signal/Group/group-session-builder.js.map +0 -1
- package/lib/Signal/Group/group_cipher.d.ts.map +0 -1
- package/lib/Signal/Group/group_cipher.js.map +0 -1
- package/lib/Signal/Group/index.d.ts.map +0 -1
- package/lib/Signal/Group/index.js.map +0 -1
- package/lib/Signal/Group/keyhelper.d.ts.map +0 -1
- package/lib/Signal/Group/keyhelper.js.map +0 -1
- package/lib/Signal/Group/sender-chain-key.d.ts.map +0 -1
- package/lib/Signal/Group/sender-chain-key.js.map +0 -1
- package/lib/Signal/Group/sender-key-distribution-message.d.ts.map +0 -1
- package/lib/Signal/Group/sender-key-distribution-message.js.map +0 -1
- package/lib/Signal/Group/sender-key-message.d.ts.map +0 -1
- package/lib/Signal/Group/sender-key-message.js.map +0 -1
- package/lib/Signal/Group/sender-key-name.d.ts.map +0 -1
- package/lib/Signal/Group/sender-key-name.js.map +0 -1
- package/lib/Signal/Group/sender-key-record.d.ts.map +0 -1
- package/lib/Signal/Group/sender-key-record.js.map +0 -1
- package/lib/Signal/Group/sender-key-state.d.ts.map +0 -1
- package/lib/Signal/Group/sender-key-state.js.map +0 -1
- package/lib/Signal/Group/sender-message-key.d.ts.map +0 -1
- package/lib/Signal/Group/sender-message-key.js.map +0 -1
- package/lib/Signal/libsignal.d.ts.map +0 -1
- package/lib/Signal/libsignal.js.map +0 -1
- package/lib/Signal/lid-mapping.d.ts.map +0 -1
- package/lib/Signal/lid-mapping.js.map +0 -1
- package/lib/Socket/Client/index.d.ts.map +0 -1
- package/lib/Socket/Client/index.js.map +0 -1
- package/lib/Socket/Client/types.d.ts.map +0 -1
- package/lib/Socket/Client/types.js.map +0 -1
- package/lib/Socket/Client/websocket.d.ts.map +0 -1
- package/lib/Socket/Client/websocket.js.map +0 -1
- package/lib/Socket/business.d.ts.map +0 -1
- package/lib/Socket/business.js.map +0 -1
- package/lib/Socket/chats.d.ts.map +0 -1
- package/lib/Socket/chats.js.map +0 -1
- package/lib/Socket/communities.d.ts.map +0 -1
- package/lib/Socket/communities.js.map +0 -1
- package/lib/Socket/dugong.d.ts.map +0 -1
- package/lib/Socket/dugong.js.map +0 -1
- package/lib/Socket/groups.d.ts.map +0 -1
- package/lib/Socket/groups.js.map +0 -1
- package/lib/Socket/index.d.ts.map +0 -1
- package/lib/Socket/index.js.map +0 -1
- package/lib/Socket/messages-recv.d.ts.map +0 -1
- package/lib/Socket/messages-recv.js.map +0 -1
- package/lib/Socket/messages-send.d.ts.map +0 -1
- package/lib/Socket/messages-send.js.map +0 -1
- package/lib/Socket/mex.d.ts.map +0 -1
- package/lib/Socket/mex.js.map +0 -1
- package/lib/Socket/newsletter.d.ts.map +0 -1
- package/lib/Socket/newsletter.js.map +0 -1
- package/lib/Socket/socket.d.ts.map +0 -1
- package/lib/Socket/socket.js.map +0 -1
- package/lib/Types/Auth.d.ts.map +0 -1
- package/lib/Types/Auth.js.map +0 -1
- package/lib/Types/Bussines.d.ts.map +0 -1
- package/lib/Types/Bussines.js.map +0 -1
- package/lib/Types/Call.d.ts.map +0 -1
- package/lib/Types/Call.js.map +0 -1
- package/lib/Types/Chat.d.ts.map +0 -1
- package/lib/Types/Chat.js.map +0 -1
- package/lib/Types/Contact.d.ts.map +0 -1
- package/lib/Types/Contact.js.map +0 -1
- package/lib/Types/Events.d.ts.map +0 -1
- package/lib/Types/Events.js.map +0 -1
- package/lib/Types/GroupMetadata.d.ts.map +0 -1
- package/lib/Types/GroupMetadata.js.map +0 -1
- package/lib/Types/Label.d.ts.map +0 -1
- package/lib/Types/Label.js.map +0 -1
- package/lib/Types/LabelAssociation.d.ts.map +0 -1
- package/lib/Types/LabelAssociation.js.map +0 -1
- package/lib/Types/Message.d.ts.map +0 -1
- package/lib/Types/Message.js.map +0 -1
- package/lib/Types/Newsletter.d.ts.map +0 -1
- package/lib/Types/Newsletter.js.map +0 -1
- package/lib/Types/Product.d.ts.map +0 -1
- package/lib/Types/Product.js.map +0 -1
- package/lib/Types/Signal.d.ts.map +0 -1
- package/lib/Types/Signal.js.map +0 -1
- package/lib/Types/Socket.d.ts.map +0 -1
- package/lib/Types/Socket.js.map +0 -1
- package/lib/Types/State.d.ts.map +0 -1
- package/lib/Types/State.js.map +0 -1
- package/lib/Types/USync.d.ts.map +0 -1
- package/lib/Types/USync.js.map +0 -1
- package/lib/Types/index.d.ts.map +0 -1
- package/lib/Types/index.js.map +0 -1
- package/lib/Utils/auth-utils.d.ts.map +0 -1
- package/lib/Utils/auth-utils.js.map +0 -1
- package/lib/Utils/browser-utils.d.ts.map +0 -1
- package/lib/Utils/browser-utils.js.map +0 -1
- package/lib/Utils/business.d.ts.map +0 -1
- package/lib/Utils/business.js.map +0 -1
- package/lib/Utils/chat-utils.d.ts.map +0 -1
- package/lib/Utils/chat-utils.js.map +0 -1
- package/lib/Utils/crypto.d.ts.map +0 -1
- package/lib/Utils/crypto.js.map +0 -1
- package/lib/Utils/decode-wa-message.d.ts.map +0 -1
- package/lib/Utils/decode-wa-message.js.map +0 -1
- package/lib/Utils/event-buffer.d.ts.map +0 -1
- package/lib/Utils/event-buffer.js.map +0 -1
- package/lib/Utils/generics.d.ts.map +0 -1
- package/lib/Utils/generics.js.map +0 -1
- package/lib/Utils/history.d.ts.map +0 -1
- package/lib/Utils/history.js.map +0 -1
- package/lib/Utils/identity-change-handler.d.ts.map +0 -1
- package/lib/Utils/identity-change-handler.js.map +0 -1
- package/lib/Utils/index.d.ts.map +0 -1
- package/lib/Utils/index.js.map +0 -1
- package/lib/Utils/link-preview.d.ts.map +0 -1
- package/lib/Utils/link-preview.js.map +0 -1
- package/lib/Utils/logger.d.ts.map +0 -1
- package/lib/Utils/logger.js.map +0 -1
- package/lib/Utils/lt-hash.d.ts.map +0 -1
- package/lib/Utils/lt-hash.js.map +0 -1
- package/lib/Utils/make-mutex.d.ts.map +0 -1
- package/lib/Utils/make-mutex.js.map +0 -1
- package/lib/Utils/message-retry-manager.d.ts.map +0 -1
- package/lib/Utils/message-retry-manager.js.map +0 -1
- package/lib/Utils/messages-media.d.ts.map +0 -1
- package/lib/Utils/messages-media.js.map +0 -1
- package/lib/Utils/messages.d.ts.map +0 -1
- package/lib/Utils/messages.js.map +0 -1
- package/lib/Utils/noise-handler.d.ts.map +0 -1
- package/lib/Utils/noise-handler.js.map +0 -1
- package/lib/Utils/offline-node-processor.d.ts.map +0 -1
- package/lib/Utils/offline-node-processor.js.map +0 -1
- package/lib/Utils/pre-key-manager.d.ts.map +0 -1
- package/lib/Utils/pre-key-manager.js.map +0 -1
- package/lib/Utils/process-message.d.ts.map +0 -1
- package/lib/Utils/process-message.js.map +0 -1
- package/lib/Utils/reporting-utils.d.ts.map +0 -1
- package/lib/Utils/reporting-utils.js.map +0 -1
- package/lib/Utils/rich-messages.d.ts.map +0 -1
- package/lib/Utils/rich-messages.js.map +0 -1
- package/lib/Utils/signal.d.ts.map +0 -1
- package/lib/Utils/signal.js.map +0 -1
- package/lib/Utils/stanza-ack.d.ts.map +0 -1
- package/lib/Utils/stanza-ack.js.map +0 -1
- package/lib/Utils/sync-action-utils.d.ts.map +0 -1
- package/lib/Utils/sync-action-utils.js.map +0 -1
- package/lib/Utils/tc-token-utils.d.ts.map +0 -1
- package/lib/Utils/tc-token-utils.js.map +0 -1
- package/lib/Utils/use-multi-file-auth-state.d.ts.map +0 -1
- package/lib/Utils/use-multi-file-auth-state.js.map +0 -1
- package/lib/Utils/validate-connection.d.ts.map +0 -1
- package/lib/Utils/validate-connection.js.map +0 -1
- package/lib/WABinary/constants.d.ts.map +0 -1
- package/lib/WABinary/constants.js.map +0 -1
- package/lib/WABinary/decode.d.ts.map +0 -1
- package/lib/WABinary/decode.js.map +0 -1
- package/lib/WABinary/encode.d.ts.map +0 -1
- package/lib/WABinary/encode.js.map +0 -1
- package/lib/WABinary/generic-utils.d.ts.map +0 -1
- package/lib/WABinary/generic-utils.js.map +0 -1
- package/lib/WABinary/index.d.ts.map +0 -1
- package/lib/WABinary/index.js.map +0 -1
- package/lib/WABinary/jid-utils.d.ts.map +0 -1
- package/lib/WABinary/jid-utils.js.map +0 -1
- package/lib/WABinary/types.d.ts.map +0 -1
- package/lib/WABinary/types.js.map +0 -1
- package/lib/WAM/BinaryInfo.d.ts.map +0 -1
- package/lib/WAM/BinaryInfo.js.map +0 -1
- package/lib/WAM/constants.d.ts.map +0 -1
- package/lib/WAM/constants.js.map +0 -1
- package/lib/WAM/encode.d.ts.map +0 -1
- package/lib/WAM/encode.js.map +0 -1
- package/lib/WAM/index.d.ts.map +0 -1
- package/lib/WAM/index.js.map +0 -1
- package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts.map +0 -1
- package/lib/WAUSync/Protocols/USyncContactProtocol.js.map +0 -1
- package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts.map +0 -1
- package/lib/WAUSync/Protocols/USyncDeviceProtocol.js.map +0 -1
- package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts.map +0 -1
- package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js.map +0 -1
- package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts.map +0 -1
- package/lib/WAUSync/Protocols/USyncStatusProtocol.js.map +0 -1
- package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts.map +0 -1
- package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js.map +0 -1
- package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts.map +0 -1
- package/lib/WAUSync/Protocols/UsyncLIDProtocol.js.map +0 -1
- package/lib/WAUSync/Protocols/index.d.ts.map +0 -1
- package/lib/WAUSync/Protocols/index.js.map +0 -1
- package/lib/WAUSync/USyncQuery.d.ts.map +0 -1
- package/lib/WAUSync/USyncQuery.js.map +0 -1
- package/lib/WAUSync/USyncUser.d.ts.map +0 -1
- package/lib/WAUSync/USyncUser.js.map +0 -1
- package/lib/WAUSync/index.d.ts.map +0 -1
- package/lib/WAUSync/index.js.map +0 -1
- package/lib/index.d.ts.map +0 -1
- package/lib/index.js.map +0 -1
package/README.md
CHANGED
|
@@ -16,7 +16,54 @@
|
|
|
16
16
|
|
|
17
17
|
---
|
|
18
18
|
|
|
19
|
-
## 🆕 Novedades —
|
|
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.
|
|
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-
|
|
127
|
+
const { state, saveCreds } = await useMultiFileAuthState('session-myfer')
|
|
81
128
|
|
|
82
|
-
const
|
|
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
|
-
|
|
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
|
-
|
|
140
|
+
fer.ev.on('messages.upsert', async ({ messages }) => {
|
|
94
141
|
const m = messages[0]
|
|
95
142
|
if (!m.message) return
|
|
96
143
|
|
|
97
|
-
await
|
|
98
|
-
text: '¡Hola! Soy un bot de
|
|
144
|
+
await fer.sendMessage(m.key.remoteJid, {
|
|
145
|
+
text: '¡Hola! Soy un bot de Fer!'
|
|
99
146
|
})
|
|
100
147
|
})
|
|
101
148
|
|
|
102
|
-
|
|
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, `
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
package/lib/Defaults/index.js
CHANGED
|
@@ -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,
|
|
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"),
|
package/lib/Signal/libsignal.js
CHANGED
|
@@ -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
|
},
|