Source: Variables.js

// Importar módulos necesarios
const { Client, GatewayIntentBits, Partials } = require('../../libraries/node_modules/discord.js');
require('../../libraries/node_modules/dotenv').config({ path: './helpers/resources/.env' });

// ======== VARIABLES Y CONFIGURACIÓN ========

// ¡¡¡ EXTREMA IMPORTANCIA !!! CAMBIAR RUTAS SI SE CAMBIA DE DISPOSITIVO (ya sean absolutas o relativas puede dar lugar a error, más que nada por el nombre de usuario)

const TOKEN = process.env.TOKEN; // Reemplaza con tu token

const IMAGE_PATHS = Object.freeze({
  default: process.env.default,      // Imagen predeterminada para errores
  callar: process.env.callar,        // Imagen para callar a usuarios
  avatar: process.env.avatar,       // Imagen para el comando "avatar"
  banner: process.env.banner,        // Imagen para el comando "banner"
  pececin: process.env.pececin,      // Imagen para el comando "pececin"
  chanti: process.env.chanti,        // Imagen para el comando "chanti"
  cores: process.env.cores,          // Imagen para el comando "cores"
  esencia: process.env.esencia,      // Imagen para el comando "esencia"
  dibujo: process.env.dibujo,        // Imagen para el comando "No cojan dibujo"
  sleep: process.env.sleep,          // Imagen para el mensaje programado
  wakeUp: process.env.wakeUp,        // Imagen para el mensaje de despertar a las 08:00
  lateNight: process.env.lateNight,  // Imagen para el mensaje de seguir despierto a la 01:00
});

/**
 * @Lista_Navideña:
 * 
 *  navidad1: Jingle Bells
 *  navidad2: Last Christmas
 */

const AUDIO_PATHS = Object.freeze({
  navidad1: process.env.navidad1,     // Ruta al archivo audio mp3 entre 1 dic y 8 ene // No se puede poner navideño, no reconoce eñes
  navidad2: process.env.navidad2,
  programado: process.env.programado, // Ruta al archivo de audio esencial (no es el que está puesto)
});

const FILE_PATHS = Object.freeze({
  mesesDesarollo: process.env.mesesDesarollo, // Ruta al archivo de meses de desarrollo
});

const CANAL_IDs = Object.freeze({
  purga: process.env.purga,                              // ID del canal para reaccionar mensajes // Todas las propiedades de un objeto en js son independientes no puedes declarar una variable que en su inicialización dependa de otra variable declarada en el objeto
  mensajeNocturno: process.env.purga,                    // ID del canal para mensajes programados
  checkOnline: process.env.purga,                        // ID del canal dónde comprobar quién sigue despierto a la 01:00 
  checkActivities: process.env.purga,                    // ID del canal dónde supervisar los cambios de actividad de los usuarios
  reaccion: process.env.purga,                           // ID del canal donde reaccionar


  mensajesRepetitivos: process.env.mensajesRepetitivos,  //ID del canal dónde petar a usuarios para que chambeen con mensajes repetitivos
  admins: process.env.admins,                            //  ID del canal de admins
  decretosOficiales: process.env.decretosOficiales,      //  ID del canal de decretos oficiales

  ciudadVoice: process.env.ciudadVoice,                  //  ID del canal de voz navideño
});

const ROLE_IDs = Object.freeze({
  toIgnore: process.env.toIgnore,       // ID del rol de los BOTS
  rolReactivo: process.env.rolReactivo, // ID del rol reactivo que se recibe al reaccionar al mensaje de decretos oficiales
});

const USER_IDs = Object.freeze({
  botPurgador: process.env.botPurgador, // ID del Purgador
  coresID: process.env.coresID,         // ID del Cores
  biosID: process.env.biosID,           // ID del Bios
});

const MESSAGE_IDs = Object.freeze({
  mensajeRolReactivo: process.env.mensajeRolReactivo, // ID del mensaje de decretos oficiales para recibir rol reactivo
});

const REACTIONS = Object.freeze({
  reaccionImagenGeneralNegativa: '❌',  // Reacción para imagenes de no chambear
  reaccionImagenGeneralPositiva: '✅',  // Reacción para imagenes de chambear
  reaccionImagenDormir: '😴',           // Reacción para la imagen programada nocturna
  reaccionImagenDespertar: '🌅',        // Reacción para la imagen programada diurna
  reaccionMensajes: '🗣️',               // Reacción para mensajes de tirar mierda y criticar por chambear
  reaccionMensajesAdmins: '🥵',         // Reacción para mensajes de admins
});

