dev
This commit is contained in:
parent
bfd88e8d42
commit
7ae60f0bbf
6 changed files with 20 additions and 284 deletions
4
.gitignore
vendored
4
.gitignore
vendored
|
@ -9,4 +9,6 @@ lib
|
||||||
yarn*.log
|
yarn*.log
|
||||||
|
|
||||||
# example
|
# example
|
||||||
example/config.ts
|
example/test
|
||||||
|
|
||||||
|
test/
|
|
@ -134,7 +134,7 @@ These bots are made by the community, they can help you build your own!
|
||||||
|
|
||||||
```js
|
```js
|
||||||
const player = new Player(client, {
|
const player = new Player(client, {
|
||||||
ytdlDownloadOptions: {
|
ytdlOptions: {
|
||||||
requestOptions: {
|
requestOptions: {
|
||||||
headers: {
|
headers: {
|
||||||
cookie: "YOUR_YOUTUBE_COOKIE"
|
cookie: "YOUR_YOUTUBE_COOKIE"
|
||||||
|
@ -154,7 +154,7 @@ const proxy = "http://user:pass@111.111.111.111:8080";
|
||||||
const agent = HttpsProxyAgent(proxy);
|
const agent = HttpsProxyAgent(proxy);
|
||||||
|
|
||||||
const player = new Player(client, {
|
const player = new Player(client, {
|
||||||
ytdlDownloadOptions: {
|
ytdlOptions: {
|
||||||
requestOptions: { agent }
|
requestOptions: { agent }
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,3 +0,0 @@
|
||||||
export const config = {
|
|
||||||
token: "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
|
|
||||||
};
|
|
268
example/index.ts
268
example/index.ts
|
@ -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<TextChannel>;
|
|
||||||
guildQueue.metadata.send(`🎶 | Started playing: **${track.title}** in **${guildQueue.connection.channel.name}**!`);
|
|
||||||
});
|
|
||||||
|
|
||||||
player.on("trackAdd", (queue, track) => {
|
|
||||||
const guildQueue = queue as Queue<TextChannel>;
|
|
||||||
guildQueue.metadata.send(`🎶 | Track **${track.title}** queued!`);
|
|
||||||
});
|
|
||||||
|
|
||||||
player.on("botDisconnect", (queue) => {
|
|
||||||
const guildQueue = queue as Queue<TextChannel>;
|
|
||||||
guildQueue.metadata.send("❌ | I was manually disconnected from the voice channel, clearing queue!");
|
|
||||||
});
|
|
||||||
|
|
||||||
player.on("channelEmpty", (queue) => {
|
|
||||||
const guildQueue = queue as Queue<TextChannel>;
|
|
||||||
guildQueue.metadata.send("❌ | Nobody is in the voice channel, leaving...");
|
|
||||||
});
|
|
||||||
|
|
||||||
player.on("queueEnd", (queue) => {
|
|
||||||
const guildQueue = queue as Queue<TextChannel>;
|
|
||||||
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);
|
|
|
@ -8,7 +8,7 @@
|
||||||
"lib/"
|
"lib/"
|
||||||
],
|
],
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "cd example && ts-node index.ts",
|
"dev": "cd example/test && ts-node index.ts",
|
||||||
"build": "rimraf lib && tsc",
|
"build": "rimraf lib && tsc",
|
||||||
"format": "prettier --write \"src/**/*.ts\" \"example/**/*.ts\"",
|
"format": "prettier --write \"src/**/*.ts\" \"example/**/*.ts\"",
|
||||||
"lint": "tslint -p tsconfig.json",
|
"lint": "tslint -p tsconfig.json",
|
||||||
|
@ -79,6 +79,6 @@
|
||||||
"typescript": "^4.3.2"
|
"typescript": "^4.3.2"
|
||||||
},
|
},
|
||||||
"optionalDependencies": {
|
"optionalDependencies": {
|
||||||
"sodium": "^3.0.2"
|
"libsodium-wrappers": "^0.7.9"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
21
yarn.lock
21
yarn.lock
|
@ -3054,6 +3054,18 @@ levn@^0.3.0, levn@~0.3.0:
|
||||||
prelude-ls "~1.1.2"
|
prelude-ls "~1.1.2"
|
||||||
type-check "~0.3.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:
|
linkify-it@^2.0.0:
|
||||||
version "2.2.0"
|
version "2.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.2.0.tgz#e3b54697e78bf915c70a38acd78fd09e0058b1cf"
|
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"
|
resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
|
||||||
integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
|
integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
|
||||||
|
|
||||||
node-addon-api@*, node-addon-api@^3.2.1:
|
node-addon-api@^3.2.1:
|
||||||
version "3.2.1"
|
version "3.2.1"
|
||||||
resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161"
|
resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161"
|
||||||
integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==
|
integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==
|
||||||
|
@ -3922,13 +3934,6 @@ snapdragon@^0.8.1:
|
||||||
source-map-resolve "^0.5.0"
|
source-map-resolve "^0.5.0"
|
||||||
use "^3.1.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:
|
sort-array@^2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/sort-array/-/sort-array-2.0.0.tgz#38a9c6da27fd7d147b42e60554f281187b4df472"
|
resolved "https://registry.yarnpkg.com/sort-array/-/sort-array-2.0.0.tgz#38a9c6da27fd7d147b42e60554f281187b4df472"
|
||||||
|
|
Loading…
Reference in a new issue