refactor: 🧑‍💻 improve developer experience

This commit is contained in:
Axel Olausson Holtenäs 2022-12-25 16:12:35 +01:00
parent 089b20a8cd
commit 96cb38464a
19 changed files with 94 additions and 87 deletions

View file

@ -0,0 +1,2 @@
-- AlterTable
ALTER TABLE GuildMemberCredits RENAME TO GuildMemberCredit;

View file

@ -60,10 +60,10 @@ model GuildMember {
pointsEarned Int @default(0) pointsEarned Int @default(0)
createdAt DateTime @default(now()) createdAt DateTime @default(now())
updatedAt DateTime @updatedAt updatedAt DateTime @updatedAt
GuildShopRoles GuildShopRoles[] GuildShopRoles GuildShopRoles[]
GuildMemberCredits GuildMemberCredits? GuildMemberCredit GuildMemberCredit?
// Unique Identifier // Unique Identifier
@@unique([userId, guildId]) @@unique([userId, guildId])
@ -214,7 +214,7 @@ model GuildCounters {
@@unique([guildId, channelId]) @@unique([guildId, channelId])
} }
model GuildMemberCredits { model GuildMemberCredit {
userId String userId String
guildId String guildId String

View file

@ -34,7 +34,7 @@ export const execute = async (interaction: CommandInteraction) => {
const EmbedSuccess = await BaseEmbedSuccess(guild, ":credit_card:︱Balance"); const EmbedSuccess = await BaseEmbedSuccess(guild, ":credit_card:︱Balance");
// 5. Upsert the user in the database. // 5. Upsert the user in the database.
const createGuildMemberCredits = await prisma.guildMemberCredits.upsert({ const createguildMemberCredit = await prisma.guildMemberCredit.upsert({
where: { where: {
userId_guildId: { userId_guildId: {
userId: (target || user).id, userId: (target || user).id,
@ -61,7 +61,7 @@ export const execute = async (interaction: CommandInteraction) => {
include: { GuildMember: true }, include: { GuildMember: true },
}); });
logger.silly(createGuildMemberCredits); logger.silly(createguildMemberCredit);
await upsertGuildMember(guild, user); await upsertGuildMember(guild, user);
@ -70,8 +70,8 @@ export const execute = async (interaction: CommandInteraction) => {
embeds: [ embeds: [
EmbedSuccess.setDescription( EmbedSuccess.setDescription(
target target
? `${target} has ${createGuildMemberCredits.balance} coins in his account.` ? `${target} has ${createguildMemberCredit.balance} coins in his account.`
: `You have ${createGuildMemberCredits.balance} coins in your account.` : `You have ${createguildMemberCredit.balance} coins in your account.`
), ),
], ],
}); });

View file

@ -65,7 +65,7 @@ export const execute = async (interaction: ChatInputCommandInteraction) => {
// 5. Start an transaction of the credits. // 5. Start an transaction of the credits.
await creditsTransfer(guild, user, account, credits); await creditsTransfer(guild, user, account, credits);
const receiverGuildMember = await prisma.guildMemberCredits.upsert({ const receiverGuildMember = await prisma.guildMemberCredit.upsert({
where: { where: {
userId_guildId: { userId_guildId: {
userId: account.id, userId: account.id,
@ -106,7 +106,7 @@ export const execute = async (interaction: ChatInputCommandInteraction) => {
], ],
}); });
const senderGuildMember = await prisma.guildMemberCredits.upsert({ const senderGuildMember = await prisma.guildMemberCredit.upsert({
where: { where: {
userId_guildId: { userId_guildId: {
userId: user.id, userId: user.id,

View file

@ -1,4 +1,4 @@
import { GuildMemberCredits } from "@prisma/client"; import { GuildMemberCredit } from "@prisma/client";
import { import {
CommandInteraction, CommandInteraction,
SlashCommandSubcommandBuilder, SlashCommandSubcommandBuilder,
@ -32,7 +32,7 @@ export const execute = async (interaction: CommandInteraction) => {
const EmbedSuccess = await BaseEmbedSuccess(guild, "[:dollar:] Top"); const EmbedSuccess = await BaseEmbedSuccess(guild, "[:dollar:] Top");
// 4. Get the top 10 users. // 4. Get the top 10 users.
const topTen = await prisma.guildMemberCredits.findMany({ const topTen = await prisma.guildMemberCredit.findMany({
where: { where: {
guildId: guild.id, guildId: guild.id,
}, },
@ -44,9 +44,9 @@ export const execute = async (interaction: CommandInteraction) => {
logger.silly(topTen); logger.silly(topTen);
// 5. Create the top 10 list. // 5. Create the top 10 list.
const entry = (guildMemberCredits: GuildMemberCredits, index: number) => const entry = (guildMemberCredit: GuildMemberCredit, index: number) =>
`${index + 1}. ${userMention(guildMemberCredits.userId)} | :coin: ${ `${index + 1}. ${userMention(guildMemberCredit.userId)} | :coin: ${
guildMemberCredits.balance guildMemberCredit.balance
}`; }`;
// 6. Send embed // 6. Send embed

View file

@ -124,7 +124,7 @@ export const execute = async (interaction: ChatInputCommandInteraction) => {
// Get guild object // Get guild object
const pricePerHour = upsertGuildConfigShopRoles.pricePerHour; const pricePerHour = upsertGuildConfigShopRoles.pricePerHour;
const updateGuildMember = await prisma.guildMemberCredits.update({ const updateGuildMember = await prisma.guildMemberCredit.update({
where: { where: {
userId_guildId: { userId_guildId: {
userId, userId,

View file

@ -57,7 +57,7 @@ export const execute = async (interaction: ChatInputCommandInteraction) => {
await guild?.roles await guild?.roles
.delete(optionRole?.id, `${user?.id} canceled from shop`) .delete(optionRole?.id, `${user?.id} canceled from shop`)
.then(async () => { .then(async () => {
const createGuildMember = await prisma.guildMemberCredits.upsert({ const createGuildMember = await prisma.guildMemberCredit.upsert({
where: { where: {
userId_guildId: { userId_guildId: {
userId: user.id, userId: user.id,

View file

@ -48,7 +48,7 @@ export const execute = async (interaction: ChatInputCommandInteraction) => {
} }
if (!guild) throw new Error("Guild not found"); if (!guild) throw new Error("Guild not found");
const upsertGuildMemberCredits = await prisma.guildMemberCredits.upsert({ const upsertguildMemberCredit = await prisma.guildMemberCredit.upsert({
where: { where: {
userId_guildId: { userId_guildId: {
userId: user.id, userId: user.id,
@ -74,8 +74,8 @@ export const execute = async (interaction: ChatInputCommandInteraction) => {
}, },
}); });
if (!upsertGuildMemberCredits) if (!upsertguildMemberCredit)
throw new Error("upsertGuildMemberCredits unavailable"); throw new Error("upsertguildMemberCredit unavailable");
const upsertGuildConfigApisCpgg = await prisma.guildConfigApisCpgg.upsert({ const upsertGuildConfigApisCpgg = await prisma.guildConfigApisCpgg.upsert({
where: { where: {
@ -99,17 +99,17 @@ export const execute = async (interaction: ChatInputCommandInteraction) => {
}, },
}); });
logger.silly(upsertGuildMemberCredits); logger.silly(upsertguildMemberCredit);
const dmUser = client?.users?.cache?.get(user?.id); const dmUser = client?.users?.cache?.get(user?.id);
if ((optionAmount || upsertGuildMemberCredits.balance) < 100) if ((optionAmount || upsertguildMemberCredit.balance) < 100)
throw new Error("You can't withdraw to CPGG below 100 credits."); throw new Error("You can't withdraw to CPGG below 100 credits.");
if ((optionAmount || upsertGuildMemberCredits.balance) > 1000000) if ((optionAmount || upsertguildMemberCredit.balance) > 1000000)
throw new Error("Amount or user credits is above 1.000.000."); throw new Error("Amount or user credits is above 1.000.000.");
if (upsertGuildMemberCredits.balance < optionAmount) if (upsertguildMemberCredit.balance < optionAmount)
throw new Error("You can't withdraw more than you have on your account."); throw new Error("You can't withdraw more than you have on your account.");
if (!upsertGuildConfigApisCpgg.urlIv || !upsertGuildConfigApisCpgg.urlContent) if (!upsertGuildConfigApisCpgg.urlIv || !upsertGuildConfigApisCpgg.urlContent)
@ -148,15 +148,15 @@ export const execute = async (interaction: ChatInputCommandInteraction) => {
?.post("vouchers", { ?.post("vouchers", {
uses: 1, uses: 1,
code, code,
credits: optionAmount || upsertGuildMemberCredits.balance, credits: optionAmount || upsertguildMemberCredit.balance,
memo: `${interaction?.createdTimestamp} - ${interaction?.user?.id}`, memo: `${interaction?.createdTimestamp} - ${interaction?.user?.id}`,
}) })
?.then(async () => { ?.then(async () => {
logger?.silly(`Successfully created voucher.`); logger?.silly(`Successfully created voucher.`);
upsertGuildMemberCredits.balance -= upsertguildMemberCredit.balance -=
optionAmount || upsertGuildMemberCredits.balance; optionAmount || upsertguildMemberCredit.balance;
const updateGuildMember = await prisma.guildMemberCredits.update({ const updateGuildMember = await prisma.guildMemberCredit.update({
where: { where: {
userId_guildId: { userId_guildId: {
userId: user.id, userId: user.id,
@ -165,7 +165,7 @@ export const execute = async (interaction: ChatInputCommandInteraction) => {
}, },
data: { data: {
balance: { balance: {
decrement: optionAmount || upsertGuildMemberCredits.balance, decrement: optionAmount || upsertguildMemberCredit.balance,
}, },
}, },
}); });
@ -181,7 +181,7 @@ export const execute = async (interaction: ChatInputCommandInteraction) => {
.setTimestamp() .setTimestamp()
.addFields({ .addFields({
name: "💶 Credits", name: "💶 Credits",
value: `${optionAmount || upsertGuildMemberCredits.balance}`, value: `${optionAmount || upsertguildMemberCredit.balance}`,
inline: true, inline: true,
}) })
.setColor(successColor) .setColor(successColor)

View file

@ -1,6 +1,5 @@
// Dependencies // Dependencies
import { Message } from "discord.js"; import { Message } from "discord.js";
import logger from "../../middlewares/logger";
// Modules // Modules
import counter from "./modules/counter"; import counter from "./modules/counter";
@ -14,17 +13,13 @@ export const options: IEventOptions = {
// Execute the function // Execute the function
export const execute = async (oldMessage: Message, newMessage: Message) => { export const execute = async (oldMessage: Message, newMessage: Message) => {
const { author, guild } = newMessage; const { author } = newMessage;
await audits.execute(oldMessage, newMessage); await audits.execute(oldMessage, newMessage);
logger?.silly( if (author.bot) return;
`Message update event fired by ${author.tag} (${author.id}) in guild: ${guild?.name} (${guild?.id})`
);
if (author?.bot) return logger?.silly(`Message update event fired by bot`);
await counter(newMessage); await counter(newMessage);
return true; return;
}; };

View file

@ -1,4 +1,3 @@
/* eslint-disable no-loops/no-loops */
import { Client } from "discord.js"; import { Client } from "discord.js";
import checkDirectory from "../../helpers/checkDirectory"; import checkDirectory from "../../helpers/checkDirectory";
import { ICommand } from "../../interfaces/Command"; import { ICommand } from "../../interfaces/Command";
@ -6,8 +5,10 @@ import logger from "../../middlewares/logger";
// Register the commands. // Register the commands.
export const register = async (client: Client) => { export const register = async (client: Client) => {
await checkDirectory("commands").then(async (commandNames) => { const profiler = logger.startTimer();
for await (const commandName of commandNames) {
await checkDirectory("commands").then((commandNames) => {
commandNames.forEach(async (commandName) => {
const commandProfiler = logger.startTimer(); const commandProfiler = logger.startTimer();
await import(`../../commands/${commandName}`) await import(`../../commands/${commandName}`)
@ -30,6 +31,10 @@ export const register = async (client: Client) => {
level: "error", level: "error",
}); });
}); });
} });
});
return profiler.done({
message: "Successfully registered all commands!",
}); });
}; };

View file

@ -14,14 +14,6 @@ prisma.$use(async (params, next) => {
`Query ${params.model}.${params.action} took ${after - before}ms` `Query ${params.model}.${params.action} took ${after - before}ms`
); );
if (after - before >= 50) {
logger.warn(
`Query ${params.model}.${params.action} took long time ${
after - before
}ms`
);
}
return result; return result;
}); });

View file

@ -1,4 +1,3 @@
/* eslint-disable no-loops/no-loops */
import { Client } from "discord.js"; import { Client } from "discord.js";
import checkDirectory from "../../helpers/checkDirectory"; import checkDirectory from "../../helpers/checkDirectory";
import { IEvent } from "../../interfaces/Event"; import { IEvent } from "../../interfaces/Event";
@ -8,10 +7,7 @@ import logger from "../../middlewares/logger";
export const register = async (client: Client) => { export const register = async (client: Client) => {
const profiler = logger.startTimer(); const profiler = logger.startTimer();
await checkDirectory("events").then(async (eventNames) => { await checkDirectory("events").then((eventNames) => {
const totalEvents = eventNames.length;
let loadedEvents = 0;
// Import an event. // Import an event.
const importEvent = async (name: string) => { const importEvent = async (name: string) => {
await import(`../../events/${name}`).then((event: IEvent) => { await import(`../../events/${name}`).then((event: IEvent) => {
@ -37,20 +33,17 @@ export const register = async (client: Client) => {
type: event.options.type, type: event.options.type,
message: `Listening to event '${name}'`, message: `Listening to event '${name}'`,
}); });
return loadedEvents++;
return event;
}); });
}; };
for await (const eventName of eventNames) { eventNames.forEach(async (eventName) => {
await importEvent(eventName); await importEvent(eventName);
});
});
if (loadedEvents === totalEvents) { return profiler.done({
return profiler.done({ message: "Successfully listening to all events!",
message: "Successfully listening to all events!",
});
}
}
return true;
}); });
}; };

View file

@ -6,25 +6,45 @@ import logger from "../../middlewares/logger";
// Start all jobs that are in the schedules directory // Start all jobs that are in the schedules directory
export const start = async (client: Client) => { export const start = async (client: Client) => {
const jobNames = await checkDirectory("schedules"); const profiler = logger.startTimer();
if (!jobNames) return logger.warn("⏰ No available jobs found");
return await Promise.all( await checkDirectory("schedules").then((jobNames) => {
jobNames.map(async (jobName) => { jobNames.forEach(async (jobName) => {
await import(`../../schedules/${jobName}`) await import(`../../schedules/${jobName}`)
.then((job: IJob) => { .then((job: IJob) => {
return schedule.scheduleJob(job.options.schedule, async () => { schedule.scheduleJob(job.options.schedule, async () => {
logger.verbose(`⏰ Performed the job "${jobName}"`); const jobProfiler = logger.startTimer();
await job.execute(client); await job
.execute(client)
.then(() => {
jobProfiler.done({
message: `Successfully executed job '${jobName}'`,
level: "debug",
job,
jobName,
});
})
.catch(() => {
jobProfiler.done({
message: `Failed executing job '${jobName}'`,
level: "debug",
job,
jobName,
});
});
}); });
}) })
.catch((error) => { .catch((error) => {
logger.warn({ logger.warn({
jobName, jobName,
message: `Failed to start job ${jobName}`, message: `Failed to schedule job ${jobName}`,
error, error,
}); });
}); });
}) });
); });
return profiler.done({
message: "Successfully scheduled all jobs!",
});
}; };

View file

@ -8,7 +8,7 @@ export default async (guild: Guild, user: User, amount: number) => {
transactionRules(guild, user, amount); transactionRules(guild, user, amount);
// 2. Make the transaction. // 2. Make the transaction.
const recipient = await tx.guildMemberCredits.upsert({ const recipient = await tx.guildMemberCredit.upsert({
update: { update: {
balance: { balance: {
increment: amount, increment: amount,

View file

@ -8,7 +8,7 @@ export default async (guild: Guild, user: User, amount: number) => {
transactionRules(guild, user, amount); transactionRules(guild, user, amount);
// 2. Make the transaction. // 2. Make the transaction.
const recipient = await tx.guildMemberCredits.upsert({ const recipient = await tx.guildMemberCredit.upsert({
update: { update: {
balance: amount, balance: amount,
}, },

View file

@ -8,7 +8,7 @@ export default async (guild: Guild, user: User, amount: number) => {
transactionRules(guild, user, amount); transactionRules(guild, user, amount);
// 2. Make the transaction. // 2. Make the transaction.
const recipient = await tx.guildMemberCredits.upsert({ const recipient = await tx.guildMemberCredit.upsert({
update: { update: {
balance: { balance: {
decrement: amount, decrement: amount,

View file

@ -5,7 +5,7 @@ import transactionRules from "./transactionRules";
export default async (guild: Guild, from: User, to: User, amount: number) => { export default async (guild: Guild, from: User, to: User, amount: number) => {
return await prisma.$transaction(async (tx) => { return await prisma.$transaction(async (tx) => {
// 1. Decrement amount from the sender. // 1. Decrement amount from the sender.
const sender = await tx.guildMemberCredits.upsert({ const sender = await tx.guildMemberCredit.upsert({
update: { update: {
balance: { balance: {
decrement: amount, decrement: amount,
@ -49,7 +49,7 @@ export default async (guild: Guild, from: User, to: User, amount: number) => {
if (from.id === to.id) throw new Error("You can't transfer to yourself."); if (from.id === to.id) throw new Error("You can't transfer to yourself.");
// 7. Increment the recipient's balance by amount. // 7. Increment the recipient's balance by amount.
const recipient = await tx.guildMemberCredits.upsert({ const recipient = await tx.guildMemberCredit.upsert({
update: { update: {
balance: { balance: {
increment: amount, increment: amount,

View file

@ -79,7 +79,7 @@ export default async (
}, },
}); });
setTimeout(async () => { return setTimeout(async () => {
await prisma.cooldown.delete({ await prisma.cooldown.delete({
where: { where: {
guildId_userId_timeoutId: { guildId_userId_timeoutId: {

View file

@ -34,7 +34,7 @@ export const execute = async (client: Client, role: GuildShopRoles) => {
if (!getGuildConfigShopRoles) if (!getGuildConfigShopRoles)
throw new Error("Could not find guild config shop roles."); throw new Error("Could not find guild config shop roles.");
const getGuildMemberCredits = await prisma.guildMemberCredits.findUnique({ const getguildMemberCredit = await prisma.guildMemberCredit.findUnique({
where: { where: {
userId_guildId: { userId_guildId: {
userId, userId,
@ -46,13 +46,13 @@ export const execute = async (client: Client, role: GuildShopRoles) => {
}, },
}); });
logger.silly(getGuildMemberCredits); logger.silly(getguildMemberCredit);
if (!getGuildMemberCredits) throw new Error("Could not find guild member."); if (!getguildMemberCredit) throw new Error("Could not find guild member.");
const pricePerHour = getGuildConfigShopRoles.pricePerHour; const pricePerHour = getGuildConfigShopRoles.pricePerHour;
if (getGuildMemberCredits.balance < pricePerHour) { if (getguildMemberCredit.balance < pricePerHour) {
await rMember.roles await rMember.roles
.remove(roleId) .remove(roleId)
.then(async () => { .then(async () => {
@ -79,7 +79,7 @@ export const execute = async (client: Client, role: GuildShopRoles) => {
throw new Error("User does not have enough credits."); throw new Error("User does not have enough credits.");
} }
const createGuildMember = await prisma.guildMemberCredits.upsert({ const createGuildMember = await prisma.guildMemberCredit.upsert({
where: { where: {
userId_guildId: { userId_guildId: {
userId, userId,