play.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. const { MessageEmbed } = require("discord.js");
  2. const { TrackUtils, Player } = require("erela.js");
  3. const prettyMilliseconds = require("pretty-ms");
  4. module.exports = {
  5. name: "play",
  6. description: "Play your favorite songs",
  7. usage: "[Song Name|Song URL]",
  8. permissions: {
  9. channel: ["VIEW_CHANNEL", "SEND_MESSAGES", "EMBED_LINKS"],
  10. member: [],
  11. },
  12. aliases: ["p"],
  13. /**
  14. *
  15. * @param {import("../structures/DiscordMusicBot")} client
  16. * @param {import("discord.js").Message} message
  17. * @param {string[]} args
  18. * @param {*} param3
  19. */
  20. run: async (client, message, args, { GuildDB }) => {
  21. if (!message.member.voice.channel) return client.sendTime(message.channel, "❌ | **You must be in a voice channel to play something!**");
  22. //else if(message.guild.me.voice && message.guild.me.voice.channel.id !== message.member.voice.channel.id)return client.sendTime(message.channel, "❌ | **You must be in same voice channel as the bot is in to play something!**");
  23. let SearchString = args.join(" ");
  24. if (!SearchString) return client.sendTime(message.channel, `**Usage - **\`${GuildDB.prefix}play [Song Name|Song URL]\``);
  25. let CheckNode = client.Manager.nodes.get(client.config.Lavalink.id);
  26. let Searching = await message.channel.send(":mag_right: Searching...");
  27. if (!CheckNode || !CheckNode.connected) {
  28. return client.sendTime(message.channel,"❌ | Lavalink node not connected.");
  29. }
  30. const player = client.Manager.create({
  31. guild: message.guild.id,
  32. voiceChannel: message.member.voice.channel.id,
  33. textChannel: message.channel.id,
  34. selfDeafen: false,
  35. });
  36. let SongAddedEmbed = new MessageEmbed().setColor("RANDOM");
  37. if (!player) return client.sendTime(message.channel, "❌ | **Nothing is playing right now...**");
  38. if (player.state != "CONNECTED") await player.connect();
  39. try {
  40. if (SearchString.match(client.Lavasfy.spotifyPattern)) {
  41. await client.Lavasfy.requestToken();
  42. let node = client.Lavasfy.nodes.get(client.config.Lavalink.id);
  43. let Searched = await node.load(SearchString);
  44. if (Searched.loadType === "PLAYLIST_LOADED") {
  45. let songs = [];
  46. for (let i = 0; i < Searched.tracks.length; i++) songs.push(TrackUtils.build(Searched.tracks[i], message.author));
  47. player.queue.add(songs);
  48. if (!player.playing && !player.paused && player.queue.totalSize === Searched.tracks.length) player.play();
  49. SongAddedEmbed.setAuthor(`Playlist added to queue`, message.author.displayAvatarURL());
  50. SongAddedEmbed.addField("Enqueued", `\`${Searched.tracks.length}\` songs`, false);
  51. //SongAddedEmbed.addField("Playlist duration", `\`${prettyMilliseconds(Searched.tracks, { colonNotation: true })}\``, false)
  52. Searching.edit(SongAddedEmbed);
  53. } else if (Searched.loadType.startsWith("TRACK")) {
  54. player.queue.add(TrackUtils.build(Searched.tracks[0], message.author));
  55. if (!player.playing && !player.paused && !player.queue.size) player.play();
  56. SongAddedEmbed.setAuthor(`Added to queue`, client.config.IconURL);
  57. SongAddedEmbed.setDescription(`[${Searched.tracks[0].info.title}](${Searched.tracks[0].info.uri})`);
  58. SongAddedEmbed.addField("Author", Searched.tracks[0].info.author, true);
  59. //SongAddedEmbed.addField("Duration", `\`${prettyMilliseconds(Searched.tracks[0].length, { colonNotation: true })}\``, true);
  60. if (player.queue.totalSize > 1) SongAddedEmbed.addField("Position in queue", `${player.queue.size - 0}`, true);
  61. Searching.edit(SongAddedEmbed);
  62. } else {
  63. return client.sendTime(message.channel, "**No matches found for - **" + SearchString);
  64. }
  65. } else {
  66. let Searched = await player.search(SearchString, message.author);
  67. if (!player) return client.sendTime(message.channel, "❌ | **Nothing is playing right now...**");
  68. if (Searched.loadType === "NO_MATCHES") return client.sendTime(message.channel, "**No matches found for - **" + SearchString);
  69. else if (Searched.loadType == "PLAYLIST_LOADED") {
  70. player.queue.add(Searched.tracks);
  71. if (!player.playing && !player.paused && player.queue.totalSize === Searched.tracks.length) player.play();
  72. SongAddedEmbed.setAuthor(`Playlist added to queue`, client.config.IconURL);
  73. SongAddedEmbed.setThumbnail(Searched.tracks[0].displayThumbnail());
  74. SongAddedEmbed.setDescription(`[${Searched.playlist.name}](${SearchString})`);
  75. SongAddedEmbed.addField("Enqueued", `\`${Searched.tracks.length}\` songs`, false);
  76. SongAddedEmbed.addField("Playlist duration", `\`${prettyMilliseconds(Searched.playlist.duration, { colonNotation: true })}\``, false);
  77. Searching.edit(SongAddedEmbed);
  78. } else {
  79. player.queue.add(Searched.tracks[0]);
  80. if (!player.playing && !player.paused && !player.queue.size) player.play();
  81. SongAddedEmbed.setAuthor(`Added to queue`, client.config.IconURL);
  82. SongAddedEmbed.setThumbnail(Searched.tracks[0].displayThumbnail());
  83. SongAddedEmbed.setDescription(`[${Searched.tracks[0].title}](${Searched.tracks[0].uri})`);
  84. SongAddedEmbed.addField("Author", Searched.tracks[0].author, true);
  85. SongAddedEmbed.addField("Duration", `\`${prettyMilliseconds(Searched.tracks[0].duration, { colonNotation: true })}\``, true);
  86. if (player.queue.totalSize > 1) SongAddedEmbed.addField("Position in queue", `${player.queue.size - 0}`, true);
  87. Searching.edit(SongAddedEmbed);
  88. }
  89. }
  90. } catch (e) {
  91. console.log(e);
  92. return client.sendTime(message.channel, "**No matches found for - **" + SearchString);
  93. }
  94. },
  95. SlashCommand: {
  96. options: [
  97. {
  98. name: "song",
  99. value: "song",
  100. type: 3,
  101. required: true,
  102. description: "Play music in the voice channel",
  103. },
  104. ],
  105. /**
  106. *
  107. * @param {import("../structures/DiscordMusicBot")} client
  108. * @param {import("discord.js").Message} message
  109. * @param {string[]} args
  110. * @param {*} param3
  111. */
  112. run: async (client, interaction, args, { GuildDB }) => {
  113. const guild = client.guilds.cache.get(interaction.guild_id);
  114. const member = guild.members.cache.get(interaction.member.user.id);
  115. const voiceChannel = member.voice.channel;
  116. let awaitchannel = client.channels.cache.get(interaction.channel_id); /// thanks Reyansh for this idea ;-;
  117. if (!member.voice.channel) return client.sendTime(interaction, "❌ | **You must be in a voice channel to use this command.**");
  118. if (guild.me.voice.channel && !guild.me.voice.channel.equals(member.voice.channel)) return client.sendTime(interaction, `❌ | **You must be in ${guild.me.voice.channel} to use this command.**`);
  119. let CheckNode = client.Manager.nodes.get(client.config.Lavalink.id);
  120. if (!CheckNode || !CheckNode.connected) {
  121. return client.sendTime(interaction,"❌ | Lavalink node not connected.");
  122. }
  123. let player = client.Manager.create({
  124. guild: interaction.guild_id,
  125. voiceChannel: voiceChannel.id,
  126. textChannel: interaction.channel_id,
  127. selfDeafen: false,
  128. });
  129. if (player.state != "CONNECTED") await player.connect();
  130. let search = interaction.data.options[0].value;
  131. let res;
  132. if (search.match(client.Lavasfy.spotifyPattern)) {
  133. await client.Lavasfy.requestToken();
  134. let node = client.Lavasfy.nodes.get(client.config.Lavalink.id);
  135. let Searched = await node.load(search);
  136. switch (Searched.loadType) {
  137. case "LOAD_FAILED":
  138. if (!player.queue.current) player.destroy();
  139. return interaction.send(`There was an error while searching`);
  140. case "NO_MATCHES":
  141. if (!player.queue.current) player.destroy();
  142. return interaction.send("No results were found.");
  143. case "TRACK_LOADED":
  144. player.queue.add(TrackUtils.build(Searched.tracks[0], member.user));
  145. if (!player.playing && !player.paused && !player.queue.length) player.play();
  146. return interaction.send(`**Searched Track** \`${Searched.tracks[0].info.title}\`.`);
  147. case "SEARCH_RESULT":
  148. player.queue.add(TrackUtils.build(Searched.tracks[0], member.user));
  149. if (!player.playing && !player.paused && !player.queue.length) player.play();
  150. return interaction.send(`**Searched Track** \`${Searched.tracks[0].info.title}\`.`);
  151. case "PLAYLIST_LOADED":
  152. let songs = [];
  153. for (let i = 0; i < Searched.tracks.length; i++) songs.push(TrackUtils.build(Searched.tracks[i], member.user));
  154. player.queue.add(songs);
  155. if (!player.playing && !player.paused && player.queue.totalSize === Searched.tracks.length) player.play();
  156. return interaction.send(`**Searched playlist**: \n **${Searched.tracks[0].info.title}** : **${Searched.tracks.length} tracks**`);
  157. }
  158. } else {
  159. try {
  160. res = await player.search(search, member.user);
  161. if (res.loadType === "LOAD_FAILED") {
  162. if (!player.queue.current) player.destroy();
  163. throw new Error(res.exception.message);
  164. }
  165. } catch (err) {
  166. return interaction.send(`There was an error while searching: ${err.message}`);
  167. }
  168. switch (res.loadType) {
  169. case "NO_MATCHES":
  170. if (!player.queue.current) player.destroy();
  171. return interaction.send("No results were found.");
  172. case "TRACK_LOADED":
  173. player.queue.add(res.tracks[0]);
  174. if (!player.playing && !player.paused && !player.queue.length) player.play();
  175. return client.sendTime(interaction, `**Added to queue** \n[${res.tracks[0].title}](${res.tracks[0].uri})`);
  176. case "PLAYLIST_LOADED":
  177. player.queue.add(res.tracks);
  178. if (!player.playing && !player.paused && player.queue.size === res.tracks.length) player.play();
  179. return client.sendTime(interaction, `**Searched playlist**: \n **${res.playlist.name}** : **${res.tracks.length} tracks**`);
  180. case "SEARCH_RESULT":
  181. const track = res.tracks[0];
  182. player.queue.add(track);
  183. if (!player.playing && !player.paused && !player.queue.length) {
  184. client.sendTime(interaction, `**Added to queue** [${res.tracks[0].title}](${res.tracks[0].uri})`);
  185. player.play();
  186. } else {
  187. let SongAddedEmbed = new MessageEmbed();
  188. SongAddedEmbed.setAuthor(`Added to queue`, client.config.IconURL);
  189. SongAddedEmbed.setThumbnail(track.displayThumbnail());
  190. SongAddedEmbed.setColor("RANDOM");
  191. SongAddedEmbed.setDescription(`[${track.title}](${track.uri})`);
  192. SongAddedEmbed.addField("Author", track.author, true);
  193. SongAddedEmbed.addField("Duration", `\`${prettyMilliseconds(track.duration, { colonNotation: true })}\``, true);
  194. if (player.queue.totalSize > 1) SongAddedEmbed.addField("Position in queue", `${player.queue.size - 0}`, true);
  195. interaction.send(SongAddedEmbed);
  196. }
  197. }
  198. }
  199. },
  200. },
  201. };