aboutsummaryrefslogtreecommitdiff
path: root/src/lib/models/instance/Level.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/models/instance/Level.ts')
-rw-r--r--src/lib/models/instance/Level.ts75
1 files changed, 75 insertions, 0 deletions
diff --git a/src/lib/models/instance/Level.ts b/src/lib/models/instance/Level.ts
new file mode 100644
index 0000000..e18753d
--- /dev/null
+++ b/src/lib/models/instance/Level.ts
@@ -0,0 +1,75 @@
+import { type Snowflake } from 'discord.js';
+import { type Sequelize } from 'sequelize';
+import { BaseModel } from '../BaseModel.js';
+const { DataTypes } = (await import('sequelize')).default;
+
+export interface LevelModel {
+ user: Snowflake;
+ guild: Snowflake;
+ xp: number;
+}
+
+export interface LevelModelCreationAttributes {
+ user: Snowflake;
+ guild: Snowflake;
+ xp?: number;
+}
+
+export class Level extends BaseModel<LevelModel, LevelModelCreationAttributes> implements LevelModel {
+ /**
+ * The user's id.
+ */
+ public declare user: Snowflake;
+
+ /**
+ * The guild where the user is gaining xp.
+ */
+ public declare guild: Snowflake;
+
+ /**
+ * The user's xp.
+ */
+ public declare xp: number;
+
+ /**
+ * The user's level.
+ */
+ public get level(): number {
+ return Level.convertXpToLevel(this.xp);
+ }
+
+ /**
+ * Initializes the model.
+ * @param sequelize The sequelize instance.
+ */
+ public static initModel(sequelize: Sequelize): void {
+ Level.init(
+ {
+ user: { type: DataTypes.STRING, allowNull: false },
+ guild: { type: DataTypes.STRING, allowNull: false },
+ xp: { type: DataTypes.INTEGER, allowNull: false, defaultValue: 0 }
+ },
+ { sequelize }
+ );
+ }
+
+ public static convertXpToLevel(xp: number): number {
+ let i = 0;
+ while (Level.convertLevelToXp(i + 1) < xp) {
+ i++;
+ }
+ return i;
+ }
+
+ public static convertLevelToXp(level: number): number {
+ let xp = 0;
+ for (let i = 0; i < level; i++) {
+ xp += 100 * i + 75;
+ }
+ return xp;
+ }
+
+ public static genRandomizedXp(): number {
+ return Math.floor(Math.random() * (40 - 15 + 1)) + 15;
+ }
+}