Используем createMessageComponentCollector вместо InteractionCollector

This commit is contained in:
JonnyBro 2022-08-28 21:53:54 +05:00
parent a4082163c8
commit 91096cd678
19 changed files with 231 additions and 287 deletions

3
.gitignore vendored
View file

@ -7,6 +7,9 @@
# commands.md
**/commands.md
# Data
/.data
# Clips
/clips

View file

@ -41,5 +41,4 @@ module.exports = mongoose.model("Guild", new Schema({
reports: false
}},
casesCount: { type: Number, default: 0 },
autoDeleteModCommands: { type: Boolean, default: false },
}));

View file

@ -78,10 +78,6 @@ class Config extends BaseCommand {
channels: guildData.plugins.automod.ignored.map(ch => ` ${ch}`)
}) : interaction.translate("common:DISABLED")
},
{
name: interaction.translate("administration/config:AUTODELETEMOD"),
value: guildData.autoDeleteModCommands ? interaction.translate("administration/config:AUTODELETEMOD_ENABLED") : interaction.translate("administration/config:AUTODELETEMOD_DISABLED")
},
{
name: interaction.translate("administration/config:SPECIAL_CHANNELS"),
value: interaction.translate("administration/config:NEWS", {

View file

@ -1,45 +0,0 @@
const { SlashCommandBuilder, PermissionFlagsBits } = require("discord.js");
const BaseCommand = require("../../base/BaseCommand");
class Deletemod extends BaseCommand {
/**
*
* @param {import("../../base/JaBa")} client
*/
constructor(client) {
super({
command: new SlashCommandBuilder()
.setName("deletemod")
.setDescription(client.translate("administration/deletemod:DESCRIPTION"))
.setDefaultMemberPermissions(PermissionFlagsBits.ManageGuild)
.addBooleanOption(option => option.setName("state")
.setDescription(client.translate("common:STATE"))
.setRequired(true)),
aliases: [],
dirname: __dirname,
guildOnly: true
});
}
/**
*
* @param {import("../../base/JaBa")} client
*/
async onLoad() {
//...
}
/**
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Object} data
*/
async execute(client, interaction, data) {
const state = interaction.options.getBoolean("state");
data.guildData.autoDeleteModCommands = state;
await data.guildData.save();
interaction.success(`administration/deletemod:${state ? "ENABLED" : "DISABLED"}`);
}
}
module.exports = Deletemod;

View file

@ -95,7 +95,7 @@ class Marry extends BaseCommand {
});
const filter = i => i.user.id === member.id;
const collector = interaction.channel.createMessageComponentCollector({ filter, time: (10 * 60 * 1000) });
const collector = interaction.channel.createMessageComponentCollector({ filter, idle: (10 * 60 * 1000) });
collector.on("collect", async i => {
if (i.isButton()) {
@ -107,19 +107,10 @@ class Marry extends BaseCommand {
collector.on("end", async (_, reason) => {
delete pendings[interaction.member.id];
if (reason === "time") {
const row = new ActionRowBuilder()
.addComponents(
new ButtonBuilder()
.setCustomId("marry_confirm_yes")
.setLabel(interaction.translate("common:ACCEPT"))
.setStyle(ButtonStyle.Success)
.setDisabled(true),
new ButtonBuilder()
.setCustomId("marry_confirm_no")
.setLabel(interaction.translate("common:CANCEL"))
.setStyle(ButtonStyle.Danger)
.setDisabled(true),
);
row.components.forEach(component => {
component.setDisabled(true);
});
return interaction.editReply({
components: [row]
});

View file

@ -1,4 +1,4 @@
const { SlashCommandBuilder, EmbedBuilder, ActionRowBuilder, SelectMenuBuilder, InteractionCollector, ComponentType } = require("discord.js");
const { SlashCommandBuilder, EmbedBuilder, ActionRowBuilder, SelectMenuBuilder } = require("discord.js");
const BaseCommand = require("../../base/BaseCommand"),
fetch = require("node-fetch");
@ -32,6 +32,8 @@ class Memes extends BaseCommand {
* @param {Object} data
*/
async execute(client, interaction) {
await interaction.deferReply();
const tags = ["memes", "dankmemes", "me_irl", "wholesomememes"].map(tag =>
JSON.parse(JSON.stringify({
label: tag,
@ -47,45 +49,42 @@ class Memes extends BaseCommand {
.addOptions(tags)
);
const msg = await interaction.reply({
await interaction.editReply({
content: interaction.translate("common:AVAILABLE_OPTIONS"),
components: [row],
fetchReply: true
components: [row]
});
const filter = i => i.customId === "memes_select" && i.user.id === interaction.user.id;
const collector = new InteractionCollector(client, {
filter,
componentType: ComponentType.SelectMenu,
message: msg,
idle: (60 * 1000)
});
const filter = i => i.user.id === interaction.user.id;
const collector = interaction.channel.createMessageComponentCollector({ filter, idle: (2 * 60 * 1000) });
collector.on("collect", async i => {
const tag = i?.values[0];
const res = await fetch(`https://meme-api.herokuapp.com/gimme/${tag}`).then(response => response.json());
if (i.isSelectMenu() && i.customId === "memes_select") {
i.deferUpdate();
const embed = new EmbedBuilder()
.setColor(client.config.embed.color)
.setFooter({
text: client.config.embed.footer
})
.setTitle(`${res.title}\n${interaction.translate("fun/memes:SUBREDDIT")}: ${res.subreddit}\n${interaction.translate("common:AUTHOR")}: ${res.author}\n${interaction.translate("fun/memes:UPS")}: ${res.ups}`)
.setImage(res.url)
.setTimestamp();
const tag = i.values[0];
const res = await fetch(`https://meme-api.herokuapp.com/gimme/${tag}`).then(response => response.json());
await i.update({
embeds: [embed]
});
});
const embed = new EmbedBuilder()
.setColor(client.config.embed.color)
.setFooter({
text: client.config.embed.footer
})
.setTitle(res.title)
.setDescription(`${interaction.translate("fun/memes:SUBREDDIT")}: **${res.subreddit}**\n${interaction.translate("common:AUTHOR")}: **${res.author}**\n${interaction.translate("fun/memes:UPS")}: **${res.ups}**`)
.setImage(res.url)
.setTimestamp();
collector.on("end", (_, reason) => {
if (reason === "idle") {
if (msg) msg.update({
components: []
await interaction.editReply({
embeds: [embed]
});
}
});
collector.on("end", () => {
return interaction.editReply({
components: []
});
});
}
}

View file

@ -1,4 +1,4 @@
const { SlashCommandBuilder, EmbedBuilder, ActionRowBuilder, SelectMenuBuilder, InteractionCollector, PermissionsBitField, ComponentType } = require("discord.js"),
const { SlashCommandBuilder, EmbedBuilder, ActionRowBuilder, SelectMenuBuilder, PermissionsBitField } = require("discord.js"),
{ defaultApplications } = require("../../helpers/discordTogether");
const BaseCommand = require("../../base/BaseCommand");
@ -32,6 +32,8 @@ class Activity extends BaseCommand {
* @param {Object} data
*/
async execute(client, interaction) {
await interaction.deferReply();
const voice = interaction.member.voice.channel;
if (!voice) return interaction.error("music/play:NO_VOICE_CHANNEL");
@ -53,46 +55,43 @@ class Activity extends BaseCommand {
.addOptions(activities)
);
const msg = await interaction.reply({
await interaction.reply({
content: interaction.translate("general/activity:AVAILABLE_ACTIVITIES"),
components: [row],
fetchReply: true
components: [row]
});
const filter = i => i.customId === "activity_select" && i.user.id === interaction.user.id;
const collector = new InteractionCollector(client, {
filter,
componentType: ComponentType.SelectMenu,
message: msg,
idle: (2 * 1000)
});
const filter = i => i.user.id === interaction.user.id;
const collector = interaction.channel.createMessageComponentCollector({ filter, idle: (15 * 1000) });
collector.on("collect", async i => {
const activity = i?.values[0];
if (i.isSelectMenu() && i.customId === "activity_select") {
const activity = i?.values[0];
const invite = await client.discordTogether.createTogetherCode(voice.id, activity);
const embed = new EmbedBuilder()
.setTitle(activity)
.setColor(client.config.embed.color)
.setDescription(`**[${interaction.translate("general/activity:CLICK_HERE", { activity: defaultApplications.find(a => a.id === activity).name, channel: voice.name })}](${invite.code})**`)
.setFooter({
text: client.config.embed.footer
})
.setTimestamp();
const invite = await client.discordTogether.createTogetherCode(voice.id, activity);
const embed = new EmbedBuilder()
.setTitle(defaultApplications.find(a => a.id === activity).name)
.setColor(client.config.embed.color)
.setDescription(`**[${interaction.translate("general/activity:CLICK_HERE", {
activity: defaultApplications.find(a => a.id === activity).name,
channel: voice.name
})}](${invite.code})**`)
.setFooter({
text: client.config.embed.footer
})
.setTimestamp();
await i.update({
embeds: [embed],
components: []
});
});
collector.on("end", (_, reason) => {
if (reason === "idle") {
if (msg) msg.update({
await interaction.editReply({
embeds: [embed],
components: []
});
}
});
collector.on("end", () => {
return interaction.editReply({
components: []
});
});
}
}

View file

@ -1,4 +1,4 @@
const { SlashCommandBuilder, EmbedBuilder, ActionRowBuilder, SelectMenuBuilder, InteractionCollector, PermissionsBitField, ComponentType } = require("discord.js");
const { SlashCommandBuilder, EmbedBuilder, ActionRowBuilder, SelectMenuBuilder, PermissionsBitField } = require("discord.js");
const BaseCommand = require("../../base/BaseCommand");
class Help extends BaseCommand {
@ -34,14 +34,16 @@ class Help extends BaseCommand {
* @param {Object} data
*/
async execute(client, interaction) {
await interaction.deferReply();
const commands = [...new Map(client.commands.map(v => [v.constructor.name, v])).values()];
const categories = [];
const command = interaction.options.getString("command");
if (command) {
const embed = generateCommandHelp(client, interaction, command);
const embed = generateCommandHelp(interaction, command);
return interaction.reply({
return interaction.editReply({
embeds: [embed]
});
}
@ -68,60 +70,57 @@ class Help extends BaseCommand {
.addOptions(categoriesRows)
);
const msg = await interaction.reply({
await interaction.editReply({
content: interaction.translate("common:AVAILABLE_OPTIONS"),
components: [row],
fetchReply: true
components: [row]
});
const collector = new InteractionCollector(client, {
componentType: ComponentType.SelectMenu,
message: msg,
idle: (2 * 1000)
});
const filter = i => i.user.id === interaction.user.id;
const collector = interaction.channel.createMessageComponentCollector({ filter, idle: (15 * 1000) });
collector.on("collect", async msg => {
const arg = msg?.values[0];
collector.on("collect", async i => {
if (i.isSelectMenu() && (i.customId === "help_category_select" || i.customId === "help_commands_select")) {
i.deferUpdate();
if (categories.find(c => c === arg)) {
const categoryCommands = commands.filter(cmd => cmd.category === arg).map(c => {
return {
label: c.command.name,
value: c.command.name
};
});
const arg = i?.values[0];
const commandsRow = new ActionRowBuilder()
.addComponents(
new SelectMenuBuilder()
.setCustomId("help_commands_select")
.setPlaceholder(client.translate("common:NOTHING_SELECTED"))
.addOptions(categoryCommands)
);
if (categories.includes(arg)) {
const categoryCommands = commands.filter(cmd => cmd.category === arg).map(c => {
return {
label: c.command.name,
value: c.command.name
};
});
await msg.update({
content: interaction.translate("general/help:COMMANDS_IN", {
category: arg
}),
components: [commandsRow],
fetchReply: true
});
} else {
const embed = generateCommandHelp(client, interaction, arg);
await msg.update({
content: null,
components: [],
embeds: [embed]
});
const commandsRow = new ActionRowBuilder()
.addComponents(
new SelectMenuBuilder()
.setCustomId("help_commands_select")
.setPlaceholder(client.translate("common:NOTHING_SELECTED"))
.addOptions(categoryCommands)
);
return await interaction.editReply({
content: interaction.translate("general/help:COMMANDS_IN", {
category: arg
}),
components: [commandsRow]
});
} else {
const embed = generateCommandHelp(interaction, arg);
return interaction.editReply({
content: null,
components: [],
embeds: [embed]
});
}
}
});
collector.on("end", (_, reason) => {
if (reason === "idle") {
if (msg) msg.update({
components: []
});
}
collector.on("end", () => {
return interaction.editReply({
components: []
});
});
}
}
@ -132,9 +131,9 @@ function getPermName(bitfield = 0) {
return null;
}
function generateCommandHelp(client, interaction, command) {
const cmd = client.commands.get(command);
if (!cmd) return interaction.error("general/help:NOT_FOUND", { search: command });
function generateCommandHelp(interaction, command) {
const cmd = interaction.client.commands.get(command);
if (!cmd) return interaction.error("general/help:NOT_FOUND", { search: command }, { edit: true });
const embed = new EmbedBuilder()
.setAuthor({
@ -164,9 +163,9 @@ function generateCommandHelp(client, interaction, command) {
value: cmd.command.default_member_permissions > 0 ? interaction.translate(`misc:PERMISSIONS:${getPermName(cmd.command.default_member_permissions)}`) : interaction.translate("general/help:NO_REQUIRED_PERMISSION")
}
])
.setColor(client.config.embed.color)
.setColor(interaction.client.config.embed.color)
.setFooter({
text: client.config.embed.footer
text: interaction.client.config.embed.footer
});
return embed;

View file

@ -36,6 +36,8 @@ class Clear extends BaseCommand {
* @param {Object} data
*/
async execute(client, interaction) {
await interaction.deferReply({ ephemeral: true });
const option = interaction.options.getString("option");
const member = interaction.options.getMember("user");
@ -52,37 +54,54 @@ class Clear extends BaseCommand {
.setStyle(ButtonStyle.Secondary),
);
await interaction.reply({
await interaction.editReply({
content: interaction.translate("moderation/clear:ALL_CONFIRM"),
ephemeral: true,
components: [row]
});
const filter = i => i.user.id === interaction.user.id;
const collector = interaction.channel.createMessageComponentCollector({ filter, time: 15000 });
const collector = interaction.channel.createMessageComponentCollector({ filter, idle: (15 * 1000) });
collector.on("collect", async i => {
if (i.isButton()) {
if (i.customId === "clear_confirm_yes") {
i.deferUpdate();
const position = interaction.channel.position;
const newChannel = await interaction.channel.clone();
await interaction.channel.delete();
newChannel.setPosition(position);
await newChannel.send({
return newChannel.send({
content: interaction.translate("moderation/clear:CHANNEL_CLEARED")
});
} else if (i.customId === "clear_confirm_no") {
row.components[0].setDisabled(true);
row.components[1].setDisabled(true);
i.update({
content: interaction.translate("misc:SELECT_CANCELED")
});
i.deferUpdate();
collector.stop("cancel");
}
}
});
collector.on("end", async (_, reason) => {
if (reason === "cancel") {
row.components.forEach(component => {
component.setDisabled(true);
});
interaction.editReply({
content: interaction.translate("misc:SELECT_CANCELED"),
components: [row]
});
} else if (reason === "idle") {
row.components.forEach(component => {
component.setDisabled(true);
});
interaction.editReply({
components: [row]
});
}
});
} else {
if (isNaN(option) || parseInt(option) < 1) return interaction.error("misc:OPTION_NAN_ALL", null, { ephemeral: true });
let messages = await interaction.channel.messages.fetch({

View file

@ -69,7 +69,7 @@ class Giveaway extends BaseCommand {
filter,
componentType: ComponentType.SelectMenu,
message: msg,
idle: 30 * 1000
idle: (30 * 1000)
});
collector.on("collect", async i => {

View file

@ -65,7 +65,7 @@ class Poll extends BaseCommand {
let mention = null;
const filter = i => i.user.id === interaction.user.id;
const collector = interaction.channel.createMessageComponentCollector({ filter, time: 15000 });
const collector = interaction.channel.createMessageComponentCollector({ filter, idle: (15 * 1000) });
collector.on("collect", async i => {
if (i.isButton()) {

View file

@ -1,4 +1,4 @@
const { SlashCommandBuilder, ActionRowBuilder, SelectMenuBuilder, InteractionCollector, ComponentType } = require("discord.js"),
const { SlashCommandBuilder, ActionRowBuilder, SelectMenuBuilder, } = require("discord.js"),
{ joinVoiceChannel, createAudioResource, createAudioPlayer, getVoiceConnection, AudioPlayerStatus } = require("@discordjs/voice");
const BaseCommand = require("../../base/BaseCommand"),
fs = require("fs");
@ -34,6 +34,8 @@ class Clips extends BaseCommand {
*/
async execute(client, interaction) {
fs.readdir("./clips", async function (err, files) {
await interaction.deferReply();
if (err) return console.log("Unable to read directory: " + err);
const clips = files.map(file => {
@ -52,68 +54,62 @@ class Clips extends BaseCommand {
.addOptions(clips)
);
const msg = await interaction.reply({
await interaction.editReply({
content: interaction.translate("music/clips:AVAILABLE_CLIPS"),
components: [row],
fetchReply: true
components: [row]
});
const filter = i => i.customId === "clips_select" && i.user.id === interaction.user.id;
const collector = new InteractionCollector(client, {
filter,
componentType: ComponentType.SelectMenu,
message: msg,
idle: (2 * 1000)
});
const filter = i => i.user.id === interaction.user.id;
const collector = interaction.channel.createMessageComponentCollector({ filter, idle: (15 * 1000) });
collector.on("collect", async i => {
const clip = i?.values[0];
const voice = i.member.voice.channel;
if (!voice) return i.update({ content: interaction.translate("music/play:NO_VOICE_CHANNEL"), components: [] });
const queue = client.player.getQueue(i.guild.id);
if (queue) return i.update({ content: interaction.translate("music/clips:ACTIVE_QUEUE"), components: [] });
if (getVoiceConnection(i.guild.id)) return i.update({ content: interaction.translate("music/clips:ACTIVE_CLIP"), components: [] });
if (!fs.existsSync(`./clips/${clip}.mp3`)) return i.update({ content: interaction.translate("music/clips:NO_FILE", { file: clip }), components: [] });
if (i.isSelectMenu() && i.customId === "clips_select") {
const clip = i?.values[0];
const voice = i.member.voice.channel;
if (!voice) return i.update({ content: interaction.translate("music/play:NO_VOICE_CHANNEL"), components: [] });
const queue = client.player.getQueue(i.guild.id);
if (queue) return i.update({ content: interaction.translate("music/clips:ACTIVE_QUEUE"), components: [] });
if (getVoiceConnection(i.guild.id)) return i.update({ content: interaction.translate("music/clips:ACTIVE_CLIP"), components: [] });
if (!fs.existsSync(`./clips/${clip}.mp3`)) return i.update({ content: interaction.translate("music/clips:NO_FILE", { file: clip }), components: [] });
try {
const connection = joinVoiceChannel({
channelId: voice.id,
guildId: i.guild.id,
adapterCreator: i.guild.voiceAdapterCreator
});
const resource = createAudioResource(fs.createReadStream(`./clips/${clip}.mp3`));
const player = createAudioPlayer()
.on("error", err => {
connection.destroy();
console.error(err.message);
try {
const connection = joinVoiceChannel({
channelId: voice.id,
guildId: interaction.guild.id,
adapterCreator: interaction.guild.voiceAdapterCreator
});
player.play(resource);
connection.subscribe(player);
const resource = createAudioResource(fs.createReadStream(`./clips/${clip}.mp3`));
const player = createAudioPlayer()
.on("error", err => {
connection.destroy();
console.error(err.message);
});
player.on(AudioPlayerStatus.Idle, () => {
connection.destroy();
});
} catch (error) {
console.error(error);
}
player.play(resource);
connection.subscribe(player);
await i.update({
content: interaction.translate("music/clips:PLAYING", {
clip
}),
components: []
});
});
player.on(AudioPlayerStatus.Idle, () => {
connection.destroy();
});
} catch (error) {
console.error(error);
}
collector.on("end", (_, reason) => {
if (reason === "idle") {
if (msg) msg.update({
await interaction.editReply({
content: interaction.translate("music/clips:PLAYING", {
clip
}),
components: []
});
}
});
collector.on("end", () => {
return interaction.editReply({
components: []
});
});
});
}
}

View file

@ -73,7 +73,7 @@ class Loop extends BaseCommand {
const collector = interaction.channel.createMessageComponentCollector({ filter, idle: (15 * 1000) });
collector.on("collect", async i => {
if (i.isSelectMenu()) {
if (i.isSelectMenu() && i.customId === "loop_select") {
const type = i?.values[0];
const mode = type === "3" ? QueueRepeatMode.AUTOPLAY :
type === "2" ? QueueRepeatMode.QUEUE :

View file

@ -72,7 +72,7 @@ class Queue extends BaseCommand {
});
const filter = i => i.user.id === interaction.user.id;
const collector = interaction.channel.createMessageComponentCollector({ filter, idle: (60 * 1000) });
const collector = interaction.channel.createMessageComponentCollector({ filter, idle: (20 * 1000) });
collector.on("collect", async i => {
if (i.isButton()) {
@ -143,21 +143,19 @@ class Queue extends BaseCommand {
});
} else if (i.customId === "queue_stop") {
i.deferUpdate();
collector.stop(true);
collector.stop();
}
}
});
collector.on("end", async (_, reason) => {
if (reason) {
row.components.forEach(component => {
component.setDisabled(true);
});
collector.on("end", () => {
row.components.forEach(component => {
component.setDisabled(true);
});
return interaction.editReply({
components: [row]
});
}
return interaction.editReply({
components: [row]
});
});
}
}

View file

@ -1,4 +1,4 @@
const { SlashCommandBuilder, EmbedBuilder, ActionRowBuilder, SelectMenuBuilder, InteractionCollector, ComponentType } = require("discord.js");
const { SlashCommandBuilder, EmbedBuilder, ActionRowBuilder, SelectMenuBuilder } = require("discord.js");
const BaseCommand = require("../../base/BaseCommand"),
fetch = require("node-fetch");
@ -32,6 +32,8 @@ class NSFW extends BaseCommand {
* @param {Object} data
*/
async execute(client, interaction) {
await interaction.deferReply({ ephemeral: true });
if (!interaction.channel.nsfw) return interaction.replyT("misc:NSFW_COMMAND", null, { ephemeral: true });
const tags = ["hentai", "ecchi", "lewdanimegirls", "hentaifemdom", "animefeets", "animebooty", "biganimetiddies", "sideoppai", "ahegao"].map(tag =>
@ -49,46 +51,43 @@ class NSFW extends BaseCommand {
.addOptions(tags)
);
const msg = await interaction.reply({
await interaction.editReply({
content: interaction.translate("common:AVAILABLE_OPTIONS"),
ephemeral: true,
components: [row],
fetchReply: true
components: [row]
});
const filter = i => i.customId === "nsfw_select" && i.user.id === interaction.user.id;
const collector = new InteractionCollector(client, {
filter,
componentType: ComponentType.SelectMenu,
message: msg,
idle: (60 * 1000)
});
const filter = i => i.user.id === interaction.user.id;
const collector = interaction.channel.createMessageComponentCollector({ filter, idle: (2 * 60 * 1000) });
collector.on("collect", async i => {
const tag = i?.values[0];
const res = await fetch(`https://meme-api.herokuapp.com/gimme/${tag}`).then(response => response.json());
if (i.isSelectMenu() && i.customId === "nsfw_select") {
i.deferUpdate();
const embed = new EmbedBuilder()
.setColor(client.config.embed.color)
.setFooter({
text: client.config.embed.footer
})
.setTitle(`${res.title}\n${interaction.translate("fun/memes:SUBREDDIT")}: ${res.subreddit}\n${interaction.translate("common:AUTHOR")}: ${res.author}\n${interaction.translate("fun/memes:UPS")}: ${res.ups}`)
.setImage(res.url)
.setTimestamp();
const tag = i?.values[0];
const res = await fetch(`https://meme-api.herokuapp.com/gimme/${tag}`).then(response => response.json());
await i.update({
embeds: [embed]
});
});
const embed = new EmbedBuilder()
.setColor(client.config.embed.color)
.setFooter({
text: client.config.embed.footer
})
.setTitle(res.title)
.setDescription(`${interaction.translate("fun/memes:SUBREDDIT")}: **${res.subreddit}**\n${interaction.translate("common:AUTHOR")}: **${res.author}**\n${interaction.translate("fun/memes:UPS")}: **${res.ups}**`)
.setImage(res.url)
.setTimestamp();
collector.on("end", (_, reason) => {
if (reason === "idle") {
if (msg) msg.update({
components: []
await interaction.editReply({
embeds: [embed]
});
}
});
collector.on("end", () => {
return interaction.editReply({
components: []
});
});
}
}

View file

@ -84,7 +84,7 @@ class Servers extends BaseCommand {
description = `${interaction.translate("common:SERVERS")}: ${client.guilds.cache.size}\n\n` +
client.guilds.cache
.sort((a, b) => b.memberCount - a.memberCount)
.map((r) => r)
.map(r => r)
.map((r, i) => `**${i + 1}** - ${r.name} | ${r.memberCount} ${client.getNoun(r.memberCount, interaction.translate("misc:NOUNS:MEMBERS:1"), interaction.translate("misc:NOUNS:MEMBERS:2"), interaction.translate("misc:NOUNS:MEMBERS:5"))}`)
.slice(i0, i1)
.join("\n");

View file

@ -22,9 +22,6 @@
"AUTOMOD_TITLE": "Auto-moderation:",
"AUTOMOD_CONTENT": "Auto-moderation enabled.\n*Ignored channels: {{channels}}*",
"AUTOMOD_DISABLED": "Auto-moderation disabled.",
"AUTODELETEMOD": "Auto delete mod commands",
"AUTODELETEMOD_ENABLED": "Automatic moderation commands deletion.",
"AUTODELETEMOD_DISABLED": "Automatic moderation commands deletion disabled.",
"DASHBOARD_TITLE": "Edit your configuration:",
"DASHBOARD_CONTENT": "Click here to go on the dashboard!",
"AUTO_SANCTIONS": "Automatic sanctions",

View file

@ -15,9 +15,6 @@
"REPORTS": "Жалобы: {{channel}}",
"AUTOMOD_TITLE": "Автомодерация",
"AUTOMOD_CONTENT": "Автомодерация включена.\nИгнорируемые каналы: {{channels}}",
"AUTODELETEMOD": "Автоудаление команд модерации",
"AUTODELETEMOD_ENABLED": "Автоудаление команд модерации включено.",
"AUTODELETEMOD_DISABLED": "Автоудаление команд модерации отключено.",
"AUTO_SANCTIONS": "Автоматические наказания",
"KICK_CONTENT": "Кик: После **{{count}}** предупреждений.",
"KICK_NOT_DEFINED": "Кик: Не назначено.",

View file

@ -22,9 +22,6 @@
"AUTOMOD_TITLE": "Автомодерація",
"AUTOMOD_CONTENT": "Автомодерація увімкнена.\n*Ігноровані канали: {{channels}}*",
"AUTOMOD_DISABLED": "Автомодерація вимкнена.",
"AUTODELETEMOD": "Автовидалення команд модерації",
"AUTODELETEMOD_ENABLED": "Автовидалення команд модерації увімкнено.",
"AUTODELETEMOD_DISABLED": "Автовидалення команд модерації вимкнено.",
"DASHBOARD_TITLE": "Змінити налаштування",
"DASHBOARD_CONTENT": "Натисніть сюди, щоб перейти до панелі керування!",
"AUTO_SANCTIONS": "Автоматичні покарання",