diff --git a/.gitignore b/.gitignore index 2991299..e0c9b06 100644 --- a/.gitignore +++ b/.gitignore @@ -9,4 +9,6 @@ lib yarn*.log # example -example/config.ts \ No newline at end of file +example/test + +test/ \ No newline at end of file diff --git a/README.md b/README.md index 46fac3f..87767cc 100644 --- a/README.md +++ b/README.md @@ -134,7 +134,7 @@ These bots are made by the community, they can help you build your own! ```js const player = new Player(client, { - ytdlDownloadOptions: { + ytdlOptions: { requestOptions: { headers: { cookie: "YOUR_YOUTUBE_COOKIE" @@ -154,7 +154,7 @@ const proxy = "http://user:pass@111.111.111.111:8080"; const agent = HttpsProxyAgent(proxy); const player = new Player(client, { - ytdlDownloadOptions: { + ytdlOptions: { requestOptions: { agent } } }); diff --git a/example/config.example.ts b/example/config.example.ts deleted file mode 100644 index 83c37ee..0000000 --- a/example/config.example.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const config = { - token: "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" -}; diff --git a/example/index.ts b/example/index.ts deleted file mode 100644 index a62920d..0000000 --- a/example/index.ts +++ /dev/null @@ -1,268 +0,0 @@ -import { Client, GuildMember, TextChannel } from "discord.js"; -import { config } from "./config"; -import { Player, Queue, QueryType, QueueRepeatMode } from "../src/index"; -// use this in prod. -// import { Player, Queue } from "discord-player"; - -const client = new Client({ - intents: ["GUILD_VOICE_STATES", "GUILD_MESSAGES", "GUILDS"] -}); - -client.on("ready", () => { - console.log("Bot is online!"); - client.user.setActivity({ - name: "🎶 | Music Time", - type: "LISTENING" - }); -}); -client.on("error", console.error); -client.on("warn", console.warn); - -// instantiate the player -const player = new Player(client); - -player.on("error", console.error); - -player.on("trackStart", (queue, track) => { - const guildQueue = queue as Queue; - guildQueue.metadata.send(`🎶 | Started playing: **${track.title}** in **${guildQueue.connection.channel.name}**!`); -}); - -player.on("trackAdd", (queue, track) => { - const guildQueue = queue as Queue; - guildQueue.metadata.send(`🎶 | Track **${track.title}** queued!`); -}); - -player.on("botDisconnect", (queue) => { - const guildQueue = queue as Queue; - guildQueue.metadata.send("❌ | I was manually disconnected from the voice channel, clearing queue!"); -}); - -player.on("channelEmpty", (queue) => { - const guildQueue = queue as Queue; - guildQueue.metadata.send("❌ | Nobody is in the voice channel, leaving..."); -}); - -player.on("queueEnd", (queue) => { - const guildQueue = queue as Queue; - guildQueue.metadata.send("✅ | Queue finished!"); -}); - -client.on("message", async (message) => { - if (message.author.bot || !message.guild) return; - if (!client.application?.owner) await client.application?.fetch(); - - if (message.content === "!deploy" && message.author.id === client.application?.owner?.id) { - await message.guild.commands.set([ - { - name: "play", - description: "Plays a song from youtube", - options: [ - { - name: "query", - type: "STRING", - description: "The song you want to play", - required: true - } - ] - }, - { - name: "soundcloud", - description: "Plays a song from soundcloud", - options: [ - { - name: "query", - type: "STRING", - description: "The song you want to play", - required: true - } - ] - }, - { - name: "volume", - description: "Sets music volume", - options: [ - { - name: "amount", - type: "INTEGER", - description: "The volume amount to set (0-100)", - required: false - } - ] - }, - { - name: "loop", - description: "Sets loop mode", - options: [ - { - name: "mode", - type: "INTEGER", - description: "Loop type", - required: true, - choices: [ - { - name: "Off", - value: 0 - }, - { - name: "Track", - value: 1 - }, - { - name: "Queue", - value: 2 - } - ] - } - ] - }, - { - name: "skip", - description: "Skip to the current song" - }, - { - name: "queue", - description: "See the queue" - }, - { - name: "pause", - description: "Pause the current song" - }, - { - name: "resume", - description: "Resume the current song" - }, - { - name: "stop", - description: "Stop the player" - }, - { - name: "np", - description: "Now Playing" - } - ]); - - await message.reply("Deployed!"); - } -}); - -client.on("interaction", async (interaction) => { - if (!interaction.isCommand() || !interaction.guildID) return; - - if (!(interaction.member instanceof GuildMember) || !interaction.member.voice.channel) { - return void interaction.reply({ content: "You are not in a voice channel!", ephemeral: true }); - } - - if (interaction.guild.me.voice.channelID && interaction.member.voice.channelID !== interaction.guild.me.voice.channelID) { - return void interaction.reply({ content: "You are not in my voice channel!", ephemeral: true }); - } - - if (interaction.commandName === "play" || interaction.commandName === "soundcloud") { - await interaction.defer(); - - const query = interaction.options.get("query")!.value! as string; - const searchResult = await player - .search(query, { - requestedBy: interaction.user, - searchEngine: interaction.commandName === "soundcloud" ? QueryType.SOUNDCLOUD_SEARCH : QueryType.AUTO - }) - .catch(() => {}); - if (!searchResult || !searchResult.tracks.length) return void interaction.followUp({ content: "No results were found!" }); - - const queue = await player.createQueue(interaction.guild, { - metadata: interaction.channel as TextChannel - }); - - try { - if (!queue.connection) await queue.connect(interaction.member.voice.channel); - } catch { - void player.deleteQueue(interaction.guildID); - return void interaction.followUp({ content: "Could not join your voice channel!" }); - } - - await interaction.followUp({ content: "⏱ | Loading your track..." }); - searchResult.playlist ? queue.addTracks(searchResult.tracks) : queue.addTrack(searchResult.tracks[0]); - if (!queue.playing) await queue.play(); - } else if (interaction.commandName === "volume") { - await interaction.defer(); - const queue = player.getQueue(interaction.guildID); - if (!queue || !queue.playing) return void interaction.followUp({ content: "❌ | No music is being played!" }); - const vol = interaction.options.get("amount"); - if (!vol) return void interaction.followUp({ content: `🎧 | Current volume is **${queue.volume}**%!` }); - if ((vol.value as number) < 0 || (vol.value as number) > 100) return void interaction.followUp({ content: "❌ | Volume range must be 0-100" }); - const success = queue.setVolume(vol.value as number); - return void interaction.followUp({ - content: success ? `✅ | Volume set to **${vol.value}%**!` : "❌ | Something went wrong!" - }); - } else if (interaction.commandName === "skip") { - await interaction.defer(); - const queue = player.getQueue(interaction.guildID); - if (!queue || !queue.playing) return void interaction.followUp({ content: "❌ | No music is being played!" }); - const currentTrack = queue.current; - const success = queue.skip(); - return void interaction.followUp({ - content: success ? `✅ | Skipped **${currentTrack}**!` : "❌ | Something went wrong!" - }); - } else if (interaction.commandName === "queue") { - await interaction.defer(); - const queue = player.getQueue(interaction.guildID); - if (!queue || !queue.playing) return void interaction.followUp({ content: "❌ | No music is being played!" }); - const currentTrack = queue.current; - const tracks = queue.tracks.slice(0, 10).map((m, i) => { - return `${i + 1}. **${m.title}**`; - }); - - return void interaction.followUp({ - embeds: [ - { - title: "Server Queue", - description: `${tracks.join("\n")}${ - queue.tracks.length > tracks.length - ? `\n...${queue.tracks.length - tracks.length === 1 ? `${queue.tracks.length - tracks.length} more track` : `${queue.tracks.length - tracks.length} more tracks`}` - : "" - }`, - color: 0xff0000, - fields: [{ name: "Now Playing", value: `🎶 | **${currentTrack.title}**` }] - } - ] - }); - } else if (interaction.commandName === "pause") { - await interaction.defer(); - const queue = player.getQueue(interaction.guildID); - if (!queue || !queue.playing) return void interaction.followUp({ content: "❌ | No music is being played!" }); - const success = queue.setPaused(true); - return void interaction.followUp({ content: success ? "⏸ | Paused!" : "❌ | Something went wrong!" }); - } else if (interaction.commandName === "resume") { - await interaction.defer(); - const queue = player.getQueue(interaction.guildID); - if (!queue || !queue.playing) return void interaction.followUp({ content: "❌ | No music is being played!" }); - const success = queue.setPaused(false); - return void interaction.followUp({ content: success ? "▶ | Resumed!" : "❌ | Something went wrong!" }); - } else if (interaction.commandName === "stop") { - await interaction.defer(); - const queue = player.getQueue(interaction.guildID); - if (!queue || !queue.playing) return void interaction.followUp({ content: "❌ | No music is being played!" }); - queue.destroy(); - return void interaction.followUp({ content: "🛑 | Stopped the player!" }); - } else if (interaction.commandName === "np") { - await interaction.defer(); - const queue = player.getQueue(interaction.guildID); - if (!queue || !queue.playing) return void interaction.followUp({ content: "❌ | No music is being played!" }); - return void interaction.followUp({ content: `🎶 | Current song: **${queue.current.title}**!` }); - } else if (interaction.commandName === "loop") { - await interaction.defer(); - const queue = player.getQueue(interaction.guildID); - if (!queue || !queue.playing) return void interaction.followUp({ content: "❌ | No music is being played!" }); - const loopMode = interaction.options.get("mode")!.value as QueueRepeatMode; - const success = queue.setRepeatMode(loopMode); - const mode = loopMode === QueueRepeatMode.TRACK ? "🔂" : loopMode === QueueRepeatMode.QUEUE ? "🔁" : "▶"; - return void interaction.followUp({ content: success ? `${mode} | Updated loop mode!` : "❌ | Could not update loop mode!" }); - } else { - interaction.reply({ - content: "Unknown command!", - ephemeral: true - }); - } -}); - -client.login(config.token); diff --git a/package.json b/package.json index d2a2257..a256fe1 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "lib/" ], "scripts": { - "test": "cd example && ts-node index.ts", + "dev": "cd example/test && ts-node index.ts", "build": "rimraf lib && tsc", "format": "prettier --write \"src/**/*.ts\" \"example/**/*.ts\"", "lint": "tslint -p tsconfig.json", @@ -79,6 +79,6 @@ "typescript": "^4.3.2" }, "optionalDependencies": { - "sodium": "^3.0.2" + "libsodium-wrappers": "^0.7.9" } } diff --git a/yarn.lock b/yarn.lock index 97a7d61..c27df99 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3054,6 +3054,18 @@ levn@^0.3.0, levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" +libsodium-wrappers@^0.7.9: + version "0.7.9" + resolved "https://registry.yarnpkg.com/libsodium-wrappers/-/libsodium-wrappers-0.7.9.tgz#4ffc2b69b8f7c7c7c5594a93a4803f80f6d0f346" + integrity sha512-9HaAeBGk1nKTRFRHkt7nzxqCvnkWTjn1pdjKgcUnZxj0FyOP4CnhgFhMdrFfgNsukijBGyBLpP2m2uKT1vuWhQ== + dependencies: + libsodium "^0.7.0" + +libsodium@^0.7.0: + version "0.7.9" + resolved "https://registry.yarnpkg.com/libsodium/-/libsodium-0.7.9.tgz#4bb7bcbf662ddd920d8795c227ae25bbbfa3821b" + integrity sha512-gfeADtR4D/CM0oRUviKBViMGXZDgnFdMKMzHsvBdqLBHd9ySi6EtYnmuhHVDDYgYpAO8eU8hEY+F8vIUAPh08A== + linkify-it@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.2.0.tgz#e3b54697e78bf915c70a38acd78fd09e0058b1cf" @@ -3317,7 +3329,7 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -node-addon-api@*, node-addon-api@^3.2.1: +node-addon-api@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== @@ -3922,13 +3934,6 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^3.1.0" -sodium@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/sodium/-/sodium-3.0.2.tgz#4dbd7eb4a21c92ca7e7f684756cd733fee78112e" - integrity sha512-IsTwTJeoNBU97km3XkrbCGC/n/9aUQejgD3QPr2YY2gtbSPru3TI6nhCqgoez9Mv88frF9oVZS/jrXFbd6WXyA== - dependencies: - node-addon-api "*" - sort-array@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/sort-array/-/sort-array-2.0.0.tgz#38a9c6da27fd7d147b42e60554f281187b4df472"