removed music commands
This commit is contained in:
parent
76bc07543d
commit
9be36e7199
12 changed files with 0 additions and 472 deletions
|
@ -1,60 +0,0 @@
|
|||
import { players } from "../../utils/soundplayer.js";
|
||||
import MusicCommand from "../../classes/musicCommand.js";
|
||||
|
||||
class HostCommand extends MusicCommand {
|
||||
async run() {
|
||||
this.success = false;
|
||||
if (!this.guild) return "This command only works in servers!";
|
||||
if (!this.member.voiceState) return "You need to be in a voice channel first!";
|
||||
if (!this.guild.voiceStates.has(this.client.user.id)) return "I'm not in a voice channel!";
|
||||
if (!this.connection) return "I haven't completely connected yet!";
|
||||
if (this.connection.host !== this.author && !process.env.OWNER.split(",").includes(this.connection.host)) return "Only the current voice session host can choose another host!";
|
||||
const input = this.options.user ?? this.args.join(" ");
|
||||
if (input?.trim()) {
|
||||
let user;
|
||||
if (this.type === "classic") {
|
||||
const getUser = this.message.mentions.users.length >= 1 ? this.message.mentions.users[0] : this.client.users.get(input);
|
||||
if (getUser) {
|
||||
user = getUser;
|
||||
} else if (input.match(/^<?[@#]?[&!]?\d+>?$/) && input >= 21154535154122752n) {
|
||||
try {
|
||||
user = await this.client.rest.users.get(input);
|
||||
} catch {
|
||||
// no-op
|
||||
}
|
||||
} else {
|
||||
const userRegex = new RegExp(input.split(" ").join("|"), "i");
|
||||
const member = this.client.users.find(element => {
|
||||
return userRegex.test(element.username);
|
||||
});
|
||||
user = member;
|
||||
}
|
||||
} else {
|
||||
user = input;
|
||||
}
|
||||
if (!user) return "I can't find that user!";
|
||||
if (user.bot) return "This is illegal, you know.";
|
||||
const member = this.guild.members.get(user.id);
|
||||
if (!member) return "That user isn't in this server!";
|
||||
const object = this.connection;
|
||||
object.host = member.id;
|
||||
players.set(this.guildID, object);
|
||||
this.success = true;
|
||||
return `🔊 ${member.mention} is the new voice channel host.`;
|
||||
} else {
|
||||
const member = this.guild.members.get(players.get(this.guild.id).host);
|
||||
this.success = true;
|
||||
return `🔊 The current voice channel host is **${member?.username}#${member?.discriminator}**.`;
|
||||
}
|
||||
}
|
||||
|
||||
static flags = [{
|
||||
name: "user",
|
||||
type: 6,
|
||||
description: "The user you want the new host to be"
|
||||
}];
|
||||
static description = "Gets or changes the host of the current voice session";
|
||||
static aliases = ["sethost"];
|
||||
}
|
||||
|
||||
export default HostCommand;
|
|
@ -1,23 +0,0 @@
|
|||
import { players } from "../../utils/soundplayer.js";
|
||||
import MusicCommand from "../../classes/musicCommand.js";
|
||||
|
||||
class LoopCommand extends MusicCommand {
|
||||
async run() {
|
||||
this.success = false;
|
||||
if (!this.guild) return "This command only works in servers!";
|
||||
if (!this.member.voiceState) return "You need to be in a voice channel first!";
|
||||
if (!this.guild.voiceStates.has(this.client.user.id)) return "I'm not in a voice channel!";
|
||||
if (!this.connection) return "I haven't completely connected yet!";
|
||||
if (this.connection.host !== this.author && !this.member.permissions.has("MANAGE_CHANNELS")) return "Only the current voice session host can loop the music!";
|
||||
const object = this.connection;
|
||||
object.loop = !object.loop;
|
||||
players.set(this.guild.id, object);
|
||||
this.success = true;
|
||||
return object.loop ? "🔊 The player is now looping." : "🔊 The player is no longer looping.";
|
||||
}
|
||||
|
||||
static description = "Loops the music";
|
||||
static aliases = ["toggleloop", "repeat"];
|
||||
}
|
||||
|
||||
export default LoopCommand;
|
|
@ -1,48 +0,0 @@
|
|||
import Command from "../../classes/command.js";
|
||||
import { commands, aliases, info, categories } from "../../utils/collections.js";
|
||||
|
||||
// all-in-one music command
|
||||
class MusicAIOCommand extends Command {
|
||||
async run() {
|
||||
let cmd = this.type === "classic" ? this.args[0] : this.optionsArray[0].name;
|
||||
if (cmd === "music" || this.constructor.aliases.includes(cmd)) return "https://esmbot.net/robotdance.gif";
|
||||
// await this.acknowledge();
|
||||
if (this.type === "classic") {
|
||||
this.origOptions.args.shift();
|
||||
} else {
|
||||
this.origOptions.interaction.data.options.raw = this.origOptions.interaction.data.options.raw[0].options;
|
||||
}
|
||||
if (aliases.has(cmd)) cmd = aliases.get(cmd);
|
||||
if (commands.has(cmd) && info.get(cmd).category === "music") {
|
||||
const command = commands.get(cmd);
|
||||
const inst = new command(this.client, this.origOptions);
|
||||
const result = await inst.run();
|
||||
this.success = inst.success;
|
||||
return result;
|
||||
} else {
|
||||
this.success = false;
|
||||
return "That isn't a valid music command!";
|
||||
}
|
||||
}
|
||||
|
||||
static postInit() {
|
||||
this.flags = [];
|
||||
for (const cmd of categories.get("music")) {
|
||||
if (cmd === "music") continue;
|
||||
const cmdInfo = info.get(cmd);
|
||||
this.flags.push({
|
||||
name: cmd,
|
||||
type: 1,
|
||||
description: cmdInfo.description,
|
||||
options: cmdInfo.flags
|
||||
});
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
static description = "Handles music playback";
|
||||
static aliases = ["m"];
|
||||
static directAllowed = false;
|
||||
}
|
||||
|
||||
export default MusicAIOCommand;
|
|
@ -1,51 +0,0 @@
|
|||
import format from "format-duration";
|
||||
import MusicCommand from "../../classes/musicCommand.js";
|
||||
|
||||
class NowPlayingCommand extends MusicCommand {
|
||||
async run() {
|
||||
this.success = false;
|
||||
if (!this.guild) return "This command only works in servers!";
|
||||
if (!this.member.voiceState) return "You need to be in a voice channel first!";
|
||||
if (!this.guild.voiceStates.has(this.client.user.id)) return "I'm not in a voice channel!";
|
||||
if (!this.connection) return "I haven't completely connected yet!";
|
||||
const player = this.connection.player;
|
||||
if (!player) return "I'm not playing anything!";
|
||||
const track = await player.node.rest.decode(player.track);
|
||||
const parts = Math.floor((player.position / track.length) * 10);
|
||||
this.success = true;
|
||||
return {
|
||||
embeds: [{
|
||||
color: 16711680,
|
||||
author: {
|
||||
name: "Now Playing",
|
||||
iconURL: this.client.user.avatarURL()
|
||||
},
|
||||
fields: [{
|
||||
name: "ℹ️ Title",
|
||||
value: track.title ? track.title : "Unknown"
|
||||
},
|
||||
{
|
||||
name: "🎤 Artist",
|
||||
value: track.author ? track.author : "Unknown"
|
||||
},
|
||||
{
|
||||
name: "💬 Channel",
|
||||
value: (this.guild.channels.get(this.member.voiceState.channelID) ?? await this.client.rest.channels.get(this.member.voiceState.channelID)).name
|
||||
},
|
||||
{
|
||||
name: "🌐 Node",
|
||||
value: player.node ? player.node.name : "Unknown"
|
||||
},
|
||||
{
|
||||
name: `${"▬".repeat(parts)}🔘${"▬".repeat(10 - parts)}`,
|
||||
value: `${format(player.position)}/${track.isStream ? "∞" : format(track.length)}`
|
||||
}]
|
||||
}]
|
||||
};
|
||||
}
|
||||
|
||||
static description = "Shows the currently playing song";
|
||||
static aliases = ["playing", "np", "current"];
|
||||
}
|
||||
|
||||
export default NowPlayingCommand;
|
|
@ -1,41 +0,0 @@
|
|||
import { play } from "../../utils/soundplayer.js";
|
||||
import MusicCommand from "../../classes/musicCommand.js";
|
||||
const prefixes = ["scsearch:", "spsearch:", "sprec:", "amsearch:", "dzsearch:", "dzisrc:"];
|
||||
if (process.env.YT_DISABLED !== "true") prefixes.push("ytsearch:", "ytmsearch:");
|
||||
|
||||
class PlayCommand extends MusicCommand {
|
||||
async run() {
|
||||
const input = this.options.query ?? this.args.join(" ");
|
||||
if (!input && ((!this.message || this.message?.attachments.size <= 0))) {
|
||||
this.success = false;
|
||||
return "You need to provide what you want to play!";
|
||||
}
|
||||
let query = input ? input.trim() : "";
|
||||
const attachment = this.type === "classic" ? this.message.attachments.first() : null;
|
||||
if (query.startsWith("||") && query.endsWith("||")) {
|
||||
query = query.substring(2, query.length - 2);
|
||||
}
|
||||
if (query.startsWith("<") && query.endsWith(">")) {
|
||||
query = query.substring(1, query.length - 1);
|
||||
}
|
||||
try {
|
||||
const url = new URL(query);
|
||||
return play(this.client, url, { channel: this.channel, member: this.member, type: this.type, interaction: this.interaction }, true);
|
||||
} catch {
|
||||
const search = prefixes.some(v => query.startsWith(v)) ? query : !query && attachment ? attachment.url : (process.env.YT_DISABLED !== "true" ? `ytsearch:${query}` : `dzsearch:${query}`);
|
||||
return play(this.client, search, { channel: this.channel, member: this.member, type: this.type, interaction: this.interaction }, true);
|
||||
}
|
||||
}
|
||||
|
||||
static flags = [{
|
||||
name: "query",
|
||||
type: 3,
|
||||
description: "An audio search query or URL",
|
||||
required: true
|
||||
}];
|
||||
static description = "Plays a song or adds it to the queue";
|
||||
static aliases = ["p"];
|
||||
static arguments = ["[url]"];
|
||||
}
|
||||
|
||||
export default PlayCommand;
|
|
@ -1,65 +0,0 @@
|
|||
import { request } from "undici";
|
||||
import format from "format-duration";
|
||||
import { nodes } from "../../utils/soundplayer.js";
|
||||
import paginator from "../../utils/pagination/pagination.js";
|
||||
import MusicCommand from "../../classes/musicCommand.js";
|
||||
|
||||
class QueueCommand extends MusicCommand {
|
||||
async run() {
|
||||
this.success = false;
|
||||
if (!this.guild) return "This command only works in servers!";
|
||||
if (!this.member.voiceState) return "You need to be in a voice channel first!";
|
||||
if (!this.guild.voiceStates.has(this.client.user.id)) return "I'm not in a voice channel!";
|
||||
if (!this.channel.permissionsOf(this.client.user.id.toString()).has("EMBED_LINKS")) return "I don't have the `Embed Links` permission!";
|
||||
const player = this.connection;
|
||||
if (!player) return "I haven't completely connected yet!";
|
||||
const node = nodes.filter((val) => val.name === player.player.node.name)[0];
|
||||
const tracks = await request(`http://${node.url}/decodetracks`, { method: "POST", body: JSON.stringify(this.queue), headers: { authorization: node.auth, "content-type": "application/json" } }).then(res => res.body.json());
|
||||
const trackList = [];
|
||||
const firstTrack = tracks.shift();
|
||||
for (const [i, track] of tracks.entries()) {
|
||||
trackList.push(`${i + 1}. ${track.info.author !== "" ? track.info.author : "(blank)"} - **${track.info.title !== "" ? track.info.title : "(blank)"}** (${track.info.isStream ? "∞" : format(track.info.length)})`);
|
||||
}
|
||||
const pageSize = 5;
|
||||
const embeds = [];
|
||||
const groups = trackList.map((item, index) => {
|
||||
return index % pageSize === 0 ? trackList.slice(index, index + pageSize) : null;
|
||||
}).filter(Boolean);
|
||||
if (groups.length === 0) groups.push("del");
|
||||
for (const [i, value] of groups.entries()) {
|
||||
embeds.push({
|
||||
embeds: [{
|
||||
author: {
|
||||
name: "Queue",
|
||||
iconURL: this.client.user.avatarURL()
|
||||
},
|
||||
color: 16711680,
|
||||
footer: {
|
||||
text: `Page ${i + 1} of ${groups.length}`
|
||||
},
|
||||
fields: [{
|
||||
name: "🎶 Now Playing",
|
||||
value: `${firstTrack.info.author !== "" ? firstTrack.info.author : "(blank)"} - **${firstTrack.info.title !== "" ? firstTrack.info.title : "(blank)"}** (${firstTrack.info.isStream ? "∞" : format(firstTrack.info.length)})`
|
||||
}, {
|
||||
name: "🔁 Looping?",
|
||||
value: player.loop ? "Yes" : "No"
|
||||
}, {
|
||||
name: "🌐 Node",
|
||||
value: player.player.node ? player.player.node.name : "Unknown"
|
||||
}, {
|
||||
name: "🗒️ Queue",
|
||||
value: value !== "del" ? value.join("\n") : "There's nothing in the queue!"
|
||||
}]
|
||||
}]
|
||||
});
|
||||
}
|
||||
if (embeds.length === 0) return "There's nothing in the queue!";
|
||||
this.success = true;
|
||||
return paginator(this.client, { type: this.type, message: this.message, interaction: this.interaction, channel: this.channel, author: this.author }, embeds);
|
||||
}
|
||||
|
||||
static description = "Shows the current queue";
|
||||
static aliases = ["q"];
|
||||
}
|
||||
|
||||
export default QueueCommand;
|
|
@ -1,33 +0,0 @@
|
|||
import { queues } from "../../utils/soundplayer.js";
|
||||
import MusicCommand from "../../classes/musicCommand.js";
|
||||
|
||||
class RemoveCommand extends MusicCommand {
|
||||
async run() {
|
||||
this.success = false;
|
||||
if (!this.guild) return "This command only works in servers!";
|
||||
if (!this.member.voiceState) return "You need to be in a voice channel first!";
|
||||
if (!this.guild.voiceStates.has(this.client.user.id)) return "I'm not in a voice channel!";
|
||||
if (!this.connection) return "I haven't completely connected yet!";
|
||||
if (this.connection.host !== this.author && !process.env.OWNER.split(",").includes(this.connection.host)) return "Only the current voice session host can remove songs from the queue!";
|
||||
const pos = parseInt(this.options.position ?? this.args[0]);
|
||||
if (isNaN(pos) || pos > this.queue.length || pos < 1) return "That's not a valid position!";
|
||||
const removed = this.queue.splice(pos, 1);
|
||||
if (removed.length === 0) return "That's not a valid position!";
|
||||
const track = await this.connection.player.node.rest.decode(removed[0]);
|
||||
queues.set(this.guildID, this.queue);
|
||||
this.success = true;
|
||||
return `🔊 The song \`${track.title ? track.title : "(blank)"}\` has been removed from the queue.`;
|
||||
}
|
||||
|
||||
static flags = [{
|
||||
name: "position",
|
||||
type: 4,
|
||||
description: "The queue position you want to remove",
|
||||
min_value: 1,
|
||||
required: true
|
||||
}];
|
||||
static description = "Removes a song from the queue";
|
||||
static aliases = ["rm"];
|
||||
}
|
||||
|
||||
export default RemoveCommand;
|
|
@ -1,38 +0,0 @@
|
|||
import MusicCommand from "../../classes/musicCommand.js";
|
||||
|
||||
class SeekCommand extends MusicCommand {
|
||||
async run() {
|
||||
this.success = false;
|
||||
if (!this.guild) return "This command only works in servers!";
|
||||
if (!this.member.voiceState) return "You need to be in a voice channel first!";
|
||||
if (!this.guild.voiceStates.has(this.client.user.id)) return "I'm not in a voice channel!";
|
||||
if (!this.connection) return "I haven't completely connected yet!";
|
||||
if (this.connection.host !== this.author) return "Only the current voice session host can seek the music!";
|
||||
const player = this.connection.player;
|
||||
const track = await player.node.rest.decode(player.track);
|
||||
if (!track.isSeekable) return "This track isn't seekable!";
|
||||
const pos = this.options.position ?? this.args[0];
|
||||
let seconds;
|
||||
if (typeof pos === "string" && pos.includes(":")) {
|
||||
seconds = +(pos.split(":").reduce((acc, time) => (60 * acc) + +time));
|
||||
} else {
|
||||
seconds = parseFloat(pos);
|
||||
}
|
||||
if (isNaN(seconds) || (seconds * 1000) > track.length || (seconds * 1000) < 0) return "That's not a valid position!";
|
||||
player.seekTo(seconds * 1000);
|
||||
this.success = true;
|
||||
return `🔊 Seeked track to ${seconds} second(s).`;
|
||||
}
|
||||
|
||||
static flags = [{
|
||||
name: "position",
|
||||
type: 3,
|
||||
description: "Seek to this position",
|
||||
required: true
|
||||
}];
|
||||
static description = "Seeks to a different position in the music";
|
||||
static aliases = ["pos"];
|
||||
static arguments = ["[seconds]"];
|
||||
}
|
||||
|
||||
export default SeekCommand;
|
|
@ -1,23 +0,0 @@
|
|||
import { players } from "../../utils/soundplayer.js";
|
||||
import MusicCommand from "../../classes/musicCommand.js";
|
||||
|
||||
class ShuffleCommand extends MusicCommand {
|
||||
async run() {
|
||||
this.success = false;
|
||||
if (!this.guild) return "This command only works in servers!";
|
||||
if (!this.member.voiceState) return "You need to be in a voice channel first!";
|
||||
if (!this.guild.voiceStates.has(this.client.user.id)) return "I'm not in a voice channel!";
|
||||
if (!this.connection) return "I haven't completely connected yet!";
|
||||
if (this.connection.host !== this.author) return "Only the current voice session host can shuffle the music!";
|
||||
const object = this.connection;
|
||||
object.shuffle = !object.shuffle;
|
||||
players.set(this.guildID, object);
|
||||
this.success = true;
|
||||
return object.shuffle ? "🔊 The player is now shuffling." : "🔊 The player is no longer shuffling.";
|
||||
}
|
||||
|
||||
static description = "Shuffles the music";
|
||||
static aliases = ["toggleshuffle"];
|
||||
}
|
||||
|
||||
export default ShuffleCommand;
|
|
@ -1,41 +0,0 @@
|
|||
import { skipVotes } from "../../utils/soundplayer.js";
|
||||
import MusicCommand from "../../classes/musicCommand.js";
|
||||
|
||||
class SkipCommand extends MusicCommand {
|
||||
async run() {
|
||||
this.success = false;
|
||||
if (!this.guild) return "This command only works in servers!";
|
||||
if (!this.member.voiceState) return "You need to be in a voice channel first!";
|
||||
if (!this.guild.voiceStates.has(this.client.user.id)) return "I'm not in a voice channel!";
|
||||
const player = this.connection;
|
||||
if (!player) return "I haven't completely connected yet!";
|
||||
if (player.host !== this.author && !this.member.permissions.has("MANAGE_CHANNELS")) {
|
||||
const votes = skipVotes.get(this.guild.id) ?? { count: 0, ids: [], max: Math.min(3, player.voiceChannel.voiceMembers.filter((i) => i.id !== this.client.user.id && !i.bot).length) };
|
||||
if (votes.ids.includes(this.author)) return "You've already voted to skip!";
|
||||
const newObject = {
|
||||
count: votes.count + 1,
|
||||
ids: [...votes.ids, this.author].filter(item => !!item),
|
||||
max: votes.max
|
||||
};
|
||||
if (votes.count + 1 === votes.max) {
|
||||
await player.player.stopTrack(this.guild.id);
|
||||
skipVotes.set(this.guild.id, { count: 0, ids: [], max: Math.min(3, player.voiceChannel.voiceMembers.filter((i) => i.id !== this.client.user.id && !i.bot).length) });
|
||||
this.success = true;
|
||||
if (this.type === "application") return "🔊 The current song has been skipped.";
|
||||
} else {
|
||||
skipVotes.set(this.guild.id, newObject);
|
||||
this.success = true;
|
||||
return `🔊 Voted to skip song (${votes.count + 1}/${votes.max} people have voted).`;
|
||||
}
|
||||
} else {
|
||||
await player.player.stopTrack();
|
||||
this.success = true;
|
||||
if (this.type === "application") return "🔊 The current song has been skipped.";
|
||||
}
|
||||
}
|
||||
|
||||
static description = "Skips the current song";
|
||||
static aliases = ["forceskip", "s"];
|
||||
}
|
||||
|
||||
export default SkipCommand;
|
|
@ -1,28 +0,0 @@
|
|||
import { manager, players, queues } from "../../utils/soundplayer.js";
|
||||
import MusicCommand from "../../classes/musicCommand.js";
|
||||
|
||||
class StopCommand extends MusicCommand {
|
||||
async run() {
|
||||
this.success = false;
|
||||
if (!this.guild) return "This command only works in servers!";
|
||||
if (!this.member.voiceState) return "You need to be in a voice channel first!";
|
||||
if (!this.guild.voiceStates.has(this.client.user.id)) return "I'm not in a voice channel!";
|
||||
if (!this.connection) {
|
||||
await manager.getNode().leaveChannel(this.guild.id);
|
||||
this.success = true;
|
||||
return "🔊 The current voice channel session has ended.";
|
||||
}
|
||||
if (this.connection.host !== this.author && !this.member.permissions.has("MANAGE_CHANNELS")) return "Only the current voice session host can stop the music!";
|
||||
const connection = this.connection.player;
|
||||
connection.node.leaveChannel(this.guild.id);
|
||||
players.delete(this.guild.id);
|
||||
queues.delete(this.guild.id);
|
||||
this.success = true;
|
||||
return `🔊 The voice channel session in \`${this.connection.voiceChannel.name}\` has ended.`;
|
||||
}
|
||||
|
||||
static description = "Stops the music";
|
||||
static aliases = ["disconnect"];
|
||||
}
|
||||
|
||||
export default StopCommand;
|
|
@ -1,21 +0,0 @@
|
|||
import MusicCommand from "../../classes/musicCommand.js";
|
||||
|
||||
class ToggleCommand extends MusicCommand {
|
||||
async run() {
|
||||
this.success = false;
|
||||
if (!this.guild) return "This command only works in servers!";
|
||||
if (!this.member.voiceState) return "You need to be in a voice channel first!";
|
||||
if (!this.guild.voiceStates.has(this.client.user.id)) return "I'm not in a voice channel!";
|
||||
if (!this.connection) return "I haven't completely connected yet!";
|
||||
if (this.connection.host !== this.author && !this.member.permissions.has("MANAGE_CHANNELS")) return "Only the current voice session host can pause/resume the music!";
|
||||
const player = this.connection.player;
|
||||
player.setPaused(!player.paused ? true : false);
|
||||
this.success = true;
|
||||
return `🔊 The player has been ${player.paused ? "paused" : "resumed"}.`;
|
||||
}
|
||||
|
||||
static description = "Pauses/resumes the current song";
|
||||
static aliases = ["pause", "resume"];
|
||||
}
|
||||
|
||||
export default ToggleCommand;
|
Loading…
Reference in a new issue