Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,5 @@ node_modules/
logs/
rejection.txt
exception.txt
Dockerfile
Dockerfile
dist/
60 changes: 31 additions & 29 deletions commands/music/audiofilter.js → commands/music/audiofilter.ts
Original file line number Diff line number Diff line change
@@ -1,25 +1,24 @@
require("dotenv").config();
const { SlashCommandBuilder } = require("@discordjs/builders");
const { EmbedBuilder, MessageFlags } = require("discord.js");
const { useMainPlayer } = require("discord-player");
const {
buildRequestedByFooter,
translate,
translateAudioFilter,
translateGenericAction,
} = require("../../utils/botText");
const {
import "dotenv/config";
import { SlashCommandBuilder } from "@discordjs/builders";
import { EmbedBuilder, MessageFlags } from "discord.js";
import { useMainPlayer } from "discord-player";
import type { GuildCommandInteraction } from "../../types/discord";
import type { ExtendedClient } from "../../types";
import { buildRequestedByFooter, translate, translateAudioFilter, translateGenericAction } from "../../utils/botText";
import {
ensureDjAccess,
ensureInVoiceChannel,
ensureSameVoiceChannel,
getQueueNotPlayingResponse,
} = require("../../utils/interactionGuards");
} from "../../utils/interactionGuards";

