Source: Functions/Listener/index.js

/*
    Esse local é restrito em nível máximo, usar ele na exec pode causar danos.
    Portanto, não existe função Ambient ou demais funções de exports, não utilize.
    NÃO DELETE ESSA PASTA OU ARQUIVO!
*/

/* Requires */
const ffmpeglocation = require('@ffmpeg-installer/ffmpeg');
global.fluent_ffmpeg_1 = require('fluent-ffmpeg');
const Indexer = require('../../index');
const extender = require('./messages');

/* Ajusta o ffmpeg para sobrepor o uso dos módulos que usem ele */
global.fluent_ffmpeg_1.setFfmpegPath(ffmpeglocation.path);
global.irisNumber = false;

/* Define uma let para armazenar se rodou com sucesso */
let sucessfulInit = false;

/**
 * Cria um listener para processar eventos do WhatsApp.
 * @function createListener
 * @param {Object} kill - Objeto principal que contém a sessão e métodos do WhatsApp.
 * @param {Function} saveCreds - Função para salvar as credenciais da sessão.
 * @param {Function} genSession - Função para gerar ou recarregar a sessão.
 * @param {Object} startOptions - Opções de inicialização para a sessão.
 * @param {number} indexlaunch - Índice de inicialização para controle de múltiplas sessões.
 * @param {Object} launchInstance - Objeto para as configurações de inicialização.
 * @returns {void}
 */
function createListener(kill, saveCreds, genSession, startOptions, indexlaunch, launchInstance) {
    /* Caso a função raiz seja inválida */
    if (
        typeof kill === 'object'
        && [saveCreds, genSession].some((t) => typeof t === 'function')
        && typeof startOptions === 'object'
        && typeof launchInstance === 'object'
        && /[0-9]+/g.test(indexlaunch)
    ) {
        /* Try Catch para evitar erros */
        try {
            /* Processa os eventos um a um */
            kill.ev.process(async (events) => {
                /* Caso a sessão mude de estado */
                if (events['connection.update']) {
                    /* Envia para o reload */
                    await Indexer('states').spec(events['connection.update'], genSession, startOptions, indexlaunch, launchInstance);
                }

                /* Se atualizar a sessão */
                if (events['creds.update']) {
                    /* Salva na pasta de sessões armazenadas */
                    await saveCreds();
                }

                /* Se tiver um evento de alteração no participante de um grupo */
                if (events['group-participants.update']) {
                    /* Roda as funções de greetings */
                    await Indexer('greetings').events(kill, events['group-participants.update']);
                }

                /* Se tiver um evento de caso alguém pedir para entrar */
                if (events['group.join-request']) {
                    /* Roda as funções de approval */
                    await Indexer('approval').events(kill, events['group.join-request']);
                }

                /* Se for um evento de mensagem */
                if (events['messages.upsert']) {
                    /* E for a primeira mensagem recebida */
                    if (sucessfulInit === false) {
                        /* Define sucesso na inicialização */
                        sucessfulInit = true;

                        /* Reajusta o número da Íris */
                        irisNumber = irisNumber === false ? `${kill?.user?.id.split('@')[0].split(':')[0]}@s.whatsapp.net` : irisNumber;

                        /* Avisa que iniciou */
                        console.log(Indexer('color').echo('----------- [START - OK] -----------', 'brightGreen').value);
                    }

                    /* Define a object e o tempo atual */
                    const messageObject = events['messages.upsert'];
                    messageObject.currentTimeDate = Date.now();

                    /* Envia a mensagem para formatação e funções posteriores */
                    await Indexer('commands').cmds(kill, messageObject);
                }

                /* Injeta o awaitMessages na kill para uso global */
                /* eslint-disable-next-line no-param-reassign */
                kill.awaitMessages = extender.awaitMessages;
            });

            /* Caso der erros em algo */
        } catch (error) {
            /* Printa o erro */
            console.error(error);
        }
    }
}

/* Exporta o módulo */
module.exports = createListener;