diff --git a/commands/Administration/config.js b/commands/Administration/config.js index 854b92fa..15a4e157 100644 --- a/commands/Administration/config.js +++ b/commands/Administration/config.js @@ -156,7 +156,7 @@ class Config extends BaseCommand { state = interaction.options.getBoolean("state"), channel = interaction.options.getChannel("channel"); - await changeSetting(interaction, setting, state, channel); + await changeSetting(interaction, setting, state, channel, data.guildData); } } } @@ -167,13 +167,14 @@ class Config extends BaseCommand { * @param {String} setting * @param {Boolean} state * @param {import("discord.js").GuildTextBasedChannel} channel + * @param {import("../../base/Guild")} guildData * @returns */ -async function changeSetting(interaction, setting, state, channel) { +async function changeSetting(interaction, setting, state, channel, guildData) { if (!state) { - interaction.guild.data.plugins[setting] = null; - interaction.guild.data.markModified(`plugins.${setting}`); - await interaction.guild.data.save(); + guildData.plugins[setting] = null; + guildData.markModified(`plugins.${setting}`); + await guildData.save(); return interaction.reply({ content: `${interaction.translate(`administration/config:${setting.toUpperCase()}`)}: **${interaction.translate("common:DISABLED")}**`, @@ -181,16 +182,16 @@ async function changeSetting(interaction, setting, state, channel) { }); } else { if (channel) { - interaction.guild.data.plugins[setting] = channel.id; - interaction.guild.data.markModified(`plugins.${setting}`); - await interaction.guild.data.save(); + guildData.plugins[setting] = channel.id; + guildData.markModified(`plugins.${setting}`); + await guildData.save(); return interaction.reply({ content: `${interaction.translate(`administration/config:${setting.toUpperCase()}`)}: **${interaction.translate("common:ENABLED")}** (${channel.toString()})`, ephemeral: true, }); } else return interaction.reply({ - content: `${interaction.translate(`administration/config:${setting.toUpperCase()}`)}: ${interaction.guild.data.plugins[setting] ? `**${interaction.translate("common:ENABLED")}** (<#${interaction.guild.data.plugins[setting]}>)` : `**${interaction.translate("common:DISABLED")}**`}`, + content: `${interaction.translate(`administration/config:${setting.toUpperCase()}`)}: ${guildData.plugins[setting] ? `**${interaction.translate("common:ENABLED")}** (<#${guildData.plugins[setting]}>)` : `**${interaction.translate("common:DISABLED")}**`}`, ephemeral: true, }); } diff --git a/commands/General/boosters.js b/commands/General/boosters.js index 661f14f8..785fbbf0 100644 --- a/commands/General/boosters.js +++ b/commands/General/boosters.js @@ -34,14 +34,14 @@ class Boosters extends BaseCommand { * @param {import("discord.js").ChatInputCommandInteraction} interaction * @param {Object} data */ - async execute(client, interaction) { + async execute(client, interaction, data) { await interaction.deferReply(); let currentPage = 0; const boosters = (await interaction.guild.members.fetch()).filter(m => m.premiumSince); if (boosters.size === 0) return interaction.error("general/boosters:NO_BOOSTERS", null, { edit: true }); - const embeds = generateBoostersEmbeds(client, interaction, boosters); + const embeds = generateBoostersEmbeds(client, interaction, boosters, data.guildData); const row = new ActionRowBuilder() .addComponents( @@ -151,9 +151,10 @@ class Boosters extends BaseCommand { * @param {import("../../base/JaBa")} client * @param {import("discord.js").ChatInputCommandInteraction} interaction * @param {Array} boosters + * @param {import("../../base/Guild")} guildData * @returns */ -function generateBoostersEmbeds(client, interaction, boosters) { +function generateBoostersEmbeds(client, interaction, boosters, guildData) { const embeds = []; let k = 10; @@ -162,7 +163,7 @@ function generateBoostersEmbeds(client, interaction, boosters) { let j = i; k += 10; - const info = current.map(member => `${++j}. ${member.toString()} | ${interaction.translate("general/boosters:BOOSTER_SINCE")}: **${client.functions.printDate(client, member.premiumSince, null, interaction.guild.data.language)}**`).join("\n"); + const info = current.map(member => `${++j}. ${member.toString()} | ${interaction.translate("general/boosters:BOOSTER_SINCE")}: **${client.functions.printDate(client, member.premiumSince, null, guildData.language)}**`).join("\n"); const embed = new EmbedBuilder() .setColor(interaction.client.config.embed.color) diff --git a/commands/General/remindme.js b/commands/General/remindme.js index bac08144..8679aa4e 100644 --- a/commands/General/remindme.js +++ b/commands/General/remindme.js @@ -71,7 +71,7 @@ class Remindme extends BaseCommand { interaction.success("general/remindme:SAVED", { message, - time: moment(rData.sendAt).locale(interaction.guild.data.language).format("dddd, Do MMMM YYYY, HH:mm:ss"), + time: moment(rData.sendAt).locale(data.guildData.language).format("dddd, Do MMMM YYYY, HH:mm:ss"), }, { edit: true }); } } diff --git a/commands/General/report.js b/commands/General/report.js index 04be8323..af87e2d2 100644 --- a/commands/General/report.js +++ b/commands/General/report.js @@ -48,11 +48,13 @@ class Report extends BaseCommand { * @param {import("discord.js").ChatInputCommandInteraction} interaction * @param {Object} data */ - async execute(client, interaction) { - const repChannel = interaction.guild.channels.cache.get(interaction.guild.data.plugins.reports); + async execute(client, interaction, data) { + const repChannel = interaction.guild.channels.cache.get(data.guildData.plugins.reports); if (!repChannel) return interaction.error("general/report:MISSING_CHANNEL"); + const member = interaction.options.getMember("user"); if (member.id === interaction.user.id) return interaction.error("general/report:INVALID_USER"); + const rep = interaction.options.getString("message"); const embed = new EmbedBuilder() diff --git a/commands/General/suggest.js b/commands/General/suggest.js index 7a125e25..edd9651a 100644 --- a/commands/General/suggest.js +++ b/commands/General/suggest.js @@ -41,9 +41,10 @@ class Suggest extends BaseCommand { * @param {import("discord.js").ChatInputCommandInteraction} interaction * @param {Object} data */ - async execute(client, interaction) { - const suggChannel = interaction.guild.channels.cache.get(interaction.guild.data.plugins.suggestions); + async execute(client, interaction, data) { + const suggChannel = interaction.guild.channels.cache.get(data.guildData.plugins.suggestions); if (!suggChannel) return interaction.error("general/suggest:MISSING_CHANNEL"); + const suggestion = interaction.options.getString("message"); const embed = new EmbedBuilder() diff --git a/commands/Music/nowplaying.js b/commands/Music/nowplaying.js index 26b9b02e..0c627476 100644 --- a/commands/Music/nowplaying.js +++ b/commands/Music/nowplaying.js @@ -35,7 +35,7 @@ class Nowplaying extends BaseCommand { * @param {import("discord.js").ChatInputCommandInteraction} interaction * @param {Object} data */ - async execute(client, interaction) { + async execute(client, interaction, data) { await interaction.deferReply(); const queue = client.player.nodes.get(interaction.guildId); @@ -62,7 +62,7 @@ class Nowplaying extends BaseCommand { { name: "\u200B", value: "\u200B", inline: true }, { name: interaction.translate("common:VIEWS"), - value: track.raw.live ? "" : new Intl.NumberFormat(interaction.client.languages.find(language => language.name === interaction.guild.data.language).moment, { notation: "standard" }).format(track.raw.views), + value: track.raw.live ? "" : new Intl.NumberFormat(interaction.client.languages.find(language => language.name === data.guldData.language).moment, { notation: "standard" }).format(track.raw.views), inline: true, }, { diff --git a/events/CommandHandler.js b/events/CommandHandler.js index 46087c1f..3879c59c 100644 --- a/events/CommandHandler.js +++ b/events/CommandHandler.js @@ -12,42 +12,32 @@ class CommandHandler extends BaseEvent { /** * * @param {import("../base/JaBa")} client - * @param {import("discord.js").Interaction} interaction + * @param {import("discord.js").BaseInteraction} interaction */ async execute(client, interaction) { const command = client.commands.get(interaction.commandName); const data = []; - const userData = await client.findOrCreateUser({ - id: interaction.user.id, - }); + const userData = await client.findOrCreateUser({ id: interaction.user.id }); data.userData = userData; if (interaction.inGuild()) { - const guildData = await client.findOrCreateGuild({ - id: interaction.guildId, - }); - interaction.guild.data = data.guildData = guildData; + const guildData = await client.findOrCreateGuild({ id: interaction.guildId }); + const memberData = await client.findOrCreateMember({ id: interaction.member.id, guildId: interaction.guildId }); - const memberData = await client.findOrCreateMember({ - id: interaction.member.id, - guildId: interaction.guildId, - }); + data.guildData = guildData; data.memberData = memberData; } - if (interaction.isAutocomplete()) { + if (interaction.isAutocomplete()) return await command.autocompleteRun(client, interaction); - } if (interaction.type !== InteractionType.ApplicationCommand && !interaction.isCommand()) return; - if (command.guildOnly && !interaction.inGuild()) return interaction.error("misc:GUILD_ONLY", null, { ephemeral: true }); if (command.ownerOnly && interaction.user.id !== client.config.owner.id) return interaction.error("misc:OWNER_ONLY", null, { ephemeral: true }); - if (!interaction.guildId === "1039187019957555252") return interaction.error({ content: "IAT Only", ephemeral: true }); // IAT - if (!interaction.guildId === "600970971410857996") return interaction.error({ content: "SC Only", ephemeral: true }); // SC + if (!interaction.guildId === "1039187019957555252") return interaction.error({ content: "IAT Only", ephemeral: true }); + if (!interaction.guildId === "600970971410857996") return interaction.error({ content: "SC Only", ephemeral: true }); - /* if (!userData.achievements.firstCommand.achieved) { const args = { content: interaction.user.toString(), @@ -62,9 +52,8 @@ class CommandHandler extends BaseEvent { userData.markModified("achievements.firstCommand"); await userData.save(); - interaction.channel.isDMBased() ? interaction.user.send(args) : await interaction.channel.send(args); + interaction.user.send(args); } - */ client.logger.log(`User ${interaction.user.discriminator === "0" ? interaction.user.username : interaction.user.tag} used ${command.command.name} in ${interaction.guild ? interaction.guild.name : "DM"} with arguments: ${interaction.options.data.length > 0 ? interaction.options.data.map(arg => { return `${arg.name}: ${arg.value}`; }).join(", ") : "no args"}`, "cmd"); diff --git a/events/Guild/guildCreate.js b/events/Guild/guildCreate.js index cc6958cf..f96c7744 100644 --- a/events/Guild/guildCreate.js +++ b/events/Guild/guildCreate.js @@ -20,7 +20,7 @@ class GuildCreate extends BaseEvent { }); if (!userData.achievements.invite.achieved) { - userData.achievements.invite.progress.now += 1; + userData.achievements.invite.progress.now = 1; userData.achievements.invite.achieved = true; userData.markModified("achievements.invite"); await userData.save(); @@ -28,9 +28,9 @@ class GuildCreate extends BaseEvent { const thanks = new EmbedBuilder() .setAuthor({ - name: "Спасибо что добавили меня на свой сервер!", + name: "Thanks for inviting me to your server!", }) - .setDescription("Чтобы получить список команд, используйте `/help`!.") + .setDescription("Use in your server to get list of all commands!.") .setColor(client.config.embed.color) .setFooter({ text: client.config.embed.footer, diff --git a/events/Guild/guildMemberAdd.js b/events/Guild/guildMemberAdd.js index d6990394..aafc425b 100644 --- a/events/Guild/guildMemberAdd.js +++ b/events/Guild/guildMemberAdd.js @@ -35,20 +35,6 @@ class GuildMemberAdd extends BaseEvent { const guildData = await client.findOrCreateGuild({ id: member.guild.id, }); - member.guild.data = guildData; - - const memberData = await client.findOrCreateMember({ - id: member.id, - guildId: member.guild.id, - }); - if (memberData.mute.muted && memberData.mute.endDate > Date.now()) - member.guild.channels.cache.forEach(channel => { - channel.permissionOverwrites.edit(member.id, { - SEND_MESSAGES: false, - ADD_REACTIONS: false, - CONNECT: false, - }).catch(() => {}); - }); if (guildData.plugins.autorole.enabled) member.roles.add(guildData.plugins.autorole.role); @@ -95,11 +81,11 @@ class GuildMemberAdd extends BaseEvent { // Draw server name ctx.font = applyText(canvas, client.translate("administration/welcome:IMG_WELCOME", { server: member.guild.name, - }, member.guild.data.language), 53, 625, "RubikMonoOne"); + }, guildData.language), 53, 625, "RubikMonoOne"); ctx.fillText(client.translate("administration/welcome:IMG_WELCOME", { server: member.guild.name, - }, member.guild.data.language), canvas.width - 700, canvas.height - 70); + }, guildData.language), canvas.width - 700, canvas.height - 70); // Draw discriminator ctx.font = "35px RubikMonoOne"; @@ -107,20 +93,20 @@ class GuildMemberAdd extends BaseEvent { // Draw membercount ctx.font = "22px RubikMonoOne"; - ctx.fillText(`${member.guild.memberCount}й ${client.translate("misc:NOUNS:MEMBERS:1", null, member.guild.data.language)}`, 40, canvas.height - 35); + ctx.fillText(`${member.guild.memberCount}й ${client.translate("misc:NOUNS:MEMBERS:1", null, guildData.language)}`, 40, canvas.height - 35); // Draw # for discriminator ctx.fillStyle = "#FFFFFF"; ctx.font = "70px RubikMonoOne"; - ctx.fillText("#", canvas.width - 690, canvas.height - 165); + ctx.fillText(member.user.discriminator === "0" ? "" : "#", canvas.width - 690, canvas.height - 165); // Draw title ctx.font = "45px RubikMonoOne"; ctx.strokeStyle = "#000000"; ctx.lineWidth = 10; - ctx.strokeText(client.translate("administration/welcome:TITLE", null, member.guild.data.language), canvas.width - 670, canvas.height - 330); + ctx.strokeText(client.translate("administration/welcome:TITLE", null, guildData.language), canvas.width - 670, canvas.height - 330); ctx.fillStyle = "#FFFFFF"; - ctx.fillText(client.translate("administration/welcome:TITLE", null, member.guild.data.language), canvas.width - 670, canvas.height - 330); + ctx.fillText(client.translate("administration/welcome:TITLE", null, guildData.language), canvas.width - 670, canvas.height - 330); // Draw avatar circle ctx.beginPath(); diff --git a/events/Guild/guildMemberRemove.js b/events/Guild/guildMemberRemove.js index 823a1e2f..00b5b85a 100644 --- a/events/Guild/guildMemberRemove.js +++ b/events/Guild/guildMemberRemove.js @@ -35,7 +35,6 @@ class GuildMemberRemove extends BaseEvent { const guildData = await client.findOrCreateGuild({ id: member.guild.id, }); - member.guild.data = guildData; if (guildData.plugins.goodbye.enabled) { const channel = member.guild.channels.cache.get(guildData.plugins.goodbye.channel); @@ -80,11 +79,11 @@ class GuildMemberRemove extends BaseEvent { // Draw server name ctx.font = applyText(canvas, client.translate("administration/goodbye:IMG_GOODBYE", { server: member.guild.name, - }, member.guild.data.language), 53, 625, "RubikMonoOne"); + }, guildData.language), 53, 625, "RubikMonoOne"); ctx.fillText(client.translate("administration/goodbye:IMG_GOODBYE", { server: member.guild.name, - }, member.guild.data.language), canvas.width - 700, canvas.height - 70); + }, guildData.language), canvas.width - 700, canvas.height - 70); // Draw discriminator ctx.font = "35px RubikMonoOne"; @@ -92,7 +91,7 @@ class GuildMemberRemove extends BaseEvent { // Draw membercount ctx.font = "22px RubikMonoOne"; - ctx.fillText(`${member.guild.memberCount} ${client.functions.getNoun(member.guild.memberCount, client.translate("misc:NOUNS:MEMBERS:1", null, member.guild.data.language), client.translate("misc:NOUNS:MEMBERS:2", null, member.guild.data.language), client.translate("misc:NOUNS:MEMBERS:5", null, member.guild.data.language))}`, 40, canvas.height - 35); + ctx.fillText(`${member.guild.memberCount} ${client.functions.getNoun(member.guild.memberCount, client.translate("misc:NOUNS:MEMBERS:1", null, guildData.language), client.translate("misc:NOUNS:MEMBERS:2", null, guildData.language), client.translate("misc:NOUNS:MEMBERS:5", null, guildData.language))}`, 40, canvas.height - 35); // Draw # for discriminator ctx.fillStyle = "#FFFFFF"; @@ -103,9 +102,9 @@ class GuildMemberRemove extends BaseEvent { ctx.font = "45px RubikMonoOne"; ctx.strokeStyle = "#000000"; ctx.lineWidth = 10; - ctx.strokeText(client.translate("administration/goodbye:TITLE", null, member.guild.data.language), canvas.width - 670, canvas.height - 330); + ctx.strokeText(client.translate("administration/goodbye:TITLE", null, guildData.language), canvas.width - 670, canvas.height - 330); ctx.fillStyle = "#FFFFFF"; - ctx.fillText(client.translate("administration/goodbye:TITLE", null, member.guild.data.language), canvas.width - 670, canvas.height - 330); + ctx.fillText(client.translate("administration/goodbye:TITLE", null, guildData.language), canvas.width - 670, canvas.height - 330); // Draw avatar circle ctx.beginPath(); diff --git a/events/Guild/guildMemberUpdate.js b/events/Guild/guildMemberUpdate.js index 0f04b48a..d0a990ef 100644 --- a/events/Guild/guildMemberUpdate.js +++ b/events/Guild/guildMemberUpdate.js @@ -17,12 +17,13 @@ class GuildMemberUpdate extends BaseEvent { async execute(client, oldMember, newMember) { if (oldMember.guild && oldMember.guild.id === "568120814776614924") return; if (oldMember.guild.id !== client.config.support.id) return; - if (oldMember.roles.cache.some(r => r.name === "Поддержавшие JaBa")) return; + if (oldMember.roles.cache.some(r => r.id === "940149470975365191")) return; - if (newMember?.roles.cache.some(r => r.name === "Поддержавшие JaBa")) { + if (newMember?.roles.cache.some(r => r.id === "940149470975365191")) { const userData = await client.findOrCreateUser({ id: newMember.id, }); + userData.achievements.tip.progress.now = 1; userData.achievements.tip.achieved = true; userData.markModified("achievements.tip"); diff --git a/events/MessageHandler.js b/events/MessageHandler.js index 9513ea8d..66073071 100644 --- a/events/MessageHandler.js +++ b/events/MessageHandler.js @@ -20,30 +20,26 @@ class MessageCreate extends BaseEvent { if (message.guild && message.guild.id === "568120814776614924") return; const data = {}; + if (message.author.bot) return; + + const userData = await client.findOrCreateUser({ id: message.author.id }); + data.userData = userData; + if (message.guild && !message.member) await message.guild.members.fetch(message.author.id); if (message.guild) { - const guild = await client.findOrCreateGuild({ - id: message.guild.id, - }); - message.guild.data = data.guildData = guild; + const guild = await client.findOrCreateGuild({ id: message.guild.id }); + data.guildData = guild; } + if (message.content.match(new RegExp(`^<@!?${client.user.id}>( |)$`))) return message.replyT("misc:HELLO_SERVER", null, { mention: true }); if (message.guild) { - const memberData = await client.findOrCreateMember({ - id: message.author.id, - guildId: message.guild.id, - }); + const memberData = await client.findOrCreateMember({ id: message.author.id, guildId: message.guild.id }); data.memberData = memberData; } - const userData = await client.findOrCreateUser({ - id: message.author.id, - }); - data.userData = userData; - if (message.guild) { - await updateXp(client, message, data); + await updateXp(client, message, data.memberData); if (message.content.includes("discord.com/channels/")) { const link = message.content.match(/(https|http):\/\/(ptb\.|canary\.)?(discord.com)\/(channels)\/\d+\/\d+\/\d+/g)[0], @@ -133,12 +129,12 @@ class MessageCreate extends BaseEvent { * * @param {import("../base/JaBa")} client * @param {import("discord.js").Message} msg - * @param {*} data + * @param {import("../base/Member")} memberData * @returns */ -async function updateXp(client, msg, data) { - const points = parseInt(data.memberData.exp), - level = parseInt(data.memberData.level), +async function updateXp(client, msg, memberData) { + const points = parseInt(memberData.exp), + level = parseInt(memberData.level), isInCooldown = xpCooldown[msg.author.id]; if (isInCooldown) @@ -152,14 +148,14 @@ async function updateXp(client, msg, data) { const neededXp = 5 * (level * level) + 80 * level + 100; if (newXp > neededXp) { - data.memberData.level = parseInt(level + 1, 10); - data.memberData.exp = 0; + memberData.level = parseInt(level + 1, 10); + memberData.exp = 0; msg.replyT("misc:LEVEL_UP", { - level: data.memberData.level, + level: memberData.level, }, { mention: false }); - } else data.memberData.exp = parseInt(newXp, 10); + } else memberData.exp = parseInt(newXp, 10); - await data.memberData.save(); + await memberData.save(); } module.exports = MessageCreate; \ No newline at end of file diff --git a/scripts/create-db-indexes.js b/scripts/create-db-indexes.js index 62122910..dedd3d52 100644 --- a/scripts/create-db-indexes.js +++ b/scripts/create-db-indexes.js @@ -14,6 +14,7 @@ const config = require("../config"); const dbName = config.mongoDB.split("/").pop(); const baseURL = config.mongoDB.substr(0, config.mongoDB.length - dbName.length); const client = new MongoClient(baseURL, { + useNewUrlParser: true, useUnifiedTopology: true, }); @@ -26,22 +27,28 @@ client.connect().then(async () => { const users = db.collection("users"); console.log(chalk.yellow("Creating guilds index...")); + await guilds.createIndex({ id: 1, }); + console.log(chalk.green("Guilds index created.")); console.log(chalk.yellow("Creating members index...")); + await members.createIndex({ guildID: 1, id: -1, }); + console.log(chalk.green("Members index created.")); console.log(chalk.yellow("Creating users index...")); + await users.createIndex({ id: 1, }); + console.log(chalk.green("Users index created.")); console.log(chalk.blue("\n\nIndexes created.")); @@ -49,5 +56,6 @@ client.connect().then(async () => { process.exit(0); }).catch(() => { console.log(chalk.red("Couldn't connect to mongoDB database...")); + process.exit(1); }); \ No newline at end of file