module.exports = {
const client = (globalThis as any).client as ExtendedClient;

export default {
data: new SlashCommandBuilder()
.setName("audiofilter")
.setDescription("Check or toggle audio filters!")
.addStringOption((option) =>
.addStringOption((option: any) =>
option.setName("filter").setDescription("What filter do you want to toggle?").setRequired(false).addChoices(
{
name: "Bassboost",
Expand Down Expand Up @@ -59,23 +58,26 @@ module.exports = {
},
),
),
async execute(interaction) {
async execute(interaction: GuildCommandInteraction): Promise<void> {
const filter = interaction.options.getString("filter");
if (!(await ensureDjAccess(interaction))) return;
if (!(await ensureInVoiceChannel(interaction))) return;
if (!(await ensureSameVoiceChannel(interaction))) return;

const player = useMainPlayer();
var queue = player.nodes.get(interaction.guild.id);
if (!queue || !queue.isPlaying()) return interaction.reply(getQueueNotPlayingResponse(interaction));
const queue = player.nodes.get(interaction.guild.id);
if (!queue || !queue.isPlaying()) {
await interaction.reply(getQueueNotPlayingResponse(interaction));
return;
}

if (!filter) {
var curFilters = queue.filters.ffmpeg.getFiltersEnabled();
const curFilters = queue.filters.ffmpeg.getFiltersEnabled();

if (curFilters.length == 0) {
interaction.reply({ content: translate(interaction, "audiofilter.noneEnabled") });
if (curFilters.length === 0) {
await interaction.reply({ content: translate(interaction, "audiofilter.noneEnabled") });
} else {
interaction.reply({
await interaction.reply({
content: translate(interaction, "audiofilter.listEnabled", {
filters: curFilters
.map((enabledFilter) => translateAudioFilter(interaction, enabledFilter))
Expand All @@ -84,11 +86,11 @@ module.exports = {
});
}
} else {
const isEnabled = queue.filters.ffmpeg.getFiltersEnabled().includes(filter);
const isEnabled = queue.filters.ffmpeg.getFiltersEnabled().includes(filter as any);
const filterembed = new EmbedBuilder()
.setAuthor({ name: interaction.client.user.tag, iconURL: interaction.client.user.displayAvatarURL() })
.setThumbnail(interaction.guild.iconURL({ dynamic: true }))
.setColor(client.config.embedColour)
.setAuthor({ name: interaction.client.user!.tag, iconURL: interaction.client.user!.displayAvatarURL() })
.setThumbnail(interaction.guild.iconURL())
.setColor(client.config.embedColour as any)
.setTitle(translate(interaction, "audiofilter.toggleTitle"))
.setDescription(
translate(interaction, "audiofilter.toggleDescription", {
Expand All @@ -103,10 +105,10 @@ module.exports = {
.setFooter(buildRequestedByFooter(interaction, interaction.user));

try {
queue.filters.ffmpeg.toggle(filter);
interaction.reply({ embeds: [filterembed] });
} catch (err) {
interaction.reply({
queue.filters.ffmpeg.toggle(filter as any);
await interaction.reply({ embeds: [filterembed] });
} catch {
await interaction.reply({
content: translateGenericAction(interaction, "adjustingAudioFilter"),
flags: MessageFlags.Ephemeral,
});
Expand Down
52 changes: 28 additions & 24 deletions commands/music/back.js → commands/music/back.ts
Original file line number Diff line number Diff line change
@@ -1,42 +1,46 @@
require("dotenv").config();
const { SlashCommandBuilder } = require("@discordjs/builders");
const { EmbedBuilder, MessageFlags } = require("discord.js");
const { useMainPlayer } = require("discord-player");
const {
buildRequestedByFooter,
buildTrackLinkText,
translate,
translateGenericAction,
} = require("../../utils/botText");
const {
import "dotenv/config";
import { SlashCommandBuilder } from "@discordjs/builders";
import { EmbedBuilder, MessageFlags } from "discord.js";
import { useMainPlayer } from "discord-player";
import type { GuildCommandInteraction } from "../../types/discord";
import type { ExtendedClient } from "../../types";
import { buildRequestedByFooter, buildTrackLinkText, translate, translateGenericAction } from "../../utils/botText";
import {
ensureDjAccess,
ensureInVoiceChannel,
ensureSameVoiceChannel,
getQueueNotPlayingResponse,
} = require("../../utils/interactionGuards");
} from "../../utils/interactionGuards";

module.exports = {
const client = (globalThis as any).client as ExtendedClient;

export default {
data: new SlashCommandBuilder().setName("back").setDescription("Play the previous song!"),
async execute(interaction) {
async execute(interaction: GuildCommandInteraction): Promise<void> {
if (!(await ensureDjAccess(interaction))) return;
if (!(await ensureInVoiceChannel(interaction))) return;
if (!(await ensureSameVoiceChannel(interaction))) return;

const player = useMainPlayer();
var queue = player.nodes.get(interaction.guild.id);
if (!queue || !queue.isPlaying()) return interaction.reply(getQueueNotPlayingResponse(interaction));
const queue = player.nodes.get(interaction.guild.id);
if (!queue || !queue.isPlaying()) {
await interaction.reply(getQueueNotPlayingResponse(interaction));
return;
}

const previousTracks = queue.history.tracks.toArray();
if (!previousTracks[0])
return interaction.reply({
if (!previousTracks[0]) {
await interaction.reply({
content: translate(interaction, "np.backMissing"),
flags: MessageFlags.Ephemeral,
});
return;
}

const backembed = new EmbedBuilder()
.setAuthor({ name: interaction.client.user.tag, iconURL: interaction.client.user.displayAvatarURL() })
.setThumbnail(interaction.guild.iconURL({ dynamic: true }))
.setColor(client.config.embedColour)
.setAuthor({ name: interaction.client.user!.tag, iconURL: interaction.client.user!.displayAvatarURL() })
.setThumbnail(interaction.guild.iconURL())
.setColor(client.config.embedColour as any)
.setTitle(translate(interaction, "np.backTitle"))
.setDescription(
translate(interaction, "np.backDescription", {
Expand All @@ -49,9 +53,9 @@ module.exports = {

try {
queue.history.back();
interaction.reply({ embeds: [backembed] });
} catch (err) {
interaction.reply({
await interaction.reply({ embeds: [backembed] });
} catch {
await interaction.reply({
content: translateGenericAction(interaction, "returningToPreviousSong"),
flags: MessageFlags.Ephemeral,
});
Expand Down
43 changes: 0 additions & 43 deletions commands/music/clearqueue.js

This file was deleted.

50 changes: 50 additions & 0 deletions commands/music/clearqueue.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
import "dotenv/config";
import { SlashCommandBuilder } from "@discordjs/builders";
import { EmbedBuilder, MessageFlags } from "discord.js";
import { useMainPlayer } from "discord-player";
import type { GuildCommandInteraction } from "../../types/discord";
import type { ExtendedClient } from "../../types";
import { buildRequestedByFooter, translate, translateGenericAction } from "../../utils/botText";
import {
ensureDjAccess,
ensureInVoiceChannel,
ensureSameVoiceChannel,
getQueueNotPlayingResponse,
} from "../../utils/interactionGuards";

const client = (globalThis as any).client as ExtendedClient;

export default {
data: new SlashCommandBuilder().setName("clearqueue").setDescription("Clear the current music queue!"),
async execute(interaction: GuildCommandInteraction): Promise<void> {
if (!(await ensureDjAccess(interaction))) return;
if (!(await ensureInVoiceChannel(interaction))) return;
if (!(await ensureSameVoiceChannel(interaction))) return;

const player = useMainPlayer();
const queue = player.nodes.get(interaction.guild.id);
if (!queue || !queue.isPlaying()) {
await interaction.reply(getQueueNotPlayingResponse(interaction));
return;
}

const clearembed = new EmbedBuilder()
.setAuthor({ name: interaction.client.user!.tag, iconURL: interaction.client.user!.displayAvatarURL() })
.setThumbnail(interaction.guild.iconURL())
.setColor(client.config.embedColour as any)
.setTitle(translate(interaction, "queue.clearTitle"))
.setDescription(translate(interaction, "queue.clearDescription"))
.setTimestamp()
.setFooter(buildRequestedByFooter(interaction, interaction.user));

try {
queue.tracks.clear();
await interaction.reply({ embeds: [clearembed] });
} catch {
await interaction.reply({
content: translateGenericAction(interaction, "clearingQueue"),
flags: MessageFlags.Ephemeral,
});
}
},
};
Loading