DEV Community

Soblend
Soblend

Posted on

@soblend/baileys 1.0.4

Queria decirles sobre mi nuevo proyecto, este es un mod de baileys que les puede servir bastante para bots de whatsapp, muchos diran que otro es mejor o el original es mejor, pero ¿Porque no darle una oportunidad a algo nuevo? no creen que quizas les guste mucho mas, o de pronto les sea mas util. 🤗

En este post no lo dire todo ya que es demasiado largo, pero te dejo aqui los enlaces de los repositorios y de npmjs.com para que puedas leerlo completamente:

GitHub: Click Aqui
NPMJS: Clicl Aqui

Instalación

Opción 1: NPM

npm install @soblend/baileys

Opción 2: Yarn

yarn add @soblend/baileys

Opción 3: PNPM

pnpm add @soblend/baileys

Ejemplo Basico

`import { SoblendBaileys } from '@soblend/baileys';

async function main() {
// Crear instancia con configuración básica
const soblend = new SoblendBaileys({
printQRInTerminal: true, // Mostrar QR en consola
enableCache: true, // Activar caché inteligente
logLevel: 'info', // Nivel de logs
});

// Conectar
const socket = await soblend.connect('auth_session');

console.log('✅ ¡Conectado a WhatsApp!');

// Escuchar mensajes
socket.ev.on('messages.upsert', async ({ messages }) => {
const msg = messages[0];
if (!msg.message || msg.key.fromMe) return;

const text = msg.message.conversation || '';
const from = msg.key.remoteJid;

// Responder a "hola"
if (text.toLowerCase() === 'hola') {
  await socket.sendMessage(from, { text: '¡Hola! 👋' });
}
Enter fullscreen mode Exit fullscreen mode

});
}

main();`

Ejemplo 2: Bot con Base de datos y sistema de niveles

`import { SoblendBaileys, SoblendStorage } from '@soblend/baileys';

async function main() {
const storage = new SoblendStorage('./database', true, 'password');
await storage.initialize();

const soblend = new SoblendBaileys({ printQRInTerminal: true });
const socket = await soblend.connect('session');

socket.ev.on('messages.upsert', async ({ messages }) => {
const msg = messages[0];
if (!msg.message || msg.key.fromMe) return;

const sender = msg.key.participant || msg.key.remoteJid;
const from = msg.key.remoteJid;

// Registrar usuario si no existe
let user = storage.getUser(sender);
if (!user) {
  await storage.saveUser({
    jid: sender,
    name: msg.pushName || 'Usuario',
    messageCount: 0,
    firstSeen: Date.now(),
    lastSeen: Date.now(),
    isBlocked: false,
    isBanned: false,
    level: 1,
    points: 0
  });
  user = storage.getUser(sender);
}

// Incrementar contador y puntos
await storage.updateUser(sender, {
  messageCount: user.messageCount + 1,
  lastSeen: Date.now()
});
await storage.incrementUserLevel(sender, 10);  // +10 puntos por mensaje

const text = msg.message.conversation || '';

// Comando: !level
if (text === '!level') {
  const updatedUser = storage.getUser(sender);
  await socket.sendMessage(from, {
    text: `👤 Tu Perfil:\n` +
          `Nivel: ${updatedUser.level}\n` +
          `Puntos: ${updatedUser.points}\n` +
          `Mensajes: ${updatedUser.messageCount}`
  });
}

// Comando: !top
if (text === '!top') {
  const topUsers = await storage.getTopUsers(5);
  let leaderboard = '🏆 Top 5 Usuarios:\n\n';
  topUsers.forEach((u, i) => {
    leaderboard += `${i + 1}. ${u.name}\n`;
    leaderboard += `   Nivel ${u.level} - ${u.points} puntos\n\n`;
  });
  await socket.sendMessage(from, { text: leaderboard });
}
Enter fullscreen mode Exit fullscreen mode

});
}

main();`

Ejemplo 3: Sistema de administración

`import { SoblendBaileys, GroupAdminManager } from '@soblend/baileys';

async function main() {
const soblend = new SoblendBaileys({ printQRInTerminal: true });
const socket = await soblend.connect('session');
const groupManager = new GroupAdminManager(socket);

// Configurar reglas anti-spam y anti-link
const GROUP_ID = 'GROUP_ID@g.us';

groupManager.addRule(GROUP_ID, {
id: 'no-links',
type: 'anti-link',
enabled: true,
action: 'kick',
message: '❌ Enlaces prohibidos'
});

groupManager.addRule(GROUP_ID, {
id: 'no-spam',
type: 'anti-spam',
enabled: true,
action: 'mute'
});

// Mensaje de bienvenida personalizado
groupManager.setWelcomeMessage(GROUP_ID, {
enabled: true,
text: '¡Hola {user}! 👋\nBienvenido a {group}\n\n📋 Reglas:\n1. No spam\n2. No enlaces\n3. Respeto mutuo',
buttons: true
});

socket.ev.on('messages.upsert', async ({ messages }) => {
const msg = messages[0];
if (!msg.message || msg.key.fromMe) return;

const text = msg.message.conversation || '';
const from = msg.key.remoteJid;
const sender = msg.key.participant || msg.key.remoteJid;

// Verificar reglas
if (from.endsWith('@g.us')) {
  const allowed = await groupManager.checkRules(from, sender, text);
  if (!allowed) return;  // Mensaje bloqueado por reglas
}

// Comando: !admin (mostrar panel)
if (text === '!admin' && from.endsWith('@g.us')) {
  const isAdmin = await groupManager.isAdmin(from, sender);
  if (isAdmin) {
    await groupManager.sendAdminPanel(from, sender);
  }
}

// Comando: !kick @usuario
if (text.startsWith('!kick') && from.endsWith('@g.us')) {
  const isAdmin = await groupManager.isAdmin(from, sender);
  if (!isAdmin) return;

  const mentioned = msg.message.extendedTextMessage?.contextInfo?.mentionedJid;
  if (mentioned && mentioned.length > 0) {
    await groupManager.removeParticipants(from, mentioned);
    await socket.sendMessage(from, { text: '✅ Usuarios eliminados' });
  }
}
Enter fullscreen mode Exit fullscreen mode

});
}

main();`

Solucion De Problemas (Comunes)

Problema: QR Code no aparece
Solución:

const soblend = new SoblendBaileys({
printQRInTerminal: true, // Asegúrate de que esté en true
logLevel: 'debug' // Activa logs detallados
});

Problema: Reconexión lenta
Solución:

const soblend = new SoblendBaileys({
autoReconnect: true,
reconnectDelay: 1500, // Reducir delay inicial
maxReconnectAttempts: 20 // Aumentar intentos
});

Problema: Alto uso de memoria
Solución:

`const soblend = new SoblendBaileys({
enableCache: true,
cacheMaxSize: 5000, // Reducir tamaño del caché
});

// Limpiar caché periódicamente
setInterval(() => {
soblend.getCache().clear();
}, 3600000); // Cada hora`

Problema: Botones no funcionan
Solución:

await socket.sendInteractiveButtons(jid, {
text: 'Elige una opción',
footer: 'Powered by Soblend',
buttons: [
{
buttonId: 'id1',
buttonText: { displayText: 'Opción 1' },
type: 1
}
]
});

[ NOTA ] Recientemente se encontro un error en los botones, esto se estara corrijiendo en la siguiente version junto con la integración de carouseles.

Top comments (0)