feat: add achievement system

Signed-off-by: Ahmad <103906421+ahmadk953@users.noreply.github.com>
This commit is contained in:
Ahmad 2025-04-16 16:52:44 -04:00
parent 830838a6a1
commit 2f5c3499e7
No known key found for this signature in database
GPG key ID: 8FD8A93530D182BF
15 changed files with 1966 additions and 37 deletions

View file

@ -1,6 +1,7 @@
import {
boolean,
integer,
json,
jsonb,
pgTable,
timestamp,
@ -32,6 +33,7 @@ export interface levelTableTypes {
xp: number;
level: number;
messagesSent: number;
reactionCount: number;
lastMessageTimestamp?: Date;
}
@ -43,6 +45,7 @@ export const levelTable = pgTable('levels', {
xp: integer('xp').notNull().default(0),
level: integer('level').notNull().default(0),
messagesSent: integer('messages_sent').notNull().default(0),
reactionCount: integer('reaction_count').notNull().default(0),
lastMessageTimestamp: timestamp('last_message_timestamp'),
});
@ -143,3 +146,36 @@ export const giveawayTable = pgTable('giveaways', {
requireAllCriteria: boolean('require_all_criteria').default(true),
bonusEntries: jsonb('bonus_entries').default({}),
});
export type userAchievementsTableTypes = InferSelectModel<
typeof userAchievementsTable
>;
export const userAchievementsTable = pgTable('user_achievements', {
id: integer().primaryKey().generatedAlwaysAsIdentity(),
discordId: varchar('user_id', { length: 50 })
.notNull()
.references(() => memberTable.discordId),
achievementId: integer('achievement_id')
.notNull()
.references(() => achievementDefinitionsTable.id),
earnedAt: timestamp('earned_at'),
progress: integer().default(0),
});
export type achievementDefinitionsTableTypes = InferSelectModel<
typeof achievementDefinitionsTable
>;
export const achievementDefinitionsTable = pgTable('achievement_definitions', {
id: integer().primaryKey().generatedAlwaysAsIdentity(),
name: varchar({ length: 100 }).notNull(),
description: varchar({ length: 255 }).notNull(),
imageUrl: varchar('image_url', { length: 255 }),
requirement: json().notNull(),
requirementType: varchar('requirement_type', { length: 50 }).notNull(),
threshold: integer().notNull(),
rewardType: varchar('reward_type', { length: 50 }),
rewardValue: varchar('reward_value', { length: 50 }),
createdAt: timestamp('created_at').defaultNow().notNull(),
});