simply-xp 1.3.7 → 1.3.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -17
- package/package.json +50 -25
- package/simplyxp.js +1 -1
- package/src/Fonts/Baloo2-Regular.woff2 +0 -0
- package/src/addLevel.js +3 -3
- package/src/addXP.js +3 -3
- package/src/charts.js +2 -7
- package/src/create.js +1 -1
- package/src/fetch.js +2 -18
- package/src/leaderboard.js +25 -10
- package/src/models/level.js +6 -4
- package/src/models/lvlrole.js +2 -2
- package/src/rank.js +10 -11
- package/src/reset.js +2 -2
- package/src/roleSetup.js +2 -2
- package/src/setLevel.js +5 -5
- package/src/setXP.js +4 -4
- package/src/utils/getUserPosition.js +22 -0
- package/src/Fonts/Baloo-Regular.ttf +0 -0
package/README.md
CHANGED
|
@@ -2,19 +2,21 @@
|
|
|
2
2
|
|
|
3
3
|
<h2 style="font-size:2.5rem;" align="center">Simply-XP</h2>
|
|
4
4
|
|
|
5
|
-
<
|
|
5
|
+
<p align="center">
|
|
6
|
+
A simple, beginner-friendly XP system for Discord.js.<br>
|
|
7
|
+
Developed by <strong>Rahuletto</strong> & Maintained by <strong>Abadima</strong>
|
|
8
|
+
</p>
|
|
6
9
|
|
|
7
10
|
<br>
|
|
8
11
|
<p align="center">
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
<a href="https://discord.gg/3JzDV9T5Fn"><img src="https://invidget.switchblade.xyz/3JzDV9T5Fn" /></a>
|
|
12
|
+
<a href="https://www.npmjs.com/package/simply-xp"><img src="https://img.shields.io/npm/v/simply-xp.svg?style=flat-square" /></a>
|
|
13
|
+
<a href="https://www.npmjs.com/package/simply-xp"><img src="https://img.shields.io/npm/dt/simply-xp?style=flat-square" /></a><br>
|
|
14
|
+
<a href="https://discord.gg/3JzDV9T5Fn"><img src="https://invidget.switchblade.xyz/3JzDV9T5Fn" /></a>
|
|
13
15
|
</p>
|
|
14
16
|
|
|
15
17
|
<br>
|
|
16
18
|
|
|
17
|
-
## 🖥️ <b>How to install
|
|
19
|
+
## 🖥️ <b>How to install?
|
|
18
20
|
|
|
19
21
|
```
|
|
20
22
|
npm install simply-xp
|
|
@@ -28,23 +30,21 @@ yarn add simply-xp
|
|
|
28
30
|
|
|
29
31
|
<br>
|
|
30
32
|
|
|
31
|
-
# 🎉 Recent Updates
|
|
33
|
+
# 🎉 Recent Updates
|
|
32
34
|
|
|
33
35
|
- Fixed Various Bugs
|
|
34
36
|
- Updated `Chart.js`
|
|
35
37
|
- D.JS v14 Support
|
|
36
38
|
- Patched v1.3.5 Bugs
|
|
37
39
|
|
|
40
|
+
# ⭐ Features
|
|
38
41
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
-
|
|
42
|
-
-
|
|
43
|
-
-
|
|
42
|
+
- Easy XP System
|
|
43
|
+
- Automatic Role Assignment
|
|
44
|
+
- Beautiful Rank Cards
|
|
45
|
+
- Optimized for Performance
|
|
46
|
+
- Lightweight & Flexible
|
|
44
47
|
- Beginner Friendly
|
|
45
|
-
- Easier than other XP Systems
|
|
46
|
-
- Inbuilt Auto Roles system
|
|
47
|
-
- Flexible and simple at the same time
|
|
48
48
|
|
|
49
49
|
<br>
|
|
50
50
|
|
|
@@ -52,7 +52,7 @@ yarn add simply-xp
|
|
|
52
52
|
|
|
53
53
|
<br>
|
|
54
54
|
|
|
55
|
-
<h1>👥 Contact
|
|
55
|
+
<h1>👥 Contact & Support</h1>
|
|
56
56
|
<p>
|
|
57
57
|
<a href="https://discord.gg/3JzDV9T5Fn"><img src="https://invidget.switchblade.xyz/3JzDV9T5Fn" /></a>
|
|
58
|
-
</p>
|
|
58
|
+
</p>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "simply-xp",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.8",
|
|
4
4
|
"description": "A Simple, Easy and Beginner Friendly XP System",
|
|
5
5
|
"main": "simplyxp.js",
|
|
6
6
|
"typings": "index.d.ts",
|
|
@@ -9,47 +9,72 @@
|
|
|
9
9
|
"beta": "eslint . --fix && pnpm update && npm publish --tag beta",
|
|
10
10
|
"legacy": "eslint . --fix && pnpm update && npm publish --tag legacy"
|
|
11
11
|
},
|
|
12
|
-
"author":
|
|
12
|
+
"author": {
|
|
13
|
+
"name": "Abadima",
|
|
14
|
+
"url": "https://abadima.dev"
|
|
15
|
+
},
|
|
16
|
+
"maintainers": [
|
|
17
|
+
{
|
|
18
|
+
"name": "Abadima",
|
|
19
|
+
"url": "https://abadima.dev"
|
|
20
|
+
}
|
|
21
|
+
],
|
|
22
|
+
"contributors": [
|
|
23
|
+
{
|
|
24
|
+
"name": "Rahuletto",
|
|
25
|
+
"role": "Original Author",
|
|
26
|
+
"url": "https://marban.is-a.dev/"
|
|
27
|
+
}
|
|
28
|
+
],
|
|
29
|
+
"license": "Apache-2.0",
|
|
13
30
|
"keywords": [
|
|
14
31
|
"xp",
|
|
15
|
-
"
|
|
16
|
-
"
|
|
17
|
-
"
|
|
18
|
-
"system",
|
|
19
|
-
"mongoose",
|
|
32
|
+
"experience",
|
|
33
|
+
"level",
|
|
34
|
+
"leveling",
|
|
35
|
+
"leveling system",
|
|
20
36
|
"discord",
|
|
21
|
-
"discord
|
|
22
|
-
"discord-xp",
|
|
23
|
-
"simply-djs",
|
|
37
|
+
"discord bot",
|
|
24
38
|
"discord.js",
|
|
25
|
-
"
|
|
26
|
-
"weky",
|
|
27
|
-
"nuggies",
|
|
28
|
-
"experience",
|
|
29
|
-
"level role",
|
|
30
|
-
"amari",
|
|
31
|
-
"package",
|
|
39
|
+
"discord-xp",
|
|
32
40
|
"leaderboard",
|
|
33
|
-
"
|
|
41
|
+
"rank",
|
|
42
|
+
"rank card",
|
|
43
|
+
"leaderboard card",
|
|
44
|
+
"gamification",
|
|
45
|
+
"xp system",
|
|
46
|
+
"simply",
|
|
47
|
+
"simplydjs",
|
|
34
48
|
"charts",
|
|
35
|
-
"
|
|
36
|
-
"
|
|
49
|
+
"@napi-rs/canvas",
|
|
50
|
+
"chart.js",
|
|
51
|
+
"mongoose",
|
|
52
|
+
"mongodb",
|
|
53
|
+
"sqlite",
|
|
54
|
+
"nodejs",
|
|
55
|
+
"bot",
|
|
56
|
+
"mee6",
|
|
57
|
+
"amari",
|
|
58
|
+
"weky"
|
|
37
59
|
],
|
|
38
|
-
"license": "Apache-2.0",
|
|
39
60
|
"repository": {
|
|
40
61
|
"type": "git",
|
|
41
62
|
"url": "git+https://github.com/Abadima/simply-xp.git"
|
|
42
63
|
},
|
|
43
64
|
"homepage": "https://simplyxp.js.org",
|
|
65
|
+
"bugs": {
|
|
66
|
+
"url": "https://github.com/Abadima/simply-xp/issues"
|
|
67
|
+
},
|
|
68
|
+
"readme": "README.md",
|
|
44
69
|
"dependencies": {
|
|
45
|
-
"@napi-rs/canvas": "
|
|
70
|
+
"@napi-rs/canvas": "0.1.88",
|
|
46
71
|
"chart.js": "^3.9.1",
|
|
47
|
-
"mongoose": "^7.
|
|
72
|
+
"mongoose": "^7.8.8"
|
|
48
73
|
},
|
|
49
74
|
"peerDependencies": {
|
|
50
75
|
"discord.js": ">=13.12.0"
|
|
51
76
|
},
|
|
52
77
|
"devDependencies": {
|
|
53
|
-
"eslint": "^
|
|
78
|
+
"eslint": "^9.39.2"
|
|
54
79
|
}
|
|
55
|
-
}
|
|
80
|
+
}
|
package/simplyxp.js
CHANGED
|
Binary file
|
package/src/addLevel.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const levels = require("../src/models/level.js");
|
|
2
|
-
let {roleSetup} = require("../simplyxp");
|
|
2
|
+
let { roleSetup } = require("../simplyxp");
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* @param {Discord.Message} message
|
|
@@ -14,9 +14,9 @@ async function addLevel(message, userID, guildID, level) {
|
|
|
14
14
|
|
|
15
15
|
if (!level) throw new Error("[XP] Level amount is not provided.");
|
|
16
16
|
|
|
17
|
-
let {client} = message;
|
|
17
|
+
let { client } = message;
|
|
18
18
|
|
|
19
|
-
const user = await levels.findOne({user: userID, guild: guildID});
|
|
19
|
+
const user = await levels.findOne({ user: userID, guild: guildID });
|
|
20
20
|
|
|
21
21
|
if (!user) {
|
|
22
22
|
const newUser = new levels({
|
package/src/addXP.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const levels = require("../src/models/level.js");
|
|
2
|
-
let {roleSetup} = require("../simplyxp");
|
|
2
|
+
let { roleSetup } = require("../simplyxp");
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* @param {Discord.Message} message
|
|
@@ -15,7 +15,7 @@ async function addXP(message, userID, guildID, xp) {
|
|
|
15
15
|
|
|
16
16
|
if (!xp) throw new Error("[XP] XP amount is not provided.");
|
|
17
17
|
|
|
18
|
-
let {client} = message;
|
|
18
|
+
let { client } = message;
|
|
19
19
|
|
|
20
20
|
let min;
|
|
21
21
|
let max;
|
|
@@ -47,7 +47,7 @@ async function addXP(message, userID, guildID, xp) {
|
|
|
47
47
|
xp = Math.floor(Math.random() * (max - min) + min);
|
|
48
48
|
}
|
|
49
49
|
|
|
50
|
-
const user = await levels.findOne({user: userID, guild: guildID});
|
|
50
|
+
const user = await levels.findOne({ user: userID, guild: guildID });
|
|
51
51
|
|
|
52
52
|
let lvl = Math.floor(0.1 * Math.sqrt(xp));
|
|
53
53
|
|
package/src/charts.js
CHANGED
|
@@ -6,14 +6,9 @@ let leaderboard = require("./leaderboard");
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
async function charts(message, options) {
|
|
9
|
-
try {
|
|
10
|
-
require("canvas");
|
|
11
|
-
} catch {
|
|
12
|
-
throw "[XP] This requires canvas to be installed. \n\"npm install canvas\"";
|
|
13
|
-
}
|
|
14
9
|
const ChartJS = require("chart.js");
|
|
15
|
-
const Canvas = require("canvas");
|
|
16
|
-
let {client} = message;
|
|
10
|
+
const Canvas = require("@napi-rs/canvas");
|
|
11
|
+
let { client } = message;
|
|
17
12
|
|
|
18
13
|
let data = [];
|
|
19
14
|
let pos = options?.position || 5;
|
package/src/create.js
CHANGED
|
@@ -10,7 +10,7 @@ async function create(userID, guildID) {
|
|
|
10
10
|
|
|
11
11
|
if (!guildID) throw new Error("[XP] User ID was not provided.");
|
|
12
12
|
|
|
13
|
-
let uzer = await levels.findOne({user: userID, guild: guildID});
|
|
13
|
+
let uzer = await levels.findOne({ user: userID, guild: guildID });
|
|
14
14
|
|
|
15
15
|
if (uzer) return;
|
|
16
16
|
|
package/src/fetch.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
const levels = require("../src/models/level.js");
|
|
2
|
+
const getUserPosition = require("./utils/getUserPosition");
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* @param {string} userID
|
|
@@ -25,24 +26,7 @@ async function fetch(userID, guildID) {
|
|
|
25
26
|
await user.save();
|
|
26
27
|
}
|
|
27
28
|
|
|
28
|
-
|
|
29
|
-
.find({
|
|
30
|
-
guild: guildID
|
|
31
|
-
})
|
|
32
|
-
.sort([["xp", "descending"]])
|
|
33
|
-
.exec();
|
|
34
|
-
|
|
35
|
-
if (user === null)
|
|
36
|
-
return {
|
|
37
|
-
level: 0,
|
|
38
|
-
xp: 0,
|
|
39
|
-
reqxp: 100,
|
|
40
|
-
rank: leaderboard.findIndex((i) => i.user === userID) + 1,
|
|
41
|
-
shortxp: 0,
|
|
42
|
-
shortreq: 100
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
user.position = leaderboard.findIndex((i) => i.user === userID) + 1;
|
|
29
|
+
user.position = (await getUserPosition(userID, guildID)) || 1;
|
|
46
30
|
|
|
47
31
|
let targetxp = user.level + 1;
|
|
48
32
|
|
package/src/leaderboard.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const levels = require("../src/models/level.js");
|
|
2
|
-
const {options} = require("../simplyxp");
|
|
2
|
+
const { options } = require("../simplyxp");
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* @param {Discord.Client} client
|
|
@@ -13,9 +13,14 @@ async function leaderboard(client, guildID, limit) {
|
|
|
13
13
|
let g = client.guilds.cache.get(guildID);
|
|
14
14
|
if (!g) throw new Error("[XP] Guild was not found.");
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
const leaderboard = await levels
|
|
17
|
+
.find({ guild: guildID })
|
|
18
|
+
.sort([["xp", "descending"]]);
|
|
17
19
|
|
|
18
|
-
|
|
20
|
+
const led = [];
|
|
21
|
+
let subtractPos = 0;
|
|
22
|
+
const shouldPurge = Boolean(options?.auto_purge);
|
|
23
|
+
const limitNumber = limit ? Number(limit) : null;
|
|
19
24
|
|
|
20
25
|
function shortener(count) {
|
|
21
26
|
const COUNT_ABBRS = ["", "k", "M", "T"];
|
|
@@ -26,13 +31,22 @@ async function leaderboard(client, guildID, limit) {
|
|
|
26
31
|
return result;
|
|
27
32
|
}
|
|
28
33
|
|
|
29
|
-
|
|
34
|
+
for (let i = 0; i < leaderboard.length; i += 1) {
|
|
35
|
+
const key = leaderboard[i];
|
|
30
36
|
const user = await g.members.fetch(key.user).catch(() => null);
|
|
31
|
-
if (!user &&
|
|
32
|
-
|
|
37
|
+
if (!user && shouldPurge) {
|
|
38
|
+
await levels.deleteOne({ user: key.user, guild: guildID });
|
|
39
|
+
}
|
|
40
|
+
if (key.xp === 0 || !user) {
|
|
41
|
+
subtractPos += 1;
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
33
44
|
|
|
34
|
-
|
|
35
|
-
if (
|
|
45
|
+
const pos = i + 1 - subtractPos;
|
|
46
|
+
if (limitNumber && pos > limitNumber) {
|
|
47
|
+
if (!shouldPurge) break;
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
36
50
|
|
|
37
51
|
led.push({
|
|
38
52
|
guildID: key.guild,
|
|
@@ -44,8 +58,9 @@ async function leaderboard(client, guildID, limit) {
|
|
|
44
58
|
username: user.user.username,
|
|
45
59
|
tag: user.user.tag
|
|
46
60
|
});
|
|
47
|
-
}
|
|
48
|
-
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return led;
|
|
49
64
|
}
|
|
50
65
|
|
|
51
66
|
module.exports = leaderboard;
|
package/src/models/level.js
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
const mongoose = require("mongoose");
|
|
2
2
|
|
|
3
3
|
const Levelz = new mongoose.Schema({
|
|
4
|
-
user: {type: String, unique: true},
|
|
5
|
-
guild: {type: String},
|
|
6
|
-
xp: {type: Number, default: 0},
|
|
7
|
-
level: {type: Number, default: 0}
|
|
4
|
+
user: { type: String, unique: true },
|
|
5
|
+
guild: { type: String },
|
|
6
|
+
xp: { type: Number, default: 0 },
|
|
7
|
+
level: { type: Number, default: 0 }
|
|
8
8
|
});
|
|
9
9
|
|
|
10
|
+
Levelz.index({ guild: 1, xp: -1 });
|
|
11
|
+
|
|
10
12
|
module.exports = mongoose.model("Simply-XP", Levelz);
|
package/src/models/lvlrole.js
CHANGED
package/src/rank.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
const levels = require("../src/models/level.js");
|
|
2
|
-
const {join} = require("path");
|
|
2
|
+
const { join } = require("path");
|
|
3
|
+
const getUserPosition = require("./utils/getUserPosition");
|
|
3
4
|
|
|
4
5
|
/**
|
|
5
6
|
* @param {Discord.Message} message
|
|
@@ -19,14 +20,7 @@ async function rank(message, userID, guildID, options = []) {
|
|
|
19
20
|
});
|
|
20
21
|
if (!user) throw new Error("[XP] NO_DATA | User has no XP data.");
|
|
21
22
|
|
|
22
|
-
|
|
23
|
-
.find({
|
|
24
|
-
guild: guildID
|
|
25
|
-
})
|
|
26
|
-
.sort([["xp", "descending"]])
|
|
27
|
-
.exec();
|
|
28
|
-
|
|
29
|
-
user.position = leaderboard.findIndex((i) => i.user === userID) + 1;
|
|
23
|
+
user.position = (await getUserPosition(userID, guildID)) || 1;
|
|
30
24
|
|
|
31
25
|
let targetxp = user.level + 1;
|
|
32
26
|
|
|
@@ -48,7 +42,7 @@ async function rank(message, userID, guildID, options = []) {
|
|
|
48
42
|
try {
|
|
49
43
|
const Canvas = require("@napi-rs/canvas");
|
|
50
44
|
Canvas.GlobalFonts.registerFromPath(
|
|
51
|
-
join(__dirname, "Fonts", "
|
|
45
|
+
join(__dirname, "Fonts", "Baloo2-Regular.woff2"),
|
|
52
46
|
"Sans Serif"
|
|
53
47
|
);
|
|
54
48
|
|
|
@@ -114,7 +108,12 @@ async function rank(message, userID, guildID, options = []) {
|
|
|
114
108
|
ctx.fillRect(0, 0, 1080, 400);
|
|
115
109
|
let background = await Canvas.loadImage(BackGroundImg);
|
|
116
110
|
ctx.globalAlpha = 0.7;
|
|
117
|
-
|
|
111
|
+
const canvasWidth = canvas.width;
|
|
112
|
+
const canvasHeight = canvas.height;
|
|
113
|
+
const scale = canvasWidth / background.width;
|
|
114
|
+
const scaledHeight = background.height * scale;
|
|
115
|
+
const yOffset = (canvasHeight - scaledHeight) / 2;
|
|
116
|
+
ctx.drawImage(background, 0, yOffset, canvasWidth, scaledHeight);
|
|
118
117
|
ctx.restore();
|
|
119
118
|
|
|
120
119
|
ctx.fillStyle = DrawLayerColor;
|
package/src/reset.js
CHANGED
|
@@ -11,12 +11,12 @@ async function reset(userID, guildID) {
|
|
|
11
11
|
if (!guildID) throw new Error("[XP] User ID was not provided.");
|
|
12
12
|
|
|
13
13
|
await levels
|
|
14
|
-
.findOneAndUpdate({user: userID, guild: guildID}, {xp: 0, level: 0})
|
|
14
|
+
.findOneAndUpdate({ user: userID, guild: guildID }, { xp: 0, level: 0 })
|
|
15
15
|
.catch((err) => {
|
|
16
16
|
throw new Error(err);
|
|
17
17
|
});
|
|
18
18
|
|
|
19
|
-
return {user: userID, guild: guildID, xp: 0, level: 0};
|
|
19
|
+
return { user: userID, guild: guildID, xp: 0, level: 0 };
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
module.exports = reset;
|
package/src/roleSetup.js
CHANGED
|
@@ -36,7 +36,7 @@ class roleSetup {
|
|
|
36
36
|
await newrol.save();
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
-
newrol.lvlrole.push({lvl: options.level, role: options.role});
|
|
39
|
+
newrol.lvlrole.push({ lvl: options.level, role: options.role });
|
|
40
40
|
|
|
41
41
|
await newrol
|
|
42
42
|
.save()
|
|
@@ -75,7 +75,7 @@ class roleSetup {
|
|
|
75
75
|
gid: guildID
|
|
76
76
|
},
|
|
77
77
|
{
|
|
78
|
-
$pull: {lvlrole: {lvl: options.level}}
|
|
78
|
+
$pull: { lvlrole: { lvl: options.level } }
|
|
79
79
|
}
|
|
80
80
|
);
|
|
81
81
|
|
package/src/setLevel.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const levels = require("../src/models/level.js");
|
|
2
|
-
const {roleSetup} = require("../simplyxp");
|
|
2
|
+
const { roleSetup } = require("../simplyxp");
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* @param {Discord.Message} message
|
|
@@ -12,12 +12,12 @@ async function setLevel(message, userID, guildID, level) {
|
|
|
12
12
|
if (!guildID) throw new Error("[XP] Guild ID was not provided.");
|
|
13
13
|
if (!level || isNaN(Number(level))) throw new Error("[XP] Invalid level amount.");
|
|
14
14
|
|
|
15
|
-
const {client} = message;
|
|
15
|
+
const { client } = message;
|
|
16
16
|
|
|
17
17
|
const user = await levels.findOneAndUpdate(
|
|
18
|
-
{user: userID, guild: guildID},
|
|
19
|
-
{xp: (level * 10) ** 2, level: Math.floor(0.1 * Math.sqrt((level * 10) ** 2))},
|
|
20
|
-
{upsert: true, new: true}
|
|
18
|
+
{ user: userID, guild: guildID },
|
|
19
|
+
{ xp: (level * 10) ** 2, level: Math.floor(0.1 * Math.sqrt((level * 10) ** 2)) },
|
|
20
|
+
{ upsert: true, new: true }
|
|
21
21
|
);
|
|
22
22
|
|
|
23
23
|
if (user.level !== level) {
|
package/src/setXP.js
CHANGED
|
@@ -6,9 +6,9 @@ async function setXP(userID, guildID, xp) {
|
|
|
6
6
|
if (!xp || isNaN(Number(xp))) throw new Error("[XP] Invalid XP amount.");
|
|
7
7
|
|
|
8
8
|
const user = await levels.findOneAndUpdate(
|
|
9
|
-
{user: userID, guild: guildID},
|
|
10
|
-
{xp: xp},
|
|
11
|
-
{upsert: true}
|
|
9
|
+
{ user: userID, guild: guildID },
|
|
10
|
+
{ xp: xp },
|
|
11
|
+
{ upsert: true }
|
|
12
12
|
);
|
|
13
13
|
|
|
14
14
|
const lvl = Math.floor(0.1 * Math.sqrt(xp));
|
|
@@ -17,7 +17,7 @@ async function setXP(userID, guildID, xp) {
|
|
|
17
17
|
await user.save().catch((e) => console.log(`[XP] Failed to set XP | User: ${userID} | Err: ${e}`));
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
return {xp};
|
|
20
|
+
return { xp };
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
module.exports = setXP;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
const levels = require("../models/level.js");
|
|
2
|
+
|
|
3
|
+
async function getUserPosition(userID, guildID) {
|
|
4
|
+
const cursor = levels.find({ guild: guildID }).sort({ xp: -1 }).cursor();
|
|
5
|
+
let position = 0;
|
|
6
|
+
|
|
7
|
+
try {
|
|
8
|
+
for await (const entry of cursor) {
|
|
9
|
+
position += 1;
|
|
10
|
+
if (entry.user === userID) {
|
|
11
|
+
return position;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
return null;
|
|
15
|
+
} finally {
|
|
16
|
+
if (typeof cursor.close === "function") {
|
|
17
|
+
await cursor.close();
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
module.exports = getUserPosition;
|
|
Binary file
|