🎨 changed from /groups to /modules for plugins.

This commit is contained in:
Axel Olausson Holtenäs 2022-05-20 14:42:43 +02:00
parent 7f0835813c
commit 39099ebaea
No known key found for this signature in database
GPG key ID: 7BF6826B76382CBA
76 changed files with 300 additions and 465 deletions

View file

@ -10,7 +10,7 @@ export default {
async execute(guild: Guild) {
const { client } = guild;
logger?.verbose(`Added to guild: ${guild.name} (${guild.id})`);
logger?.silly(`Added to guild: ${guild.name} (${guild.id})`);
await fetchGuild(guild);
await updatePresence(client);

View file

@ -10,7 +10,7 @@ export default {
async execute(guild: Guild) {
const { client } = guild;
logger?.verbose(`Deleted from guild: ${guild.name} (${guild.id})`);
logger?.silly(`Deleted from guild: ${guild.name} (${guild.id})`);
await dropGuild(guild);
await updatePresence(client);

View file

@ -12,7 +12,7 @@ export default {
async execute(member: GuildMember) {
const { client, user, guild } = member;
logger?.verbose(
logger?.silly(
`New member: ${user.tag} (${user.id}) added to guild: ${guild.name} (${guild.id})`
);

View file

@ -12,7 +12,7 @@ export default {
async execute(member: GuildMember) {
const { client, user, guild } = member;
logger?.verbose(
logger?.silly(
`Removed member: ${user.tag} (${user.id}) from guild: ${guild.name} (${guild.id})`
);

22
src/events/index.ts Normal file
View file

@ -0,0 +1,22 @@
// 3rd party dependencies
import mongoose from "mongoose";
// Dependencies
import logger from "@logger";
// Configuration
import { url } from "@config/database";
export default async () => {
await mongoose.connect(url).then(async (connection) => {
logger.info(`Connected to database: ${connection.connection.name}`);
});
mongoose.connection.on("error", async (error) => {
logger.error(`${error}`);
});
mongoose.connection.on("warn", async (warning) => {
logger.warn(warning);
});
};

View file

@ -4,7 +4,6 @@ import { CommandInteraction, MessageEmbed } from "discord.js";
import logger from "@logger";
import { errorColor, footerText, footerIcon } from "@config/embed";
import i18next from "i18next";
import deferReply from "@root/helpers/deferReply";
import getCommandMetadata from "@root/helpers/getCommandMetadata";
@ -31,7 +30,7 @@ export default async (interaction: CommandInteraction) => {
return interaction?.editReply({
embeds: [
new MessageEmbed()
.setTitle("[:toolbox:] Manage")
.setTitle("[:x:] Permission")
.setDescription(`You do not have the permission to manage the bot.`)
.setTimestamp(new Date())
.setColor(errorColor)
@ -42,17 +41,12 @@ export default async (interaction: CommandInteraction) => {
if (metadata.guildOnly) {
if (!guild) {
logger.verbose(`Guild is null`);
logger.debug(`Guild is null`);
return interaction.editReply({
embeds: [
new MessageEmbed()
.setDescription(
i18next.t("guildOnly", {
lng: interaction.locale,
ns: "errors",
})
)
.setDescription("This command is only available for guild")
.setColor(errorColor)
.setTimestamp(new Date())
.setFooter({ text: footerText, iconURL: footerIcon }),
@ -63,17 +57,12 @@ export default async (interaction: CommandInteraction) => {
if (metadata.dmOnly) {
if (guild) {
logger.verbose(`Guild exist`);
logger.silly(`Guild exist`);
return interaction.editReply({
embeds: [
new MessageEmbed()
.setDescription(
i18next.t("dmOnly", {
lng: interaction.locale,
ns: "errors",
})
)
.setDescription("This command is only available in DM.")
.setColor(errorColor)
.setTimestamp(new Date())
.setFooter({ text: footerText, iconURL: footerIcon }),
@ -85,7 +74,7 @@ export default async (interaction: CommandInteraction) => {
await currentCommand
.execute(interaction)
.then(async () => {
return logger?.verbose(
return logger?.silly(
`Command: ${commandName} executed in guild: ${guild?.name} (${guild?.id}) by user: ${user?.tag} (${user?.id})`
);
})

View file

@ -10,7 +10,7 @@ export default {
async execute(interaction: CommandInteraction) {
const { guild, id } = interaction;
logger?.verbose(
logger?.silly(
`New interaction: ${id} in guild: ${guild?.name} (${guild?.id})`
);

View file

@ -23,7 +23,7 @@ export default {
});
if (counter === null) {
logger.verbose(
logger.silly(
`No counter found for guild ${guildId} and channel ${channelId}`
);
return;
@ -33,7 +33,7 @@ export default {
lastMessage?.author.id === author.id &&
channel.id === counter.channelId
) {
logger.verbose(
logger.silly(
`${author.username} sent the last message therefor not allowing again.`
);
await message.delete();
@ -41,7 +41,7 @@ export default {
}
if (content !== counter.word) {
logger.verbose(
logger.silly(
`Counter word ${counter.word} does not match message ${content}`
);
@ -53,7 +53,7 @@ export default {
await counter
.save()
.then(async () => {
logger.verbose(
logger.silly(
`Counter for guild ${guildId} and channel ${channelId} is now ${counter.counter}`
);
})
@ -64,7 +64,7 @@ export default {
);
});
logger.verbose(
logger.silly(
`Counter word ${counter.word} was found in message ${content} from ${author.tag} (${author.id}) in guild: ${guild?.name} (${guild?.id})`
);
},

View file

@ -30,7 +30,7 @@ export default {
const timeout = await timeouts.findOne(timeoutData);
if (timeout) {
logger.verbose(
logger.silly(
`User ${userId} in guild ${guildId} is on timeout 2022-04-14-13-51-00`
);
return;
@ -41,7 +41,7 @@ export default {
await userData
.save()
.then(async () => {
logger.verbose(
logger.silly(
`User ${userId} in guild ${guildId} has ${userData.credits} credits`
);
})
@ -55,7 +55,7 @@ export default {
await timeouts
.create(timeoutData)
.then(async () => {
logger.verbose(
logger.silly(
`Timeout 2022-04-14-13-51-00 for user ${userId} in guild ${guildId} has been created`
);
})
@ -70,7 +70,7 @@ export default {
await timeouts
.deleteOne(timeoutData)
.then(async () => {
logger.verbose(
logger.silly(
`Timeout 2022-04-14-13-51-00 for user ${userId} in guild ${guildId} has been deleted`
);
})

View file

@ -30,7 +30,7 @@ export default {
const timeout = await timeouts.findOne(timeoutData);
if (timeout) {
logger.verbose(
logger.silly(
`User ${author.tag} (${author.id}) in guild: ${guild?.name} (${guild?.id} is on timeout 2022-04-14-14-15-00`
);
return;
@ -41,7 +41,7 @@ export default {
await userData
.save()
.then(async () => {
logger.verbose(
logger.silly(
`Successfully saved user ${author.tag} (${author.id}) in guild: ${guild?.name} (${guild?.id})`
);
})
@ -52,14 +52,14 @@ export default {
);
});
logger.verbose(
logger.silly(
`User ${author.tag} (${author.id}) in guild: ${guild?.name} (${guild?.id}) has ${userData.points} points`
);
await timeouts
.create(timeoutData)
.then(async () => {
logger.verbose(
logger.silly(
`Successfully created timeout for user ${author.tag} (${author.id}) in guild: ${guild?.name} (${guild?.id})`
);
})
@ -74,7 +74,7 @@ export default {
await timeouts
.deleteOne(timeoutData)
.then(async () => {
logger.verbose(
logger.silly(
`Successfully deleted timeout 2022-04-14-14-15-00 for user ${author.tag} (${author.id}) in guild: ${guild?.name} (${guild?.id})`
);
})

View file

@ -14,7 +14,7 @@ export default async (message: Message) => {
});
if (counter === null)
return logger?.verbose(
return logger?.silly(
`No counter found for guild: ${guild?.name} (${guild?.id})`
);
const { word } = counter;
@ -29,8 +29,8 @@ export default async (message: Message) => {
if (lastMessage.author.id === message.author.id) return;
channel?.send(`${author} said **${word}**.`);
logger?.verbose(`${author} said ${word} in ${channel}`);
return logger?.verbose(
logger?.silly(`${author} said ${word} in ${channel}`);
return logger?.silly(
`User: ${author?.tag} (${author?.id}) in guild: ${guild?.name} (${guild?.id}) said the counter word: ${word}`
);
};

View file

@ -13,12 +13,11 @@ export default {
await audits.execute(oldMessage, newMessage);
logger?.verbose(
logger?.silly(
`Message update event fired by ${author.tag} (${author.id}) in guild: ${guild?.name} (${guild?.id})`
);
if (author?.bot)
return logger?.verbose(`Message update event fired by bot`);
if (author?.bot) return logger?.silly(`Message update event fired by bot`);
await counter(newMessage);
},

View file

@ -14,12 +14,12 @@ export default async (message: Message) => {
});
if (counter === null)
return logger?.verbose(
return logger?.silly(
`No counter found for guild: ${guild?.name} (${guild?.id})`
);
const { word } = counter;
if (content === word)
return logger?.verbose(
return logger?.silly(
`User: ${author?.tag} (${author?.id}) in guild: ${guild?.name} (${guild?.id}) said the counter word: ${word}`
);
@ -27,7 +27,7 @@ export default async (message: Message) => {
?.delete()
?.then(async () => {
await channel?.send(`${author} said **${word}**.`);
logger?.verbose(`${author} said ${word} in ${channel}`);
logger?.silly(`${author} said ${word} in ${channel}`);
})
?.catch(async (error: any) => {
logger?.error(error);

View file

@ -10,14 +10,14 @@ import devMode from "@handlers/devMode";
export default {
once: true,
async execute(client: Client) {
logger.info(`${client.user?.tag} (${client.user?.id}) is ready`);
logger.info("Ready!");
await updatePresence(client);
await devMode(client);
await deployCommands(client);
client.guilds?.cache.forEach((guild) => {
logger.verbose(
logger.silly(
`${client.user?.tag} (${client.user?.id}) is in guild: ${guild.name} (${guild.id}) with member count of ${guild.memberCount}`
);
});

View file

@ -12,7 +12,7 @@ export default async (client: Client) => {
}
await Promise.all(
plugins.map(async (pluginName) => {
plugins.map(async (pluginName, index) => {
const plugin = await import(`../plugins/${pluginName}`);
await client.commands.set(
@ -20,10 +20,14 @@ export default async (client: Client) => {
plugin.default,
plugin.default.metadata
);
logger.verbose(
`Loaded plugin ${index + 1}/${plugins.length}: ${pluginName}`
);
})
)
.then(async () => {
logger.debug("Successfully loaded plugins.");
logger.info(`Started all ${plugins.length} plugins.`);
})
.catch(async (err) => {
logger.error(`${err}`);

View file

@ -14,12 +14,12 @@ export default async (client: Client) => {
client.commands.map(async (pluginData: any) => {
pluginList.push(pluginData.builder.toJSON());
logger.verbose(
`${pluginData.builder.name} successfully pushed to plugin list.`
`Plugin is ready for deployment: ${pluginData.builder.name}`
);
})
)
.then(async () => {
logger.debug("Successfully pushed all plugins to plugin list.");
logger.info("All plugins are ready to be deployed.");
})
.catch(async (error) => {
logger.error(`${error}`);
@ -32,7 +32,7 @@ export default async (client: Client) => {
body: pluginList,
})
.then(async () => {
logger.debug(`Successfully deployed plugins to Discord`);
logger.info(`Successfully deployed plugins to Discord's API`);
})
.catch(async (error) => {
logger.error(`${error}`);
@ -44,7 +44,7 @@ export default async (client: Client) => {
body: pluginList,
})
.then(async () =>
logger.debug(`Successfully deployed guild plugins to Discord`)
logger.info(`Successfully deployed guild plugins to Discord's API`)
)
.catch(async (error) => {
logger.error(`${error}`);

View file

@ -9,11 +9,9 @@ import { devMode, guildId } from "@config/other";
export default async (client: Client) => {
if (!devMode) {
return client?.application?.commands?.set([], guildId).then(async () => {
return logger.debug(
`Development commands disabled for guild: ${guildId}`
);
return logger.verbose(`Development mode is disabled.`);
});
}
return logger.debug(`Development commands enabled for guild: ${guildId}`);
return logger.info(`Development mode is enabled.`);
};

View file

@ -9,10 +9,12 @@ export default async (client: Client) => {
}
await Promise.all(
events.map(async (eventName) => {
events.map(async (eventName, index) => {
const event = await import(`../events/${eventName}`);
logger.verbose(`Loaded event: ${eventName}`);
logger.verbose(
`Loaded event ${index + 1}/${events.length}: ${eventName}`
);
if (event.once) {
return client.once(eventName, async (...args) =>
@ -26,10 +28,10 @@ export default async (client: Client) => {
})
)
.then(async () => {
logger.debug("Successfully loaded events.");
logger.info(`Started all ${events.length} events.`);
})
.catch(async (err) => {
logger.error(err);
logger.error(`${err}`);
});
});
};

View file

@ -13,7 +13,7 @@ export default async (guild: Guild) => {
await guildSchema
.deleteMany({ guildId: guild.id })
.then(async () => {
return logger?.verbose(`Deleted guild: ${guild.id}`);
return logger?.silly(`Deleted guild: ${guild.id}`);
})
.catch(async (error) => {
logger?.error(`Error deleting guild: ${guild.id} - ${error}`);
@ -22,7 +22,7 @@ export default async (guild: Guild) => {
await userSchema
.deleteMany({ guildId: guild.id })
.then(async () => {
logger?.verbose(`Deleted users for guild: ${guild.id} from database`);
logger?.silly(`Deleted users for guild: ${guild.id} from database`);
})
.catch(async (error) => {
logger?.error(`Error deleting users for guild: ${guild.id} - ${error}`);
@ -31,7 +31,7 @@ export default async (guild: Guild) => {
await apiSchema
.deleteMany({ guildId: guild.id })
.then(async () => {
logger?.verbose(`Deleted apis for guild: ${guild.id} from database`);
logger?.silly(`Deleted apis for guild: ${guild.id} from database`);
})
.catch(async (error) => {
logger?.error(`Error deleting apis for guild: ${guild.id} - ${error}`);
@ -40,7 +40,7 @@ export default async (guild: Guild) => {
await counterSchema
.deleteMany({ guildId: guild.id })
.then(async () => {
logger?.verbose(`Deleted counters for guild: ${guild.id} from database`);
logger?.silly(`Deleted counters for guild: ${guild.id} from database`);
})
.catch(async (error) => {
logger?.error(
@ -51,9 +51,7 @@ export default async (guild: Guild) => {
await shopRoleSchema
.deleteMany({ guildId: guild.id })
.then(async () => {
logger?.verbose(
`Deleted shop roles for guild: ${guild.id} from database`
);
logger?.silly(`Deleted shop roles for guild: ${guild.id} from database`);
})
.catch(async (error) => {
logger?.error(
@ -64,7 +62,7 @@ export default async (guild: Guild) => {
await timeoutSchema
.deleteMany({ guildId: guild.id })
.then(async () => {
logger?.verbose(`Deleted timeouts for guild: ${guild.id} from database`);
logger?.silly(`Deleted timeouts for guild: ${guild.id} from database`);
})
.catch(async (error) => {
logger?.error(

View file

@ -8,7 +8,7 @@ export default async (user: User, guild: Guild) => {
await userSchema
.deleteOne({ userId: user.id, guildId: guild.id })
.then(async () => {
logger?.verbose(`Deleted user: ${user?.id} from guild: ${guild?.id}`);
logger?.silly(`Deleted user: ${user?.id} from guild: ${guild?.id}`);
})
.catch(async (error) => {
logger?.error(

View file

@ -16,7 +16,7 @@ export default async (guild: Guild) => {
await newGuildObj
.save()
.then(async () => {
logger?.verbose(`Created guild: ${guild.id}`);
logger?.silly(`Created guild: ${guild.id}`);
})
.catch(async (error) => {
logger?.error(`Error creating guild: ${guild.id} - ${error}`);

View file

@ -22,7 +22,7 @@ export default async (user: User, guild: Guild) => {
await newUserObj
.save()
.then(async () => {
logger?.verbose(`Created user: ${user.id} for guild: ${guild.id}`);
logger?.silly(`Created user: ${user.id} for guild: ${guild.id}`);
})
.catch(async (error) => {
logger?.error(

View file

@ -8,5 +8,5 @@ export default async (interaction: CommandInteraction, currentCommand: any) => {
return currentCommand.modules[subcommand].metadata;
}
return currentCommand.groups[subcommandGroup].modules[subcommand].metadata;
return currentCommand.modules[subcommandGroup].modules[subcommand].metadata;
};

View file

@ -2,6 +2,6 @@ import logger from "@root/logger";
export default (count: number, noun: string, suffix?: string) => {
const result = `${count} ${noun}${count !== 1 ? suffix || "s" : ""}`;
logger?.verbose(`Pluralized ${count} to ${result}`);
logger?.silly(`Pluralized ${count} to ${result}`);
return result;
};

View file

@ -23,7 +23,7 @@ export default async function saveUser(data: any, data2: any) {
50
)}\n${`${_}\n${"=".repeat(50)}`}`
)
: logger?.verbose(`Saved user: ${data.id} (saveUser)`)
: logger?.silly(`Saved user: ${data.id} (saveUser)`)
);
if (data2) {
data2.save((_: any) =>
@ -33,7 +33,7 @@ export default async function saveUser(data: any, data2: any) {
50
)}\n${`${_}\n${"=".repeat(50)}`}`
)
: logger?.verbose(`Saved user: ${data2.id} (saveUser)`)
: logger?.silly(`Saved user: ${data2.id} (saveUser)`)
);
}
},

View file

@ -3,6 +3,6 @@ import logger from "@logger";
export default function sleep(milliseconds: any) {
return new Promise((resolve) => {
setTimeout(resolve, milliseconds);
logger?.verbose(`Sleeping for ${milliseconds} milliseconds`);
logger?.silly(`Sleeping for ${milliseconds} milliseconds`);
});
}

View file

@ -10,5 +10,5 @@ export default async (client: Client) => {
activities: [{ type: "WATCHING", name: status }],
status: "online",
});
logger?.verbose(`Updated client presence to: ${status}`);
logger?.debug(`Updated client presence to: ${status}`);
};

View file

@ -4,7 +4,7 @@ import { token, intents } from "@config/discord";
import { Client } from "discord.js"; // discord.js
import database from "@database";
import database from "@root/events";
import schedules from "@schedules";
import events from "@handlers/events";
import commands from "@handlers/commands";

View file

@ -17,10 +17,10 @@ export default {
const { options } = interaction;
if (options.getSubcommand() === "view") {
logger.verbose(`Executing view subcommand`);
logger.silly(`Executing view subcommand`);
return modules.view.execute(interaction);
}
logger.verbose(`Unknown subcommand ${options.getSubcommand()}`);
logger.silly(`Unknown subcommand ${options.getSubcommand()}`);
},
};

View file

@ -33,7 +33,7 @@ export default {
await modules.work.execute(interaction);
break;
default:
logger.verbose(`Unknown subcommand ${options.getSubcommand()}`);
logger.silly(`Unknown subcommand ${options.getSubcommand()}`);
}
},
};

View file

@ -5,7 +5,6 @@ import {
footerIcon,
} from "@config/embed";
import i18next from "i18next";
import { CommandInteraction, MessageEmbed } from "discord.js";
import { SlashCommandSubcommandBuilder } from "@discordjs/builders";
import logger from "@logger";
@ -25,33 +24,21 @@ export default {
);
},
execute: async (interaction: CommandInteraction) => {
const { options, user, guild, locale } = interaction;
const { options, user, guild } = interaction;
const discordUser = options.getUser("user");
const embed = new MessageEmbed()
.setTitle(
i18next.t("credits:modules:balance:general:title", {
lng: locale,
ns: "plugins",
})
)
.setTitle("[:dollar:] Balance")
.setTimestamp(new Date())
.setFooter({ text: footerText, iconURL: footerIcon });
if (guild === null) {
logger.verbose(`Guild is null`);
logger.silly(`Guild is null`);
return interaction.editReply({
embeds: [
embed
.setDescription(
i18next.t("guildOnly", {
lng: locale,
ns: "errors",
})
)
.setColor(errorColor),
embed.setDescription("Guild is not found").setColor(errorColor),
],
});
}
@ -59,17 +46,13 @@ export default {
const userObj = await fetchUser(discordUser || user, guild);
if (userObj === null) {
logger.verbose(`User not found`);
logger.silly(`User not found`);
return interaction.editReply({
embeds: [
embed
.setDescription(
i18next.t("userNotFound", {
lng: locale,
ns: "errors",
user: discordUser || user,
})
"User is not found. Please try again with a valid user."
)
.setColor(errorColor),
],
@ -77,35 +60,22 @@ export default {
}
if (userObj.credits === null) {
logger.verbose(`User has no credits`);
logger.silly(`User has no credits`);
return interaction.editReply({
embeds: [
embed
.setDescription(
i18next.t("credits:modules:balance:error01:description", {
lng: locale,
ns: "plugins",
user: discordUser || user,
})
)
.setColor(errorColor),
embed.setDescription("Credits not found").setColor(errorColor),
],
});
}
logger.verbose(`Found user ${discordUser || user}`);
logger.silly(`Found user ${discordUser || user}`);
return interaction.editReply({
embeds: [
embed
.setDescription(
i18next.t("credits:modules:balance:success01:description", {
lng: locale,
ns: "plugins",
user: discordUser || user,
amount: userObj.credits,
})
`${discordUser || user} currently has ${userObj.credits} credits.`
)
.setColor(successColor),
],

View file

@ -18,7 +18,6 @@ import saveUser from "@helpers/saveUser";
// Models
import fetchUser from "@helpers/fetchUser";
import { SlashCommandSubcommandBuilder } from "@discordjs/builders";
import i18next from "i18next";
// Function
export default {
@ -52,44 +51,27 @@ export default {
const optionReason = options.getString("reason");
const embed = new MessageEmbed()
.setTitle(
i18next.t("credits:modules:gift:general:title", {
lng: locale,
ns: "plugins",
})
)
.setTitle("[:dollar:] Gift")
.setTimestamp(new Date())
.setFooter({ text: footerText, iconURL: footerIcon });
if (guild === null) {
logger.verbose(`Guild is null`);
logger.silly(`Guild is null`);
return interaction.editReply({
embeds: [
embed
.setDescription(
i18next.t("guildOnly", {
lng: locale,
ns: "errors",
})
)
.setColor(errorColor),
embed.setDescription("Guild is not found").setColor(errorColor),
],
});
}
if (optionUser === null) {
logger.verbose(`User not found`);
logger.silly(`User not found`);
return interaction.editReply({
embeds: [
embed
.setDescription(
i18next.t("userNotFound", {
lng: locale,
ns: "errors",
})
)
.setDescription(`User is not found in this guild`)
.setColor(errorColor),
],
});
@ -102,16 +84,13 @@ export default {
const toUserDB = await fetchUser(optionUser, guild);
if (fromUserDB === null) {
logger.verbose(`User not found`);
logger.silly(`User not found`);
return interaction.editReply({
embeds: [
embed
.setDescription(
i18next.t("userNotFound", {
lng: locale,
ns: "errors",
})
"You do not have any credits. Please write something in the chat to get some."
)
.setColor(errorColor),
],
@ -119,16 +98,13 @@ export default {
}
if (toUserDB === null) {
logger.verbose(`User not found`);
logger.silly(`User not found`);
return interaction.editReply({
embeds: [
embed
.setDescription(
i18next.t("userNotFound", {
lng: locale,
ns: "errors",
})
"The user you want to gift credits to does not have any credits. Please wait until that user has typed something in the chat to get some."
)
.setColor(errorColor),
],
@ -137,16 +113,13 @@ export default {
// If receiver is same as sender
if (optionUser.id === user.id) {
logger.verbose(`User is same as sender`);
logger.silly(`User is same as sender`);
return interaction.editReply({
embeds: [
embed
.setDescription(
i18next.t("credits:modules:gift:error01:description", {
lng: locale,
ns: "plugins",
})
"You can't gift credits to yourself. Please choose a different user."
)
.setColor(errorColor),
],
@ -155,16 +128,13 @@ export default {
// If amount is null
if (optionAmount === null) {
logger.verbose(`Amount is null`);
logger.silly(`Amount is null`);
return interaction.editReply({
embeds: [
embed
.setDescription(
i18next.t("amountNotFound", {
lng: locale,
ns: "errors",
})
"Please specify the amount of credits you want to gift."
)
.setColor(errorColor),
],
@ -173,16 +143,13 @@ export default {
// If amount is zero or below
if (optionAmount <= 0) {
logger.verbose(`Amount is zero or below`);
logger.silly(`Amount is zero or below`);
return interaction.editReply({
embeds: [
embed
.setDescription(
i18next.t("credits:modules:gift:error02:description", {
lng: locale,
ns: "plugins",
})
"Please specify a valid amount of credits you want to gift."
)
.setColor(errorColor),
],
@ -191,17 +158,13 @@ export default {
// If user has below gifting amount
if (fromUserDB.credits < optionAmount) {
logger.verbose(`User has below gifting amount`);
logger.silly(`User has below gifting amount`);
return interaction.editReply({
embeds: [
embed
.setDescription(
i18next.t("credits:modules:gift:error03:description", {
lng: locale,
ns: "plugins",
amount: fromUserDB.credits,
})
"You don't have enough credits to gift that amount. Please try again with a lower amount."
)
.setColor(errorColor),
],
@ -210,28 +173,19 @@ export default {
// If toUserDB has no credits
if (toUserDB === null) {
logger.verbose(`User has no credits`);
logger.silly(`User has no credits`);
return interaction.editReply({
embeds: [
embed
.setDescription(
i18next.t("userNotFound", {
lng: locale,
ns: "errors",
})
"The user you want to gift credits to does not have any credits. Please wait until that user has typed something in the chat to get some."
)
.setColor(errorColor),
],
});
}
// Withdraw amount from fromUserDB
fromUserDB.credits -= optionAmount;
// Deposit amount to toUserDB
toUserDB.credits += optionAmount;
// Save users
await saveUser(fromUserDB, toUserDB).then(async () => {
// Get DM user object
@ -245,13 +199,11 @@ export default {
embeds: [
embed
.setDescription(
i18next.t("credits:modules:gift:error03:description", {
lng: locale,
ns: "plugins",
user: user.tag,
amount: optionAmount,
reason: optionReason || "unspecified",
})
`${
user.tag
} has gifted you ${optionAmount} credits with reason: ${
optionReason || "unspecified"
}`
)
.setColor(successColor),
],
@ -260,7 +212,7 @@ export default {
logger.error(`[Gift] Error sending DM to user: ${error}`)
);
logger.verbose(
logger.silly(
`[Gift] Successfully gifted ${optionAmount} credits to ${optionUser.tag}`
);
@ -268,13 +220,9 @@ export default {
embeds: [
embed
.setDescription(
i18next.t("credits:modules:gift:success02:description", {
lng: locale,
ns: "plugins",
user: user,
amount: optionAmount,
reason: optionReason || "unspecified",
})
`Successfully gifted ${optionAmount} credits to ${
optionUser.tag
} with reason: ${optionReason || "unspecified"}`
)
.setColor(successColor),
],

View file

@ -5,7 +5,6 @@ import {
footerIcon,
} from "@config/embed";
import i18next from "i18next";
import { CommandInteraction, MessageEmbed } from "discord.js";
import { SlashCommandSubcommandBuilder } from "@discordjs/builders";
import logger from "@logger";
@ -19,29 +18,21 @@ export default {
return command.setName("top").setDescription(`View the top users`);
},
execute: async (interaction: CommandInteraction) => {
const { locale, guild } = interaction;
const { guild } = interaction;
const embed = new MessageEmbed()
.setTitle(
i18next.t("credits:modules:top:general:title", {
lng: locale,
ns: "plugins",
})
)
.setTitle("[:dollar:] Top")
.setTimestamp(new Date())
.setFooter({ text: footerText, iconURL: footerIcon });
if (guild === null) {
logger.verbose(`Guild is null`);
logger.silly(`Guild is null`);
return interaction.editReply({
embeds: [
embed
.setDescription(
i18next.t("guildOnly", {
lng: locale,
ns: "errors",
})
"Guild is not found. Please try again with a valid guild."
)
.setColor(errorColor),
],
@ -60,22 +51,13 @@ export default {
// Create entry object
const entry = (x: IUser, index: number) =>
i18next.t("credits:modules:top:entry", {
lng: locale,
ns: "plugins",
index: index + 1,
user: x.userId,
amount: x.credits,
});
`${index + 1}. <@${x.userId}> - ${x.credits} credits`;
return interaction.editReply({
embeds: [
embed
.setDescription(
` ${i18next.t("credits:modules:top:success01:description", {
lng: locale,
ns: "plugins",
})}
`Below are the top 10 users in this guild.
${topTen.map(entry).join("\n")}
`

View file

@ -20,7 +20,6 @@ import timeoutSchema from "@schemas/timeout";
// Helpers
import fetchUser from "@helpers/fetchUser";
import fetchGuild from "@helpers/fetchGuild";
import i18next from "i18next";
export default {
metadata: { guildOnly: true, ephemeral: true },
@ -30,15 +29,10 @@ export default {
},
execute: async (interaction: CommandInteraction) => {
// Destructure member
const { guild, user, locale } = interaction;
const { guild, user } = interaction;
const embed = new MessageEmbed()
.setTitle(
i18next.t("credits:modules:work:general:title", {
lng: locale,
ns: "plugins",
})
)
.setTitle("[:dollar:] Work")
.setTimestamp(new Date())
.setFooter({
text: footerText,
@ -56,24 +50,20 @@ export default {
});
if (guild === null) {
return logger?.verbose(`Guild is null`);
return logger?.silly(`Guild is null`);
}
const guildDB = await fetchGuild(guild);
// If user is not on timeout
if (isTimeout) {
logger?.verbose(`User ${user?.id} is on timeout`);
logger?.silly(`User ${user?.id} is on timeout`);
return interaction.editReply({
embeds: [
embed
.setDescription(
i18next.t("credits:modules:work:error01:description", {
lng: locale,
ns: "plugins",
time: guildDB?.credits.workTimeout,
})
`You are on timeout, please wait ${guildDB?.credits.workTimeout} seconds.`
)
.setColor(errorColor),
],
@ -88,27 +78,20 @@ export default {
const userDB = await fetchUser(user, guild);
if (userDB === null) {
return logger?.verbose(`User not found`);
return logger?.silly(`User not found`);
}
userDB.credits += creditsEarned;
await userDB?.save()?.then(async () => {
logger?.verbose(
logger?.silly(
`User ${userDB?.userId} worked and earned ${creditsEarned} credits`
);
return interaction.editReply({
embeds: [
embed
.setDescription(
i18next.t("credits:modules:work:success01:description", {
lng: locale,
ns: "plugins",
time: guildDB?.credits.workTimeout,
amount: creditsEarned,
})
)
.setDescription(`You worked and earned ${creditsEarned} credits.`)
.setColor(successColor),
],
});
@ -122,7 +105,7 @@ export default {
});
setTimeout(async () => {
logger?.verbose(`Removing timeout for user ${user?.id}`);
logger?.silly(`Removing timeout for user ${user?.id}`);
// When timeout is out, remove it from the database
await timeoutSchema?.deleteOne({

View file

@ -21,7 +21,7 @@ export default {
await modules.meme.execute(interaction);
break;
default:
logger.verbose(`Unknown subcommand ${options.getSubcommand()}`);
logger.silly(`Unknown subcommand ${options.getSubcommand()}`);
}
},
};

View file

@ -1,4 +0,0 @@
import add from "@plugins/manage/groups/counters/modules/add";
import remove from "@plugins/manage/groups/counters/modules/remove";
export default { add, remove };

View file

@ -1,6 +0,0 @@
import give from "@plugins/manage/groups/credits/modules/give";
import set from "@plugins/manage/groups/credits/modules/set";
import take from "@plugins/manage/groups/credits/modules/take";
import transfer from "@plugins/manage/groups/credits/modules/transfer";
export default { give, set, take, transfer };

View file

@ -1,4 +0,0 @@
import counters from "@plugins/manage/groups/counters";
import credits from "@plugins/manage/groups/credits";
export default { counters, credits };

View file

@ -3,35 +3,35 @@ import { SlashCommandBuilder } from "@discordjs/builders";
import { CommandInteraction } from "discord.js";
// Groups
import groups from "@plugins/manage/groups";
import modules from "@plugins/manage/modules";
import logger from "@logger";
// Function
export default {
groups,
modules,
builder: new SlashCommandBuilder()
.setName("manage")
.setDescription("Manage the bot.")
.addSubcommandGroup(groups.counters.builder)
.addSubcommandGroup(groups.credits.builder),
.addSubcommandGroup(modules.counters.builder)
.addSubcommandGroup(modules.credits.builder),
async execute(interaction: CommandInteraction) {
// Destructure
const { options } = interaction;
if (options?.getSubcommandGroup() === "credits") {
logger?.verbose(`Subcommand group is credits`);
logger?.silly(`Subcommand group is credits`);
return groups.credits.execute(interaction);
return modules.credits.execute(interaction);
}
if (options?.getSubcommandGroup() === "counters") {
logger?.verbose(`Subcommand group is counters`);
logger?.silly(`Subcommand group is counters`);
return groups.counters.execute(interaction);
return modules.counters.execute(interaction);
}
logger?.verbose(`Subcommand group is not credits or counters`);
logger?.silly(`Subcommand group is not credits or counters`);
},
};

View file

@ -23,17 +23,17 @@ export default {
const { options } = interaction;
if (options?.getSubcommand() === "add") {
logger?.verbose(`Executing create subcommand`);
logger?.silly(`Executing create subcommand`);
return modules.add.execute(interaction);
}
if (options?.getSubcommand() === "remove") {
logger?.verbose(`Executing delete subcommand`);
logger?.silly(`Executing delete subcommand`);
return modules.remove.execute(interaction);
}
logger?.verbose(`Unknown subcommand ${options?.getSubcommand()}`);
logger?.silly(`Unknown subcommand ${options?.getSubcommand()}`);
},
};

View file

@ -16,7 +16,6 @@ import logger from "@logger";
// Models
import counterSchema from "@schemas/counter";
import i18next from "i18next";
// Function
export default {
@ -57,12 +56,7 @@ export default {
const startValue = options?.getNumber("start");
const embed = new MessageEmbed()
.setTitle(
i18next.t("manage:groups:counters:modules:add:general:title", {
lng: locale,
ns: "plugins",
})
)
.setTitle("[:toolbox:] Counters - Add")
.setTimestamp(new Date())
.setFooter({ text: footerText, iconURL: footerIcon });
@ -75,16 +69,7 @@ export default {
return interaction?.editReply({
embeds: [
embed
.setDescription(
i18next.t(
"manage:groups:counters:modules:add:error01:description",
{
lng: locale,
ns: "plugins",
channel: discordChannel,
}
)
)
.setDescription(`A counter already exists for this channel.`)
.setColor(errorColor),
],
});
@ -98,20 +83,13 @@ export default {
counter: startValue || 0,
})
.then(async () => {
logger?.verbose(`Created counter`);
logger?.silly(`Created counter`);
return interaction?.editReply({
embeds: [
embed
.setDescription(
i18next.t(
"manage:groups:counters:modules:create:success01:description",
{
lng: locale,
ns: "plugins",
channel: discordChannel,
}
)
`Successfully created counter for ${discordChannel?.name}.`
)
.setColor(successColor),
],

View file

@ -0,0 +1,4 @@
import add from "@plugins/manage/modules/counters/modules/add";
import remove from "@plugins/manage/modules/counters/modules/remove";
export default { add, remove };

View file

@ -16,7 +16,6 @@ import logger from "@logger";
import counterSchema from "@schemas/counter";
import { SlashCommandSubcommandBuilder } from "@discordjs/builders";
import { ChannelType } from "discord-api-types/v10";
import i18next from "i18next";
// Function
export default {
@ -44,12 +43,7 @@ export default {
const discordChannel = options?.getChannel("channel");
const embed = new MessageEmbed()
.setTitle(
i18next.t("manage:groups:counters:modules:remove:general:title", {
lng: locale,
ns: "plugins",
})
)
.setTitle("[:toolbox:] Counters - Remove")
.setTimestamp(new Date())
.setFooter({ text: footerText, iconURL: footerIcon });
@ -59,19 +53,13 @@ export default {
});
if (counter === null) {
logger?.verbose(`Counter is null`);
logger?.silly(`Counter is null`);
return interaction?.editReply({
embeds: [
embed
.setDescription(
i18next.t(
"manage:groups:counters:modules:remove:error01:description",
{
lng: locale,
ns: "plugins",
}
)
":x: There is no counter in this channel. Please add a counter first."
)
.setColor(errorColor),
],
@ -84,19 +72,13 @@ export default {
channelId: discordChannel?.id,
})
?.then(async () => {
logger?.verbose(`Counter deleted`);
logger?.silly(`Counter deleted`);
return interaction?.editReply({
embeds: [
embed
.setDescription(
i18next.t(
"manage:groups:counters:modules:remove:success01:description",
{
lng: locale,
ns: "plugins",
}
)
":white_check_mark: Counter deleted successfully."
)
.setColor(successColor),
],

View file

@ -21,23 +21,23 @@ export default {
switch (options.getSubcommand()) {
case "give":
logger.verbose(`Executing give subcommand`);
logger.silly(`Executing give subcommand`);
return modules.give.execute(interaction);
case "set":
logger.verbose(`Executing set subcommand`);
logger.silly(`Executing set subcommand`);
return modules.set.execute(interaction);
case "take":
logger.verbose(`Executing take subcommand`);
logger.silly(`Executing take subcommand`);
return modules.take.execute(interaction);
case "transfer":
logger.verbose(`Executing transfer subcommand`);
logger.silly(`Executing transfer subcommand`);
return modules.transfer.execute(interaction);
default:
logger.verbose(`Unknown subcommand ${options.getSubcommand()}`);
logger.silly(`Unknown subcommand ${options.getSubcommand()}`);
}
},
};

View file

@ -53,7 +53,7 @@ export default {
// If amount option is null
if (creditAmount === null) {
logger?.verbose(`Amount is null`);
logger?.silly(`Amount is null`);
return interaction?.editReply({
embeds: [
@ -69,7 +69,7 @@ export default {
// If amount is zero or below
if (creditAmount <= 0) {
logger?.verbose(`Amount is zero or below`);
logger?.silly(`Amount is zero or below`);
return interaction?.editReply({
embeds: [
@ -84,7 +84,7 @@ export default {
}
if (discordReceiver === null) {
logger?.verbose(`Discord receiver is null`);
logger?.silly(`Discord receiver is null`);
return interaction?.editReply({
embeds: [
@ -98,7 +98,7 @@ export default {
});
}
if (guild === null) {
logger?.verbose(`Guild is null`);
logger?.silly(`Guild is null`);
return interaction?.editReply({
embeds: [
@ -115,7 +115,7 @@ export default {
const toUser = await fetchUser(discordReceiver, guild);
if (toUser === null) {
logger?.verbose(`To user is null`);
logger?.silly(`To user is null`);
return interaction?.editReply({
embeds: [
@ -147,7 +147,7 @@ export default {
// Save toUser
await toUser?.save()?.then(async () => {
logger?.verbose(`Saved toUser`);
logger?.silly(`Saved toUser`);
return interaction?.editReply({
embeds: [

View file

@ -0,0 +1,6 @@
import give from "@plugins/manage/modules/credits/modules/give";
import set from "@plugins/manage/modules/credits/modules/set";
import take from "@plugins/manage/modules/credits/modules/take";
import transfer from "@plugins/manage/modules/credits/modules/transfer";
export default { give, set, take, transfer };

View file

@ -51,7 +51,7 @@ export default {
// If amount is null
if (creditAmount === null) {
logger?.verbose(`Amount is null`);
logger?.silly(`Amount is null`);
return interaction?.editReply({
embeds: [
@ -66,7 +66,7 @@ export default {
}
if (discordUser === null) {
logger?.verbose(`User is null`);
logger?.silly(`User is null`);
return interaction?.editReply({
embeds: [
@ -80,7 +80,7 @@ export default {
});
}
if (guild === null) {
logger?.verbose(`Guild is null`);
logger?.silly(`Guild is null`);
return interaction?.editReply({
embeds: [
@ -99,7 +99,7 @@ export default {
// If toUser does not exist
if (toUser === null) {
logger?.verbose(`User does not exist`);
logger?.silly(`User does not exist`);
return interaction?.editReply({
embeds: [
@ -115,7 +115,7 @@ export default {
// If toUser.credits does not exist
if (toUser?.credits === null) {
logger?.verbose(`User does not have any credits`);
logger?.silly(`User does not have any credits`);
return interaction?.editReply({
embeds: [
@ -134,7 +134,7 @@ export default {
// Save toUser
await toUser?.save()?.then(async () => {
logger?.verbose(`Saved user`);
logger?.silly(`Saved user`);
return interaction?.editReply({
embeds: [

View file

@ -56,7 +56,7 @@ export default {
// If amount is null
if (optionAmount === null) {
logger?.verbose(`Amount is null`);
logger?.silly(`Amount is null`);
return interaction?.editReply({
embeds: [
@ -72,7 +72,7 @@ export default {
// If amount is zero or below
if (optionAmount <= 0) {
logger?.verbose(`Amount is zero or below`);
logger?.silly(`Amount is zero or below`);
return interaction?.editReply({
embeds: [
@ -87,7 +87,7 @@ export default {
}
if (optionUser === null) {
logger?.verbose(`Discord receiver is null`);
logger?.silly(`Discord receiver is null`);
return interaction?.editReply({
embeds: [
@ -101,7 +101,7 @@ export default {
});
}
if (guild === null) {
logger?.verbose(`Guild is null`);
logger?.silly(`Guild is null`);
return interaction?.editReply({
embeds: [
@ -120,7 +120,7 @@ export default {
// If toUser does not exist
if (toUser === null) {
logger?.verbose(`ToUser is null`);
logger?.silly(`ToUser is null`);
return interaction?.editReply({
embeds: [
@ -136,7 +136,7 @@ export default {
// If toUser.credits does not exist
if (toUser?.credits === null) {
logger?.verbose(`ToUser.credits is null`);
logger?.silly(`ToUser.credits is null`);
return interaction?.editReply({
embeds: [
@ -155,7 +155,7 @@ export default {
// Save toUser
await toUser?.save()?.then(async () => {
logger?.verbose(`Saved toUser`);
logger?.silly(`Saved toUser`);
return interaction?.editReply({
embeds: [

View file

@ -61,7 +61,7 @@ export default {
// If amount is null
if (optionAmount === null) {
logger?.verbose(`Amount is null`);
logger?.silly(`Amount is null`);
return interaction?.editReply({
embeds: [
@ -76,7 +76,7 @@ export default {
}
if (guild === null) {
logger?.verbose(`Guild is null`);
logger?.silly(`Guild is null`);
return interaction?.editReply({
embeds: [
@ -90,7 +90,7 @@ export default {
});
}
if (optionFromUser === null) {
logger?.verbose(`From user is null`);
logger?.silly(`From user is null`);
return interaction?.editReply({
embeds: [
@ -104,7 +104,7 @@ export default {
});
}
if (optionToUser === null) {
logger?.verbose(`To user is null`);
logger?.silly(`To user is null`);
return interaction?.editReply({
embeds: [
@ -126,7 +126,7 @@ export default {
// If toUser does not exist
if (fromUser === null) {
logger?.verbose(`From user does not exist`);
logger?.silly(`From user does not exist`);
return interaction?.editReply({
embeds: [
@ -144,7 +144,7 @@ export default {
// If toUser.credits does not exist
if (!fromUser?.credits) {
logger?.verbose(`From user does not have credits`);
logger?.silly(`From user does not have credits`);
return interaction?.editReply({
embeds: [
@ -162,7 +162,7 @@ export default {
// If toUser does not exist
if (toUser === null) {
logger?.verbose(`To user does not exist`);
logger?.silly(`To user does not exist`);
return interaction?.editReply({
embeds: [
@ -180,7 +180,7 @@ export default {
// If toUser.credits does not exist
if (toUser?.credits === null) {
logger?.verbose(`To user does not have credits`);
logger?.silly(`To user does not have credits`);
return interaction?.editReply({
embeds: [
@ -204,7 +204,7 @@ export default {
// Save users
await saveUser(fromUser, toUser)?.then(async () => {
logger?.verbose(`Saved users`);
logger?.silly(`Saved users`);
return interaction?.editReply({
embeds: [

View file

@ -0,0 +1,4 @@
import counters from "@plugins/manage/modules/counters";
import credits from "@plugins/manage/modules/credits";
export default { counters, credits };

View file

@ -20,11 +20,11 @@ export default {
const { options } = interaction;
if (options?.getSubcommand() === "view") {
logger?.verbose(`Executing view subcommand`);
logger?.silly(`Executing view subcommand`);
return modules.view.execute(interaction);
}
logger?.verbose(`No subcommand found`);
logger?.silly(`No subcommand found`);
},
};

View file

@ -36,7 +36,7 @@ export default {
);
if (guild === null) {
return logger?.verbose(`Guild is null`);
return logger?.silly(`Guild is null`);
}
// User Information

View file

@ -19,11 +19,11 @@ export default {
const { options } = interaction;
if (options?.getSubcommand() === "give") {
logger?.verbose(`Executing give subcommand`);
logger?.silly(`Executing give subcommand`);
await modules.give.execute(interaction);
}
logger?.verbose(`No subcommand found`);
logger?.silly(`No subcommand found`);
},
};

View file

@ -58,14 +58,14 @@ export default {
const optionType = options?.getString("type");
if (guild === null) {
return logger?.verbose(`Guild is null`);
return logger?.silly(`Guild is null`);
}
// User information
const userObj = await fetchUser(user, guild);
if (userObj === null) {
return logger?.verbose(`User is null`);
return logger?.silly(`User is null`);
}
// Check if user has a timeout
@ -77,7 +77,7 @@ export default {
// If user is not on timeout
if (isTimeout) {
logger?.verbose(`User is on timeout`);
logger?.silly(`User is on timeout`);
return interaction?.editReply({
embeds: [
@ -97,7 +97,7 @@ export default {
// Do not allow self reputation
if (optionTarget?.id === user?.id) {
logger?.verbose(`User is trying to give reputation to self`);
logger?.silly(`User is trying to give reputation to self`);
return interaction?.editReply({
embeds: [
@ -117,21 +117,21 @@ export default {
// If type is positive
if (optionType === "positive") {
logger?.verbose(`User is giving positive reputation`);
logger?.silly(`User is giving positive reputation`);
userObj.reputation += 1;
}
// If type is negative
else if (optionType === "negative") {
logger?.verbose(`User is giving negative reputation`);
logger?.silly(`User is giving negative reputation`);
userObj.reputation -= 1;
}
// Save user
await userObj?.save()?.then(async () => {
logger?.verbose(`User reputation has been updated`);
logger?.silly(`User reputation has been updated`);
await timeoutSchema?.create({
guildId: guild?.id,
@ -156,7 +156,7 @@ export default {
});
setTimeout(async () => {
logger?.verbose(`Removing timeout`);
logger?.silly(`Removing timeout`);
await timeoutSchema?.deleteOne({
guildId: guild?.id,

View file

@ -1,8 +0,0 @@
import audits from "@plugins/settings/groups/guild/modules/audits";
import credits from "@plugins/settings/groups/guild/modules/credits";
import points from "@plugins/settings/groups/guild/modules/points";
import pterodactyl from "@plugins/settings/groups/guild/modules/pterodactyl";
import shop from "@plugins/settings/groups/guild/modules/shop";
import welcome from "@plugins/settings/groups/guild/modules/welcome";
export default { audits, credits, points, pterodactyl, shop, welcome };

View file

@ -1,3 +0,0 @@
import guild from "@plugins/settings/groups/guild";
export default { guild };

View file

@ -2,31 +2,31 @@
import { SlashCommandBuilder } from "@discordjs/builders";
import { CommandInteraction } from "discord.js";
// Groups
import groups from "./groups";
// Modules
import modules from "./modules";
// Handlers
import logger from "@logger";
// Function
export default {
groups,
modules,
builder: new SlashCommandBuilder()
.setName("settings")
.setDescription("Manage settings.")
.addSubcommandGroup(groups.guild.builder),
.addSubcommandGroup(modules.guild.builder),
async execute(interaction: CommandInteraction) {
const { options } = interaction;
if (options.getSubcommandGroup() === "guild") {
logger.verbose(`Executing guild subcommand`);
logger.silly(`Executing guild subcommand`);
return groups.guild.execute(interaction);
return modules.guild.execute(interaction);
}
logger.verbose(`No subcommand group found`);
logger.silly(`No subcommand group found`);
},
};

View file

@ -30,31 +30,31 @@ export default {
switch (options?.getSubcommand()) {
case "pterodactyl":
logger?.verbose(`Subcommand is pterodactyl`);
logger?.silly(`Subcommand is pterodactyl`);
return modules.pterodactyl.execute(interaction);
case "credits":
logger?.verbose(`Subcommand is credits`);
logger?.silly(`Subcommand is credits`);
return modules.credits.execute(interaction);
case "points":
logger?.verbose(`Subcommand is points`);
logger?.silly(`Subcommand is points`);
return modules.points.execute(interaction);
case "welcome":
logger?.verbose(`Subcommand is welcome`);
logger?.silly(`Subcommand is welcome`);
return modules.welcome.execute(interaction);
case "audits":
logger?.verbose(`Subcommand is audits`);
logger?.silly(`Subcommand is audits`);
return modules.audits.execute(interaction);
case "shop":
logger?.verbose(`Subcommand is shop`);
logger?.silly(`Subcommand is shop`);
return modules.shop.execute(interaction);
default:
logger?.verbose(`Subcommand is not found`);
logger?.silly(`Subcommand is not found`);
}
},
};

View file

@ -48,7 +48,7 @@ export default {
});
if (guildDB === null) {
return logger?.verbose(`Guild not found in database.`);
return logger?.silly(`Guild not found in database.`);
}
// Modify values
@ -58,7 +58,7 @@ export default {
// Save guild
await guildDB?.save()?.then(async () => {
logger?.verbose(`Guild audits updated.`);
logger?.silly(`Guild audits updated.`);
return interaction?.editReply({
embeds: [

View file

@ -68,7 +68,7 @@ export default {
});
if (guildDB === null) {
return logger?.verbose(`Guild is null`);
return logger?.silly(`Guild is null`);
}
// Modify values
@ -86,7 +86,7 @@ export default {
// Save guild
await guildDB?.save()?.then(async () => {
logger?.verbose(`Guild saved`);
logger?.silly(`Guild saved`);
return interaction?.editReply({
embeds: [

View file

@ -0,0 +1,8 @@
import audits from "@plugins/settings/modules/guild/modules/audits";
import credits from "@plugins/settings/modules/guild/modules/credits";
import points from "@plugins/settings/modules/guild/modules/points";
import pterodactyl from "@plugins/settings/modules/guild/modules/pterodactyl";
import shop from "@plugins/settings/modules/guild/modules/shop";
import welcome from "@plugins/settings/modules/guild/modules/welcome";
export default { audits, credits, points, pterodactyl, shop, welcome };

View file

@ -56,7 +56,7 @@ export default {
});
if (guildDB === null) {
return logger?.verbose(`Guild not found in database.`);
return logger?.silly(`Guild not found in database.`);
}
// Modify values
@ -69,7 +69,7 @@ export default {
// Save guild
await guildDB?.save()?.then(async () => {
logger?.verbose(`Guild points updated.`);
logger?.silly(`Guild points updated.`);
return interaction?.editReply({
embeds: [

View file

@ -53,7 +53,7 @@ export default {
{ new: true, upsert: true }
)
.then(async () => {
logger?.verbose(`Updated API credentials.`);
logger?.silly(`Updated API credentials.`);
return interaction?.editReply({
embeds: [

View file

@ -48,7 +48,7 @@ export default {
});
if (guildDB === null) {
return logger?.verbose(`Guild not found in database.`);
return logger?.silly(`Guild not found in database.`);
}
// Modify values
@ -61,7 +61,7 @@ export default {
// Save guild
await guildDB?.save()?.then(async () => {
logger?.verbose(`Guild shop updated.`);
logger?.silly(`Guild shop updated.`);
return interaction?.editReply({
embeds: [

View file

@ -69,7 +69,7 @@ export default {
});
if (guildDB === null) {
return logger?.verbose(`Guild not found in database.`);
return logger?.silly(`Guild not found in database.`);
}
// Modify values
@ -91,7 +91,7 @@ export default {
// Save guild
await guildDB?.save()?.then(async () => {
logger?.verbose(`Guild welcome updated.`);
logger?.silly(`Guild welcome updated.`);
return interaction?.editReply({
embeds: [

View file

@ -0,0 +1,3 @@
import guild from "@plugins/settings/modules/guild";
export default { guild };

View file

@ -1,3 +0,0 @@
import roles from "./roles";
export default { roles };

View file

@ -5,37 +5,33 @@ import { CommandInteraction } from "discord.js";
// Modules
import modules from "./modules";
// Groups
import groups from "./groups";
// Handlers
import logger from "../../logger";
// Function
export default {
modules,
groups,
builder: new SlashCommandBuilder()
.setName("shop")
.setDescription("Shop for credits and custom roles.")
.addSubcommand(modules.pterodactyl.builder)
.addSubcommandGroup(groups.roles.builder),
.addSubcommandGroup(modules.roles.builder),
async execute(interaction: CommandInteraction) {
const { options } = interaction;
if (options?.getSubcommand() === "pterodactyl") {
logger.verbose(`Executing pterodactyl subcommand`);
logger.silly(`Executing pterodactyl subcommand`);
return modules.pterodactyl.execute(interaction);
}
if (options?.getSubcommandGroup() === "roles") {
logger?.verbose(`Subcommand group is roles`);
logger?.silly(`Subcommand group is roles`);
return groups.roles.execute(interaction);
return modules.roles.execute(interaction);
}
logger?.verbose(`No subcommand found.`);
logger?.silly(`No subcommand found.`);
},
};

View file

@ -1,3 +1,4 @@
import pterodactyl from "@plugins/shop/modules/pterodactyl";
import roles from "@plugins/shop/modules/roles";
export default { pterodactyl };
export default { pterodactyl, roles };

View file

@ -37,7 +37,7 @@ export default {
const optionAmount = options?.getInteger("amount");
if (optionAmount === null) {
logger?.verbose(`Amount is null.`);
logger?.silly(`Amount is null.`);
return interaction?.editReply({
embeds: [
@ -56,19 +56,19 @@ export default {
}
if (guild === null) {
return logger?.verbose(`Guild is null`);
return logger?.silly(`Guild is null`);
}
const userDB = await fetchUser(user, guild);
if (userDB === null) {
return logger?.verbose(`User is null`);
return logger?.silly(`User is null`);
}
const dmUser = client?.users?.cache?.get(user?.id);
if ((optionAmount || userDB?.credits) < 100) {
logger?.verbose(`Amount or user credits is below 100.`);
logger?.silly(`Amount or user credits is below 100.`);
return interaction?.editReply({
embeds: [
@ -93,7 +93,7 @@ export default {
}
if ((optionAmount || userDB?.credits) > 1000000) {
logger?.verbose(`Amount or user credits is above 1.000.000.`);
logger?.silly(`Amount or user credits is above 1.000.000.`);
return interaction?.editReply({
embeds: [
@ -119,7 +119,7 @@ export default {
}
if (userDB?.credits < optionAmount) {
logger?.verbose(`User credits is below amount.`);
logger?.silly(`User credits is below amount.`);
return interaction?.editReply({
embeds: [
@ -168,7 +168,7 @@ export default {
})
?.then(async () => {
logger?.verbose(`Successfully created voucher.`);
logger?.silly(`Successfully created voucher.`);
userDB.credits -= optionAmount || userDB?.credits;
@ -176,7 +176,7 @@ export default {
?.save()
?.then(async () => {
logger?.verbose(`Successfully saved new credits.`);
logger?.silly(`Successfully saved new credits.`);
await dmUser?.send({
embeds: [
@ -218,7 +218,7 @@ export default {
})
.catch(async (error) => {
logger?.verbose(`Error saving new credits. - ${error}`);
logger?.silly(`Error saving new credits. - ${error}`);
return interaction?.editReply({
embeds: [
@ -238,7 +238,7 @@ export default {
})
.catch(async (error: any) => {
logger?.verbose(`Error creating voucher. - ${error}`);
logger?.silly(`Error creating voucher. - ${error}`);
return interaction?.editReply({
embeds: [

View file

@ -33,7 +33,7 @@ export default {
if (guildDB === null) return;
if (!guildDB.shop.roles.status) {
logger.verbose(`Shop roles disabled.`);
logger.silly(`Shop roles disabled.`);
return interaction?.editReply({
embeds: [
@ -52,13 +52,13 @@ export default {
}
if (options?.getSubcommand() === "buy") {
logger.verbose(`Executing buy subcommand`);
logger.silly(`Executing buy subcommand`);
await modules.buy.execute(interaction);
}
if (options?.getSubcommand() === "cancel") {
logger.verbose(`Executing cancel subcommand`);
logger.silly(`Executing cancel subcommand`);
await modules.cancel.execute(interaction);
}

View file

@ -52,7 +52,7 @@ export default {
// If amount is null
if (optionName === null) {
logger?.verbose(`Name is null.`);
logger?.silly(`Name is null.`);
return interaction?.editReply({
embeds: [
@ -85,15 +85,15 @@ export default {
const userDB = await fetchUser(user, guild);
if (userDB === null) {
return logger?.verbose(`User is null`);
return logger?.silly(`User is null`);
}
if (guildDB === null) {
return logger?.verbose(`Guild is null`);
return logger?.silly(`Guild is null`);
}
if (guildDB.shop === null) {
return logger?.verbose(`Shop is null`);
return logger?.silly(`Shop is null`);
}
const { pricePerHour } = guildDB.shop.roles;
@ -112,7 +112,7 @@ export default {
await (member?.roles as GuildMemberRoleManager)?.add(role?.id);
logger?.verbose(`Role ${role?.name} was bought by ${user?.tag}`);
logger?.silly(`Role ${role?.name} was bought by ${user?.tag}`);
return interaction?.editReply({
embeds: [
@ -139,7 +139,7 @@ export default {
});
})
.catch(async (error) => {
return logger?.verbose(`Role could not be created. ${error}`);
return logger?.silly(`Role could not be created. ${error}`);
});
},
};

View file

@ -39,7 +39,7 @@ export default {
const optionRole = options.getRole("role");
if (optionRole === null) {
logger?.verbose(`Role is null.`);
logger?.silly(`Role is null.`);
return interaction?.editReply({
embeds: [
@ -73,7 +73,7 @@ export default {
const userDB = await fetchUser(user, guild);
if (userDB === null) {
return logger?.verbose(`User is null`);
return logger?.silly(`User is null`);
}
await shopRolesSchema?.deleteOne({
@ -104,7 +104,7 @@ export default {
});
})
.catch(async (error) => {
return logger?.verbose(`Role could not be deleted. ${error}`);
return logger?.silly(`Role could not be deleted. ${error}`);
});
},
};

View file

@ -1,6 +1,5 @@
import { successColor, footerText, footerIcon } from "@config/embed";
import i18next from "i18next";
import { CommandInteraction, MessageEmbed } from "discord.js";
import { SlashCommandSubcommandBuilder } from "@discordjs/builders";
@ -18,32 +17,19 @@ export default {
);
},
execute: async (interaction: CommandInteraction) => {
const { locale } = interaction;
const userOption = interaction.options.getUser("user");
const targetUser = userOption || interaction.user;
const embed = new MessageEmbed()
.setTitle(
i18next.t("utility:modules:avatar:general:title", {
lng: locale,
ns: "plugins",
})
)
.setTitle("[:tools:] Avatar")
.setTimestamp(new Date())
.setFooter({ text: footerText, iconURL: footerIcon });
return interaction.editReply({
embeds: [
embed
.setDescription(
i18next.t("utility:modules:avatar:success01:description", {
lng: locale,
ns: "plugins",
user: targetUser,
})
)
.setDescription(`${targetUser.username}'s avatar:`)
.setThumbnail(targetUser.displayAvatarURL())
.setColor(successColor),
],

View file

@ -64,7 +64,7 @@ export default async (client: Client) => {
guildId,
})
.then(async () => {
logger.verbose(
logger.silly(
`Shop role document ${roleId} has been deleted from user ${userId}.`
);
})
@ -78,7 +78,7 @@ export default async (client: Client) => {
}
if (new Date() > nextPayment) {
logger.verbose(
logger.silly(
`Shop role ${roleId} is due for payment. Withdrawing credits from user ${userId}.`
);
@ -109,7 +109,7 @@ export default async (client: Client) => {
await role
.save()
.then(async () => {
logger.verbose(`Shop role ${roleId} has been paid for.`);
logger.silly(`Shop role ${roleId} has been paid for.`);
})
.catch(async (err) => {
logger.error(
@ -118,7 +118,7 @@ export default async (client: Client) => {
);
});
logger.verbose(
logger.silly(
`Shop role ${roleId} has been paid for. Keeping role ${roleId} for user ${userId}.`
);
})