· 6 years ago · Mar 12, 2020, 09:50 PM
1
2MIRA TODA LA MIERDA QUE ESCRIBI
3
4const Discord = require('discord.js');
5const config = require('./config.json');
6const client = new Discord.Client();
7
8const ytdl = require('ytdl-core');
9const search = require('youtube-search');
10
11client.on('ready', () => {
12 console.log('Estoy Listo!');
13});
14
15// Objeto 'queue' donde guardamos todas las canciones que agregaremos
16const queue = new Map();
17
18let prefix = config.prefix;
19
20client.on('message', async message => {
21 if (message.author.bot) return;
22 if (!message.content.startsWith(prefix)) return;
23
24 // Esta constante 'serverQueue' nos permitira saber si un servidor tiene una lista de musica reproduciendo.
25 const serverQueue = queue.get(message.guild.id);
26
27 const args = message.content.slice(prefix.length).trim().split(/ +/g);
28 const command = args.shift().toLowerCase();
29
30 // <-- CODIGO CMD PLAY (REPRODUCIR): -->
31
32 // <-- CODIGO CMD SKIP (SALTAR): -->
33
34 // <-- CODIGO CMD STOP (DETENER): -->
35
36 // <-- CODIGO CMD VOLUMEN (VOLUMEN): -->
37
38 // <-- CODIGO CMD PAUSAR (PAUSE): -->
39
40 // <-- CODIGO CMD RESUME (RESUME): -->
41
42 // <-- CODIGO CMD QUEUE (QUEUE): -->
43
44})
45
46client.login(config.token);
47
48// <-- FUNCION PLAY (REPRODUCIR): -->
49
50// <-- CODIGO CMD PLAY (REPRODUCIR): -->
51
52if(command === 'play') {
53 const voiceChannel = message.member.voice.channel;
54
55 //verificamos que el usuario solicitante este conectado en un canal de voz.
56 if (!voiceChannel) return message.channel.send('¡Necesitas unirte a un canal de voz para reproducir música!');
57
58 const permissions = voiceChannel.permissionsFor(message.client.user);
59
60 //verificamos que el bot tenga permisos de conectar y de hablar en el canal de voz.
61 if (!permissions.has('CONNECT') || !permissions.has('SPEAK')) {
62 return message.channel.send('¡Necesito permisos para unirme y hablar en el canal de voz!');
63 }
64
65 // <-- Capturamos la información de la música a reproducir -->
66
67
68 }
69
70
71 // <-- Capturamos la información de la música a reproducir -->
72
73 var opts = {
74 maxResults: 1, //Maximo de resultados a encontrar
75 key: 'API-KEY-YOUTUBE', //Necesitas una CLAVE de la API de youtube.
76 type: "video" // Que tipo de resultado a obtener.
77 };
78
79 const songArg = await search(args.join(' '), opts);
80 const songURL = songArg.results[0].link;
81 const songInfo = await ytdl.getInfo(songURL);
82
83 const song = {
84 title: songInfo.title,
85 url: songInfo.video_url,
86 author: message.author.tag
87 };
88
89// <-- Verificamos la lista de canciones de un servidor -->
90
91
92// <-- Verificamos la lista de canciones de un servidor -->
93
94if (!serverQueue) {
95 // Si NO hay una lista de música.
96 // <-- Creamos nuestra cola de música a reproducir -->
97
98 }else {
99 // Si HAY una lista de música reproduciendo.
100
101 serverQueue.songs.push(song);
102 console.log(serverQueue.songs);
103 return message.channel.send(`**${song.title}** ha sido añadido a la cola!, __por: ${message.author.tag}__`);
104
105 }
106
107
108 // <-- Creamos nuestra cola de música a reproducir -->
109
110// Creamos el conjunto de datos para nuestra cola de música
111const queueObject = {
112 textChannel: message.channel, //guardamos el canal de texto
113 voiceChannel: voiceChannel, // guardamos el canal de voz
114 connection: null, // un objeto para la conexión
115 songs: [], // creamos la lista de canciones
116 volume: 5, // volumen al iniciar la cola
117 playing: true, // un objeto para validar la cola de música en reproducción.
118 };
119
120 // <-- Establecer la cola de música -->
121
122 // <-- Establecer la cola de música -->
123
124// Creando el conjunto de datos para nuestra cola de música
125queue.set(message.guild.id, queueObject);
126
127// Agregamos las canciones al conjunto de datos
128queueObject.songs.push(song);
129
130// <-- Conectar al canal de voz -->
131// <-- Conectar al canal de voz -->
132
133try {
134 // Aquí unimos el bot al canal de voz y guardar nuestra conexión en nuestro objeto.
135 var connection = await voiceChannel.join();
136 queueObject.connection = connection;
137
138 message.channel.send(`Reproduciendo ahora: **${song.title}**`);
139
140 // Llamar a la función de reproducción para comenzar una canción.
141 play(message.guild, queueObject.songs[0]);
142
143 } catch (err) {
144
145 // Imprimir el mensaje de error si el bot no puede unirse al chat de voz
146 console.log(err);
147 queue.delete(message.guild.id);
148 return message.channel.send(err);
149
150 }
151
152 function play(guild, song) {
153 const serverQueue = queue.get(guild.id);
154 // verificamos que hay musica en nuestro objeto de lista
155 if (!song) {
156 serverQueue.voiceChannel.leave(); // si no hay mas música en la cola, desconectamos nuestro bot
157 queue.delete(guild.id);
158 return;
159 }
160
161 // <-- Reproducción usando play() -->
162
163 }
164
165 // <-- Reproducción usando play() -->
166
167 const dispatcher = serverQueue.connection.play(ytdl(song.url))
168 .on('end', () => {
169 // Elimina la canción terminada de la cola.
170 serverQueue.songs.shift();
171
172 // Llama a la función de reproducción nuevamente con la siguiente canción
173 play(guild, serverQueue.songs[0]);
174 })
175 .on('error', error => {
176 console.error(error);
177 });
178
179 // Configuramos el volumen de la reproducción de la canción
180 dispatcher.setVolumeLogarithmic(serverQueue.volume / 5);
181
182
183 // <-- CODIGO CMD SKIP (SALTAR): -->
184
185 if(command === 'skip') {
186 // Aquí verificamos si el usuario que escribió el comando está en un canal de voz y si hay una canción que omitir.
187 if (!message.member.voice.channel) return message.channel.send('debes unirte a un canal de voz.');
188 // Aquí verificamos si el objeto de la lista de canciones esta vacía.
189 if (!serverQueue) return message.channel.send('¡No hay canción que saltar!, la cola esta vacía');
190
191 // Finalizamos el dispatcher
192 await serverQueue.connection.dispatcher.destroy();
193 message.channel.send(`Reproduciendo ahora: **${serverQueue.songs[0].title}**`);
194 }
195
196 // <-- CODIGO CMD STOP (DETENER): -->
197
198 if(command === 'stop') {
199 if (!message.member.voice.channel) return message.channel.send('Debes unirte a un canal de voz para detener la canción.');
200 if (!serverQueue) return message.channel.send('¡No hay canción!, la cola esta vacía.');
201 // Aquí borramos la cola de las canciones agregadas
202 serverQueue.songs = [];
203
204 // Finalizamos el dispatcher
205 await serverQueue.connection.dispatcher.end();
206 message.channel.send('Lista de canciones fue detenida.')
207
208 }
209 // <-- CODIGO CMD VOLUMEN (VOLUMEN): -->
210
211 if(command === 'volumen') {
212 // Validamos si la cola esta vacía
213 if (!serverQueue) return message.channel.send('¡No hay canción!, la cola esta vacía.');
214 if(!args.join(' ')) return message.channel.send('Agrege el volumen entre **1 a 100%**')
215
216 // Creamos una variable para el porcentaje del volumen
217 let countVolumen = parseInt(args[0]);
218
219 if (countVolumen < 100) {
220 let dispatcher = serverQueue.connection.dispatcher;
221
222 // Modificamos el volumen de la canción en reproducción
223 await dispatcher.setVolume(Math.min((dispatcher.volume = countVolumen / 50)))
224
225 message.channel.send(`**Volume:** \`${Math.round(dispatcher.volume*50)}\`**%**`)
226
227 } else {
228 message.channel.send('El volumen debe estar entre **1 a 100%**')
229
230 }
231
232 }
233
234
235 // <-- CODIGO CMD PAUSAR (PAUSE): -->
236
237 if(command === 'pause') {
238 // Validamos si la cola esta vacía
239 if (!serverQueue) return message.channel.send('¡No hay canción!, la cola esta vacía.');
240 if (!message.member.voice.channel) return message.channel.send('debes unirte a un canal de voz.');
241
242 // Pausamos la canción en reproducción
243 await serverQueue.connection.dispatcher.pause();
244
245 message.channel.send(`Canción actual en pausa.`)
246
247 }
248
249 // <-- CODIGO CMD RESUME (RESUME): -->
250
251 if(command === 'resume') {
252 // Validamos si la cola esta vacía
253 if (!serverQueue) return message.channel.send('¡No hay canción!, la cola esta vacía.');
254
255 if (!message.member.voice.channel) return message.channel.send('debes unirte a un canal de voz.');
256
257 // Reanudamos la canción pausada
258 await serverQueue.connection.dispatcher.resume();
259
260 message.channel.send(`Canción actual reanudada.`)
261
262 }