feat: Implement custom error classes, a Drizzle transaction utility, and update Discord.js ephemeral message flags.

This commit is contained in:
syntaxbullet
2025-12-15 22:14:17 +01:00
parent 3c81fd8396
commit 7e986fae5a
14 changed files with 112 additions and 114 deletions

View File

@@ -1,7 +1,8 @@
import { users, userTimers } from "@/db/schema";
import { eq, sql, and } from "drizzle-orm";
import { DrizzleClient } from "@/lib/DrizzleClient";
import { withTransaction } from "@/lib/db";
import { config } from "@/lib/config";
import type { Transaction } from "@/lib/types";
export const levelingService = {
// Calculate XP required for a specific level
@@ -10,8 +11,8 @@ export const levelingService = {
},
// Pure XP addition - No cooldown checks
addXp: async (id: string, amount: bigint, tx?: any) => {
const execute = async (txFn: any) => {
addXp: async (id: string, amount: bigint, tx?: Transaction) => {
return await withTransaction(async (txFn) => {
// Get current state
const user = await txFn.query.users.findFirst({
where: eq(users.id, BigInt(id)),
@@ -43,20 +44,12 @@ export const levelingService = {
.returning();
return { user: updatedUser, levelUp, currentLevel };
};
if (tx) {
return await execute(tx);
} else {
return await DrizzleClient.transaction(async (t) => {
return await execute(t);
})
}
}, tx);
},
// Handle chat XP with cooldowns
processChatXp: async (id: string, tx?: any) => {
const execute = async (txFn: any) => {
processChatXp: async (id: string, tx?: Transaction) => {
return await withTransaction(async (txFn) => {
// check if an xp cooldown is in place
const cooldown = await txFn.query.userTimers.findFirst({
where: and(
@@ -93,14 +86,6 @@ export const levelingService = {
});
return { awarded: true, amount, ...result };
};
if (tx) {
return await execute(tx);
} else {
return await DrizzleClient.transaction(async (t) => {
return await execute(t);
})
}
}, tx);
}
};