const DATA_ESCTRUCTURES = Object.freeze({
  intervalosMinutos: [1, 5, 10],              // Intervalos disponibles en minutos
  audioQueue: [],                             // Cola de reproducción
  userStateDM: new Map(),                     // Mapa de mensajes y cooldown (para enviar la foto y el emoji juntos) de usuarios por DM
  activeGames: new Map(),                     // Mapa para almacenar los juegos activos de los usuarios
});

const PLAYLISTS = Object.freeze({
  cancionesNavidad: ['navidad1', 'navidad2'], // Canciones navideñas (ampliable)

});

const BOT_MESSAGES = Object.freeze({
  mensaje1: 'Dime',
  mensaje2: '¿Qué?',
  mensaje3: '¿Qué quieres?',
  mensaje4: '¿Qué pasó?',
  mensaje5: 'Qué pasa, jefe?',
  mensaje6: 'Qué pasa chico, ¿qué quieres?',
  mensaje7: '¿Sí?',
  mensaje8: 'Al aparato',
  mensaje9: 'El que viste y calza',
  mensaje10: 'El mismísimo',
  mensaje11: 'Alo',
  mensaje12: 'Hola',
  mensaje13: 'Buenos días',
  mensaje14: '¿Qué tal?',
});

const BOT_ANSWERS= Object.freeze({
  mensaje1: 'Tú callao',
  mensaje2: 'Calla',
  mensaje3: 'Shhhh',
  mensaje4: 'No estaba hablando contigo',
  mensaje5: '¿Qué me tienes que andar respondiendo?',
  mensaje6: '¡Qué me tiene que decir a mi la furcia esta!',
  mensaje7: 'Deja de andar jodiendo',
  mensaje8: 'Tú no tienes nada que hacer, o cómo',
});

const GLOBAL_VARIABLES = { // En este objeto no se aplica Object.freeze para hacer el contenido del objeto constante (inmutable) porque son variables, en todos los demás sí se aplica por tratarse de constantes.
  connection: null,        // Conexión al canal de voz // Hay que inicializar todas las propiedades de un objeto porque sino js se pone triste
  player: null,            // Reproductor de audio
  isPlaying: false,        // Indica si el bot está reproduciendo algo
  playCount: 0,            // Inicializa un contador para el mensaje de terminal de "El audio ha terminado. Reproduciendo de nuevo..."
  intervalo: null,         // Variable global para controlar el temporizador de mensajes repetitivos
  collectorActivo: false,  // Indica si el collector está activo
  biosReaction: true,      // Cambia a false si no quieres que reaccione a los mensajes de bios
  working: false,          // Indica si estoy en VS Code o no // Basura de idea // La mejor idea del mundo, indica si el evento tiene que dejarme en paz la entrada del hash o no
};

// Crear una instancia del cliente de Discord con todos los permisos de request a la API necesarios
const CLIENT = new Client({
  intents: [
    GatewayIntentBits.Guilds,
    GatewayIntentBits.GuildMessages,
    GatewayIntentBits.GuildMessageReactions,
    GatewayIntentBits.MessageContent,
    GatewayIntentBits.GuildVoiceStates,
    GatewayIntentBits.GuildMembers,
    GatewayIntentBits.GuildPresences,
    GatewayIntentBits.GuildModeration,
    GatewayIntentBits.DirectMessages,
  ],
  partials: [
    Partials.Message,
    Partials.Channel,
    Partials.Reaction,
  ],
});

//Objeto con todas las variables (Objetos) del archivo
const variables = Object.freeze({
  TOKEN,
  IMAGE_PATHS,
  AUDIO_PATHS,
  FILE_PATHS,
  CANAL_IDs,
  ROLE_IDs,
  USER_IDs,
  MESSAGE_IDs,
  REACTIONS,
  DATA_ESCTRUCTURES,
  PLAYLISTS,
  BOT_MESSAGES,
  BOT_ANSWERS,
  GLOBAL_VARIABLES,
  CLIENT,
});

module.exports = variables;