Elifaz

Untitled

Aug 25th, 2020
541
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. const Discord = require("discord.js");
  2. const Youtube = require("simple-youtube-api");
  3. const Ytdl = require("ytdl-core");
  4. const { TOKEN_DISCORD, GOOGLE_KEY } = require("./config.js");
  5. const youtube = new Youtube(GOOGLE_KEY);
  6. const app = new Discord.Client();
  7.  
  8. // Reviewer: Nao entendi o por que voce criou esse prefixo.
  9. // const prefixoComando = "!";
  10. const filaDeMusicas = [];
  11. let estouPronto = false;
  12.  
  13. // HANDLERS
  14. // 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`
  15. const handleJoin = (msg) => {
  16.  if (msg.member.voice.channel) {
  17.       connection = await msg.member.voice.channel.join();
  18.       estouPronto = true;
  19.     } else {
  20.       msg.channel.send("Pra nós ficarmos juntos em call você precisa entrar em um canal de voz");
  21.     }
  22.   return;
  23. };
  24.  
  25. const handleLeave = (msg) => {
  26. // 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`
  27.  if (msg.member.voice.channel) {
  28.       msg.member.voice.channel.leave();
  29.       estouPronto = false;
  30.       msg.channel.send("Caso precise de mais algo basta me chamar e eu venho na hora:");
  31.   } else {
  32.     msg.channel.send("Você precisa estar conectado a um Canal de Voz");
  33.   }
  34.   return;
  35. }
  36.  
  37.  
  38.  
  39. // 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!
  40. // 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.
  41. const tocarMusica = (song) => {
  42.   connection.play(Ytdl(filaDeMusicas[0])).on("finish", () => {
  43.     filaDeMusicas.shift();
  44.  
  45.     if (filaDeMusicas.length) {
  46.       tocarMusica(song);
  47.     }
  48.   });
  49. }
  50.  
  51.  
  52.  
  53. // EVENTS
  54. app.on("ready", () => {
  55.   console.log("Estou conectado!");
  56. });
  57.  
  58. app.on("message", async (msg) => {
  59.   if (msg.content === "!join") {
  60.     handleJoin(msg);
  61.   } else if (msg.content === "!leave") {
  62.     handleLeave(msg);
  63.   } else if (msg.content.startsWith("!play")) {
  64.     // 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.
  65.  
  66.     // Author: !play [link] = Bot toca músicas
  67.     if (estouPronto) {
  68.       // Reviewer: Tenta rastrear quando o `estouPronto` é alterado.
  69.       // Reviewer: O que acontece com `content` aqui?
  70.       const oQueTocar = msg.content.replace("!play", "");
  71.       // oQueTocar é uma url? por que voce precisa de remover o `!play` da url?
  72.       if (Ytdl.validateURL(oQueTocar)) {
  73.         filaDeMusicas.push(oQueTocar);
  74.         // 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.
  75.         // Reviewer: [...] === Infinity ||  [...] === -Infinity -> false;
  76.         // Reviewer: if (filaDeMusicas.length) {...}
  77.         if (filaDeMusicas === 1) {
  78.           // Author: acredito que o erro possa estar aqui, toda vez que eu apago esse if e deixo apenas
  79.           // Author: if (Ytdl.validateURL(oQueTocar)){ filaDeMusicas.push(oQueTocar);}
  80.           // Author: ele volta a tocar musica, porém a funções de uma fila de musicas pra vir a seguir não funciona
  81.           tocarMusica(msg);
  82.         }
  83.       } else {
  84.         msg.channel.send("Link inválido");
  85.       }
  86.  
  87.       try {
  88.         // Author: tenta encontrar música por link
  89.         let video = await youtube.getVideo(oQueTocar);
  90.         msg.channel.send(`O video foi encontrado: ${video.title}`);
  91.       } catch (error) {
  92.         try {
  93.           let videosPesquisados = await youtube.searchVideos(oQueTocar, 5);
  94.           // 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`.
  95.           // let videoEncontrado;
  96.  
  97.  
  98.           // 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.
  99.           for (i in videosPesquisados) {
  100.             const videoEncontrado = await youtube.getVideoByID(
  101.               videosPesquisados[i].id
  102.             );
  103.             msg.channel.send(videoEncontrado.title);
  104.           }
  105.  
  106.           msg.channel
  107.             .send({
  108.               embed: {
  109.                 color: 3447003,
  110.                 description:
  111.                   "Você poderia clicar na reação que representa qual musica você gostaria? Assim posso saber exatamente o que você quer ^^ ",
  112.               },
  113.             })
  114.             .then(async (embedMessage) => {
  115.               await embedMessage.react("1️⃣");
  116.               await embedMessage.react("2️⃣");
  117.               await embedMessage.react("3️⃣");
  118.               await embedMessage.react("4️⃣");
  119.               await embedMessage.react("5️⃣");
  120.               // 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!
  121.               // 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);
  122.               const filter = (reaction, user) => (
  123.                 ["1️⃣", "2️⃣", "3️⃣", "4️⃣", "5️⃣"].includes(
  124.                   reaction.emoji.name
  125.                 ) && user.id === msg.author.id
  126.               );
  127.              
  128.               // Reviewer: O primeiro argumento de createReactionCollector é uma `callback function né? pois é isso o que voce esta passando na linha 124. So para verificar!`
  129.               let collector = embedMessage.createReactionCollector(filter, {
  130.                 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.
  131.               });
  132.              
  133.               // Reviewer: Se nao esta utilizando um argumento, remova-o. Alem do mais, o seu codigo abaixo é irrelevante dessa forma, aqui, irei alterar para voce.
  134.               collector.on("collect", async reaction => msg.channel.send(`Reagiu com ${reaction.emoji.name}`));
  135.  
  136.                 // if (reaction.emoji.name === "1️⃣") {
  137.                 //   msg.channel.send("Reagiu com 1️⃣ ");
  138.                 // } else if (reaction.emoji.name === "2️⃣") {
  139.                 //   msg.channel.send("Reagiu com 2️⃣ ");
  140.                 // } else if (reaction.emoji.name === "3️⃣") {
  141.                 //   msg.channel.send("Reagiu com 3️⃣ ");
  142.                 // } else if (reaction.emoji.name === "4️⃣") {
  143.                 //   msg.channel.send("Reagiu com 4️⃣ ");
  144.                 // } else if (reaction.emoji.name === "5️⃣") {
  145.                 //   msg.channel.send("Reagiu com 5️⃣ ");
  146.                 // }
  147.               // });
  148.             });
  149.         } catch (error) {
  150.           // Reviewer: É sempre bom voce capturar os erros sempre que conseguir, dessa forma voce passa menos tempo procurando bugs, e mais produzindo coisas incriveis ;)
  151.           console.log(error, "error found.");
  152.         }
  153.       }
  154.     }
  155.   }
  156. });
  157.  
  158.  
  159. // Reviewer: "msg" aqui é "message"? ou era para ser music? Evite usar abreviacoes quando o termo é pequeno ou no inicio de desenvolvimento do seu codigo.
  160. // const tocarMusica = (msg) => {
  161. //   connection.play(Ytdl(filaDeMusicas[0])).on("finish", () => {
  162. //     filaDeMusicas.shift();
  163.  
  164. //     if (filaDeMusicas.length) {
  165. //       tocarMusica(msg);
  166. //     }
  167. //   });
  168. // }
  169.  
  170. app.login(TOKEN_DISCORD);
Advertisement
Add Comment
Please, Sign In to add comment