A flexible xp-based level system framework that uses mongoDB
This package was designed for Discord but nothing is linking it to discord directly, so if you are searching for a general xp-based level system think of guildId as a group name and userId as the individual users. (Note: guildId has to be unique, and the userId's inside that guild have to be unique as well)
npm install cronos-xp
const CronosXp = require("cronos-xp")
const Level = new CronosXp("mongoDBUrlGoesHere", {
linear: false, //Default value
xpGap: 300, //Default value
growthMultiplier: 30, //Default value
startWithZero: true, //Default value
returnDetails: false //Default value
})
linear:
Defines if the leveling is linear (aka. you always need the same amount of xp for each level) or exponential (see below).
Here is an example of how it works
xpGap:
Only needed if linear is true
This value defines the xp gap between the different levels
growthMultiplier:
Only needed if linear is false
The XP needed for a level is calculated with the function ƒ(x) = g * x²
where g = growthMultiplier
.
(A growthMultiplier of 0
equals x
, turning the function into Ć’(x) = xÂł
)
Hint:
High growthMultiplier
= rapid increase in the amount of xp needed for the next level.
Low growthMultiplier
= slow increase in the amount of xp needed for the next level.
startWithZero:
Since ƒ(0) = g * 0²
equals 0
the starting level would be 0
.
To have it start with level 1
set this property to false
.
(This changes the function to ƒ(x) = g * x² - g
or Ć’(x) = xÂł - x
)
returnDetails:
If this option is on some functions will return more information than they normally do.
This includes:
For more information take a look at the Declaration file index.d.ts
linear = true; xpGap = 500;
level 0 = "0xp"
level 1 = "500xp"
level 2 = "1,000xp"
//...
level 50 = "25,000xp"
level 51 = "25,500xp"
level 52 = "26,000xp"
//...
level 90 = "45,000xp"
level 91 = "45,500xp"
level 92 = "46,000xp"
linear = false; growthMultiplier = 20;
level 0 = "0xp"
level 1 = "20xp"
level 2 = "80xp"
//...
level 50 = "50,000xp"
level 51 = "52,020xp"
level 52 = "54,080xp"
//...
level 90 = "162,000xp"
level 91 = "165,620xp"
level 92 = "169,280xp"
interface ConstructorOptions {
linear?: boolean,
xpGap?: number,
growthMultiplier?: number,
startWithZero?: boolean,
returnDetails?: boolean
}
interface User {
xp: number,
level: number
}
interface Details {
xpDifference: number,
levelDifference: number,
nextLevelXp: number,
currentLevelXp: number
}
interface AddSubtractReturnObject {
newLevel: number,
newXp: number,
hasLevelUp?: boolean, // Exists on addXp or addLevel
hasLevelDown?: boolean, // Exists on subtractXp or subtractLevel
details?: Details // This only exists when `returnDetails` is enabled
}
interface XpForNextReturnObject {
xpNeeded: number,
currentLevel: number,
nextLevel: number,
currentLevelXp: number,
nextLevelXp: number
}
If there are any questions about the methods, their parameters, their return types or anything thing else take a look at the Declaration file index.d.ts
or just join our Discord
A method that calculates the minimum amount of xp needed for a specific level.
Level.xpForLevel(<targetLevel - number>);
// Returns <number>
A method that calculates the level for a specific amount of xp.
Level.levelForXp(<targetXp - number>);
// Returns <number>
A method that calculates the amount of xp needed to reach the next level based on the current xp.
If returnDetails
is true this will return an object of type XpForNextReturnObject.
Level.xpForNext(<currentXp - number>);
// Returns <number> | <XpForNextReturnObject>
A method to set the amount of xp for a specific user inside a specific guild.
Level.setXp(<guildId - string>, <userId - string>, <value - number>);
// Returns <Promise<boolean>>
A method to set the level for a specific user inside a specific guild.
Level.setLevel(<guildId - string>, <userId - string>, <value - number>);
// Returns <Promise<boolean>>
A method that adds a specific amount of xp to a specific user in a specific guild. Returns object of type AddSubtractReturnObject
If returnDetails
is true the returned object will have a details
property that looks like this.
Level.addXp(<guildId - string>, <userId - string>, <value - number>);
// Returns <Promise<AddSubtractReturnObject>>
A method that adds a specific amount of level to a specific user in a specific guild. Returns object of type AddSubtractReturnObject
If returnDetails
is true the returned object will have a details
property that looks like this.
Level.addLevel(<guildId - string>, <userId - string>, <value - number>);
// Returns <Promise<AddSubtractReturnObject>>
A method that subtracts a specific amount of xp from a specific user in a specific guild. Returns object of type AddSubtractReturnObject
If returnDetails
is true the returned object will have a details
property that looks like this.
Level.subtractXp(<guildId - string>, <userId - string>, <value - number>);
// Returns <Promise<AddSubtractReturnObject>>
A method that subtracts a specific amount of level from a specific user in a specific guild. Returns object of type AddSubtractReturnObject
If returnDetails
is true the returned object will have a details
property that looks like this.
Level.subtractLevel(<guildId - string>, <userId - string>, <value - number>);
// Returns <Promise<AddSubtractReturnObject>>
A method that returns the top users of a guild sorted by their amount of xp.
limit
is an optional parameter to change the number of users that are being returned (Default: 10).
startingAt
is an optional parameter to change where the list of returned users start (Default: 0).
(If startingAt
is 2 for example it will start with the third place.)
Returns an array of arrays that contain a string being the userid and, an object of type User.
Level.getLeaderboard(<guildId - string>[, <limit? - number>, <startingAt? - number>]);
// Returns <Promise<[string, User][] | boolean>>
A method to find out if a specific user exists in a specific guild.
Level.isUser(<guildId - string>, <userId - string>);
// Returns <Promise<boolean>>
A method to get the data of a specific user in a specific guild.
If the user exists it returns an object of type User.
Level.getUser(<guildId - string>, <userId - string>);
// Returns <Promise<User | boolean>>
A method to get the Rank of a specific user in a specific guild.
If the user exists it returns his rank, otherwise it will return 0 or throw an error.
Level.getUserRank(<guildId - string>, <userId - string>);
// Returns <Promise<number>>
A method to create a new user in a specific guild.
Level.createUser(<guildId - string>, <userId - string>);
// Returns <Promise<boolean>>
A method to delete a user in a specific guild.
Level.deleteUser(<guildId - string>, <userId - string>);
// Returns <Promise<boolean>>
A method to delete a user in all guilds.
Level.deleteUserGlobal(<userId - string>);
// Returns <Promise<boolean>>
A method to reset a users xp and level inside a specific guild.
Level.resetUser(<guildId - string>, <userId - string>);
// Returns <Promise<boolean>>
A method to reset a users xp and level in all guilds.
Level.resetUserGlobal(<userId - string>);
// Returns <Promise<boolean>>
A method to find out if a specific guild exists.
Level.isGuild(<guildId - string>);
// Returns <Promise<boolean>>
A method to get all users of a guild.
Returns an object that uses the userid's as the key and has their user object of type User as their value.
Level.getGuild(<guildId - string>);
// Returns <Promise<boolean | object>>
A method to create a new guild.
Level.createGuild(<guildId - string>);
// Returns <Promise<boolean>>
A method to delete a specific guild.
Level.deleteGuild(<guildId - string>);
// Returns <Promise<boolean>>
A method to delete all users of a specific guild
Level.resetUser(<guildId - string>);
// Returns <Promise<boolean>>
A method that closes the MongoDB connection and clears the GuildXP model.
Level.destroy();
// Returns <Promise<boolean>>
Those methods are just for validating function arguments
Level._validateGuildId(<guildId - string | number>);
// Returns <string>
Level._validateUserId(<userId - string | number>);
// Returns <string>