From cf4f510e825e5f421c5577c6b8687bfeb31bc68c Mon Sep 17 00:00:00 2001 From: "Jonny_Bro (Nikita)" Date: Sat, 30 Mar 2024 12:06:19 +0500 Subject: [PATCH] v4.4.4 --- commands/!DISABLED/importmee6.js | 5 +- commands/Administration/addemoji.js | 73 ++++++++ commands/General/boosters.js | 7 +- commands/General/reminds.js | 176 +++++++++++++++++++ commands/Tickets/createticketembed.js | 2 +- dashboard/dashboard-core | 2 +- languages/en-US/administration/addemoji.json | 5 + languages/en-US/general/reminds.json | 7 + languages/ru-RU/administration/addemoji.json | 5 + languages/ru-RU/general/reminds.json | 7 + languages/uk-UA/administration/addemoji.json | 5 + languages/uk-UA/general/boosters.json | 2 +- languages/uk-UA/general/reminds.json | 7 + package.json | 4 +- 14 files changed, 297 insertions(+), 10 deletions(-) create mode 100644 commands/Administration/addemoji.js create mode 100644 commands/General/reminds.js create mode 100644 languages/en-US/administration/addemoji.json create mode 100644 languages/en-US/general/reminds.json create mode 100644 languages/ru-RU/administration/addemoji.json create mode 100644 languages/ru-RU/general/reminds.json create mode 100644 languages/uk-UA/administration/addemoji.json create mode 100644 languages/uk-UA/general/reminds.json diff --git a/commands/!DISABLED/importmee6.js b/commands/!DISABLED/importmee6.js index ce413ffb..f4467149 100644 --- a/commands/!DISABLED/importmee6.js +++ b/commands/!DISABLED/importmee6.js @@ -12,7 +12,10 @@ class ImportMee6 extends BaseCommand { command: new SlashCommandBuilder() .setName("importmee6") .setDescription(client.translate("economy/importmee6:DESCRIPTION")) - .setDescriptionLocalizations({ uk: client.translate("economy/importmee6:DESCRIPTION", null, "uk-UA"), ru: client.translate("economy/importmee6:DESCRIPTION", null, "ru-RU") }) + .setDescriptionLocalizations({ + uk: client.translate("economy/importmee6:DESCRIPTION", null, "uk-UA"), + ru: client.translate("economy/importmee6:DESCRIPTION", null, "ru-RU"), + }) .setDMPermission(false), dirname: __dirname, ownerOnly: false, diff --git a/commands/Administration/addemoji.js b/commands/Administration/addemoji.js new file mode 100644 index 00000000..1540049e --- /dev/null +++ b/commands/Administration/addemoji.js @@ -0,0 +1,73 @@ +const { SlashCommandBuilder, PermissionsBitField } = require("discord.js"); +const BaseCommand = require("../../base/BaseCommand"); + +class Addemoji extends BaseCommand { + /** + * + * @param {import("../../base/Client")} client + */ + constructor(client) { + super({ + command: new SlashCommandBuilder() + .setName("addemoji") + .setDescription(client.translate("administration/addemoji:DESCRIPTION")) + .setDescriptionLocalizations({ + uk: client.translate("administration/addemoji:DESCRIPTION", null, "uk-UA"), + ru: client.translate("administration/addemoji:DESCRIPTION", null, "ru-RU"), + }) + .setDMPermission(false) + .setDefaultMemberPermissions(PermissionsBitField.Flags.ManageGuild) + .addStringOption(option => + option + .setName("link") + .setDescription(client.translate("common:LINK")) + .setDescriptionLocalizations({ + uk: client.translate("common:LINK", null, "uk-UA"), + ru: client.translate("common:LINK", null, "ru-RU"), + }) + .setRequired(true), + ) + .addStringOption(option => + option + .setName("name") + .setDescription(client.translate("common:NAME")) + .setDescriptionLocalizations({ + uk: client.translate("common:NAME", null, "uk-UA"), + ru: client.translate("common:NAME", null, "ru-RU"), + }) + .setRequired(true), + ), + dirname: __dirname, + ownerOnly: false, + }); + } + + /** + * + * @param {import("../../base/Client")} client + * @param {import("discord.js").ChatInputCommandInteraction} interaction + */ + async execute(client, interaction) { + const link = interaction.options.getString("link"), + name = interaction.options.getString("name"); + + interaction.guild.emojis + .create({ + name: name, + attachment: link, + }) + .then(emoji => + interaction.success("administration/stealemoji:SUCCESS", { + emoji: emoji.name, + }, { ephemeral: true }), + ) + .catch(e => { + interaction.error("administration/stealemoji:ERROR", { + emoji: name, + e, + }, { ephemeral: true }); + }); + } +} + +module.exports = Addemoji; diff --git a/commands/General/boosters.js b/commands/General/boosters.js index 3429bf4f..d4f8ea19 100644 --- a/commands/General/boosters.js +++ b/commands/General/boosters.js @@ -34,7 +34,7 @@ class Boosters extends BaseCommand { interaction.data.guild = await client.findOrCreateGuild(interaction.guildId); const boosters = (await interaction.guild.members.fetch()).filter(m => m.premiumSince), - embeds = generateBoostersEmbeds(client, interaction, boosters); + embeds = generateBoostersEmbeds(interaction, boosters); const row = new ActionRowBuilder().addComponents( new ButtonBuilder().setCustomId("boosters_prev_page").setStyle(ButtonStyle.Primary).setEmoji("⬅️"), @@ -143,12 +143,11 @@ class Boosters extends BaseCommand { /** * - * @param {import("../../base/Client")} client * @param {import("discord.js").ChatInputCommandInteraction} interaction * @param {Array} boosters * @returns */ -function generateBoostersEmbeds(client, interaction, boosters) { +function generateBoostersEmbeds(interaction, boosters) { const embeds = []; let k = 10; @@ -162,7 +161,7 @@ function generateBoostersEmbeds(client, interaction, boosters) { const info = current.map(member => `${++j}. ${member.toString()} | ${interaction.translate("general/boosters:BOOSTER_SINCE")}: **${Math.floor(new Date(member.premiumSince).getTime() / 1000)}**`).join("\n"); - const embed = client.embed({ + const embed = interaction.client.embed({ title: interaction.translate("general/boosters:BOOSTERS_LIST"), description: info, }); diff --git a/commands/General/reminds.js b/commands/General/reminds.js new file mode 100644 index 00000000..648cc7f7 --- /dev/null +++ b/commands/General/reminds.js @@ -0,0 +1,176 @@ +const { SlashCommandBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle } = require("discord.js"); +const BaseCommand = require("../../base/BaseCommand"); + +class Reminds extends BaseCommand { + /** + * + * @param {import("../base/Client")} client + */ + constructor(client) { + super({ + command: new SlashCommandBuilder() + .setName("reminds") + .setDescription(client.translate("general/reminds:DESCRIPTION")) + .setDescriptionLocalizations({ + uk: client.translate("general/reminds:DESCRIPTION", null, "uk-UA"), + ru: client.translate("general/reminds:DESCRIPTION", null, "ru-RU"), + }) + .setDMPermission(false), + dirname: __dirname, + ownerOnly: false, + }); + } + + /** + * + * @param {import("../../base/Client")} client + */ + async onLoad(client) { + client.on("interactionCreate", async interaction => { + if (!interaction.isButton()) return; + + if (interaction.customId.startsWith("reminds_")) { + interaction.data = []; + interaction.data.guild = await client.findOrCreateGuild(interaction.guildId); + interaction.data.user = await client.findOrCreateUser(interaction.user.id); + + const reminds = interaction.data.user.reminds, + embeds = generateRemindsEmbeds(interaction, reminds); + + const row = new ActionRowBuilder().addComponents( + new ButtonBuilder().setCustomId("reminds_prev_page").setStyle(ButtonStyle.Primary).setEmoji("⬅️"), + new ButtonBuilder().setCustomId("reminds_next_page").setStyle(ButtonStyle.Primary).setEmoji("➡️"), + new ButtonBuilder().setCustomId("reminds_jump_page").setStyle(ButtonStyle.Secondary).setEmoji("↗️"), + new ButtonBuilder().setCustomId("reminds_stop").setStyle(ButtonStyle.Danger).setEmoji("❌"), + ); + + let currentPage = Number(interaction.message.content.match(/\d+/g)[0]) - 1 ?? 0; + + if (interaction.customId === "reminds_prev_page") { + await interaction.deferUpdate(); + + if (currentPage !== 0) { + --currentPage; + interaction.editReply({ + content: `${interaction.translate("common:PAGE")}: **${currentPage + 1}**/**${embeds.length}**`, + embeds: [embeds[currentPage]], + components: [row], + }); + } + } else if (interaction.customId === "reminds_next_page") { + await interaction.deferUpdate(); + + if (currentPage < embeds.length - 1) { + currentPage++; + interaction.editReply({ + content: `${interaction.translate("common:PAGE")}: **${currentPage + 1}**/**${embeds.length}**`, + embeds: [embeds[currentPage]], + components: [row], + }); + } + } else if (interaction.customId === "reminds_jump_page") { + await interaction.deferUpdate(); + + const msg = await interaction.followUp({ + content: interaction.translate("misc:JUMP_TO_PAGE", { + length: embeds.length, + }), + fetchReply: true, + }); + + const filter = res => { + return res.author.id === interaction.user.id && !isNaN(res.content); + }; + + interaction.channel.awaitMessages({ filter, max: 1, time: 10 * 1000 }).then(collected => { + if (embeds[collected.first().content - 1]) { + currentPage = collected.first().content - 1; + interaction.editReply({ + content: `${interaction.translate("common:PAGE")}: **${currentPage + 1}**/**${embeds.length}**`, + embeds: [embeds[currentPage]], + components: [row], + }); + + if (collected.first().deletable) collected.first().delete(); + if (msg.deletable) msg.delete(); + } else { + if (collected.first().deletable) collected.first().delete(); + if (msg.deletable) msg.delete(); + return; + } + }); + } else if (interaction.customId === "reminds_stop") { + await interaction.deferUpdate(); + + row.components.forEach(component => { + component.setDisabled(true); + }); + + return interaction.editReply({ + components: [row], + }); + } + } + }); + } + + /** + * + * @param {import("../../base/Client")} client + * @param {import("discord.js").ChatInputCommandInteraction} interaction + */ + async execute(client, interaction) { + await interaction.deferReply(); + + const reminds = interaction.data.user.reminds; + if (reminds.length === 0) return interaction.error("general/reminds:NO_REMINDS", null, { edit: true }); + + const embeds = generateRemindsEmbeds(interaction, reminds); + + const row = new ActionRowBuilder().addComponents( + new ButtonBuilder().setCustomId("reminds_prev_page").setStyle(ButtonStyle.Primary).setEmoji("⬅️"), + new ButtonBuilder().setCustomId("reminds_next_page").setStyle(ButtonStyle.Primary).setEmoji("➡️"), + new ButtonBuilder().setCustomId("reminds_jump_page").setStyle(ButtonStyle.Secondary).setEmoji("↗️"), + new ButtonBuilder().setCustomId("reminds_stop").setStyle(ButtonStyle.Danger).setEmoji("❌"), + ); + + await interaction.editReply({ + content: `${interaction.translate("common:PAGE")}: **1**/**${embeds.length}**`, + embeds: [embeds[0]], + components: [row], + }); + } +} + +/** + * + * @param {import("discord.js").ChatInputCommandInteraction} interaction + * @param {Array} reminds + * @returns + */ +function generateRemindsEmbeds(interaction, reminds) { + const embeds = []; + let k = 5; + + for (let i = 0; i < reminds.length; i += 5) { + const current = reminds + .sort((a, b) => a.createdAt - b.createdAt) + .map(g => g) + .slice(i, k); + let j = i; + k += 5; + + const info = current.map(r => `${++j}. ${interaction.client.translate("general/remindme:EMBED_CREATED")}: \n${interaction.client.translate("general/remindme:EMBED_TIME")}: \n${interaction.client.translate("common:MESSAGE")}: \`${r.message}\``).join("\n"); + + const embed = interaction.client.embed({ + title: interaction.translate("general/reminds:REMINDS_LIST"), + description: info, + }); + + embeds.push(embed); + } + + return embeds; +} + +module.exports = Reminds; diff --git a/commands/Tickets/createticketembed.js b/commands/Tickets/createticketembed.js index 9bc2c5f5..886b86b8 100644 --- a/commands/Tickets/createticketembed.js +++ b/commands/Tickets/createticketembed.js @@ -34,7 +34,7 @@ class CreateTicketEmbed extends BaseCommand { interaction.data = []; interaction.data.guild = await client.findOrCreateGuild(interaction.guildId); - const guildData = interaction.guild.data, + const guildData = interaction.data.guild, ticketsCategory = guildData.plugins?.tickets?.ticketsCategory, ticketLogs = guildData.plugins?.tickets?.ticketLogs, transcriptionLogs = guildData.plugins?.tickets?.transcriptionLogs; diff --git a/dashboard/dashboard-core b/dashboard/dashboard-core index 56517444..d63e6e43 160000 --- a/dashboard/dashboard-core +++ b/dashboard/dashboard-core @@ -1 +1 @@ -Subproject commit 565174444577d51cc6bf86d0478a01aad7be0248 +Subproject commit d63e6e4301abfdba6ba031adfd6115c4a639cb88 diff --git a/languages/en-US/administration/addemoji.json b/languages/en-US/administration/addemoji.json new file mode 100644 index 00000000..ac755cfc --- /dev/null +++ b/languages/en-US/administration/addemoji.json @@ -0,0 +1,5 @@ +{ + "DESCRIPTION": "Adds an emoji to the current server from given link", + "USAGE": "[link] [name]", + "EXAMPLES": "addemoji link:https://google.com name:google" +} \ No newline at end of file diff --git a/languages/en-US/general/reminds.json b/languages/en-US/general/reminds.json new file mode 100644 index 00000000..3ad889c3 --- /dev/null +++ b/languages/en-US/general/reminds.json @@ -0,0 +1,7 @@ +{ + "DESCRIPTION": "Lists your reminds", + "USAGE": "", + "EXAMPLES": "reminds", + "NO_REMINDS": "No reminds found", + "REMINDS_LIST": "Reminds List" +} \ No newline at end of file diff --git a/languages/ru-RU/administration/addemoji.json b/languages/ru-RU/administration/addemoji.json new file mode 100644 index 00000000..93638e19 --- /dev/null +++ b/languages/ru-RU/administration/addemoji.json @@ -0,0 +1,5 @@ +{ + "DESCRIPTION": "Добавляет эмодзи на сервер по ссылке", + "USAGE": "[link] [name]", + "EXAMPLES": "addemoji link:https://google.com name:google" +} \ No newline at end of file diff --git a/languages/ru-RU/general/reminds.json b/languages/ru-RU/general/reminds.json new file mode 100644 index 00000000..b07f1630 --- /dev/null +++ b/languages/ru-RU/general/reminds.json @@ -0,0 +1,7 @@ +{ + "DESCRIPTION": "Список ваших напоминаний", + "USAGE": "", + "EXAMPLES": "reminds", + "NO_REMINDS": "Напоминания отсутствуют", + "REMINDS_LIST": "Список Напоминаний" +} \ No newline at end of file diff --git a/languages/uk-UA/administration/addemoji.json b/languages/uk-UA/administration/addemoji.json new file mode 100644 index 00000000..8ef7869a --- /dev/null +++ b/languages/uk-UA/administration/addemoji.json @@ -0,0 +1,5 @@ +{ + "DESCRIPTION": "Додає емодзі на сервер за посиланням", + "USAGE": "[link] [name]", + "EXAMPLES": "addemoji link:https://google.com name:google" +} \ No newline at end of file diff --git a/languages/uk-UA/general/boosters.json b/languages/uk-UA/general/boosters.json index 4018bae6..c9b2b671 100644 --- a/languages/uk-UA/general/boosters.json +++ b/languages/uk-UA/general/boosters.json @@ -2,7 +2,7 @@ "DESCRIPTION": "Список учасників, які дали буст серверу", "USAGE": "", "EXAMPLES": "boosters", - "BOOSTERS_LIST": "Список бустерів", + "BOOSTERS_LIST": "Список Бустерів", "NO_BOOSTERS": "Бусти відсутні", "BOOSTER_SINCE": "Буст з" } \ No newline at end of file diff --git a/languages/uk-UA/general/reminds.json b/languages/uk-UA/general/reminds.json new file mode 100644 index 00000000..76d886b1 --- /dev/null +++ b/languages/uk-UA/general/reminds.json @@ -0,0 +1,7 @@ +{ + "DESCRIPTION": "Список ваших нагадувань", + "USAGE": "", + "EXAMPLES": "reminds", + "NO_REMINDS": "Нагадування відсутні", + "REMINDS_LIST": "Список Нагадування" +} \ No newline at end of file diff --git a/package.json b/package.json index 7435fcbe..cd923222 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,12 @@ { "name": "jaba", - "version": "4.4.3", + "version": "4.4.4", "description": "My Discord Bot", "main": "index.js", "scripts": { "preinstall": "npx only-allow pnpm", "start": "node .", - "lint": "eslint . --ext .js" + "lint": "eslint . --ext .js --ignore-pattern \"dashboard-core/\"" }, "author": "Discord: @jonny_bro", "dependencies": {