This commit is contained in:
JonnyBro 2022-10-03 20:21:42 +05:00
parent 625ab84df0
commit 76ab9c38a0
23 changed files with 81 additions and 90 deletions

View file

@ -111,7 +111,7 @@ class JaBa extends Client {
/** /**
* Load commands from directory * Load commands from directory
* @param {String} dir Directory where's all commands/subdirectories located * @param {String} dir Directory where's all commands located
* @returns * @returns
*/ */
async loadCommands(dir) { async loadCommands(dir) {
@ -211,7 +211,7 @@ class JaBa extends Client {
/** /**
* Load events from directory * Load events from directory
* @param {String} dir Directory where's all events/subdirectories located * @param {String} dir Directory where's all events located
* @returns * @returns
*/ */
async loadEvents(dir) { async loadEvents(dir) {
@ -340,34 +340,34 @@ class JaBa extends Client {
* @param {Boolean} isLean Return JSON instead Mongoose model? * @param {Boolean} isLean Return JSON instead Mongoose model?
* @returns {import("./Member")} Mongoose model or JSON of this member * @returns {import("./Member")} Mongoose model or JSON of this member
*/ */
async findOrCreateMember({ id: memberID, guildID }, isLean) { async findOrCreateMember({ id: memberID, guildId }, isLean) {
if (this.databaseCache.members.get(`${memberID}${guildID}`)) return isLean ? this.databaseCache.members.get(`${memberID}${guildID}`).toJSON() : this.databaseCache.members.get(`${memberID}${guildID}`); if (this.databaseCache.members.get(`${memberID}${guildId}`)) return isLean ? this.databaseCache.members.get(`${memberID}${guildId}`).toJSON() : this.databaseCache.members.get(`${memberID}${guildId}`);
else { else {
let memberData = (isLean ? await this.membersData.findOne({ let memberData = (isLean ? await this.membersData.findOne({
guildID, guildID: guildId,
id: memberID id: memberID
}).lean() : await this.membersData.findOne({ }).lean() : await this.membersData.findOne({
guildID, guildID: guildId,
id: memberID id: memberID
})); }));
if (memberData) { if (memberData) {
if (!isLean) this.databaseCache.members.set(`${memberID}${guildID}`, memberData); if (!isLean) this.databaseCache.members.set(`${memberID}${guildId}`, memberData);
return memberData; return memberData;
} else { } else {
memberData = new this.membersData({ memberData = new this.membersData({
id: memberID, id: memberID,
guildID: guildID guildID: guildId
}); });
await memberData.save(); await memberData.save();
const guild = await this.findOrCreateGuild({ const guild = await this.findOrCreateGuild({
id: guildID id: guildId
}); });
if (guild) { if (guild) {
guild.members.push(memberData._id); guild.members.push(memberData._id);
await guild.save(); await guild.save();
} }
this.databaseCache.members.set(`${memberID}${guildID}`, memberData); this.databaseCache.members.set(`${memberID}${guildId}`, memberData);
return isLean ? memberData.toJSON() : memberData; return isLean ? memberData.toJSON() : memberData;
} }
@ -380,24 +380,24 @@ class JaBa extends Client {
* @param {Boolean} isLean Return JSON instead Mongoose model? * @param {Boolean} isLean Return JSON instead Mongoose model?
* @returns {import("./Guild")} Mongoose model or JSON of this guild * @returns {import("./Guild")} Mongoose model or JSON of this guild
*/ */
async findOrCreateGuild({ id: guildID }, isLean) { async findOrCreateGuild({ id: guildId }, isLean) {
if (this.databaseCache.guilds.get(guildID)) return isLean ? this.databaseCache.guilds.get(guildID).toJSON() : this.databaseCache.guilds.get(guildID); if (this.databaseCache.guilds.get(guildId)) return isLean ? this.databaseCache.guilds.get(guildId).toJSON() : this.databaseCache.guilds.get(guildId);
else { else {
let guildData = (isLean ? await this.guildsData.findOne({ let guildData = (isLean ? await this.guildsData.findOne({
id: guildID id: guildId
}).populate("members").lean() : await this.guildsData.findOne({ }).populate("members").lean() : await this.guildsData.findOne({
id: guildID id: guildId
}).populate("members")); }).populate("members"));
if (guildData) { if (guildData) {
if (!isLean) this.databaseCache.guilds.set(guildID, guildData); if (!isLean) this.databaseCache.guilds.set(guildId, guildData);
return guildData; return guildData;
} else { } else {
guildData = new this.guildsData({ guildData = new this.guildsData({
id: guildID id: guildId
}); });
await guildData.save(); await guildData.save();
this.databaseCache.guilds.set(guildID, guildData); this.databaseCache.guilds.set(guildId, guildData);
return isLean ? guildData.toJSON() : guildData; return isLean ? guildData.toJSON() : guildData;
} }

View file

@ -46,12 +46,14 @@ class Set extends BaseCommand {
* @param {import("discord.js").ChatInputCommandInteraction} interaction * @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Object} data * @param {Object} data
*/ */
async execute(client, interaction) { async execute(client, interaction, data) {
const type = interaction.options.getString("type"); const type = interaction.options.getString("type");
const member = interaction.options.getMember("user"); const member = interaction.options.getMember("user");
if (member.user.bot) return interaction.error("misc:BOT_USER", null, { ephemeral: true }); if (member.user.bot) return interaction.error("misc:BOT_USER", null, { ephemeral: true });
const memberData = await client.findOrCreateMember({
id: member.id const memberData = member.id === interaction.user.id ? data : await client.findOrCreateMember({
id: member.id,
guildId: interaction.guildId
}); });
const int = interaction.options.getInteger("int"); const int = interaction.options.getInteger("int");
if (int < 0) return interaction.error("administration/set:INVALID_NUMBER", null, { ephemeral: true }); if (int < 0) return interaction.error("administration/set:INVALID_NUMBER", null, { ephemeral: true });

View file

@ -45,9 +45,9 @@ class Money extends BaseCommand {
const member = interaction.options.getMember("user") || interaction.member; const member = interaction.options.getMember("user") || interaction.member;
if (member.user.bot) return interaction.error("economy/money:BOT_USER"); if (member.user.bot) return interaction.error("economy/money:BOT_USER");
const memberData = (member.id === interaction.user.id) ? data.memberData : await client.findOrCreateMember({ const memberData = member.id === interaction.user.id ? data.memberData : await client.findOrCreateMember({
id: member.id, id: member.id,
guildID: interaction.guildId guildId: interaction.guildId
}); });
const guilds = client.guilds.cache.filter(g => g.members.cache.find(m => m.id === member.id)); const guilds = client.guilds.cache.filter(g => g.members.cache.find(m => m.id === member.id));
@ -55,7 +55,7 @@ class Money extends BaseCommand {
await asyncForEach(guilds, async guild => { await asyncForEach(guilds, async guild => {
const data = await client.findOrCreateMember({ const data = await client.findOrCreateMember({
id: member.id, id: member.id,
guildID: guild.id guildId: guild.id
}); });
globalMoney += data.money + data.bankSold; globalMoney += data.money + data.bankSold;
}); });

View file

@ -79,7 +79,7 @@ class Number extends BaseCommand {
const memberData = await client.findOrCreateMember({ const memberData = await client.findOrCreateMember({
id: msg.author.id, id: msg.author.id,
guildID: interaction.guildId guildId: interaction.guildId
}); });
const info = { const info = {

View file

@ -50,7 +50,7 @@ class Pay extends BaseCommand {
const memberData = await client.findOrCreateMember({ const memberData = await client.findOrCreateMember({
id: member.id, id: member.id,
guildID: interaction.guildId guildId: interaction.guildId
}); });
const info = { const info = {

View file

@ -48,7 +48,7 @@ class Profile extends BaseCommand {
const memberData = (member.id === interaction.user.id ? data.memberData : await client.findOrCreateMember({ const memberData = (member.id === interaction.user.id ? data.memberData : await client.findOrCreateMember({
id: member.id, id: member.id,
guildID: interaction.guildId guildId: interaction.guildId
})); }));
const userData = (member.id === interaction.user.id ? data.userData : await client.findOrCreateUser({ const userData = (member.id === interaction.user.id ? data.userData : await client.findOrCreateUser({
id: member.id id: member.id
@ -60,7 +60,7 @@ class Profile extends BaseCommand {
await asyncForEach(guilds, async guild => { await asyncForEach(guilds, async guild => {
const data = await client.findOrCreateMember({ const data = await client.findOrCreateMember({
id: member.id, id: member.id,
guildID: guild.id guildId: guild.id
}); });
globalMoney += data.money + data.bankSold; globalMoney += data.money + data.bankSold;
}); });

View file

@ -45,7 +45,7 @@ class Rob extends BaseCommand {
const memberData = await client.findOrCreateMember({ const memberData = await client.findOrCreateMember({
id: member.id, id: member.id,
guildID: interaction.guildId guildId: interaction.guildId
}); });
if (amount > memberData.money) return interaction.error("economy/rob:NOT_ENOUGH_MEMBER", { user: member.toString() }); if (amount > memberData.money) return interaction.error("economy/rob:NOT_ENOUGH_MEMBER", { user: member.toString() });
const isInCooldown = memberData.cooldowns.rob || 0; const isInCooldown = memberData.cooldowns.rob || 0;

View file

@ -42,7 +42,7 @@ class TicTacToe extends BaseCommand {
}).then(async winner => { }).then(async winner => {
const memberData = await client.findOrCreateMember({ const memberData = await client.findOrCreateMember({
id: winner.id, id: winner.id,
guildID: interaction.guildId guildId: interaction.guildId
}); });
const info = { const info = {

View file

@ -38,7 +38,7 @@ class Clearwarns extends BaseCommand {
const memberData = await client.findOrCreateMember({ const memberData = await client.findOrCreateMember({
id: member.id, id: member.id,
guildID: interaction.guildId guildId: interaction.guildId
}); });
memberData.sanctions = []; memberData.sanctions = [];

View file

@ -40,7 +40,7 @@ class Warn extends BaseCommand {
const memberData = await client.findOrCreateMember({ const memberData = await client.findOrCreateMember({
id: member.id, id: member.id,
guildID: interaction.guildId guildId: interaction.guildId
}); });
const modal = new ModalBuilder() const modal = new ModalBuilder()

View file

@ -39,7 +39,7 @@ class Warns extends BaseCommand {
const memberData = await client.findOrCreateMember({ const memberData = await client.findOrCreateMember({
id: member.id, id: member.id,
guildID: interaction.guildId guildId: interaction.guildId
}); });
const embed = new EmbedBuilder() const embed = new EmbedBuilder()

View file

@ -68,7 +68,7 @@ class Debug extends BaseCommand {
* @param {import("discord.js").ChatInputCommandInteraction} interaction * @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Array} data * @param {Array} data
*/ */
async execute(client, interaction) { async execute(client, interaction, data) {
const command = interaction.options.getSubcommand(); const command = interaction.options.getSubcommand();
if (command === "set") { if (command === "set") {
@ -78,8 +78,9 @@ class Debug extends BaseCommand {
const userData = await client.findOrCreateUser({ const userData = await client.findOrCreateUser({
id: member.id id: member.id
}); });
const memberData = await client.findOrCreateMember({ const memberData = member.id === interaction.user.id ? data : await client.findOrCreateMember({
id: member.id id: member.id,
guildId: interaction.guildId
}); });
const int = interaction.options.getInteger("int"); const int = interaction.options.getInteger("int");
@ -136,8 +137,9 @@ class Debug extends BaseCommand {
const userData = await client.findOrCreateUser({ const userData = await client.findOrCreateUser({
id: member.id id: member.id
}); });
const memberData = await client.findOrCreateMember({ const memberData = member.id === interaction.user.id ? data : await client.findOrCreateMember({
id: member.id id: member.id,
guildId: interaction.guildId
}); });
const int = interaction.options.getInteger("int"); const int = interaction.options.getInteger("int");

View file

@ -1,3 +1,10 @@
### JaBa v4.1.9
* Изменения
* Переписана система опыта. Теперь при достижении нового уровня опыт сбрасывается и бот оповещает о получении нового уровня.
* Исправления
* Команды *set* и *debug* ничего не делали.
### JaBa v4.1.8 ### JaBa v4.1.8
* Добавлено * Добавлено
* Возможность сразу сократить ссылку в команде *lmgtfy*. * Возможность сразу сократить ссылку в команде *lmgtfy*.

View file

@ -17,7 +17,7 @@ router.get("/:serverID", CheckAuth, async(req, res) => {
// Fetch guild informations // Fetch guild informations
const guildInfos = await utils.fetchGuild(guild.id, req.client, req.user.guilds); const guildInfos = await utils.fetchGuild(guild.id, req.client, req.user.guilds);
const memberData = await req.client.findOrCreateMember({ id: req.userInfos.id, guildID: guild.id }); const memberData = await req.client.findOrCreateMember({ id: req.userInfos.id, guildId: guild.id });
res.render("manager/guild", { res.render("manager/guild", {
guild: guildInfos, guild: guildInfos,

View file

@ -14,7 +14,7 @@ router.get("/:serverID", CheckAuth, async (req, res) => {
}); });
} }
const memberData = await req.client.findOrCreateMember({ id: req.userInfos.id, guildID: guild.id }); const memberData = await req.client.findOrCreateMember({ id: req.userInfos.id, guildId: guild.id });
// Fetch guild informations // Fetch guild informations
const membersData = await req.client.membersData.find({ const membersData = await req.client.membersData.find({

View file

@ -36,7 +36,7 @@ class CommandHandler extends BaseEvent {
const memberData = await client.findOrCreateMember({ const memberData = await client.findOrCreateMember({
id: interaction.member.id, id: interaction.member.id,
guildID: interaction.guildId guildId: interaction.guildId
}); });
data.memberData = memberData; data.memberData = memberData;
} }

View file

@ -40,7 +40,7 @@ class GuildMemberAdd extends BaseEvent {
const memberData = await client.findOrCreateMember({ const memberData = await client.findOrCreateMember({
id: member.id, id: member.id,
guildID: member.guild.id guildId: member.guild.id
}); });
if (memberData.mute.muted && memberData.mute.endDate > Date.now()) { if (memberData.mute.muted && memberData.mute.endDate > Date.now()) {
member.guild.channels.cache.forEach((channel) => { member.guild.channels.cache.forEach((channel) => {

View file

@ -33,7 +33,7 @@ class MessageCreate extends BaseEvent {
if (message.guild) { if (message.guild) {
const memberData = await client.findOrCreateMember({ const memberData = await client.findOrCreateMember({
id: message.author.id, id: message.author.id,
guildID: message.guild.id guildId: message.guild.id
}); });
data.memberData = memberData; data.memberData = memberData;
} }
@ -75,24 +75,37 @@ class MessageCreate extends BaseEvent {
} }
} }
/**
*
* @param {import("../base/JaBa")} client
* @param {import("discord.js").Message} msg
* @param {*} data
* @returns
*/
async function updateXp(client, msg, data) { async function updateXp(client, msg, data) {
const points = parseInt(data.memberData.exp); const points = parseInt(data.memberData.exp),
const level = parseInt(data.memberData.level); level = parseInt(data.memberData.level),
const isInCooldown = xpCooldown[msg.author.id]; isInCooldown = xpCooldown[msg.author.id];
if (isInCooldown) { if (isInCooldown) {
if (isInCooldown > Date.now()) return; if (isInCooldown > Date.now()) return;
} }
const toWait = Date.now() + 60000; // 1 min const toWait = Date.now() + (60 * 1000); // 1 min
xpCooldown[msg.author.id] = toWait; xpCooldown[msg.author.id] = toWait;
const won = client.functions.randomNum(1, 4); const won = client.functions.randomNum(1, 2);
const newXp = parseInt(points + won, 10); const newXp = parseInt(points + won, 10);
const neededXp = 5 * (level * level) + 80 * level + 100; const neededXp = 5 * (level * level) + 80 * level + 100;
if (newXp > neededXp) data.memberData.level = parseInt(level + 1, 10); if (newXp > neededXp) {
data.memberData.level = parseInt(level + 1, 10);
data.memberData.exp = 0;
msg.replyT("misc:LEVEL_UP", {
level: data.memberData.level
}, { mention: false });
} else data.memberData.exp = parseInt(newXp, 10);
data.memberData.exp = parseInt(newXp, 10);
await data.memberData.save(); await data.memberData.save();
} }

View file

@ -18,31 +18,24 @@ class Ready extends BaseEvent {
let tUsers = client.users.cache.size - hiddenGuild.memberCount; let tUsers = client.users.cache.size - hiddenGuild.memberCount;
let tServers = client.guilds.cache.size - 1; let tServers = client.guilds.cache.size - 1;
// Logs some informations using logger
client.logger.log(`Loaded a total of ${commands.length} command(s).`, "ready"); client.logger.log(`Loaded a total of ${commands.length} command(s).`, "ready");
client.logger.log(`${client.user.tag}, ready to serve ${tUsers} users in ${tServers} servers.`, "ready"); client.logger.log(`${client.user.tag}, ready to serve ${tUsers} users in ${tServers} servers.`, "ready");
client.logger.log(`Invite Link: ${client.generateInvite({ scopes: ["bot", "applications.commands"] , permissions: [ PermissionsBitField.Flags.Administrator ] })}`, "ready"); client.logger.log(`Invite Link: ${client.generateInvite({ scopes: ["bot", "applications.commands"] , permissions: [ PermissionsBitField.Flags.Administrator ] })}`, "ready");
// Birthday Announce
const birthdays = require("../helpers/birthdays"); const birthdays = require("../helpers/birthdays");
birthdays.init(client); birthdays.init(client);
// Unmute users
const checkUnmutes = require("../helpers/checkUnmutes"); const checkUnmutes = require("../helpers/checkUnmutes");
checkUnmutes.init(client); checkUnmutes.init(client);
// Send reminds
const checkReminds = require("../helpers/checkReminds"); const checkReminds = require("../helpers/checkReminds");
checkReminds.init(client); checkReminds.init(client);
// Clear transactions
const cleanup = require("../helpers/cleanup"); const cleanup = require("../helpers/cleanup");
cleanup.init(client); cleanup.init(client);
// Start the dashboard
if (client.config.dashboard.enabled) client.dashboard.init(client); if (client.config.dashboard.enabled) client.dashboard.init(client);
// Update status
const version = require("../package.json").version; const version = require("../package.json").version;
const status = [ const status = [
{ name: "help", type: ActivityType.Watching }, { name: "help", type: ActivityType.Watching },

View file

@ -25,9 +25,9 @@ module.exports.init = async function (client) {
for (const user of res) { for (const user of res) {
client.users.fetch(user.id).then(u => { client.users.fetch(user.id).then(u => {
if (u.username.match(/.*Deleted User.* [A-z0-9]+/g)) { if (u.username.match(/.*Deleted User.* [A-z0-9]+/g)) {
client.databaseCache.users.delete(user.id); client.databaseCache.users.delete(u.id);
client.usersData.deleteOne({ id: user.id }); client.usersData.deleteOne({ id: u.id });
console.log(`Removed from database deleted user - ID: ${u.id} Username: ${u.username}`); client.logger.log(`Removed from database deleted user - ID: ${u.id} Username: ${u.username}`);
} }
}); });
} }

View file

@ -1,25 +1,12 @@
const { Message, CommandInteraction } = require("discord.js"); const { Message, CommandInteraction } = require("discord.js");
/**
*
* @param {String} key
* @param {Array} args
* @returns {String}
*/
CommandInteraction.prototype.translate = function (key, args) { CommandInteraction.prototype.translate = function (key, args) {
const language = this.client.translations.get(this.guild ? this.guild.data.language : "ru-RU"); const language = this.client.translations.get(this.guild ? this.guild.data.language : "ru-RU");
if (!language) throw "Message: Invalid language set in data."; if (!language) throw "Interaction: Invalid language set in data.";
return language(key, args); return language(key, args);
}; };
/**
*
* @param {String} key
* @param {Array} args
* @param {Array} options
* @returns {import("discord.js").BaseCommandInteraction}
*/
CommandInteraction.prototype.replyT = function (key, args, options = {}) { CommandInteraction.prototype.replyT = function (key, args, options = {}) {
let string = this.translate(key, args, this.guild ? this.guild.data.language : "ru-RU"); let string = this.translate(key, args, this.guild ? this.guild.data.language : "ru-RU");
if (options.prefixEmoji) string = `${this.client.customEmojis[options.prefixEmoji]} | ${string}`; if (options.prefixEmoji) string = `${this.client.customEmojis[options.prefixEmoji]} | ${string}`;
@ -28,26 +15,12 @@ CommandInteraction.prototype.replyT = function (key, args, options = {}) {
else return this.reply({ content: string, ephemeral: options.ephemeral || false }); else return this.reply({ content: string, ephemeral: options.ephemeral || false });
}; };
/**
*
* @param {String} key
* @param {Array} args
* @param {Array} options
* @returns {import("discord.js").BaseCommandInteraction}
*/
CommandInteraction.prototype.error = function (key, args, options = {}) { CommandInteraction.prototype.error = function (key, args, options = {}) {
options.prefixEmoji = "error"; options.prefixEmoji = "error";
return this.replyT(key, args, options); return this.replyT(key, args, options);
}; };
/**
*
* @param {String} key
* @param {Array} args
* @param {Array} options
* @returns {import("discord.js").BaseCommandInteraction}
*/
CommandInteraction.prototype.success = function (key, args, options = {}) { CommandInteraction.prototype.success = function (key, args, options = {}) {
options.prefixEmoji = "success"; options.prefixEmoji = "success";
@ -65,8 +38,8 @@ Message.prototype.replyT = function (key, args, options = {}) {
let string = this.translate(key, args, this.guild ? this.guild.data.language : "ru-RU"); let string = this.translate(key, args, this.guild ? this.guild.data.language : "ru-RU");
if (options.prefixEmoji) string = `${this.client.customEmojis[options.prefixEmoji]} | ${string}`; if (options.prefixEmoji) string = `${this.client.customEmojis[options.prefixEmoji]} | ${string}`;
if (options.edit) return this.edit({ content: string }); if (options.edit) return this.edit({ content: string, allowedMentions: { repliedUser: options.mention || true } });
else return this.reply({ content: string }); else return this.reply({ content: string, allowedMentions: { repliedUser: options.mention || true } });
}; };
Message.prototype.error = function (key, args, options = {}) { Message.prototype.error = function (key, args, options = {}) {

View file

@ -1,6 +1,7 @@
{ {
"BOT_USER": "Вы не можете сделать это с ботом!", "BOT_USER": "Вы не можете сделать это с ботом!",
"FORCE_STOP": "Игра принудительно окончена {{user}}, никто не победил!", "FORCE_STOP": "Игра принудительно окончена {{user}}, никто не победил!",
"LEVEL_UP": "Вы достигли следующего уровня! Ваш новый уровень: **{{level}}**",
"GUILD_ONLY": "Данную команду можно использовать только на сервере!", "GUILD_ONLY": "Данную команду можно использовать только на сервере!",
"HELLO_SERVER": "Привет, **{{username}}**! Все мои команды доступны через **/** Используйте `/help`, чтобы получить список команд!", "HELLO_SERVER": "Привет, **{{username}}**! Все мои команды доступны через **/** Используйте `/help`, чтобы получить список команд!",
"INVALID_NUMBER_RANGE": "Укажите число от **{{min}}** до **{{max}}**!", "INVALID_NUMBER_RANGE": "Укажите число от **{{min}}** до **{{max}}**!",

View file

@ -1,6 +1,6 @@
{ {
"name": "jaba", "name": "jaba",
"version": "4.1.8", "version": "4.1.9",
"description": "My Discord Bot", "description": "My Discord Bot",
"main": "index.js", "main": "index.js",
"private": true, "private": true,