fix(arabot): add xp to next level to fix levels being broken

This commit is contained in:
smyalygames 2023-03-10 21:50:43 +00:00
parent e48db66f0c
commit 304f5996fb
3 changed files with 23 additions and 25 deletions

View File

@ -0,0 +1,2 @@
-- AlterTable
ALTER TABLE "Xp" ADD COLUMN "xpToNextLevel" INTEGER NOT NULL DEFAULT 0;

View File

@ -98,12 +98,13 @@ model Verify {
}
model Xp {
user User @relation(fields: [userId], references: [id])
userId String @id
level Int @default(0)
xp Int @default(0)
messageCount Int @default(0)
lastMessage DateTime @default(now())
user User @relation(fields: [userId], references: [id])
userId String @id
level Int @default(0)
xp Int @default(0)
xpToNextLevel Int @default(0)
messageCount Int @default(0)
lastMessage DateTime @default(now())
}
// Economy

View File

@ -13,6 +13,7 @@ export async function getUser(userId: Snowflake) {
},
select: {
xp: true,
xpToNextLevel: true,
level: true,
},
});
@ -21,11 +22,17 @@ export async function getUser(userId: Snowflake) {
export async function addXp(userId: Snowflake, xp: number) {
const user = await getUser(userId);
let xpNextLevel = xp;
let level = 0;
if (user !== null
&& xpToNextLevel(user.level, user.xp + xp) < 0) {
level = 1;
if (user !== null) {
xpNextLevel = xpToNextLevel(user.level, user.xpToNextLevel + xp);
if (xpNextLevel < 0) {
xpNextLevel = -xpNextLevel;
level = 1;
} else {
xpNextLevel = user.xpToNextLevel + xp;
}
}
await container.database.xp.upsert({
@ -34,6 +41,7 @@ export async function addXp(userId: Snowflake, xp: number) {
},
update: {
xp: { increment: xp },
xpToNextLevel: xpNextLevel,
level: { increment: level },
messageCount: { increment: 1 },
lastMessage: new Date(),
@ -51,6 +59,7 @@ export async function addXp(userId: Snowflake, xp: number) {
},
messageCount: 1,
xp,
xpToNextLevel: xp,
},
});
}
@ -98,22 +107,8 @@ export async function getRank(userId: Snowflake) {
},
});
const xp = await container.database.xp.findUnique({
where: {
userId,
},
select: {
level: true,
xp: true,
},
});
if (xp === null) {
return info;
}
info.level = xp.level;
info.xp = xp.xp;
info.level = user.level;
info.xp = user.xp;
return info;
}