_antiprivado.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. import ws from 'ws';
  2. // Caché local para metadatos de grupos
  3. const groupMetadataCache = {};
  4. export async function before(m, { conn, isAdmin, isBotAdmin, isOwner, isROwner }) {
  5. try {
  6. // Verificar que chat existe antes de usarlo
  7. let chat = global.db.data.chats[m.chat] || {};
  8. let user = global.db.data.users[m.sender] || {};
  9. let setting = global.db.data.settings[this.user.jid] || {};
  10. // Usar setting con verificación
  11. let prefixRegex = new RegExp('^[' + (setting.prefix || '').replace(/[|\\{}()[\]^$+*.\-\^]/g, '\\$&') + ']');
  12. const users = [...new Set([...global.conns.filter((conn) => conn.user && conn.ws.socket && conn.ws.socket.readyState !== ws.CLOSED).map((conn) => conn)])];
  13. // ===== IMPLEMENTACIÓN CON CACHÉ PARA EVITAR RATE LIMITS =====
  14. let participants = [];
  15. if (m.isGroup) {
  16. // Verificar si ya tenemos el metadata en caché
  17. if (groupMetadataCache[m.chat] && (Date.now() - groupMetadataCache[m.chat].timestamp < 60000)) {
  18. // Usar caché si existe y no ha expirado (60 segundos)
  19. participants = groupMetadataCache[m.chat].participants;
  20. } else {
  21. try {
  22. // Si no está en caché o expiró, hacer la llamada a la API
  23. const metadata = await conn.groupMetadata(m.chat).catch(e => ({}));
  24. if (metadata && metadata.participants) {
  25. participants = metadata.participants;
  26. // Guardar en caché con timestamp
  27. groupMetadataCache[m.chat] = {
  28. participants: metadata.participants,
  29. timestamp: Date.now()
  30. };
  31. }
  32. } catch (e) {
  33. console.error('Error al obtener metadata del grupo:', e);
  34. // En caso de error, usar los datos que ya tengamos
  35. participants = (conn.chats[m.chat] || {}).participants || [];
  36. }
  37. }
  38. }
  39. // Optimizar las búsquedas con Map para mejor rendimiento
  40. const participantsMap = new Map(participants.map(p => [p.id, p]));
  41. const mainBotInGroup = participantsMap.has(global.conn.user.jid);
  42. // Verificar que chat.primaryBot existe antes de acceder
  43. const primaryBot = chat.primaryBot || null;
  44. const primaryBotConnected = primaryBot ? users.some(conn => conn.user.jid === primaryBot) : false;
  45. const primaryBotInGroup = primaryBot ? participantsMap.has(primaryBot) : false;
  46. if (!global.db.data.users[m.sender]) global.db.data.users[m.sender] = {};
  47. if (!global.db.data.users[m.sender].mensaje) global.db.data.users[m.sender].mensaje = {};
  48. if (!global.db.data.users[m.sender].mensaje[m.chat]) global.db.data.users[m.sender].mensaje[m.chat] = 0;
  49. global.db.data.users[m.sender].mensaje[m.chat]++;
  50. if (m.isGroup) {
  51. if (primaryBot) {
  52. if (primaryBotConnected && primaryBotInGroup) {
  53. if (this.user.jid !== primaryBot) throw !1;
  54. }
  55. else if (mainBotInGroup) {
  56. if (this.user.jid !== global.conn.user.jid) throw !1;
  57. }
  58. }
  59. }
  60. if (m.fromMe) return
  61. if (m.isGroup) return !1
  62. if (!m.message) return !0
  63. if (["120363371008200788@newsletter", "120363371008200788@newsletter"].includes(m.chat)) return;
  64. // Usar expresiones regulares para comprobaciones más eficientes
  65. const allowedTerms = /PIEDRA|PAPEL|TIJERA|menu|estado|code|Code|bots|serbot|jadibot|reg|verificar|Serbot|Jadibot|jadibot code|serbot code|jadibot --code|serbot --code/i;
  66. if (m.text && allowedTerms.test(m.text)) return !0;
  67. if (!user.warnPv) user.warnPv = false;
  68. // Verificar que setting existe antes de usar antiPrivate
  69. if (setting && setting.antiPrivate && !isOwner && !isROwner) {
  70. if (user.warnPv) {
  71. console.log(`[AntiPrivate]`);
  72. throw !1;
  73. }
  74. if (!user.warnPv) {
  75. // Verificar que nna2 está definido, o usar un valor predeterminado
  76. const nna2 = global.nna2 || 'https://chat.whatsapp.com/grupo_oficial';
  77. m.reply(`Hola, está prohibido usar los comandos en privado...\n\n*\`🔰 SI QUIERES HACERTE UN SUB BOT, USA LOS SIGUIENTES COMANDOS:\`*\n/serbot\n/code\n\n> _*Para usar mis funciones, únete al grupo oficial 👇*_\n${nna2}`);
  78. user.warnPv = true;
  79. throw !1;
  80. }
  81. }
  82. if (m.text && prefixRegex.test(m.text)) {
  83. this.sendPresenceUpdate('composing', m.chat)
  84. this.readMessages([m.key])
  85. let usedPrefix = m.text.match(prefixRegex)[0]
  86. let command = m.text.slice(usedPrefix.length).trim().split(' ')[0]
  87. }
  88. } catch (error) {
  89. // Si el error es rate-limit, manejarlo silenciosamente
  90. if (error.message && error.message.includes('rate-overlimit')) {
  91. console.log('[RATE LIMIT] Detectado rate limit en _antiprivado.js, esperando...');
  92. return !1; // Continuar sin bloquear la ejecución
  93. }
  94. // Para otros errores, lanzarlos normalmente
  95. throw error;
  96. }
  97. }