diff options
Diffstat (limited to 'src/lib/models/instance/Level.ts')
-rw-r--r-- | src/lib/models/instance/Level.ts | 75 |
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; + } +} |