Eventos¶
Referencia completa de todos los eventos emitidos por WhatsApp.
Escuchar eventos¶
WhatsApp expone un EventEmitter tipado a traves de wa.event:
import { WhatsApp } from "@arcaelas/whatsapp";
const wa = new WhatsApp();
// Escuchar evento
wa.event.on("message:created", (msg) => {
// msg esta tipado correctamente
});
// Escuchar una sola vez
wa.event.once("open", () => {
console.log("Primera conexion exitosa");
});
// Remover listener
const handler = (msg) => console.log(msg);
wa.event.on("message:created", handler);
wa.event.off("message:created", handler);
Eventos de conexion¶
open¶
Emitido cuando la conexion es exitosa.
wa.event.on("open", () => {
console.log("Conectado a WhatsApp");
// Aqui puedes empezar a enviar mensajes
});
Payload: ninguno
close¶
Emitido cuando la conexion se cierra. La reconexion es automatica.
Payload: ninguno
error¶
Emitido cuando ocurre un error fatal que no permite reconexion.
wa.event.on("error", (error) => {
console.error("Error fatal:", error.message);
// Error comun:
// - "Logged out" - Sesion cerrada desde telefono
});
Payload: Error
Eventos de contacto¶
contact:created¶
Emitido cuando se crea un nuevo contacto.
wa.event.on("contact:created", (contact) => {
console.log(`Nuevo contacto: ${contact.name}`);
console.log(` ID: ${contact.id}`);
console.log(` Telefono: ${contact.phone}`);
});
Payload: Contact
contact:updated¶
Emitido cuando se actualiza un contacto existente.
wa.event.on("contact:updated", (contact) => {
console.log(`Contacto actualizado: ${contact.name}`);
});
Payload: Contact
Eventos de chat¶
chat:created¶
Emitido cuando se crea un nuevo chat.
wa.event.on("chat:created", (chat) => {
if (chat.type === "group") {
console.log(`Nuevo grupo: ${chat.name}`);
} else {
console.log(`Nuevo chat: ${chat.name}`);
}
});
Payload: Chat
chat:updated¶
Emitido cuando se actualiza un chat existente.
Payload: Chat
chat:pinned¶
Emitido cuando se fija o desfija un chat. El payload es la instancia de Chat actualizada.
wa.event.on("chat:pinned", (chat) => {
if (chat.pinned) {
console.log(`Chat ${chat.name} fijado`);
} else {
console.log(`Chat ${chat.name} desfijado`);
}
});
Payload: Chat
chat:archived¶
Emitido cuando se archiva o desarchiva un chat. El payload es la instancia de Chat actualizada.
wa.event.on("chat:archived", (chat) => {
console.log(`Chat ${chat.name}: ${chat.archived ? "archivado" : "desarchivado"}`);
});
Payload: Chat
chat:muted¶
Emitido cuando se silencia o desilencia un chat. El payload es la instancia de Chat actualizada.
wa.event.on("chat:muted", (chat) => {
if (chat.muted) {
console.log(`Chat ${chat.name} silenciado hasta ${new Date(chat.muted)}`);
} else {
console.log(`Chat ${chat.name} desilenciado`);
}
});
Payload: Chat
chat:deleted¶
Emitido cuando se elimina un chat.
Payload: (cid: string)
Eventos de mensaje¶
message:created¶
Emitido cuando se recibe un nuevo mensaje.
wa.event.on("message:created", async (msg) => {
console.log(`Nuevo mensaje:`);
console.log(` ID: ${msg.id}`);
console.log(` Chat: ${msg.cid}`);
console.log(` Tipo: ${msg.type}`);
console.log(` Mio: ${msg.me}`);
console.log(` Autor: ${msg.author}`);
console.log(` Caption: ${msg.caption}`);
console.log(` Creado: ${new Date(msg.created_at)}`);
if (msg.mid) {
console.log(` Respuesta a: ${msg.mid}`);
}
// Obtener contenido
if (msg.type === "text") {
const text = (await msg.content()).toString();
console.log(` Texto: ${text}`);
}
});
Payload: Message
Propiedades disponibles:
id- ID del mensajecid- JID del chatmid- ID del mensaje padre (reply) onullme- true si es mensaje propioauthor- JID del autor del mensajetype- Tipo de mensaje (text, image, video, audio, location, poll)mime- MIME typecaption- Caption/textostatus- Estado del mensaje (enum)starred- true si esta destacadoforwarded- true si fue reenviadoedited- true si fue editadocreated_at- Timestamp de creacion en milisegundosdeleted_at- Timestamp de expiracion en ms onull
message:updated¶
Emitido cuando se edita un mensaje.
wa.event.on("message:updated", async (msg) => {
console.log(`Mensaje editado: ${msg.id}`);
console.log(` edited: ${msg.edited}`); // true
if (msg.type === "text") {
const new_text = (await msg.content()).toString();
console.log(` Nuevo texto: ${new_text}`);
}
});
Payload: Message
message:reacted¶
Emitido cuando alguien reacciona a un mensaje.
wa.event.on("message:reacted", (cid, mid, emoji) => {
console.log(`Reaccion en mensaje:`);
console.log(` Chat: ${cid}`);
console.log(` Mensaje: ${mid}`);
console.log(` Emoji: ${emoji}`); // "" si se quito la reaccion
});
Payload: (cid: string, mid: string, emoji: string)
message:deleted¶
Emitido cuando se elimina un mensaje.
wa.event.on("message:deleted", (cid, mid) => {
console.log(`Mensaje eliminado:`);
console.log(` Chat: ${cid}`);
console.log(` Mensaje: ${mid}`);
});
Payload: (cid: string, mid: string)
Patrones de uso¶
Logger completo¶
function setup_logger(wa: WhatsApp) {
// Conexion
wa.event.on("open", () => console.log("[INFO] Conectado"));
wa.event.on("close", () => console.log("[WARN] Desconectado"));
wa.event.on("error", (e) => console.error("[ERROR]", e.message));
// Contactos
wa.event.on("contact:created", (c) =>
console.log(`[CONTACT:NEW] ${c.name} (${c.phone})`)
);
wa.event.on("contact:updated", (c) =>
console.log(`[CONTACT:UPD] ${c.name}`)
);
// Chats
wa.event.on("chat:created", (c) =>
console.log(`[CHAT:NEW] ${c.name} (${c.type})`)
);
wa.event.on("chat:updated", (c) =>
console.log(`[CHAT:UPD] ${c.name}`)
);
wa.event.on("chat:pinned", (chat) =>
console.log(`[CHAT:PIN] ${chat.name}: ${chat.pinned ? "fijado" : "desfijado"}`)
);
wa.event.on("chat:archived", (chat) =>
console.log(`[CHAT:ARC] ${chat.name}: ${chat.archived ? "archivado" : "desarchivado"}`)
);
wa.event.on("chat:muted", (chat) =>
console.log(`[CHAT:MUTE] ${chat.name}: ${chat.muted ? "silenciado" : "desilenciado"}`)
);
wa.event.on("chat:deleted", (cid) =>
console.log(`[CHAT:DEL] ${cid}`)
);
// Mensajes
wa.event.on("message:created", (m) =>
console.log(`[MSG:NEW] ${m.cid} <- ${m.type} by ${m.author}`)
);
wa.event.on("message:updated", (m) =>
console.log(`[MSG:EDIT] ${m.id}`)
);
wa.event.on("message:reacted", (cid, mid, emoji) =>
console.log(`[MSG:REACT] ${mid}: ${emoji}`)
);
wa.event.on("message:deleted", (cid, mid) =>
console.log(`[MSG:DEL] ${mid} from ${cid}`)
);
}
Filtrar por chat¶
const MONITORED_CHAT = "5491112345678@s.whatsapp.net";
wa.event.on("message:created", async (msg) => {
if (msg.cid !== MONITORED_CHAT) return;
// Solo procesar mensajes de este chat
});
Filtrar por tipo¶
wa.event.on("message:created", async (msg) => {
// Solo imagenes
if (msg.type !== "image") return;
const buffer = await msg.content();
console.log(`Imagen recibida: ${buffer.length} bytes`);
});
Cola de procesamiento¶
const queue: Array<{ id: string; cid: string; type: string }> = [];
let processing = false;
wa.event.on("message:created", (msg) => {
queue.push(msg);
process_queue();
});
async function process_queue() {
if (processing || queue.length === 0) return;
processing = true;
const msg = queue.shift()!;
try {
await handle_message(msg);
} catch (error) {
console.error("Error procesando mensaje:", error);
}
processing = false;
process_queue();
}
async function handle_message(msg: any) {
// Procesar mensaje
}
Estadisticas en tiempo real¶
const stats = {
messages: 0,
text: 0,
image: 0,
video: 0,
audio: 0,
location: 0,
poll: 0,
};
wa.event.on("message:created", (msg) => {
stats.messages++;
stats[msg.type as keyof typeof stats]++;
console.log("Estadisticas:", stats);
});
Interfaz WhatsAppEventMap¶
interface WhatsAppEventMap {
// Conexion
open: [];
close: [];
error: [Error];
// Contactos
"contact:created": [Contact];
"contact:updated": [Contact];
// Chats
"chat:created": [Chat];
"chat:updated": [Chat];
"chat:pinned": [chat: Chat];
"chat:archived": [chat: Chat];
"chat:muted": [chat: Chat];
"chat:deleted": [cid: string];
// Mensajes
"message:created": [Message];
"message:updated": [Message];
"message:reacted": [cid: string, mid: string, emoji: string];
"message:deleted": [cid: string, mid: string];
}