Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- const Discord = require("discord.js");
- const Youtube = require("simple-youtube-api");
- const Ytdl = require("ytdl-core");
- const { TOKEN_DISCORD, GOOGLE_KEY } = require("./config.js");
- const youtube = new Youtube(GOOGLE_KEY);
- const app = new Discord.Client();
- // Reviewer: Nao entendi o por que voce criou esse prefixo.
- // const prefixoComando = "!";
- const filaDeMusicas = [];
- let estouPronto = false;
- // HANDLERS
- // Reviewer: Qual é o `typeof` do `voice.channel`? `object`? Se for objeto, a nao ser que ele seja `null | undefined` em algum momento, essa condicao sempre ira retornar `true`
- const handleJoin = (msg) => {
- if (msg.member.voice.channel) {
- connection = await msg.member.voice.channel.join();
- estouPronto = true;
- } else {
- msg.channel.send("Pra nós ficarmos juntos em call você precisa entrar em um canal de voz");
- }
- return;
- };
- const handleLeave = (msg) => {
- // Reviewer: Qual é o type do voice.channel? Objeto? Se for objeto, a nao ser que ele seja `null | undefined` em algum momento, essa condicao sempre ira retornar `true`
- if (msg.member.voice.channel) {
- msg.member.voice.channel.leave();
- estouPronto = false;
- msg.channel.send("Caso precise de mais algo basta me chamar e eu venho na hora:");
- } else {
- msg.channel.send("Você precisa estar conectado a um Canal de Voz");
- }
- return;
- }
- // Reviewer: Evite de declarar funcoes abaixo do local de onde elas sao chamadas para nao criar cunfusao quando voce mudar a sua logica para `function expression` pois apesar de funcoes declaradas funcionarem sem se preocupar com a ordem de processamento, uma vez mudando para arrow function com funcoes expressivas, voce pode causar mais bugs no seu codigo. Pesquise por: Function Declaration vs Function Expression. Como regra, procure declarar as suas funcoes antes de serem chamadas, sempre!
- // Reviewer: Tambem essa mistura de declaracao em ingles com declaracao em portugues é confusa, eu preferiria ver algo mais padronizado para nao ter que traduzir de um idioma para outro durante a minha leitura do seu codigo.
- const tocarMusica = (song) => {
- connection.play(Ytdl(filaDeMusicas[0])).on("finish", () => {
- filaDeMusicas.shift();
- if (filaDeMusicas.length) {
- tocarMusica(song);
- }
- });
- }
- // EVENTS
- app.on("ready", () => {
- console.log("Estou conectado!");
- });
- app.on("message", async (msg) => {
- if (msg.content === "!join") {
- handleJoin(msg);
- } else if (msg.content === "!leave") {
- handleLeave(msg);
- } else if (msg.content.startsWith("!play")) {
- // Reviewer: Esse codigo de baixo esta muito grande e com bastante nesting, quanto mais voce quebrar o seu codigo em blocos menores, mais facil sera de digerir e `debug` no futuro...vai demorar demais para eu quebrar, mas fica a dica.
- // Author: !play [link] = Bot toca músicas
- if (estouPronto) {
- // Reviewer: Tenta rastrear quando o `estouPronto` é alterado.
- // Reviewer: O que acontece com `content` aqui?
- const oQueTocar = msg.content.replace("!play", "");
- // oQueTocar é uma url? por que voce precisa de remover o `!play` da url?
- if (Ytdl.validateURL(oQueTocar)) {
- filaDeMusicas.push(oQueTocar);
- // Reviewer: filaDeMusicas nao é uma lista (Array)? Por que esta comparando com 1? talvez voce esteja tentando comparar a `length` da `filaDeMusicas` com o valor numero 1.
- // Reviewer: [...] === Infinity || [...] === -Infinity -> false;
- // Reviewer: if (filaDeMusicas.length) {...}
- if (filaDeMusicas === 1) {
- // Author: acredito que o erro possa estar aqui, toda vez que eu apago esse if e deixo apenas
- // Author: if (Ytdl.validateURL(oQueTocar)){ filaDeMusicas.push(oQueTocar);}
- // Author: ele volta a tocar musica, porém a funções de uma fila de musicas pra vir a seguir não funciona
- tocarMusica(msg);
- }
- } else {
- msg.channel.send("Link inválido");
- }
- try {
- // Author: tenta encontrar música por link
- let video = await youtube.getVideo(oQueTocar);
- msg.channel.send(`O video foi encontrado: ${video.title}`);
- } catch (error) {
- try {
- let videosPesquisados = await youtube.searchVideos(oQueTocar, 5);
- // Reviewer: Use as variaveis no menor `lexical scope` possivel, e tambem, evite `let` quando o valor nao precisa ser alterado. Tenta minimizar as chances de erros, dessa forma voce encontra o bug mais rapido e evita criar `code debt`.
- // let videoEncontrado;
- // Reviewer: Da uma olhada aqui: https://zellwk.com/blog/async-await-in-loops/#:~:text=When%20you%20use%20await%20%2C%20you,is%20what%20you'd%20expect.&text=This%20behaviour%20works%20with%20most,and%20for%2Dof%20loops)%E2%80%A6, eu acho que essa parte esta segura utilizando `for in` mas aconselharia voce a mudar para `for` loops apenas. Pois await/promises em loops é complicado e precisa ter cuidado, principalmente em metodos nativos do Array prototypal object.
- for (i in videosPesquisados) {
- const videoEncontrado = await youtube.getVideoByID(
- videosPesquisados[i].id
- );
- msg.channel.send(videoEncontrado.title);
- }
- msg.channel
- .send({
- embed: {
- color: 3447003,
- description:
- "Você poderia clicar na reação que representa qual musica você gostaria? Assim posso saber exatamente o que você quer ^^ ",
- },
- })
- .then(async (embedMessage) => {
- await embedMessage.react("1️⃣");
- await embedMessage.react("2️⃣");
- await embedMessage.react("3️⃣");
- await embedMessage.react("4️⃣");
- await embedMessage.react("5️⃣");
- // Reviewer: Isso ^ nao é escalavel, e se eu quiser adicionar mais 150? Eu imagino que essa lista vá no maximo de 0~9 mas o principio permanece caso voce queira fazer combinacoes, entao fica de olho!
- // Reviewer: Essa funcao de baixo esta causando uma má interpretacao, para mim quando eu leio `filter` eu imagino uma `Array` com itens filtrados seguindo uma condicao. Mas aqui voce esta retornando um Boolean (true/false);
- const filter = (reaction, user) => (
- ["1️⃣", "2️⃣", "3️⃣", "4️⃣", "5️⃣"].includes(
- reaction.emoji.name
- ) && user.id === msg.author.id
- );
- // Reviewer: O primeiro argumento de createReactionCollector é uma `callback function né? pois é isso o que voce esta passando na linha 124. So para verificar!`
- let collector = embedMessage.createReactionCollector(filter, {
- time: 20000, // Reviewer: 20s é para a mensagem mostrar e logo desaparecer ou ficar fixada em algum local da tela? Se for apenas um highlight, entao 3000 é o suficiente.
- });
- // Reviewer: Se nao esta utilizando um argumento, remova-o. Alem do mais, o seu codigo abaixo é irrelevante dessa forma, aqui, irei alterar para voce.
- collector.on("collect", async reaction => msg.channel.send(`Reagiu com ${reaction.emoji.name}`));
- // if (reaction.emoji.name === "1️⃣") {
- // msg.channel.send("Reagiu com 1️⃣ ");
- // } else if (reaction.emoji.name === "2️⃣") {
- // msg.channel.send("Reagiu com 2️⃣ ");
- // } else if (reaction.emoji.name === "3️⃣") {
- // msg.channel.send("Reagiu com 3️⃣ ");
- // } else if (reaction.emoji.name === "4️⃣") {
- // msg.channel.send("Reagiu com 4️⃣ ");
- // } else if (reaction.emoji.name === "5️⃣") {
- // msg.channel.send("Reagiu com 5️⃣ ");
- // }
- // });
- });
- } catch (error) {
- // Reviewer: É sempre bom voce capturar os erros sempre que conseguir, dessa forma voce passa menos tempo procurando bugs, e mais produzindo coisas incriveis ;)
- console.log(error, "error found.");
- }
- }
- }
- }
- });
- // Reviewer: "msg" aqui é "message"? ou era para ser music? Evite usar abreviacoes quando o termo é pequeno ou no inicio de desenvolvimento do seu codigo.
- // const tocarMusica = (msg) => {
- // connection.play(Ytdl(filaDeMusicas[0])).on("finish", () => {
- // filaDeMusicas.shift();
- // if (filaDeMusicas.length) {
- // tocarMusica(msg);
- // }
- // });
- // }
- app.login(TOKEN_DISCORD);
Advertisement
Add Comment
Please, Sign In to add comment