simply-xp 1.1.6 → 1.2.0-test-1
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/.github/ISSUE_TEMPLATE/bug_report.md +31 -31
- package/.prettierrc.json +8 -8
- package/README.md +13 -27
- package/index.d.ts +107 -107
- package/package.json +7 -5
- package/simplyxp.js +1 -1
- package/src/Fonts/Baloo-Regular.ttf +0 -0
- package/src/addLevel.js +71 -71
- package/src/addXP.js +112 -112
- package/src/charts.js +83 -83
- package/src/connect.js +20 -20
- package/src/create.js +28 -28
- package/src/fetch.js +74 -74
- package/src/leaderboard.js +70 -70
- package/src/lvlRole.js +54 -54
- package/src/models/level.js +10 -10
- package/src/models/lvlrole.js +8 -8
- package/src/rank.js +13 -18
- package/src/reset.js +22 -28
- package/src/roleSetup.js +122 -124
- package/src/setLevel.js +71 -71
- package/src/setXP.js +51 -51
- package/src/Fonts/Poppins-Regular.ttf +0 -0
- package/src/Fonts/Poppins-SemiBold.ttf +0 -0
package/src/leaderboard.js
CHANGED
|
@@ -1,70 +1,70 @@
|
|
|
1
|
-
let Discord = require('discord.js')
|
|
2
|
-
const levels = require('../src/models/level.js')
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* @param {Discord.Client} client
|
|
6
|
-
* @param {string} guildID
|
|
7
|
-
* @param {number} limit
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
async function leaderboard(client, guildID, limit) {
|
|
11
|
-
if (!guildID) throw new Error('[XP] Guild ID was not provided.')
|
|
12
|
-
|
|
13
|
-
let g = client.guilds.cache.get(guildID)
|
|
14
|
-
|
|
15
|
-
let leaderboard = await levels
|
|
16
|
-
.find({
|
|
17
|
-
guild: guildID
|
|
18
|
-
})
|
|
19
|
-
.sort([['xp', 'descending']])
|
|
20
|
-
.exec()
|
|
21
|
-
|
|
22
|
-
let led = []
|
|
23
|
-
|
|
24
|
-
function shortener(count) {
|
|
25
|
-
const COUNT_ABBRS = ['', 'k', 'M', 'T']
|
|
26
|
-
|
|
27
|
-
const i = 0 === count ? count : Math.floor(Math.log(count) / Math.log(1000))
|
|
28
|
-
let result = parseFloat((count / Math.pow(1000, i)).toFixed(2))
|
|
29
|
-
result += `${COUNT_ABBRS[i]}`
|
|
30
|
-
return result
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
leaderboard.map((key) => {
|
|
34
|
-
let user = g.members.cache.get(key.user)
|
|
35
|
-
if (key.xp === 0) return
|
|
36
|
-
|
|
37
|
-
let pos =
|
|
38
|
-
leaderboard.findIndex(
|
|
39
|
-
(i) => i.guild === key.guild && i.user === key.user
|
|
40
|
-
) + 1
|
|
41
|
-
|
|
42
|
-
if (limit) {
|
|
43
|
-
if (pos > Number(limit)) return
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
let shortXP = shortener(key.xp)
|
|
47
|
-
|
|
48
|
-
if (!user) return
|
|
49
|
-
|
|
50
|
-
led.push({
|
|
51
|
-
guildID: key.guild,
|
|
52
|
-
userID: key.user,
|
|
53
|
-
xp: key.xp,
|
|
54
|
-
shortxp: shortXP,
|
|
55
|
-
level: key.level,
|
|
56
|
-
position: pos,
|
|
57
|
-
username: user.user.username,
|
|
58
|
-
tag: user.user.tag
|
|
59
|
-
})
|
|
60
|
-
})
|
|
61
|
-
|
|
62
|
-
led = led.filter(
|
|
63
|
-
(thing, index, self) =>
|
|
64
|
-
index === self.findIndex((t) => t.userID === thing.userID)
|
|
65
|
-
)
|
|
66
|
-
|
|
67
|
-
return led
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
module.exports = leaderboard
|
|
1
|
+
let Discord = require('discord.js')
|
|
2
|
+
const levels = require('../src/models/level.js')
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @param {Discord.Client} client
|
|
6
|
+
* @param {string} guildID
|
|
7
|
+
* @param {number} limit
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
async function leaderboard(client, guildID, limit) {
|
|
11
|
+
if (!guildID) throw new Error('[XP] Guild ID was not provided.')
|
|
12
|
+
|
|
13
|
+
let g = client.guilds.cache.get(guildID)
|
|
14
|
+
|
|
15
|
+
let leaderboard = await levels
|
|
16
|
+
.find({
|
|
17
|
+
guild: guildID
|
|
18
|
+
})
|
|
19
|
+
.sort([['xp', 'descending']])
|
|
20
|
+
.exec()
|
|
21
|
+
|
|
22
|
+
let led = []
|
|
23
|
+
|
|
24
|
+
function shortener(count) {
|
|
25
|
+
const COUNT_ABBRS = ['', 'k', 'M', 'T']
|
|
26
|
+
|
|
27
|
+
const i = 0 === count ? count : Math.floor(Math.log(count) / Math.log(1000))
|
|
28
|
+
let result = parseFloat((count / Math.pow(1000, i)).toFixed(2))
|
|
29
|
+
result += `${COUNT_ABBRS[i]}`
|
|
30
|
+
return result
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
leaderboard.map((key) => {
|
|
34
|
+
let user = g.members.cache.get(key.user)
|
|
35
|
+
if (key.xp === 0) return
|
|
36
|
+
|
|
37
|
+
let pos =
|
|
38
|
+
leaderboard.findIndex(
|
|
39
|
+
(i) => i.guild === key.guild && i.user === key.user
|
|
40
|
+
) + 1
|
|
41
|
+
|
|
42
|
+
if (limit) {
|
|
43
|
+
if (pos > Number(limit)) return
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
let shortXP = shortener(key.xp)
|
|
47
|
+
|
|
48
|
+
if (!user) return
|
|
49
|
+
|
|
50
|
+
led.push({
|
|
51
|
+
guildID: key.guild,
|
|
52
|
+
userID: key.user,
|
|
53
|
+
xp: key.xp,
|
|
54
|
+
shortxp: shortXP,
|
|
55
|
+
level: key.level,
|
|
56
|
+
position: pos,
|
|
57
|
+
username: user.user.username,
|
|
58
|
+
tag: user.user.tag
|
|
59
|
+
})
|
|
60
|
+
})
|
|
61
|
+
|
|
62
|
+
led = led.filter(
|
|
63
|
+
(thing, index, self) =>
|
|
64
|
+
index === self.findIndex((t) => t.userID === thing.userID)
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
return led
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
module.exports = leaderboard
|
package/src/lvlRole.js
CHANGED
|
@@ -1,54 +1,54 @@
|
|
|
1
|
-
let Discord = require('discord.js')
|
|
2
|
-
const levels = require('../src/models/level.js')
|
|
3
|
-
const lrole = require('../src/models/lvlrole.js')
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* @param {Discord.Message} message
|
|
7
|
-
* @param {string} userID
|
|
8
|
-
* @param {string} guildID
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
async function lvlRole(message, userID, guildID) {
|
|
12
|
-
let e = await lrole.find({
|
|
13
|
-
gid: guildID
|
|
14
|
-
})
|
|
15
|
-
|
|
16
|
-
if (!e) return
|
|
17
|
-
|
|
18
|
-
let user = await levels.findOne({
|
|
19
|
-
user: userID,
|
|
20
|
-
guild: guildID
|
|
21
|
-
})
|
|
22
|
-
if (!user) {
|
|
23
|
-
const newuser = new levels({
|
|
24
|
-
user: userID,
|
|
25
|
-
guild: guildID
|
|
26
|
-
})
|
|
27
|
-
|
|
28
|
-
await newuser
|
|
29
|
-
.save()
|
|
30
|
-
.catch((e) => console.log(`[XP] Failed to save new user to database`))
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
e.forEach((ee) => {
|
|
34
|
-
ee = ee.lvlrole
|
|
35
|
-
|
|
36
|
-
ee.forEach((xd) => {
|
|
37
|
-
if (user && user.level >= Number(xd.lvl)) {
|
|
38
|
-
let u = message.guild.members.cache.get(userID)
|
|
39
|
-
|
|
40
|
-
let real = message.guild.roles.cache.find((r) => r.id === xd.role)
|
|
41
|
-
if (!real) return
|
|
42
|
-
else {
|
|
43
|
-
u.roles.add(real).catch((err) => {
|
|
44
|
-
message.channel.send(
|
|
45
|
-
'[XP] ERROR: Role is higher than me. `MISSING_PERMISSIONS`'
|
|
46
|
-
)
|
|
47
|
-
})
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
})
|
|
51
|
-
})
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
module.exports = lvlRole
|
|
1
|
+
let Discord = require('discord.js')
|
|
2
|
+
const levels = require('../src/models/level.js')
|
|
3
|
+
const lrole = require('../src/models/lvlrole.js')
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @param {Discord.Message} message
|
|
7
|
+
* @param {string} userID
|
|
8
|
+
* @param {string} guildID
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
async function lvlRole(message, userID, guildID) {
|
|
12
|
+
let e = await lrole.find({
|
|
13
|
+
gid: guildID
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
if (!e) return
|
|
17
|
+
|
|
18
|
+
let user = await levels.findOne({
|
|
19
|
+
user: userID,
|
|
20
|
+
guild: guildID
|
|
21
|
+
})
|
|
22
|
+
if (!user) {
|
|
23
|
+
const newuser = new levels({
|
|
24
|
+
user: userID,
|
|
25
|
+
guild: guildID
|
|
26
|
+
})
|
|
27
|
+
|
|
28
|
+
await newuser
|
|
29
|
+
.save()
|
|
30
|
+
.catch((e) => console.log(`[XP] Failed to save new user to database`))
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
e.forEach((ee) => {
|
|
34
|
+
ee = ee.lvlrole
|
|
35
|
+
|
|
36
|
+
ee.forEach((xd) => {
|
|
37
|
+
if (user && user.level >= Number(xd.lvl)) {
|
|
38
|
+
let u = message.guild.members.cache.get(userID)
|
|
39
|
+
|
|
40
|
+
let real = message.guild.roles.cache.find((r) => r.id === xd.role)
|
|
41
|
+
if (!real) return
|
|
42
|
+
else {
|
|
43
|
+
u.roles.add(real).catch((err) => {
|
|
44
|
+
message.channel.send(
|
|
45
|
+
'[XP] ERROR: Role is higher than me. `MISSING_PERMISSIONS`'
|
|
46
|
+
)
|
|
47
|
+
})
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
})
|
|
51
|
+
})
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
module.exports = lvlRole
|
package/src/models/level.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
const mongoose = require('mongoose')
|
|
2
|
-
|
|
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 }
|
|
8
|
-
})
|
|
9
|
-
|
|
10
|
-
module.exports = mongoose.model('Simply-XP', Levelz)
|
|
1
|
+
const mongoose = require('mongoose')
|
|
2
|
+
|
|
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 }
|
|
8
|
+
})
|
|
9
|
+
|
|
10
|
+
module.exports = mongoose.model('Simply-XP', Levelz)
|
package/src/models/lvlrole.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
const mongoose = require('mongoose')
|
|
2
|
-
|
|
3
|
-
const rol = new mongoose.Schema({
|
|
4
|
-
gid: { type: String },
|
|
5
|
-
lvlrole: { type: Array }
|
|
6
|
-
})
|
|
7
|
-
|
|
8
|
-
module.exports = mongoose.model('Simply-XP-LevelRole', rol)
|
|
1
|
+
const mongoose = require('mongoose')
|
|
2
|
+
|
|
3
|
+
const rol = new mongoose.Schema({
|
|
4
|
+
gid: { type: String },
|
|
5
|
+
lvlrole: { type: Array }
|
|
6
|
+
})
|
|
7
|
+
|
|
8
|
+
module.exports = mongoose.model('Simply-XP-LevelRole', rol)
|
package/src/rank.js
CHANGED
|
@@ -18,7 +18,7 @@ async function rank(message, userID, guildID, options = []) {
|
|
|
18
18
|
user: userID,
|
|
19
19
|
guild: guildID
|
|
20
20
|
})
|
|
21
|
-
if (!user)
|
|
21
|
+
if (!user) throw new Error('[XP] NO_DATA | User has no XP data.')
|
|
22
22
|
|
|
23
23
|
const leaderboard = await levels
|
|
24
24
|
.find({
|
|
@@ -49,15 +49,10 @@ async function rank(message, userID, guildID, options = []) {
|
|
|
49
49
|
try {
|
|
50
50
|
const Canvas = require('canvas')
|
|
51
51
|
const { registerFont } = require('canvas')
|
|
52
|
-
registerFont(join(__dirname, 'Fonts', '
|
|
53
|
-
family: 'Poppins-Regular'
|
|
54
|
-
})
|
|
55
|
-
registerFont(join(__dirname, 'Fonts', 'Poppins-SemiBold.ttf'), {
|
|
56
|
-
family: 'Poppins-Bold'
|
|
57
|
-
})
|
|
52
|
+
registerFont(join(__dirname, 'Fonts', 'Baloo-Regular.ttf'), { family: 'Sans Serif' })
|
|
58
53
|
|
|
59
54
|
function shortener(count) {
|
|
60
|
-
const COUNT_ABBRS = ['', 'k', 'M', 'T']
|
|
55
|
+
const COUNT_ABBRS = ['', 'k', 'M', 'B', 'T', 'Q', 'Q+', 'S', 'S+', 'O', 'N', 'D', 'U']
|
|
61
56
|
|
|
62
57
|
const i =
|
|
63
58
|
0 === count ? count : Math.floor(Math.log(count) / Math.log(1000))
|
|
@@ -88,7 +83,7 @@ async function rank(message, userID, guildID, options = []) {
|
|
|
88
83
|
let BackgroundRadius = '20',
|
|
89
84
|
BackGroundImg =
|
|
90
85
|
options.background ||
|
|
91
|
-
'https://
|
|
86
|
+
'https://pinebanana.files.wordpress.com/2011/04/rainbow.jpg',
|
|
92
87
|
AttachmentName = 'rank.png',
|
|
93
88
|
Username = noSymbols(name),
|
|
94
89
|
AvatarRoundRadius = '50',
|
|
@@ -98,7 +93,7 @@ async function rank(message, userID, guildID, options = []) {
|
|
|
98
93
|
LevelBarFill = options.lvlbar || '#ffffff',
|
|
99
94
|
LevelBarBackground = options.lvlbarBg || '#ffffff',
|
|
100
95
|
Rank = options.rank,
|
|
101
|
-
TextEXP = shortener(options.currentXP) + '
|
|
96
|
+
TextEXP = shortener(options.currentXP) + ' XP',
|
|
102
97
|
LvlText = `Level ${shortener(options.level)}`,
|
|
103
98
|
BarRadius = '20',
|
|
104
99
|
TextXpNeded = '{current}/{needed}',
|
|
@@ -176,7 +171,7 @@ async function rank(message, userID, guildID, options = []) {
|
|
|
176
171
|
ctx.fillRect(40 + 30, 30 + 180 + 30 + 50 + 30, 180, 50)
|
|
177
172
|
ctx.globalAlpha = 1
|
|
178
173
|
ctx.fillStyle = '#ffffff'
|
|
179
|
-
ctx.font = '32px "
|
|
174
|
+
ctx.font = '32px "Sans Serif"'
|
|
180
175
|
ctx.textAlign = 'center'
|
|
181
176
|
ctx.fillText(TextEXP, 40 + 30 + 180 / 2, 30 + 180 + 30 + 30 + 50 + 38)
|
|
182
177
|
ctx.restore()
|
|
@@ -191,7 +186,7 @@ async function rank(message, userID, guildID, options = []) {
|
|
|
191
186
|
ctx.fillRect(40 + 30, 30 + 180 + 30, 180, 50, 50)
|
|
192
187
|
ctx.globalAlpha = 1
|
|
193
188
|
ctx.fillStyle = '#ffffff'
|
|
194
|
-
ctx.font = '32px "
|
|
189
|
+
ctx.font = '32px "Sans Serif"'
|
|
195
190
|
ctx.textAlign = 'center'
|
|
196
191
|
ctx.fillText(LvlText, 40 + 30 + 180 / 2, 30 + 180 + 30 + 38)
|
|
197
192
|
ctx.restore()
|
|
@@ -203,7 +198,7 @@ async function rank(message, userID, guildID, options = []) {
|
|
|
203
198
|
ctx.shadowBlur = 15
|
|
204
199
|
ctx.shadowOffsetX = 1
|
|
205
200
|
ctx.shadowOffsetY = 1
|
|
206
|
-
ctx.font = '39px "
|
|
201
|
+
ctx.font = '39px "Sans Serif"'
|
|
207
202
|
ctx.fillText(Username, 390, 80)
|
|
208
203
|
ctx.restore()
|
|
209
204
|
|
|
@@ -214,7 +209,7 @@ async function rank(message, userID, guildID, options = []) {
|
|
|
214
209
|
ctx.shadowBlur = 15
|
|
215
210
|
ctx.shadowOffsetX = 1
|
|
216
211
|
ctx.shadowOffsetY = 1
|
|
217
|
-
ctx.font = '55px "
|
|
212
|
+
ctx.font = '55px "Sans Serif"'
|
|
218
213
|
ctx.fillText('#' + Rank, canvas.width - 50 - 5, 80)
|
|
219
214
|
ctx.restore()
|
|
220
215
|
|
|
@@ -224,7 +219,7 @@ async function rank(message, userID, guildID, options = []) {
|
|
|
224
219
|
ctx.stroke()
|
|
225
220
|
ctx.clip()
|
|
226
221
|
ctx.fillStyle = '#ffffff'
|
|
227
|
-
ctx.font = `${fsiz} "
|
|
222
|
+
ctx.font = `${fsiz} "Sans Serif"`
|
|
228
223
|
ctx.textAlign = 'center'
|
|
229
224
|
ctx.fillText(message.guild.name, 60 + 660, 355)
|
|
230
225
|
ctx.globalAlpha = '0.2'
|
|
@@ -258,8 +253,8 @@ async function rank(message, userID, guildID, options = []) {
|
|
|
258
253
|
ctx.textAlign = 'left'
|
|
259
254
|
ctx.fillStyle = '#ffffff'
|
|
260
255
|
ctx.globalAlpha = '0.8'
|
|
261
|
-
ctx.font = '30px "
|
|
262
|
-
ctx.fillText('Next Level: ' + shortener(NeededXP) + '
|
|
256
|
+
ctx.font = '30px "Sans Serif"'
|
|
257
|
+
ctx.fillText('Next Level: ' + shortener(NeededXP) + ' XP', 390, 230)
|
|
263
258
|
ctx.restore()
|
|
264
259
|
|
|
265
260
|
const latestXP = Number(CurrentXP) - Number(NeededXP)
|
|
@@ -269,7 +264,7 @@ async function rank(message, userID, guildID, options = []) {
|
|
|
269
264
|
ctx.textAlign = 'center'
|
|
270
265
|
ctx.fillStyle = '#474747'
|
|
271
266
|
ctx.globalAlpha = 1
|
|
272
|
-
ctx.font = '30px "
|
|
267
|
+
ctx.font = '30px "Sans Serif"'
|
|
273
268
|
ctx.fillText(textXPEdited, 730, 180)
|
|
274
269
|
|
|
275
270
|
const attachment = new Discord.MessageAttachment(
|
package/src/reset.js
CHANGED
|
@@ -1,28 +1,22 @@
|
|
|
1
|
-
const levels = require('../src/models/level.js')
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* @param {string} userID
|
|
5
|
-
* @param {string} guildID
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
async function reset(userID, guildID) {
|
|
9
|
-
if (!userID) throw new Error('[XP] User ID was not provided.')
|
|
10
|
-
|
|
11
|
-
if (!guildID) throw new Error('[XP] User ID was not provided.')
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
.catch((e) => console.log(`[XP] Failed to save new use to database`))
|
|
24
|
-
|
|
25
|
-
return true
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
module.exports = reset
|
|
1
|
+
const levels = require('../src/models/level.js')
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @param {string} userID
|
|
5
|
+
* @param {string} guildID
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
async function reset(userID, guildID) {
|
|
9
|
+
if (!userID) throw new Error('[XP] User ID was not provided.')
|
|
10
|
+
|
|
11
|
+
if (!guildID) throw new Error('[XP] User ID was not provided.')
|
|
12
|
+
|
|
13
|
+
await levels
|
|
14
|
+
.findOneAndUpdate({ user: userID, guild: guildID }, { xp: 0, level: 0 })
|
|
15
|
+
.catch((err) => {
|
|
16
|
+
throw new Error(err)
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
return { user: userID, guild: guildID, xp: 0, level: 0 }
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
module.exports = reset
|