simply-xp 1.3.4 → 1.3.5-beta-2
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/package.json +50 -49
- package/simplyxp.js +31 -31
- package/src/addLevel.js +70 -70
- package/src/addXP.js +111 -111
- package/src/charts.js +89 -88
- package/src/connect.js +4 -2
- package/src/leaderboard.js +69 -69
- package/src/lvlRole.js +53 -53
- package/src/rank.js +295 -295
- package/src/reset.js +22 -22
- package/src/roleSetup.js +121 -121
- package/src/setLevel.js +70 -70
- package/.prettierrc.json +0 -8
package/src/charts.js
CHANGED
|
@@ -1,88 +1,89 @@
|
|
|
1
|
-
let leaderboard = require('./leaderboard')
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* @param {Discord.Message} message
|
|
5
|
-
* @param {import('../index').chartsOptions} options
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
async function charts(message, options = []) {
|
|
9
|
-
|
|
10
|
-
const ChartJS = require('chart.js')
|
|
11
|
-
const Canvas = require('canvas')
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
let
|
|
15
|
-
let
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
'rgba(255,
|
|
38
|
-
'rgba(255,
|
|
39
|
-
'rgba(
|
|
40
|
-
'rgba(
|
|
41
|
-
'rgba(
|
|
42
|
-
'
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
'rgb(255,
|
|
47
|
-
'rgb(255,
|
|
48
|
-
'rgb(
|
|
49
|
-
'rgb(
|
|
50
|
-
'rgb(
|
|
51
|
-
'rgb(
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
ctx.
|
|
72
|
-
ctx.
|
|
73
|
-
ctx.
|
|
74
|
-
ctx.
|
|
75
|
-
ctx.
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
1
|
+
let leaderboard = require('./leaderboard')
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @param {Discord.Message} message
|
|
5
|
+
* @param {import('../index').chartsOptions} options
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
async function charts(message, options = []) {
|
|
9
|
+
try { require('canvas') } catch { throw '[XP] This requires canvas to be installed. \n"npm install canvas"' }
|
|
10
|
+
const ChartJS = require('chart.js')
|
|
11
|
+
const Canvas = require('canvas')
|
|
12
|
+
let { client } = message
|
|
13
|
+
|
|
14
|
+
let data = []
|
|
15
|
+
let pos = options?.position || 5
|
|
16
|
+
let uzern = []
|
|
17
|
+
|
|
18
|
+
let ctx = Canvas.createCanvas(950, 526)
|
|
19
|
+
await leaderboard(client, message.guild.id).then((e) => {
|
|
20
|
+
e.forEach((m) => {
|
|
21
|
+
if (m.position <= pos) {
|
|
22
|
+
data.push(m.xp)
|
|
23
|
+
uzern.push(m.tag)
|
|
24
|
+
}
|
|
25
|
+
})
|
|
26
|
+
})
|
|
27
|
+
|
|
28
|
+
new ChartJS(ctx, {
|
|
29
|
+
type: options.type || 'bar',
|
|
30
|
+
data: {
|
|
31
|
+
labels: uzern,
|
|
32
|
+
datasets: [
|
|
33
|
+
{
|
|
34
|
+
label: 'Leaderboards',
|
|
35
|
+
data: data,
|
|
36
|
+
backgroundColor: [
|
|
37
|
+
'rgba(255, 99, 132, 0.5)',
|
|
38
|
+
'rgba(255, 159, 64, 0.5)',
|
|
39
|
+
'rgba(255, 205, 86, 0.5)',
|
|
40
|
+
'rgba(75, 192, 192, 0.5)',
|
|
41
|
+
'rgba(54, 162, 235, 0.5)',
|
|
42
|
+
'rgba(153, 102, 255, 0.5)',
|
|
43
|
+
'rgb(201, 203, 207, 0.5)'
|
|
44
|
+
],
|
|
45
|
+
borderColor: [
|
|
46
|
+
'rgb(255, 99, 132)',
|
|
47
|
+
'rgb(255, 159, 64)',
|
|
48
|
+
'rgb(255, 205, 86)',
|
|
49
|
+
'rgb(75, 192, 192)',
|
|
50
|
+
'rgb(54, 162, 235)',
|
|
51
|
+
'rgb(153, 102, 255)',
|
|
52
|
+
'rgb(201, 203, 207)'
|
|
53
|
+
],
|
|
54
|
+
borderWidth: 2
|
|
55
|
+
}
|
|
56
|
+
]
|
|
57
|
+
},
|
|
58
|
+
options: {
|
|
59
|
+
animation: false,
|
|
60
|
+
plugins: {
|
|
61
|
+
title: {
|
|
62
|
+
display: true,
|
|
63
|
+
text: 'XP Datasheet'
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
plugins: [
|
|
68
|
+
{
|
|
69
|
+
id: 'simply-xp',
|
|
70
|
+
beforeDraw: (chart) => {
|
|
71
|
+
const ctx = chart.canvas.getContext('2d')
|
|
72
|
+
ctx.save()
|
|
73
|
+
ctx.globalCompositeOperation = 'destination-over'
|
|
74
|
+
ctx.fillStyle = options.background || '#2F3136'
|
|
75
|
+
ctx.fillRect(0, 0, chart.width, chart.height)
|
|
76
|
+
ctx.restore()
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
]
|
|
80
|
+
}).update()
|
|
81
|
+
|
|
82
|
+
const attachment = {
|
|
83
|
+
attachment: ctx.toBuffer('image/png'),
|
|
84
|
+
name: 'chart.png'
|
|
85
|
+
}
|
|
86
|
+
return attachment
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
module.exports = charts
|
package/src/connect.js
CHANGED
|
@@ -7,14 +7,16 @@ const mongoose = require('mongoose')
|
|
|
7
7
|
|
|
8
8
|
async function connect(db, options = []) {
|
|
9
9
|
if (!db) throw new Error('[XP] Database URL was not provided')
|
|
10
|
-
|
|
10
|
+
mongoose.set('strictQuery', true);
|
|
11
|
+
|
|
11
12
|
mongoose.connect(db, {
|
|
12
13
|
useNewUrlParser: true,
|
|
13
14
|
useUnifiedTopology: true
|
|
14
15
|
})
|
|
15
16
|
|
|
17
|
+
|
|
16
18
|
if (options.notify === false) return
|
|
17
19
|
else return console.log('{ XP } Database Connected')
|
|
18
20
|
}
|
|
19
21
|
|
|
20
|
-
module.exports = connect
|
|
22
|
+
module.exports = connect
|
package/src/leaderboard.js
CHANGED
|
@@ -1,69 +1,69 @@
|
|
|
1
|
-
const levels = require('../src/models/level.js')
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* @param {Discord.Client} client
|
|
5
|
-
* @param {string} guildID
|
|
6
|
-
* @param {number} limit
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
async function leaderboard(client, guildID, limit) {
|
|
10
|
-
if (!guildID) throw new Error('[XP] Guild ID was not provided.')
|
|
11
|
-
|
|
12
|
-
let g = client.guilds.cache.get(guildID)
|
|
13
|
-
|
|
14
|
-
let leaderboard = await levels
|
|
15
|
-
.find({
|
|
16
|
-
guild: guildID
|
|
17
|
-
})
|
|
18
|
-
.sort([['xp', 'descending']])
|
|
19
|
-
.exec()
|
|
20
|
-
|
|
21
|
-
let led = []
|
|
22
|
-
|
|
23
|
-
function shortener(count) {
|
|
24
|
-
const COUNT_ABBRS = ['', 'k', 'M', 'T']
|
|
25
|
-
|
|
26
|
-
const i = 0 === count ? count : Math.floor(Math.log(count) / Math.log(1000))
|
|
27
|
-
let result = parseFloat((count / Math.pow(1000, i)).toFixed(2))
|
|
28
|
-
result += `${COUNT_ABBRS[i]}`
|
|
29
|
-
return result
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
leaderboard.map((key) => {
|
|
33
|
-
let user = g.members.cache.get(key.user)
|
|
34
|
-
if (key.xp === 0) return
|
|
35
|
-
|
|
36
|
-
let pos =
|
|
37
|
-
leaderboard.findIndex(
|
|
38
|
-
(i) => i.guild === key.guild && i.user === key.user
|
|
39
|
-
) + 1
|
|
40
|
-
|
|
41
|
-
if (limit) {
|
|
42
|
-
if (pos > Number(limit)) return
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
let shortXP = shortener(key.xp)
|
|
46
|
-
|
|
47
|
-
if (!user) return
|
|
48
|
-
|
|
49
|
-
led.push({
|
|
50
|
-
guildID: key.guild,
|
|
51
|
-
userID: key.user,
|
|
52
|
-
xp: key.xp,
|
|
53
|
-
shortxp: shortXP,
|
|
54
|
-
level: key.level,
|
|
55
|
-
position: pos,
|
|
56
|
-
username: user.user.username,
|
|
57
|
-
tag: user.user.tag
|
|
58
|
-
})
|
|
59
|
-
})
|
|
60
|
-
|
|
61
|
-
led = led.filter(
|
|
62
|
-
(thing, index, self) =>
|
|
63
|
-
index === self.findIndex((t) => t.userID === thing.userID)
|
|
64
|
-
)
|
|
65
|
-
|
|
66
|
-
return led
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
module.exports = leaderboard
|
|
1
|
+
const levels = require('../src/models/level.js')
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @param {Discord.Client} client
|
|
5
|
+
* @param {string} guildID
|
|
6
|
+
* @param {number} limit
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
async function leaderboard(client, guildID, limit) {
|
|
10
|
+
if (!guildID) throw new Error('[XP] Guild ID was not provided.')
|
|
11
|
+
|
|
12
|
+
let g = client.guilds.cache.get(guildID)
|
|
13
|
+
|
|
14
|
+
let leaderboard = await levels
|
|
15
|
+
.find({
|
|
16
|
+
guild: guildID
|
|
17
|
+
})
|
|
18
|
+
.sort([['xp', 'descending']])
|
|
19
|
+
.exec()
|
|
20
|
+
|
|
21
|
+
let led = []
|
|
22
|
+
|
|
23
|
+
function shortener(count) {
|
|
24
|
+
const COUNT_ABBRS = ['', 'k', 'M', 'T']
|
|
25
|
+
|
|
26
|
+
const i = 0 === count ? count : Math.floor(Math.log(count) / Math.log(1000))
|
|
27
|
+
let result = parseFloat((count / Math.pow(1000, i)).toFixed(2))
|
|
28
|
+
result += `${COUNT_ABBRS[i]}`
|
|
29
|
+
return result
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
leaderboard.map((key) => {
|
|
33
|
+
let user = g.members.cache.get(key.user)
|
|
34
|
+
if (key.xp === 0) return
|
|
35
|
+
|
|
36
|
+
let pos =
|
|
37
|
+
leaderboard.findIndex(
|
|
38
|
+
(i) => i.guild === key.guild && i.user === key.user
|
|
39
|
+
) + 1
|
|
40
|
+
|
|
41
|
+
if (limit) {
|
|
42
|
+
if (pos > Number(limit)) return
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
let shortXP = shortener(key.xp)
|
|
46
|
+
|
|
47
|
+
if (!user) return
|
|
48
|
+
|
|
49
|
+
led.push({
|
|
50
|
+
guildID: key.guild,
|
|
51
|
+
userID: key.user,
|
|
52
|
+
xp: key.xp,
|
|
53
|
+
shortxp: shortXP,
|
|
54
|
+
level: key.level,
|
|
55
|
+
position: pos,
|
|
56
|
+
username: user.user.username,
|
|
57
|
+
tag: user.user.tag
|
|
58
|
+
})
|
|
59
|
+
})
|
|
60
|
+
|
|
61
|
+
led = led.filter(
|
|
62
|
+
(thing, index, self) =>
|
|
63
|
+
index === self.findIndex((t) => t.userID === thing.userID)
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
return led
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
module.exports = leaderboard
|
package/src/lvlRole.js
CHANGED
|
@@ -1,53 +1,53 @@
|
|
|
1
|
-
const levels = require('../src/models/level.js')
|
|
2
|
-
const lrole = require('../src/models/lvlrole.js')
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* @param {Discord.Message} message
|
|
6
|
-
* @param {string} userID
|
|
7
|
-
* @param {string} guildID
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
async function lvlRole(message, userID, guildID) {
|
|
11
|
-
let e = await lrole.find({
|
|
12
|
-
gid: guildID
|
|
13
|
-
})
|
|
14
|
-
|
|
15
|
-
if (!e) return
|
|
16
|
-
|
|
17
|
-
let user = await levels.findOne({
|
|
18
|
-
user: userID,
|
|
19
|
-
guild: guildID
|
|
20
|
-
})
|
|
21
|
-
if (!user) {
|
|
22
|
-
const newuser = new levels({
|
|
23
|
-
user: userID,
|
|
24
|
-
guild: guildID
|
|
25
|
-
})
|
|
26
|
-
|
|
27
|
-
await newuser
|
|
28
|
-
.save()
|
|
29
|
-
.catch((e) => console.log(`[XP] Failed to save new user to database`))
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
e.forEach((ee) => {
|
|
33
|
-
ee = ee.lvlrole
|
|
34
|
-
|
|
35
|
-
ee.forEach((xd) => {
|
|
36
|
-
if (user && user.level >= Number(xd.lvl)) {
|
|
37
|
-
let u = message.guild.members.cache.get(userID)
|
|
38
|
-
|
|
39
|
-
let real = message.guild.roles.cache.find((r) => r.id === xd.role)
|
|
40
|
-
if (!real) return
|
|
41
|
-
else {
|
|
42
|
-
u.roles.add(real).catch((err) => {
|
|
43
|
-
message.channel.send(
|
|
44
|
-
'[XP] ERROR: Role is higher than me. `MISSING_PERMISSIONS`'
|
|
45
|
-
)
|
|
46
|
-
})
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
})
|
|
50
|
-
})
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
module.exports = lvlRole
|
|
1
|
+
const levels = require('../src/models/level.js')
|
|
2
|
+
const lrole = require('../src/models/lvlrole.js')
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @param {Discord.Message} message
|
|
6
|
+
* @param {string} userID
|
|
7
|
+
* @param {string} guildID
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
async function lvlRole(message, userID, guildID) {
|
|
11
|
+
let e = await lrole.find({
|
|
12
|
+
gid: guildID
|
|
13
|
+
})
|
|
14
|
+
|
|
15
|
+
if (!e) return
|
|
16
|
+
|
|
17
|
+
let user = await levels.findOne({
|
|
18
|
+
user: userID,
|
|
19
|
+
guild: guildID
|
|
20
|
+
})
|
|
21
|
+
if (!user) {
|
|
22
|
+
const newuser = new levels({
|
|
23
|
+
user: userID,
|
|
24
|
+
guild: guildID
|
|
25
|
+
})
|
|
26
|
+
|
|
27
|
+
await newuser
|
|
28
|
+
.save()
|
|
29
|
+
.catch((e) => console.log(`[XP] Failed to save new user to database`))
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
e.forEach((ee) => {
|
|
33
|
+
ee = ee.lvlrole
|
|
34
|
+
|
|
35
|
+
ee.forEach((xd) => {
|
|
36
|
+
if (user && user.level >= Number(xd.lvl)) {
|
|
37
|
+
let u = message.guild.members.cache.get(userID)
|
|
38
|
+
|
|
39
|
+
let real = message.guild.roles.cache.find((r) => r.id === xd.role)
|
|
40
|
+
if (!real) return
|
|
41
|
+
else {
|
|
42
|
+
u.roles.add(real).catch((err) => {
|
|
43
|
+
message.channel.send(
|
|
44
|
+
'[XP] ERROR: Role is higher than me. `MISSING_PERMISSIONS`'
|
|
45
|
+
)
|
|
46
|
+
})
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
})
|
|
50
|
+
})
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
module.exports = lvlRole
|