diff --git a/package.json b/package.json index 511b18ee..f713a41d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "musix", - "version": "3.6.2", + "version": "3.7.0", "description": "V3 for Musix the discord music bot", "main": "./index.js", "scripts": { @@ -48,4 +48,4 @@ "ytsr": "^0.1.15", "zlib-sync": "^0.1.6" } -} +} \ No newline at end of file diff --git a/src/commands/play.js b/src/commands/play.js index b576a799..a0738c97 100644 --- a/src/commands/play.js +++ b/src/commands/play.js @@ -2,7 +2,6 @@ const YouTube = require("simple-youtube-api"); const SpotifyApi = require("spotify-web-api-node"); const ytdl = require("ytdl-core"); const ytsr = require("ytsr"); -const ms = require("ms"); module.exports = { name: "play", @@ -46,16 +45,39 @@ module.exports = { if (ytdl.validateURL(url)) { client.funcs.handleVideo(url, msg, voiceChannel, client, false, "ytdl"); } else if (url.match(/^https?:\/\/(open.spotify.com|spotify.com)(.*)$/)) { - const playlistId = url.split("/playlist/")[1].split("?")[0]; - spotify.getPlaylist(playlistId).then( - async function (data) { - searchVideos(data, client, msg, voiceChannel); - }, - function (err) { - console.log(err); - msg.channel.send(client.messages.noResultsSpotify); - } - ); + if (url.includes("playlist")) { + const playlistId = url.split("/playlist/")[1].split("?")[0]; + spotify.getPlaylist(playlistId).then( + async function (data) { + searchPlaylist(data, client, msg, voiceChannel); + }, + function (err) { + console.log(err); + msg.channel.send(client.messages.noResultsSpotify); + } + ); + } else if (url.includes("album")) { + const albumId = url.split("/album/")[1].split("?")[0]; + spotify.getAlbumTracks(albumId) + .then( + async function (data) { + searchAlbum(data, client, msg, voiceChannel); + }, + function (err) { + console.log(err); + msg.channel.send(client.messages.noResultsSpotify); + } + ); + } else if (url.includes("track")) { + return msg.channel.send(client.messages.disabledSpotifySongs); + /*const trackId = url.split("/track/")[1].split("?")[0]; + spotify.searchTracks(trackId) + .then(function (data) { + console.log(data.body) + }, function (err) { + console.log('Something went wrong!', err); + });*/ + } else msg.channel.send(client.messages.invalidSpotifyUrl) } else if ( url.match(/^https?:\/\/(www.youtube.com|youtube.com)\/playlist(.*)$/) ) { @@ -64,14 +86,21 @@ module.exports = { const videos = await playlist.getVideos(); for (const video of Object.values(videos)) { const video2 = await youtube.getVideoByID(video.id); - await client.funcs.handleVideo( - video2.url, - msg, - voiceChannel, - client, - true, - "ytdl" - ); + spotify.searchTracks(`track:${video2.name}`) + .then(function (data) { + client.funcs.handleVideo( + video2.url, + msg, + voiceChannel, + client, + true, + "ytdl", + data.body.tracks.items[0] + ); + }, function (err) { + console.log('Something went wrong!', err); + }); + } const message = client.messages.playlistAdded.replace( "%TITLE%", @@ -87,21 +116,27 @@ module.exports = { if (err) console.log(err); if (!res.items[0]) return msg.channel.send(client.messages.noResults); const videoResults = res.items.filter(item => item.type === "video"); - client.funcs.handleVideo( - videoResults[0].link, - msg, - voiceChannel, - client, - false, - "ytdl" - ); + spotify.searchTracks(`track:${searchString}`) + .then(function (data) { + client.funcs.handleVideo( + videoResults[0].link, + msg, + voiceChannel, + client, + false, + "ytdl", + data.body.tracks.items[0] + ); + }, function (err) { + console.log('Something went wrong!', err); + }); } ); } }, }; -async function searchVideos(data, client, msg, voiceChannel) { +async function searchPlaylist(data, client, msg, voiceChannel) { const lmsg = await msg.channel.send(client.messages.loadingSongs); let failed = 0; for (let i = 0; data.body.tracks.items.length > i; i++) { @@ -137,7 +172,8 @@ async function searchVideos(data, client, msg, voiceChannel) { voiceChannel, client, false, - "ytdl" + "spotify", + track ); } ); @@ -150,7 +186,8 @@ async function searchVideos(data, client, msg, voiceChannel) { voiceChannel, client, true, - "ytdl" + "spotify", + track ); } ); @@ -164,7 +201,174 @@ async function searchVideos(data, client, msg, voiceChannel) { voiceChannel, client, true, - "ytdl" + "spotify", + track + ); + } + ); + } + let message; + if (failed === 0) { + message = client.messages.playlistAdded.replace("%TITLE%", data.body.name); + } else { + message = `${client.messages.playlistAdded.replace( + "%TITLE%", + data.body.name + )}\n${client.messages.failedToLoad + failed}`; + } + lmsg.edit(message); +} + +async function searchAlbum(data, client, msg, voiceChannel) { + const lmsg = await msg.channel.send(client.messages.loadingSongs); + let failed = 0; + for (let i = 0; data.body.items.length > i; i++) { + const track = await data.body.items[i]; + await client.funcs.sleep(250); + ytsr( + `${track.artists[0].name} ${track.name} audio`, { + limit: 5, + }, + async function (err, res) { + if (err) return console.log(err); + if (!res.items[0]) { + ytsr( + `${track.artists[0].name} ${track.name} lyrics`, { + limit: 5, + }, + async function (err, res) { + if (err) return console.log(err); + if (!res.items[0]) { + ytsr( + `${track.artists[0].name} ${track.name}`, { + limit: 5, + }, + async function (err, res) { + if (err) console.log(err); + if (!res.items[0]) { + failed++; + } + const videoResults = res.items.filter(item => item.type === "video"); + client.funcs.handleVideo( + videoResults[0].link, + msg, + voiceChannel, + client, + false, + "spotify", + track + ); + } + ); + return; + } + const videoResults = res.items.filter(item => item.type === "video"); + await client.funcs.handleVideo( + videoResults[0].link, + msg, + voiceChannel, + client, + true, + "spotify", + track + ); + } + ); + failed++; + return; + } + const videoResults = res.items.filter(item => item.type === "video"); + await client.funcs.handleVideo( + videoResults[0].link, + msg, + voiceChannel, + client, + true, + "spotify", + track + ); + } + ); + } + let message; + if (failed === 0) { + message = client.messages.albumAdded.replace("%TITLE%", "yes taht palylist"); + } else { + message = `${client.messages.albumAdded.replace( + "%TITLE%", + "yes taht palylist" + )}\n${client.messages.failedToLoad + failed}`; + } + lmsg.edit(message); +} + +async function searchSong(data, client, msg, voiceChannel) { + const lmsg = await msg.channel.send(client.messages.loadingSongs); + let failed = 0; + for (let i = 0; data.body.tracks.items.length > i; i++) { + const track = await data.body.tracks.items[i].track; + await client.funcs.sleep(250); + ytsr( + `${track.artists[0].name} ${track.name} audio`, { + limit: 5, + }, + async function (err, res) { + if (err) return console.log(err); + if (!res.items[0]) { + ytsr( + `${track.artists[0].name} ${track.name} lyrics`, { + limit: 5, + }, + async function (err, res) { + if (err) return console.log(err); + if (!res.items[0]) { + ytsr( + `${track.artists[0].name} ${track.name}`, { + limit: 5, + }, + async function (err, res) { + if (err) console.log(err); + if (!res.items[0]) { + failed++; + } + const videoResults = res.items.filter(item => item.type === "video"); + client.funcs.handleVideo( + videoResults[0].link, + msg, + voiceChannel, + client, + false, + "spotify", + track + ); + } + ); + return; + } + const videoResults = res.items.filter(item => item.type === "video"); + await client.funcs.handleVideo( + videoResults[0].link, + msg, + voiceChannel, + client, + true, + "spotify", + track + ); + } + ); + failed++; + return; + } + const videoResults = res.items.filter(item => item.type === "video"); + await client.funcs.handleVideo( + videoResults[0].link, + msg, + voiceChannel, + client, + true, + "spotify", + track ); } ); diff --git a/src/commands/search.js b/src/commands/search.js index b14f01d4..a8a2c6fa 100644 --- a/src/commands/search.js +++ b/src/commands/search.js @@ -1,4 +1,5 @@ const ytsr = require('ytsr'); +const SpotifyApi = require("spotify-web-api-node"); const he = require('he'); module.exports = { @@ -10,6 +11,12 @@ module.exports = { permission: 'none', category: 'music', async execute(msg, args, client, Discord, command) { + const spotify = new SpotifyApi({ + id: client.config.spotify_client_id, + secret: client.config.spotify_client_secret, + }); + spotify.setAccessToken(client.config.spotify_access_key); + const searchString = args.slice(1).join(" "); const queue = client.queue.get(msg.guild.id); const voiceChannel = msg.member.voice.channel; @@ -47,6 +54,20 @@ module.exports = { return msg.channel.send(client.messages.cancellingVideoSelection); } const videoIndex = parseInt(response.first().content) - 1; + spotify.searchTracks(`track:${videos[videoIndex].title}`) + .then(function (data) { + client.funcs.handleVideo( + videoResults[0].link, + msg, + voiceChannel, + client, + false, + "ytdl", + data.body.tracks.items[0] + ); + }, function (err) { + console.log('Something went wrong!', err); + }); return client.funcs.handleVideo(videos[videoIndex].link, msg, voiceChannel, client, false, "ytdl"); }) } diff --git a/src/commands/searchSimilar.js b/src/commands/searchSimilar.js deleted file mode 100644 index e3074e1d..00000000 --- a/src/commands/searchSimilar.js +++ /dev/null @@ -1,64 +0,0 @@ -const similarSongs = require("similar-songs"); - -module.exports = { - name: "searchsimilar", - alias: ["none"], - usage: ", ", - description: "a command to search similar songs (in developement)", - onlyDev: false, - permission: "none", - category: "music", - async execute(msg, args, client, Discord, command) { - const searchString = args.slice(1).join(" "); - const query = searchString.split(","); - const queue = client.queue.get(msg.guild.id); - const voiceChannel = msg.member.voice.channel; - if ( - client.global.db.guilds[msg.guild.id].blacklist.includes( - msg.member.voice.channelID - ) - ) - return msg.channel.send(client.messages.blackListedVC); - if (!queue) { - if (!msg.member.voice.channel) - return msg.channel.send(client.messages.noVoiceChannel); - } else { - if (voiceChannel !== queue.voiceChannel) - return msg.channel.send(client.messages.wrongVoiceChannel); - } - if (!query[0] || !query[1]) { - const message = client.messages.searchSimilarUsage.replace("%USAGE%", command.usage); - return msg.channel.send(message); - - } - if (voiceChannel.full) return msg.channel.send(client.messages.channelFull); - if (!voiceChannel.joinable) - return msg.channel.send(client.messages.noPermsConnect); - if (!voiceChannel.speakable) - return msg.channel.send(client.messages.noPermsSpeak); - similarSongs.find({ - title: query[0], - artist: query[1].slice(1), - limit: 10, - lastfmAPIKey: client.config.lastfm_api_key, - lastfmAPISecret: client.config.lastfm_secret, - youtubeAPIKey: client.config.api_key, - }, - async function (err, songs) { - if (err) return msg.channel.send(err.message); - if (songs.length !== 0) { - const lmsg = await msg.channel.send(client.messages.loadingSongs); - for (let i = 0; i < songs.length; i++) { - client.funcs.handleVideo( - `https://www.youtube.com/watch?v=${songs[i].youtubeId}`, msg, voiceChannel, client, true, "ytdl"); - } - const message = client.messages.songsAdded.replace( - "%AMOUNT%", - songs.length - ); - return lmsg.edit(message); - } else return msg.channel.send(client.messages.noSimilarResults); - } - ); - }, -}; \ No newline at end of file diff --git a/src/commands/settings.js b/src/commands/settings.js index 2e71e095..aad7dbd0 100644 --- a/src/commands/settings.js +++ b/src/commands/settings.js @@ -48,6 +48,12 @@ module.exports = { client.messages.settingsBassDesc, true ) + .addField( + client.messages.settingsAutoPlay, + client.messages.settingsAutoPlayDesc, + true + ) + .addField() .setFooter(footer) .setAuthor(client.user.username, client.user.displayAvatarURL) .setColor(client.config.embedColor); diff --git a/src/commands/settings/announcesongs.js b/src/commands/settings/announcesongs.js index 5af56ad6..b54eb0b6 100644 --- a/src/commands/settings/announcesongs.js +++ b/src/commands/settings/announcesongs.js @@ -1,11 +1,11 @@ module.exports = { name: 'announcesongs', async execute(msg, args, client) { - if (!args[2]) return msg.channel.send(`${client.messages.announceSongs} \`${client.global.db.guilds[msg.guild.id].permissions}\``); + if (!args[2]) return msg.channel.send(`${client.messages.announceSongs} \`${client.global.db.guilds[msg.guild.id].announceSongs}\``); if (args[2] === 'true') { if (!client.global.db.guilds[msg.guild.id].announceSongs) { client.global.db.guilds[msg.guild.id].announceSongs = true; - msg.channel.send(client.messages.permissionsSetTrue); + msg.channel.send(client.messages.announceSongsTrue); } else return msg.channel.send(client.messages.announceSongsTrue); } else if (args[2] === 'false') { if (client.global.db.guilds[msg.guild.id].announceSongs) { diff --git a/src/commands/settings/autoPlay.js b/src/commands/settings/autoPlay.js new file mode 100644 index 00000000..3820895f --- /dev/null +++ b/src/commands/settings/autoPlay.js @@ -0,0 +1,17 @@ +module.exports = { + name: 'autoplay', + async execute(msg, args, client) { + if (!args[2]) return msg.channel.send(`${client.messages.autoPlay} \`${client.global.db.guilds[msg.guild.id].autoPlay}\``); + if (args[2] === 'true') { + if (!client.global.db.guilds[msg.guild.id].autoPlay) { + client.global.db.guilds[msg.guild.id].autoPlay = true; + msg.channel.send(client.messages.autoPlayTrue); + } else return msg.channel.send(client.messages.autoPlayTrue); + } else if (args[2] === 'false') { + if (client.global.db.guilds[msg.guild.id].autoPlay) { + client.global.db.guilds[msg.guild.id].autoPlay = false; + msg.channel.send(client.messages.autoPlayFalse); + } else return msg.channel.send(client.messages.autoPlayFalse); + } else return msg.channel.send(client.messages.boolean); + } +}; \ No newline at end of file diff --git a/src/commands/settings/reset.js b/src/commands/settings/reset.js index 538539f6..2dcb43af 100644 --- a/src/commands/settings/reset.js +++ b/src/commands/settings/reset.js @@ -1,13 +1,17 @@ module.exports = { name: 'reset', async execute(msg, args, client) { - client.global.db.guilds[msg.guild.id] = { + client.global.db.guilds[guild.id] = { prefix: client.config.prefix, - defaultVolume: 5, - permissions: false, + defaultVolume: client.config.defaultVolume, + permissions: client.config.permissions, + dj: client.config.dj, + djrole: client.config.djrole, + startPlaying: client.config.startPlaying, + bass: client.config.bass, + blacklist: [], premium: false, - dj: false, - djrole: null + playSimilar: client.config.playSimilar, }; msg.channel.send(client.messages.reset); } diff --git a/src/commands/skipto.js b/src/commands/skipto.js index 5e9834fb..26634870 100644 --- a/src/commands/skipto.js +++ b/src/commands/skipto.js @@ -16,12 +16,13 @@ module.exports = { let point = parseInt(args[1]); point = point - 1; if (isNaN(point)) return msg.channel.send(client.messages.validNumber); - if (point > queue.songs.size) + if (point > queue.songs.length - 1) return msg.channel.send(client.messages.noSongs); if (point < 0) return msg.channel.send(client.messages.cantSkipToCurrent); for (let i = 0; i < point; i++) { queue.prevSongs.push(queue.songs.shift()); } + msg.channel.send(client.messages.skipped); queue.endReason = "skipto"; queue.time = 0; queue.connection.dispatcher.end(); diff --git a/src/events/clientEvents/guildCreate.js b/src/events/clientEvents/guildCreate.js index 1e1b9bbe..f7efaaf8 100644 --- a/src/events/clientEvents/guildCreate.js +++ b/src/events/clientEvents/guildCreate.js @@ -11,6 +11,7 @@ module.exports = { bass: client.config.bass, blacklist: [], premium: false, + playSimilar: client.config.playSimilar, }); client.global.db.guilds[guild.id] = { prefix: client.config.prefix, @@ -22,6 +23,7 @@ module.exports = { bass: client.config.bass, blacklist: [], premium: false, + playSimilar: client.config.playSimilar, }; }, -}; +}; \ No newline at end of file diff --git a/src/events/clientEvents/ready.js b/src/events/clientEvents/ready.js index 82487f1c..205dc107 100644 --- a/src/events/clientEvents/ready.js +++ b/src/events/clientEvents/ready.js @@ -21,6 +21,7 @@ module.exports = { bass: client.config.bass, blacklist: [], premium: true, + playSimilar: client.config.playSimilar, }; }); } diff --git a/src/events/dispatcherEvents/finish.js b/src/events/dispatcherEvents/finish.js index cfe8896c..cab13a46 100644 --- a/src/events/dispatcherEvents/finish.js +++ b/src/events/dispatcherEvents/finish.js @@ -1,3 +1,7 @@ +const similarSongs = require("similar-songs"); +const ytdl = require("ytdl-core"); +const Discord = require("discord.js"); + module.exports = { async execute(client, guild) { const queue = client.queue.get(guild.id); @@ -17,8 +21,50 @@ module.exports = { if (queue.endReason !== "replay") { if (queue.endReason === "previous") queue.songs.unshift(queue.prevSongs.pop()) if (queue.endReason !== "previous") queue.prevSongs.push(queue.songs.shift()); + if (client.global.db.guilds[guild.id].playSimilar && !queue.songs[0] && queue.endReason !== "stop") { + const prevSongs = queue.prevSongs.filter(song => song.type == "spotify"); + if (prevSongs.length >= 0) return findSimilar(client, queue, prevSongs, guild); + } } } client.funcs.play(guild, queue.songs[0], client, 0, true); }, -}; \ No newline at end of file +}; + +function findSimilar(client, queue, prevSongs, guild) { + let retries = 0; + const query = prevSongs[Math.floor(Math.random() * Math.floor(prevSongs.length))]; + if (!query) return client.funcs.play(guild, queue.songs[0], client, 0, true); + similarSongs.find({ + title: query.track.name, + artist: query.track.artists[0].name, + limit: 10, + lastfmAPIKey: client.config.lastfm_api_key, + lastfmAPISecret: client.config.lastfm_secret, + youtubeAPIKey: client.config.api_key, + }, + async function (err, songs) { + if (err) return queue.textChannel.send(err.message); + if (songs[0]) { + const random = Math.floor(Math.random() * Math.floor(songs.length)) + const songInfo = await ytdl.getInfo(`https://www.youtube.com/watch?v=${songs[random].youtubeId}`); + queue.songs.push({ + title: Discord.Util.escapeMarkdown(songInfo.videoDetails.title), + url: `https://www.youtube.com/watch?v=${songs[random].youtubeId}`, + author: {}, + type: "ytdl", + info: songInfo.videoDetails + }); + client.funcs.play(guild, queue.songs[0], client, 0, true); + } else { + if (prevSongs.length > 4 && retries < 6) { + findSimilar(client, queue, prevSongs, guild); + retries++; + return; + } + queue.textChannel.send(client.messages.noSimilarResults); + client.funcs.play(guild, queue.songs[0], client, 0, true); + } + } + ); +} \ No newline at end of file diff --git a/src/struct/config/config.js b/src/struct/config/config.js index e2d1e733..82b4d150 100644 --- a/src/struct/config/config.js +++ b/src/struct/config/config.js @@ -22,7 +22,8 @@ module.exports = { secondary_test_channel: "570531724002328577", devId: "360363051792203779", embedColor: "#b50002", - invite: "https://discordapp.com/oauth2/authorize?client_id=607266889537945605&permissions=3427328&scope=bot", + invite: + "https://discordapp.com/oauth2/authorize?client_id=607266889537945605&permissions=3427328&scope=bot", supportServer: "https://discord.gg/rvHuJtB", devMode: false, api: false, @@ -40,6 +41,7 @@ module.exports = { djrole: null, startPlaying: true, bass: 1, + playSimilar: false, }; module.exports.streamConfig = { @@ -48,8 +50,8 @@ module.exports.streamConfig = { highWaterMark: 1 << 25, volume: false, requestOptions: { - maxRedirects: 4 - } + maxRedirects: 4, + }, }, options: { seek: null, @@ -57,7 +59,7 @@ module.exports.streamConfig = { volume: 1, type: "converted", }, -} +}; module.exports.queueConfig = { textChannel: null, @@ -76,7 +78,7 @@ module.exports.queueConfig = { votesNeeded: null, time: 0, endReason: null, -} +}; module.exports.emojis = { garbage: "🗑️ ", @@ -98,4 +100,4 @@ module.exports.emojis = { stop: "<:stop:674685626108477519> ", stopWatch: ":stopwatch: ", volumeHigh: "<:volumehigh:674685637626167307> ", -} \ No newline at end of file +}; diff --git a/src/struct/config/messages.js b/src/struct/config/messages.js index 40e8fbce..f8723b80 100644 --- a/src/struct/config/messages.js +++ b/src/struct/config/messages.js @@ -4,11 +4,16 @@ const { module.exports = { emojis: emojis, + albumAdded: emojis.green_check_mark + + "Album: **%TITLE%** has been added to the queue!", alreadyPaused: emojis.redx + "The music is already paused!", alreadyVoted: emojis.redx + "You have already voted to skip!", announceSongs: emojis.megaPhone + "Current setting:", announceSongsFalse: emojis.green_check_mark + "announcesongs now set to `false`!", announceSongsTrue: emojis.green_check_mark + "announcesongs now set to `true`!", + autoPlay: "Current setting:", + autoPlayFalse: emojis.green_check_mark + "autoplay now set to `false`!", + autoPlayTrue: emojis.green_check_mark + "autoplay now set to `true`!", bassApplied: emojis.volumeHigh + "The bass level **%BASS%** has been applied!", bassFalse: emojis.green_check_mark + "Bass is now false!", bassLevel: emojis.green_check_mark + "Bass level is now", @@ -41,6 +46,7 @@ module.exports = { defaultVolumeSet: emojis.green_check_mark + "Default volume set to:", devMode: emojis.redx + "Dev mode has been turned on! Commands are only available to developer(s)!", + disabledSpotifySongs: emojis.redx + "Spotify songs cannot be played currently!", disableNigthCore: emojis.redx + "Please disable nigthCore in order to use this command!", dispatcherError: "Error with the dispatcher: ", djFalse: emojis.green_check_mark + "`DJ` now set to `false`", @@ -62,6 +68,7 @@ module.exports = { helpTitle: "help", idOrMentionChannel: emojis.redx + "Please provide a channel id or mention a channel!", invalidGuild: emojis.redx + "Invalid guild id!", + invalidSpotifyUrl: emojis.redx + "That url cannot be played! If you believe this is a mistake please contact support!", inviteTitle: "Invite Musix to your Discord server!", joined: emojis.green_check_mark + "Joined", joinSupport: "Join the musix support server: ", @@ -152,6 +159,8 @@ module.exports = { "The lenght of this song is %LENGTH% seconds! You can't seek further than that!", settingsAnnounceSongs: "announcesongs", settingsAnnounceSongsDesc: "Whether to announce songs that start playing or not.", + settingsAutoPlay: "autoplay", + settingsAutoPlayDesc: "When the queue ends similar songs will be played.", settingsBass: "bass", settingsBassDesc: "Change the default bass level.", settingsBlacklist: "blacklist", @@ -185,4 +194,4 @@ module.exports = { validNumber: emojis.redx + "I'm sorry, But you need to enter a valid __number__.", wrongVoiceChannel: emojis.redx + "I'm sorry but you need to be in the same voice channel as Musix to use this command!", -}; +}; \ No newline at end of file diff --git a/src/struct/funcs/checkDB.js b/src/struct/funcs/checkDB.js index 1b4a0dfe..fa806c77 100644 --- a/src/struct/funcs/checkDB.js +++ b/src/struct/funcs/checkDB.js @@ -11,6 +11,7 @@ module.exports = async function (client) { bass: client.config.bass, blacklist: [], premium: false, + playSimilar: client.config.playSimilar, }); client.global.db.guilds[guild.id] = { prefix: client.config.prefix, @@ -22,28 +23,30 @@ module.exports = async function (client) { bass: client.config.bass, blacklist: [], premium: false, + playSimilar: client.config.playSimilar, }; return; } - if (client.global.db.guilds[guild.id].prefix === undefined) + if (!client.global.db.guilds[guild.id].prefix) client.global.db.guilds[guild.id].prefix = client.config.prefix; - if (client.global.db.guilds[guild.id].defaultVolume === undefined) + if (!client.global.db.guilds[guild.id].defaultVolume) client.global.db.guilds[guild.id].defaultVolume = client.config.defaultVolume; - if (client.global.db.guilds[guild.id].permissions === undefined) + if (!client.global.db.guilds[guild.id].permissions) client.global.db.guilds[guild.id].permissions = client.config.permissions; - if (client.global.db.guilds[guild.id].dj === undefined) + if (!client.global.db.guilds[guild.id].dj) client.global.db.guilds[guild.id].dj = client.config.dj; - if (client.global.db.guilds[guild.id].djrole === undefined) + if (!client.global.db.guilds[guild.id].djrole) client.global.db.guilds[guild.id].djrole = client.config.djrole; - if (client.global.db.guilds[guild.id].startPlaying === undefined) + if (!client.global.db.guilds[guild.id].startPlaying) client.global.db.guilds[guild.id].startPlaying = client.config.startPlaying; - if (client.global.db.guilds[guild.id].bass === undefined) + if (!client.global.db.guilds[guild.id].bass) client.global.db.guilds[guild.id].bass = client.config.bass; - if (client.global.db.guilds[guild.id].blacklsit === undefined) + if (!client.global.db.guilds[guild.id].blacklsit) client.global.db.guilds[guild.id].blacklist = []; - if (client.global.db.guilds[guild.id].premium === undefined) + if (!client.global.db.guilds[guild.id].premium) client.global.db.guilds[guild.id].premium = false; + if (!client.global.db.guilds[guild.id].playSimilar) client.global.db.guilds[guild.id].playSimilar = client.config.playSimilar }); }; \ No newline at end of file diff --git a/src/struct/funcs/handleVideo.js b/src/struct/funcs/handleVideo.js index 35f07f30..8c3aff99 100644 --- a/src/struct/funcs/handleVideo.js +++ b/src/struct/funcs/handleVideo.js @@ -7,7 +7,8 @@ module.exports = async function ( voiceChannel, client, playlist, - type + type, + spotifyTrackData ) { const songInfo = await ytdl.getInfo(resource).catch(err => console.log(err)); const song = { @@ -15,7 +16,8 @@ module.exports = async function ( url: resource, author: msg.author, type: type, - info: songInfo.videoDetails + info: songInfo.videoDetails, + track: spotifyTrackData }; const queue = client.queue.get(msg.guild.id); diff --git a/src/struct/funcs/play.js b/src/struct/funcs/play.js index af21cf6a..199bd0cf 100644 --- a/src/struct/funcs/play.js +++ b/src/struct/funcs/play.js @@ -22,12 +22,12 @@ module.exports = async function (guild, song, client, seek, play) { client.queue.delete(guild.id); return; } - }, 10000); + }, 30000); streamConfig.options.seek = seek; let input = song.url; - if (song.type === "ytdl") + if (song.type === "ytdl" || song.type === "spotify") input = ytdl(song.url, streamConfig.ytdlOptions) //.on('info', (info, format) => console.log(format)) .on("error", (error) => console.log(error)); @@ -69,7 +69,7 @@ module.exports = async function (guild, song, client, seek, play) { dispatcher.setVolume(queue.volume / 100); require("../../events/dispatcherEvents/handler")(client, dispatcher, queue, guild); if ((client.global.db.guilds[guild.id].startPlaying && play) || play) { - if (song.type !== "ytdl") return; + if (song.type !== "ytdl" && song.type !== "spotify") return; const embed = new Discord.MessageEmbed() .setTitle(`${client.messages.startPlaying}**${song.title}**`) .setDescription( diff --git a/src/struct/funcs/saveDB.js b/src/struct/funcs/saveDB.js index 64daceb3..e7c2dd83 100644 --- a/src/struct/funcs/saveDB.js +++ b/src/struct/funcs/saveDB.js @@ -12,7 +12,8 @@ module.exports = async function (client) { bass: client.global.db.guilds[guild.id].bass, blacklist: client.global.db.guilds[guild.id].blacklist, premium: client.global.db.guilds[guild.id].premium, + playSimilar: client.global.db.guilds[guild.id].playSimilar }); }); } -}; +}; \ No newline at end of file