simply-xp 2.0.0-beta.0-fix.1 → 2.0.0-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/lib/src/add.js CHANGED
@@ -1,4 +1,3 @@
1
- "use strict";
2
1
  /**
3
2
  * Add XP to a user
4
3
  * @async
@@ -9,7 +8,8 @@
9
8
  * @link `Documentation:` https://simplyxp.js.org/docs/next/functions/addlevel
10
9
  * @returns {Promise<UserResult>} - Object of user data on success
11
10
  * @throws {XpFatal} - If parameters are not provided correctly
12
- */async function addLevel(e,a,t,l){if(!e)throw new xplogs_1.XpFatal({function:"addLevel()",message:"User ID was not provided"});if(!a)throw new xplogs_1.XpFatal({function:"addLevel()",message:"Guild ID was not provided"});if(isNaN(t))throw new xplogs_1.XpFatal({function:"addLevel()",message:"Level was not provided"});var o=await database_1.db.findOne({collection:"simply-xps",data:{user:e,guild:a}});if(o)return database_1.db.updateOne({collection:"simply-xps",data:{user:e,guild:a}},{collection:"simply-xps",data:{name:l||o?.name||e,user:e,guild:a,level:o.level+t,xp:(0,xp_1.convertFrom)(t+o.level),xp_rate:xp_1.xp.xp_rate}});if(xp_1.xp.auto_create&&l)return database_1.db.createOne({collection:"simply-xps",data:{guild:a,user:e,name:l,level:t,xp:(0,xp_1.convertFrom)(t),xp_rate:xp_1.xp.xp_rate}});throw new xplogs_1.XpFatal({function:"addLevel()",message:"User does not exist"})}
11
+ */
12
+ async function addLevel(e,a,t,l){if(!e)throw new xplogs_1.XpFatal({function:"addLevel()",message:"User ID was not provided"});if(!a)throw new xplogs_1.XpFatal({function:"addLevel()",message:"Guild ID was not provided"});if(isNaN(t))throw new xplogs_1.XpFatal({function:"addLevel()",message:"Level was not provided"});var o=await database_1.db.findOne({collection:"simply-xps",data:{user:e,guild:a}});if(o)return database_1.db.updateOne({collection:"simply-xps",data:{user:e,guild:a}},{collection:"simply-xps",data:{name:l||o?.name||e,user:e,guild:a,level:o.level+t,xp:(0,xp_1.convertFrom)(t+o.level),xp_rate:xp_1.xp.xp_rate}});if(xp_1.xp.auto_create&&l)return database_1.db.createOne({collection:"simply-xps",data:{guild:a,user:e,name:l,level:t,xp:(0,xp_1.convertFrom)(t),xp_rate:xp_1.xp.xp_rate}});throw new xplogs_1.XpFatal({function:"addLevel()",message:"User does not exist"})}
13
13
  /**
14
14
  * Add XP to a user.
15
15
  * @async
@@ -20,4 +20,4 @@
20
20
  * @link `Documentation:` https://simplyxp.js.org/docs/next/functions/addxp
21
21
  * @returns {Promise<XPResult>} - Object of user data on success.
22
22
  * @throws {XpFatal} - If parameters are not provided correctly.
23
- */async function addXP(e,a,t,l){var o;if(!("number"==typeof t||"object"==typeof xp_1.xp&&t.min&&t.max))throw new xplogs_1.XpFatal({function:"addXP()",message:"XP is not a number or object, make sure you are using the correct syntax"});if("object"==typeof t&&(t=Math.floor(Math.random()*(t.max-t.min)+t.min)),!e)throw new xplogs_1.XpFatal({function:"addXP()",message:"User ID was not provided"});if(!a)throw new xplogs_1.XpFatal({function:"addXP()",message:"Guild ID was not provided"});let s;if(o=await database_1.db.findOne({collection:"simply-xps",data:{user:e,guild:a}}))s=await database_1.db.updateOne({collection:"simply-xps",data:{user:e,guild:a}},{collection:"simply-xps",data:{user:e,guild:a,name:l||o?.name||e,level:(0,xp_1.convertFrom)(o.xp+t,"xp"),xp:o.xp+t,xp_rate:xp_1.xp.xp_rate}}).catch(e=>{throw new xplogs_1.XpFatal({function:"addXP()",message:e.stack})});else{if(!xp_1.xp.auto_create||!l)throw new xplogs_1.XpFatal({function:"addXP()",message:"User does not exist"});s=await database_1.db.createOne({collection:"simply-xps",data:{guild:a,user:e,name:l,level:(0,xp_1.convertFrom)(t,"xp"),xp:t,xp_rate:xp_1.xp.xp_rate}}).catch(e=>{throw new xplogs_1.XpFatal({function:"addXP()",message:e.stack})})}return l=xplogs_1.XpEvents.eventCallback,(t=o?.level&&s?.level?s.level!==o.level?s.level-o.level:0:0<s?.level?s.level:0)<0&&l?.levelDown&&"function"==typeof l.levelDown&&l.levelDown(s,await xp_1.roleSetup.getRoles(e,a,{includeNextRoles:!0})),0<t&&l?.levelUp&&"function"==typeof l.levelUp&&l.levelUp(s,await xp_1.roleSetup.getRoles(e,a)),{...s,levelDifference:t}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.addXP=exports.addLevel=void 0;const xplogs_1=require("./functions/xplogs"),database_1=require("./functions/database"),xp_1=require("../xp");exports.addLevel=addLevel,exports.addXP=addXP;
23
+ */async function addXP(e,a,t,l){var o;if(!("number"==typeof t||"object"==typeof xp_1.xp&&t.min&&t.max))throw new xplogs_1.XpFatal({function:"addXP()",message:"XP is not a number or object, make sure you are using the correct syntax"});if("object"==typeof t&&(t=Math.floor(Math.random()*(t.max-t.min)+t.min)),!e)throw new xplogs_1.XpFatal({function:"addXP()",message:"User ID was not provided"});if(!a)throw new xplogs_1.XpFatal({function:"addXP()",message:"Guild ID was not provided"});let p;if(o=await database_1.db.findOne({collection:"simply-xps",data:{user:e,guild:a}}))p=await database_1.db.updateOne({collection:"simply-xps",data:{user:e,guild:a}},{collection:"simply-xps",data:{user:e,guild:a,name:l||o?.name||e,level:(0,xp_1.convertFrom)(o.xp+t,"xp"),xp:o.xp+t,xp_rate:xp_1.xp.xp_rate}}).catch(e=>{throw new xplogs_1.XpFatal({function:"addXP()",message:e.stack})});else{if(!xp_1.xp.auto_create||!l)throw new xplogs_1.XpFatal({function:"addXP()",message:"User does not exist"});p=await database_1.db.createOne({collection:"simply-xps",data:{guild:a,user:e,name:l,level:(0,xp_1.convertFrom)(t,"xp"),xp:t,xp_rate:xp_1.xp.xp_rate}}).catch(e=>{throw new xplogs_1.XpFatal({function:"addXP()",message:e.stack})})}return l=xplogs_1.XpEvents.eventCallback,(t=o?.level&&p?.level?p.level!==o.level?p.level-o.level:0:0<p?.level?p.level:0)<0&&l?.levelDown&&"function"==typeof l.levelDown&&l.levelDown(p,await xp_1.roleSetup.getRoles(e,a,{includeNextRoles:!0})),0<t&&l?.levelUp&&"function"==typeof l.levelUp&&l.levelUp(p,await xp_1.roleSetup.getRoles(e,a)),{...p,levelDifference:t}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.addLevel=addLevel,exports.addXP=addXP;let xplogs_1=require("./functions/xplogs"),database_1=require("./functions/database"),xp_1=require("../xp");
@@ -1,4 +1,3 @@
1
- /// <reference types="node" />
2
1
  import { SKRSContext2D } from "@napi-rs/canvas";
3
2
  import { User } from "../xp";
4
3
  export type CompareCardLocales = {
package/lib/src/cards.js CHANGED
@@ -1,4 +1,3 @@
1
- "use strict";
2
1
  /**
3
2
  * Generate a simple comparison card
4
3
  * @async
@@ -10,7 +9,8 @@
10
9
  * @link `Documentation` https://simplyxp.js.org/docs/next/functions/compareCard
11
10
  * @returns {Promise<{attachment: Buffer, description: string, name: string}>}
12
11
  * @throws {XpFatal} - If parameters are not provided correctly or if the user is not found in the database
13
- */async function compareCard(e,a,l,o={},t={}){var r,n,i,s,f,d,c;if(!e?.id||!e?.name)throw new xplogs_1.XpFatal({function:"compareCard()",message:"Please provide a guild"});if(!(a?.id&&a?.username&&l?.id&&l?.username))throw new xplogs_1.XpFatal({function:"compareCard()",message:"Please provide two valid users!"});if(!a?.avatarURL.endsWith(".png")&&!a.avatarURL.endsWith(".jpg")&&!a.avatarURL.endsWith(".webp"))throw new xplogs_1.XpFatal({function:"compareCard()",message:"[USER 1] Avatar image must be a png, jpg, or webp"});await(0,xp_1.registerFont)(o?.font||(0,path_1.join)(__dirname,"fonts","Baloo2-ExtraBold.woff2"),"Baloo"),o?.fallbackFont&&await(0,xp_1.registerFont)(o.fallbackFont,"FallbackFont"),t?.level||(t.level="Level"),t?.versus||(t.versus="vs"),s=await(0,canvas_1.loadImage)(o?.background||"https://i.ibb.co/WnfXZjc/clouds.jpg").catch(()=>{throw new xplogs_1.XpFatal({function:"compareCard()",message:"Unable to load background image, is it valid and reachable?"})}),r=await(0,canvas_1.loadImage)(a.avatarURL).catch(()=>{throw new xplogs_1.XpFatal({function:"compareCard()",message:"[USER 1] Unable to load user's AvatarURL, is it valid and reachable?"})}),n=await(0,canvas_1.loadImage)(l.avatarURL).catch(()=>{throw new xplogs_1.XpFatal({function:"compareCard()",message:"[USER 2] Unable to load user's AvatarURL, is it valid and reachable?"})});let p=await xp_1.db.findOne({collection:"simply-xps",data:{guild:e.id,user:a.id}});if(!p){if(!xp_1.xp.auto_create||!l?.username)throw new xplogs_1.XpFatal({function:"compareCard()",message:"[USER 1] User not found in database"});p=await(0,xp_1.create)(a.id,e.id,a.username)}let g=await xp_1.db.findOne({collection:"simply-xps",data:{guild:e.id,user:l.id}});if(!g){if(!xp_1.xp.auto_create||!l?.username)throw new xplogs_1.XpFatal({function:"compareCard()",message:"[USER 2] User not found in database"});g=await(0,xp_1.create)(l.id,e.id,l.username)}return RoundedBox(i=(e=(0,canvas_1.createCanvas)(1080,400)).getContext("2d"),0,0,e.width,e.height,25),i.clip(),i.fillStyle=o?.light?"#ffffff":"#000000",i.fill(),i.globalAlpha=.6,i.drawImage(s,-5,0,1090,400),i.restore(),i.globalAlpha=1,s=o?.color||o?.light?"rgba(0,0,0,0.5)":"rgba(255,255,255,0.5)",f=o?.centerBarBg||o?.light?"rgba(0,0,0,0.4)":"rgba(255,255,255,0.4)",d=t.level+(" "+shortener(p.level,!0)),c=t.level+(" "+shortener(g.level,!0)),i.save(),i.textAlign="center",i.fillStyle="#ffffff",i.shadowColor="#000000",i.shadowBlur=6,i.shadowOffsetX=1,i.shadowOffsetY=1,i.font="40px Baloo, FallbackFont",i.fillText(`${a.username} ${t.versus} `+l.username,540,60),i.restore(),i.save(),i.beginPath(),i.arc(160,200,105,0,2*Math.PI,!0),i.closePath(),i.strokeStyle=s,i.lineWidth=5,i.stroke(),i.beginPath(),i.arc(160,200,100,0,2*Math.PI,!0),i.closePath(),i.clip(),i.fillStyle=s,i.fill(),i.drawImage(r,50,90,220,220),i.restore(),i.save(),i.beginPath(),i.arc(920,200,105,0,2*Math.PI,!0),i.closePath(),i.strokeStyle=s,i.lineWidth=5,i.stroke(),i.beginPath(),i.arc(920,200,100,0,2*Math.PI,!0),i.closePath(),i.clip(),i.fillStyle=s,i.fill(),i.drawImage(n,810,90,220,220),i.restore(),i.save(),i.globalAlpha=1,i.fillStyle="#ffffff",i.textAlign="center",i.font="25px Baloo, FallbackFont",o?.light&&(i.shadowColor="#000000",i.shadowBlur=5,i.shadowOffsetX=1,i.shadowOffsetY=1),i.fillText(d,160,350),i.fillText(c,920,350),i.restore(),i.save(),i.globalAlpha=1,RoundedBox(i,265,330,540,25,10),i.clip(),i.fillStyle=f,i.fill(),i.fillStyle="#ffffff",i.textAlign="center",i.font="22px Baloo, FallbackFont",i.fillText((p.xp>g.xp?"+":"-")+Math.abs(p.level-g.level),540,350),xp_1.xp.auto_clean&&(0,xp_1.clean)(),{attachment:e.toBuffer("image/png"),description:"Simply-XP Comparison Card",name:"compareCard.png"}}
12
+ */
13
+ async function compareCard(e,a,l,t={},o={}){var r,n,i,s,f,d;
14
14
  /**
15
15
  * Generate a simple leaderboard card
16
16
  * @async
@@ -21,7 +21,7 @@
21
21
  * @link `Documentation` https://simplyxp.js.org/docs/next/functions/leaderboard
22
22
  * @returns {Promise<{attachment: Buffer, description: string, name: string}>}
23
23
  * @throws {XpFatal} - If parameters are not provided correctly
24
- */async function leaderboardCard(a,e={},l,o={}){var t,r,n,i,s,f;if(!a||a.length<1)throw new xplogs_1.XpFatal({function:"leaderboardCard()",message:"There must be at least 1 user in the data array"});let d=void 0,c=void 0,p,g=(e?.artworkImage&&(d=await(0,canvas_1.loadImage)(e.artworkImage).catch(()=>{throw new xplogs_1.XpFatal({function:"leaderboardCard()",message:"Unable to load artwork image, is it valid?"})})),e?.backgroundImage&&(c=await(0,canvas_1.loadImage)(e.backgroundImage).catch(()=>{throw new xplogs_1.XpFatal({function:"leaderboardCard()",message:"Unable to load background image, is it valid?"})})),await(0,xp_1.registerFont)(e?.primaryFont||(0,path_1.join)(__dirname,"fonts","Baloo2-ExtraBold.woff2"),"Baloo"),e?.secondaryFont&&await(0,xp_1.registerFont)(e.secondaryFont,"SecondaryFont"),e?.fallbackFont&&await(0,xp_1.registerFont)(e.fallbackFont,"FallbackFont"),o.level||(o.level="LEVEL"),o.members||(o.members="Members"),a=a.slice(0,8),t=e?.secondaryFont?"SecondaryFont, FallbackFont":"Baloo, FallbackFont",p=e?.light?{artworkColors:e?.artworkColors||["#997fe1","#616bff"],backgroundColor:"#FFFFFF",borderColors:e?.borderColors||["#e0d440","#fffa6b"],evenColor:"#f0f0f0",oddColor:"#dcdcdc",primaryTextColor:"#000000",secondaryTextColor:"rgba(0,0,0,0.5)"}:{artworkColors:e?.artworkColors||["#6B46D4","#2e3cff"],backgroundColor:"#141414",borderColors:e?.borderColors||["#e0d440","#fffa6b"],evenColor:"#1e1e1e",oddColor:"#282828",primaryTextColor:"#ffffff",secondaryTextColor:"rgba(255,255,255,0.5)"},RoundedBox(n=(r=(0,canvas_1.createCanvas)(1350,1080)).getContext("2d"),0,0,r.width,r.height,20,{clip:!0}),(i=n.createLinearGradient(0,0,r.width,0)).addColorStop(.4,p.artworkColors[0]),i.addColorStop(1,p.artworkColors[1]),n.fillStyle=i,n.fillRect(0,0,r.width,220),d&&(n.fillStyle="#000000",n.fillRect(0,0,r.width,220),n.globalAlpha=.5,n.drawImage(d,0,0,r.width,220),n.globalAlpha=1),n.fillStyle=e.backgroundColor||p.backgroundColor,n.fillRect(0,220,r.width,1080),c&&(n.globalAlpha=.9,n.drawImage(c,0,220,r.width,1080),n.globalAlpha=1),l&&l?.imageURL&&l?.name&&(i=await(0,canvas_1.loadImage)(l.imageURL),n.save(),n.beginPath(),n.arc(150,110,90,0,2*Math.PI,!0),n.closePath(),n.clip(),n.drawImage(i,60,20,180,180),n.restore(),(i=n.createLinearGradient(0,0,0,220)).addColorStop(0,p.borderColors[0]),i.addColorStop(1,p.borderColors[1]),n.strokeStyle=i,n.lineWidth=8,n.beginPath(),n.arc(150,110,90,0,2*Math.PI,!0),n.stroke(),n.fillStyle=p.primaryTextColor,n.font="60px Baloo, FallbackFont",l?.memberCount?(n.fillText(l.name,270,110),n.fillStyle=p.secondaryTextColor,n.font="40px Baloo, FallbackFont",n.fillText(l.memberCount+" "+o.members,270,160)):n.fillText(l.name,270,130)),p.evenColor);s=e?.rowOpacity&&!isNaN(e?.rowOpacity)?e.rowOpacity:c?.5:1;for(let e=0;e<a.length;e++)f=300+90*e,n.globalAlpha=s,n.save(),1===a.length?RoundedBox(n,30,f,1290,90,20,{clip:!0,fill:{color:g}}):0===e?RoundedBox(n,30,f,1290,90,20,{clip:!0,fill:{color:g},roundCorners:{top:!0,bottom:!1}}):e===a.length-1?RoundedBox(n,30,f,1290,90,20,{clip:!0,fill:{color:g},roundCorners:{top:!1,bottom:!0}}):RoundedBox(n,30,f,1290,90,0,{fill:{color:g}}),n.restore(),n.globalAlpha=1,n.textAlign="left",n.font="30px "+t,n.fillStyle=p.secondaryTextColor,n.fillText(e+1+".",60,55+f),n.textAlign="left",n.font="40px "+t,n.fillStyle=p.primaryTextColor,n.fillText(a[e]?.name||a[e]?.user||"???",120,60+f),n.textAlign="right",n.font="30px "+t,n.fillStyle=p.primaryTextColor,n.fillText(shortener(a[e]?.level)||"???",1270,55+f),n.fillStyle=p.secondaryTextColor,n.fillText(o.level,1270-n.measureText(shortener(a[e]?.level)||"???").width-15,55+f),g=g===p.evenColor?p.oddColor:p.evenColor;return xp_1.xp.auto_clean&&(0,xp_1.clean)(),{attachment:r.toBuffer("image/png"),description:"Simply-XP Leaderboard Card",name:"leaderboard.png"}}
24
+ */if(!e?.id||!e?.name)throw new xplogs_1.XpFatal({function:"compareCard()",message:"Please provide a guild"});if(!(a?.id&&a?.username&&l?.id&&l?.username))throw new xplogs_1.XpFatal({function:"compareCard()",message:"Please provide two valid users!"});if(!a?.avatarURL.endsWith(".png")&&!a.avatarURL.endsWith(".jpg")&&!a.avatarURL.endsWith(".webp"))throw new xplogs_1.XpFatal({function:"compareCard()",message:"[USER 1] Avatar image must be a png, jpg, or webp"});await(0,xp_1.registerFont)(t?.font||(0,path_1.join)(__dirname,"fonts","Baloo2-ExtraBold.woff2"),"Baloo"),t?.fallbackFont&&await(0,xp_1.registerFont)(t.fallbackFont,"FallbackFont"),o?.level||(o.level="Level"),o?.versus||(o.versus="vs"),s=await(0,canvas_1.loadImage)(t?.background||"https://i.ibb.co/WnfXZjc/clouds.jpg").catch(()=>{throw new xplogs_1.XpFatal({function:"compareCard()",message:"Unable to load background image, is it valid and reachable?"})}),r=await(0,canvas_1.loadImage)(a.avatarURL).catch(()=>{throw new xplogs_1.XpFatal({function:"compareCard()",message:"[USER 1] Unable to load user's AvatarURL, is it valid and reachable?"})}),n=await(0,canvas_1.loadImage)(l.avatarURL).catch(()=>{throw new xplogs_1.XpFatal({function:"compareCard()",message:"[USER 2] Unable to load user's AvatarURL, is it valid and reachable?"})});let c=await xp_1.db.findOne({collection:"simply-xps",data:{guild:e.id,user:a.id}});if(!c){if(!xp_1.xp.auto_create||!l?.username)throw new xplogs_1.XpFatal({function:"compareCard()",message:"[USER 1] User not found in database"});c=await(0,xp_1.create)(a.id,e.id,a.username)}let p=await xp_1.db.findOne({collection:"simply-xps",data:{guild:e.id,user:l.id}});if(!p){if(!xp_1.xp.auto_create||!l?.username)throw new xplogs_1.XpFatal({function:"compareCard()",message:"[USER 2] User not found in database"});p=await(0,xp_1.create)(l.id,e.id,l.username)}return RoundedBox(i=(e=(0,canvas_1.createCanvas)(1080,400)).getContext("2d"),0,0,e.width,e.height,25),i.clip(),i.fillStyle=t?.light?"#ffffff":"#000000",i.fill(),i.globalAlpha=.6,i.drawImage(s,-5,0,1090,400),i.restore(),i.globalAlpha=1,s=t?.color||t?.light?"rgba(0,0,0,0.5)":"rgba(255,255,255,0.5)",t=t?.centerBarBg||t?.light?"rgba(0,0,0,0.4)":"rgba(255,255,255,0.4)",f=o.level+(" "+shortener(c.level,!0)),d=o.level+(" "+shortener(p.level,!0)),i.save(),i.textAlign="center",i.lineWidth=6,i.strokeStyle="#000000",i.font="40px Baloo, FallbackFont",i.strokeText(`${a.username} ${o.versus} `+l.username,540,60),i.fillStyle="#ffffff",i.fillText(`${a.username} ${o.versus} `+l.username,540,60),i.restore(),i.save(),i.beginPath(),i.arc(160,200,105,0,2*Math.PI,!0),i.closePath(),i.strokeStyle=s,i.lineWidth=5,i.stroke(),i.beginPath(),i.arc(160,200,100,0,2*Math.PI,!0),i.closePath(),i.clip(),i.fillStyle=s,i.fill(),i.drawImage(r,50,90,220,220),i.restore(),i.save(),i.beginPath(),i.arc(920,200,105,0,2*Math.PI,!0),i.closePath(),i.strokeStyle=s,i.lineWidth=5,i.stroke(),i.beginPath(),i.arc(920,200,100,0,2*Math.PI,!0),i.closePath(),i.clip(),i.fillStyle=s,i.fill(),i.drawImage(n,810,90,220,220),i.restore(),i.save(),i.textAlign="center",i.font="25px Baloo, FallbackFont",i.lineWidth=5,i.strokeStyle="#000000",i.fillStyle="#ffffff",i.strokeText(f,160,350),i.fillText(f,160,350),i.strokeText(d,920,350),i.fillText(d,920,350),i.restore(),i.save(),RoundedBox(i,265,330,540,25,10),i.clip(),i.fillStyle=t,i.fill(),i.textAlign="center",i.font="22px Baloo, FallbackFont",i.lineWidth=4,i.strokeStyle="rgba(0,0,0,0.7)",i.fillStyle="#ffffff",a=(c.xp>p.xp?"+":"-")+Math.abs(c.level-p.level),i.strokeText(a,540,350),i.fillText(a,540,350),i.restore(),xp_1.xp.auto_clean&&(0,xp_1.clean)(),{attachment:e.toBuffer("image/png"),description:"Simply-XP Comparison Card",name:"compareCard.png"}}async function leaderboardCard(a,e={},l,t={}){var o,r,n,i,s,f;
25
25
  /**
26
26
  * Generate a simple user rank card
27
27
  * @async
@@ -32,4 +32,4 @@
32
32
  * @link `Documentation` https://simplyxp.js.org/docs/next/functions/rankCard
33
33
  * @returns {Promise<{attachment: Buffer, description: string, name: string}>}
34
34
  * @throws {XpFatal} - If parameters are not provided correctly
35
- */async function rankCard(e,a,l={},o={}){var t,r,n,i,s,f,d,c,p,g,h,x;if(!e)throw new xplogs_1.XpFatal({function:"rankCard()",message:"No Guild Provided"});if(!a)throw new xplogs_1.XpFatal({function:"rankCard()",message:"No User Provided"});if(o?.level||(o.level="Level"),o?.next_level||(o.next_level="Next Level"),o?.xp||(o.xp="XP"),xplogs_1.XpLog.debug("rankCard()",`${l?.legacy?"LEGACY":"MODERN"} ENABLED`),!a||!a.id||!a.username)throw new xplogs_1.XpFatal({function:"rankCard()",message:"Invalid User Provided, user must contain id, username, and avatarURL."});await(0,xp_1.registerFont)(l?.font||(0,path_1.join)(__dirname,"fonts","Baloo2-ExtraBold.woff2"),"Baloo"),l?.fallbackFont&&await(0,xp_1.registerFont)(l.fallbackFont,"FallbackFont"),i=await(0,canvas_1.loadImage)(l?.background||(l?.legacy?"https://i.ibb.co/dck2Tnt/rank-card.webp":"https://i.ibb.co/WnfXZjc/clouds.jpg")).catch(()=>{throw new xplogs_1.XpFatal({function:"rankCard()",message:"Unable to load background image, is it valid and reachable?"})}),t=await(0,canvas_1.loadImage)(a.avatarURL).catch(()=>{throw new xplogs_1.XpFatal({function:"rankCard()",message:"Unable to load user's AvatarURL, is it valid and reachable??"})});let b=await xp_1.db.findOne({collection:"simply-xps",data:{guild:e.id,user:a.id}});if(!b){if(!xp_1.xp.auto_create)throw new xplogs_1.XpFatal({function:"rankCard()",message:"User not found in database"});b=await(0,xp_1.create)(a.id,e.id,a.username)}return r=await xp_1.db.find("simply-xps",e.id),b.position=1+r.sort((e,a)=>a.xp-e.xp).findIndex(e=>e.user===a.id)||1,(n=(r=(0,canvas_1.createCanvas)(1080,400)).getContext("2d")).save(),RoundedBox(n,0,0,r.width,r.height,25),n.clip(),n.fillStyle=l?.light?"#ffffff":"#000000",n.fill(),n.globalAlpha=l?.legacy?.8:.6,n.drawImage(i,-5,0,1090,400),n.restore(),i=l?.color||(l?.legacy?"#9900ff":l?.light?"rgba(0,0,0,0.5)":"rgba(255,255,255,0.5)"),s=l?.lvlbar||"#ffffff",f=l?.lvlbarBg||l?.legacy?"#FFFFFF":l?.light?"rgba(0,0,0,0.2)":"rgba(255,255,255,0.2)",d=shortener(b.xp)+(" "+o.xp),c=o.level+(" "+shortener(b.level)),p="{current} / {needed}",g=(0,xp_1.convertFrom)(b.level+1),h=(0,xp_1.convertFrom)(b.level),h=100*(b.xp-h)/(g-h)*(l?.legacy?660:530)/100,x="326815959358898189"===b.user?"#ade6d8":1===b.position?"#ADD8E6":2===b.position?"#C0C0C0":3===b.position?"#CD7F32":"#ffffff",l?.legacy?(n.save(),n.globalAlpha=.4,n.fillStyle=l?.light?"#ffffff":"#000000",n.fillRect(40,0,240,r.height),n.restore(),n.save(),RoundedBox(n,70,30,180,180,50,{clip:!0,fill:{color:i}}),RoundedBox(n,75,35,170,170,50,{clip:!0}),n.drawImage(t,70,30,180,180),n.restore(),n.save(),RoundedBox(n,70,320,180,50,20,{clip:!0}),n.fillStyle=i,n.fillRect(70,320,180,50),n.fillStyle="#ffffff",dynamicFont(n,d,160,358,160,32),n.restore(),n.save(),RoundedBox(n,70,240,180,50,20,{clip:!0}),n.fillStyle=i,n.fillRect(70,240,180,50),n.fillStyle="#ffffff",n.textAlign="center",dynamicFont(n,c,160,278,160,32),n.restore(),n.save(),n.textAlign="left",n.fillStyle="#ffffff",n.shadowColor="#000000",n.shadowBlur=15,n.shadowOffsetX=1,n.shadowOffsetY=1,n.font="39px Baloo, FallbackFont",n.fillText(a.username,395,80),n.restore(),n.save(),n.textAlign="right",n.fillStyle="#ffffff",n.shadowColor="#000000",n.shadowBlur=15,n.shadowOffsetX=1,n.shadowOffsetY=1,n.font="55px Baloo, FallbackFont",n.fillText("#"+b.position,r.width-55,80),n.restore(),n.save(),RoundedBox(n,390,305,660,70,20,{clip:!0}),n.fillStyle="#ffffff",dynamicFont(n,e.name,720,355,700,45),n.globalAlpha=.2,n.fillRect(390,305,660,70),n.restore(),n.save(),RoundedBox(n,390,145,660,50,20,{clip:!0}),n.fillStyle=f,n.globalAlpha=.2,n.fillRect(390,145,660,50),n.restore(),n.save(),RoundedBox(n,390,145,h,50,20,{clip:!0}),n.fillStyle=s,n.globalAlpha=.5,n.fillRect(390,145,h,50),n.restore(),n.save(),n.textAlign="left",n.fillStyle="#ffffff",n.globalAlpha=.8,n.font="30px Baloo, FallbackFont",n.fillText(o.next_level+": "+shortener(g)+" "+o.xp,390,230),n.restore(),d=p.replace(/{needed}/g,shortener(g)).replace(/{current}/g,shortener(b.xp)),n.textAlign="center",n.fillStyle="#474747",n.globalAlpha=1,n.font="30px Baloo, FallbackFont",n.fillText(d,730,180)):(n.save(),n.textAlign="center",n.fillStyle="#ffffff",n.shadowColor="#000000",n.shadowBlur=5,n.shadowOffsetX=1,n.shadowOffsetY=1,n.font="40px Baloo, FallbackFont",n.fillText(a.username,540,80),n.restore(),n.save(),n.beginPath(),n.arc(160,200,105,0,2*Math.PI,!0),n.closePath(),n.lineWidth=5,n.strokeStyle=i,n.stroke(),n.beginPath(),n.arc(160,200,100,0,2*Math.PI,!0),n.closePath(),n.clip(),n.fillStyle=i,n.fill(),n.drawImage(t,50,90,220,220),n.restore(),n.save(),n.beginPath(),n.arc(230,130,30,0,2*Math.PI,!0),n.closePath(),n.strokeStyle=i,n.lineWidth=5,n.stroke(),n.beginPath(),n.arc(230,130,30,0,2*Math.PI,!0),n.closePath(),n.fillStyle=x,n.fill(),n.clip(),n.fillStyle="#000000",dynamicFont(n,shortener(b.position,!0),230,138,45,30),n.restore(),n.save(),n.fillStyle="#ffffff",l?.light&&(n.shadowColor="#000000",n.shadowBlur=5,n.shadowOffsetX=1,n.shadowOffsetY=1),n.textAlign="center",n.font="25px Baloo, FallbackFont",n.fillText(c,160,350),n.restore(),n.save(),RoundedBox(n,265,330,540,25,10,{clip:!0,fill:{color:f}}),RoundedBox(n,270,335,h,15,5,{clip:!0,fill:{color:s}}),n.restore(),n.save(),n.textAlign="center",n.fillStyle=l?.light?"rgba(0,0,0,0.6)":"rgba(255,255,255,0.6)",n.font="22px Baloo, FallbackFont",n.fillText(p.replace(/{needed}/g,shortener(g)).replace(/{current}/g,shortener(b.xp)),540,320),n.save(),n.fillStyle="#ffffff",n.textAlign="center",l?.light&&(n.shadowColor="#000000",n.shadowBlur=5,n.shadowOffsetX=1,n.shadowOffsetY=1),n.font="25px Baloo, FallbackFont",n.fillText(o.level+" "+shortener(b.level+1),920,350),n.restore()),xp_1.xp.auto_clean&&(0,xp_1.clean)(),{attachment:r.toBuffer("image/png"),description:"Simply-XP Rank Card",name:"rank.png"}}function RoundedBox(e,a,l,o,t,r,n){var i=n?.roundCorners||{top:!0,bottom:!0};e.beginPath(),e.moveTo(a+(i.top?r:0),l),e.lineTo(a+o-(i.top?r:0),l),i.top&&e.quadraticCurveTo(a+o,l,a+o,l+r),e.lineTo(a+o,l+t-(i.bottom?r:0)),i.bottom&&e.quadraticCurveTo(a+o,l+t,a+o-r,l+t),e.lineTo(a+(i.bottom?r:0),l+t),i.bottom&&e.quadraticCurveTo(a,l+t,a,l+t-r),e.lineTo(a,l+(i.top?r:0)),i.top&&e.quadraticCurveTo(a,l,a+r,l),e.closePath(),n?.fill&&(n?.clip&&e.clip(),n.fill?.color&&(e.fillStyle=n.fill.color),n.fill?.alpha&&(e.globalAlpha=n.fill.alpha),e.fillRect(a,l,o,t)),n?.stroke&&(n.stroke?.color&&(e.strokeStyle=n.stroke.color),n.stroke?.width&&(e.lineWidth=n.stroke.width),e.stroke()),n?.clip&&e.clip()}function shortener(e,a){let l="",o=0;if(!e||0===e)return"0";if(e>Number.MAX_SAFE_INTEGER)return"∞";for(;1e3<=e&&o<8;)e/=1e3,o++;switch(o){case 0:l="";break;case 1:l="K";break;case 2:l="M";break;case 3:l="B";break;case 4:l="T";break;case 5:l="Qa";break;case 6:l="Qi";break;default:l="S+"}return""+e.toFixed(0===o||a?0:2)+l}function dynamicFont(e,a,l,o,t,r){let n=r;for(;0<n&&(e.font=n+"px Baloo, FallbackFont",!(e.measureText(a).width<t));)n--;e.textAlign="center",e.fillText(a,l,o)}Object.defineProperty(exports,"__esModule",{value:!0}),exports.RoundedBox=exports.rankCard=exports.leaderboardCard=exports.compareCard=void 0;const canvas_1=require("@napi-rs/canvas"),xp_1=require("../xp"),xplogs_1=require("./functions/xplogs"),path_1=require("path");exports.compareCard=compareCard,exports.leaderboardCard=leaderboardCard,exports.rankCard=rankCard,exports.RoundedBox=RoundedBox;
35
+ */if(!a||a.length<1)throw new xplogs_1.XpFatal({function:"leaderboardCard()",message:"There must be at least 1 user in the data array"});let d=void 0,c=void 0,p,g=(e?.artworkImage&&(d=await(0,canvas_1.loadImage)(e.artworkImage).catch(()=>{throw new xplogs_1.XpFatal({function:"leaderboardCard()",message:"Unable to load artwork image, is it valid?"})})),e?.backgroundImage&&(c=await(0,canvas_1.loadImage)(e.backgroundImage).catch(()=>{throw new xplogs_1.XpFatal({function:"leaderboardCard()",message:"Unable to load background image, is it valid?"})})),await(0,xp_1.registerFont)(e?.primaryFont||(0,path_1.join)(__dirname,"fonts","Baloo2-ExtraBold.woff2"),"Baloo"),e?.secondaryFont&&await(0,xp_1.registerFont)(e.secondaryFont,"SecondaryFont"),e?.fallbackFont&&await(0,xp_1.registerFont)(e.fallbackFont,"FallbackFont"),t.level||(t.level="LEVEL"),t.members||(t.members="Members"),a=a.slice(0,8),o=e?.secondaryFont?"SecondaryFont, FallbackFont":"Baloo, FallbackFont",p=e?.light?{artworkColors:e?.artworkColors||["#997fe1","#616bff"],backgroundColor:"#FFFFFF",borderColors:e?.borderColors||["#e0d440","#fffa6b"],evenColor:e?.rowColors?.[0]||"#f0f0f0",oddColor:e?.rowColors?.[1]||"#dcdcdc",primaryTextColor:"#000000",secondaryTextColor:"rgba(0,0,0,0.5)"}:{artworkColors:e?.artworkColors||["#6B46D4","#2e3cff"],backgroundColor:"#141414",borderColors:e?.borderColors||["#e0d440","#fffa6b"],evenColor:e?.rowColors?.[0]||"#1e1e1e",oddColor:e?.rowColors?.[1]||"#282828",primaryTextColor:"#ffffff",secondaryTextColor:"rgba(255,255,255,0.5)"},RoundedBox(n=(r=(0,canvas_1.createCanvas)(1350,1080)).getContext("2d"),0,0,r.width,r.height,20,{clip:!0}),(i=n.createLinearGradient(0,0,r.width,0)).addColorStop(.4,p.artworkColors[0]),i.addColorStop(1,p.artworkColors[1]),n.fillStyle=i,n.fillRect(0,0,r.width,220),d&&(n.fillStyle="#000000",n.fillRect(0,0,r.width,220),n.globalAlpha=.5,n.drawImage(d,0,0,r.width,220),n.globalAlpha=1),n.fillStyle=e.backgroundColor||p.backgroundColor,n.fillRect(0,220,r.width,1080),c&&(n.globalAlpha=.9,n.drawImage(c,0,220,r.width,1080),n.globalAlpha=1),l&&l?.imageURL&&l?.name&&(i=await(0,canvas_1.loadImage)(l.imageURL),n.save(),n.beginPath(),n.arc(150,110,90,0,2*Math.PI,!0),n.closePath(),n.clip(),n.drawImage(i,60,20,180,180),n.restore(),(i=n.createLinearGradient(0,0,0,220)).addColorStop(0,p.borderColors[0]),i.addColorStop(1,p.borderColors[1]),n.strokeStyle=i,n.lineWidth=8,n.beginPath(),n.arc(150,110,90,0,2*Math.PI,!0),n.stroke(),n.fillStyle=p.primaryTextColor,n.font="60px Baloo, FallbackFont",l?.memberCount?(n.fillText(l.name,270,110),n.fillStyle=p.secondaryTextColor,n.font="40px Baloo, FallbackFont",n.fillText(l.memberCount+" "+t.members,270,160)):n.fillText(l.name,270,130)),p.evenColor);s=e?.rowOpacity&&!isNaN(e?.rowOpacity)?e.rowOpacity:c?.5:1;for(let e=0;e<a.length;e++)f=300+90*e,n.globalAlpha=s,n.save(),1===a.length?RoundedBox(n,30,f,1290,90,20,{clip:!0,fill:{color:g}}):0===e?RoundedBox(n,30,f,1290,90,20,{clip:!0,fill:{color:g},roundCorners:{top:!0,bottom:!1}}):e===a.length-1?RoundedBox(n,30,f,1290,90,20,{clip:!0,fill:{color:g},roundCorners:{top:!1,bottom:!0}}):RoundedBox(n,30,f,1290,90,0,{fill:{color:g}}),n.restore(),n.globalAlpha=1,n.textAlign="left",n.font="30px "+o,n.fillStyle=p.secondaryTextColor,n.fillText(e+1+".",60,55+f),n.textAlign="left",n.font="40px "+o,n.fillStyle=p.primaryTextColor,n.fillText(a[e]?.name||a[e]?.user||"???",120,60+f),n.textAlign="right",n.font="30px "+o,n.fillStyle=p.primaryTextColor,n.fillText(shortener(a[e]?.level)||"???",1270,55+f),n.fillStyle=p.secondaryTextColor,n.fillText(t.level,1270-n.measureText(shortener(a[e]?.level)||"???").width-15,55+f),g=g===p.evenColor?p.oddColor:p.evenColor;return xp_1.xp.auto_clean&&(0,xp_1.clean)(),{attachment:r.toBuffer("image/png"),description:"Simply-XP Leaderboard Card",name:"leaderboard.png"}}async function rankCard(e,a,l={},t={}){var o,r,n,i,s,f,d,c,p,g,x,h;if(!e)throw new xplogs_1.XpFatal({function:"rankCard()",message:"No Guild Provided"});if(!a)throw new xplogs_1.XpFatal({function:"rankCard()",message:"No User Provided"});if(t?.level||(t.level="Level"),t?.next_level||(t.next_level="Next Level"),t?.xp||(t.xp="XP"),xplogs_1.XpLog.debug("rankCard()",`${l?.legacy?"LEGACY":"MODERN"} ENABLED`),!a||!a.id||!a.username)throw new xplogs_1.XpFatal({function:"rankCard()",message:"Invalid User Provided, user must contain id, username, and avatarURL."});await(0,xp_1.registerFont)(l?.font||(0,path_1.join)(__dirname,"fonts","Baloo2-ExtraBold.woff2"),"Baloo"),l?.fallbackFont&&await(0,xp_1.registerFont)(l.fallbackFont,"FallbackFont"),i=await(0,canvas_1.loadImage)(l?.background||(l?.legacy?"https://i.ibb.co/dck2Tnt/rank-card.webp":"https://i.ibb.co/WnfXZjc/clouds.jpg")).catch(()=>{throw new xplogs_1.XpFatal({function:"rankCard()",message:"Unable to load background image, is it valid and reachable?"})}),o=await(0,canvas_1.loadImage)(a.avatarURL).catch(()=>{throw new xplogs_1.XpFatal({function:"rankCard()",message:"Unable to load user's AvatarURL, is it valid and reachable??"})});let b=await xp_1.db.findOne({collection:"simply-xps",data:{guild:e.id,user:a.id}});if(!b){if(!xp_1.xp.auto_create)throw new xplogs_1.XpFatal({function:"rankCard()",message:"User not found in database"});b=await(0,xp_1.create)(a.id,e.id,a.username)}return r=await xp_1.db.find("simply-xps",e.id),b.position=1+r.sort((e,a)=>a.xp-e.xp).findIndex(e=>e.user===a.id)||1,(n=(r=(0,canvas_1.createCanvas)(1080,400)).getContext("2d")).save(),RoundedBox(n,0,0,r.width,r.height,25),n.clip(),n.fillStyle=l?.light?"#ffffff":"#000000",n.fill(),n.globalAlpha=l?.legacy?.8:.6,n.drawImage(i,-5,0,1090,400),n.restore(),i=l?.color||(l?.legacy?"#9900ff":l?.light?"rgba(0,0,0,0.5)":"rgba(255,255,255,0.5)"),s=l?.lvlbar||"#ffffff",f=l?.lvlbarBg||l?.legacy?"#FFFFFF":l?.light?"rgba(0,0,0,0.2)":"rgba(255,255,255,0.2)",d=shortener(b.xp)+(" "+t.xp),c=t.level+(" "+shortener(b.level)),p="{current} / {needed}",g=(0,xp_1.convertFrom)(b.level+1),x=(0,xp_1.convertFrom)(b.level),x=100*(b.xp-x)/(g-x)*(l?.legacy?660:530)/100,h="326815959358898189"===b.user?"#ade6d8":1===b.position?"#ADD8E6":2===b.position?"#C0C0C0":3===b.position?"#CD7F32":"#ffffff",l?.legacy?(n.save(),n.globalAlpha=.4,n.fillStyle=l?.light?"#ffffff":"#000000",n.fillRect(40,0,240,r.height),n.restore(),n.save(),RoundedBox(n,70,30,180,180,50,{clip:!0,fill:{color:i}}),RoundedBox(n,75,35,170,170,50,{clip:!0}),n.drawImage(o,70,30,180,180),n.restore(),n.save(),RoundedBox(n,70,320,180,50,20,{clip:!0}),n.fillStyle=i,n.fillRect(70,320,180,50),n.fillStyle="#ffffff",dynamicFont(n,d,160,355,160,32),n.restore(),n.save(),RoundedBox(n,70,240,180,50,20,{clip:!0}),n.fillStyle=i,n.fillRect(70,240,180,50),n.fillStyle="#ffffff",n.textAlign="center",dynamicFont(n,c,160,275,160,32),n.restore(),n.save(),n.textAlign="left",n.font="39px Baloo, FallbackFont",n.fillStyle="#ffffff",n.lineWidth=4,n.strokeStyle="#000000",n.strokeText(a.username,395,80),n.fillText(a.username,395,80),n.restore(),n.save(),n.textAlign="right",n.font="55px Baloo, FallbackFont",n.fillStyle="#ffffff",n.lineWidth=4,n.strokeStyle="#000000",n.strokeText("#"+b.position,r.width-55,80),n.fillText("#"+b.position,r.width-55,80),n.restore(),n.save(),RoundedBox(n,390,305,660,70,20,{clip:!0}),n.globalAlpha=.2,n.fillStyle="#ffffff",n.fillRect(390,305,660,70),n.globalAlpha=1,dynamicFont(n,e.name,720,355,700,45),n.restore(),n.save(),RoundedBox(n,390,145,660,50,20,{clip:!0}),n.globalAlpha=.2,n.fillStyle=f,n.fillRect(390,145,660,50),n.restore(),n.save(),RoundedBox(n,390,145,x,50,20,{clip:!0}),n.globalAlpha=.5,n.fillStyle=s,n.fillRect(390,145,x,50),n.restore(),n.save(),n.textAlign="left",n.font="30px Baloo, FallbackFont",n.fillStyle="#ffffff",n.globalAlpha=.8,n.fillText(`${t.next_level}: ${shortener(g)} `+t.xp,390,230),n.restore(),n.textAlign="center",n.font="30px Baloo, FallbackFont",n.fillStyle="#474747",n.globalAlpha=1,d=p.replace(/{needed}/g,shortener(g)).replace(/{current}/g,shortener(b.xp)),n.fillText(d,730,180)):(n.save(),n.textAlign="center",n.font="40px Baloo, FallbackFont",n.lineWidth=4,n.strokeStyle="#000000",n.strokeText(a.username,540,80),n.fillStyle="#ffffff",n.fillText(a.username,540,80),n.restore(),n.save(),n.beginPath(),n.arc(160,200,105,0,2*Math.PI),n.strokeStyle=i,n.lineWidth=5,n.stroke(),n.beginPath(),n.arc(160,200,100,0,2*Math.PI),n.clip(),n.fillStyle=i,n.fill(),n.drawImage(o,50,90,220,220),n.restore(),n.save(),n.beginPath(),n.arc(230,130,30,0,2*Math.PI),n.strokeStyle=i,n.lineWidth=5,n.stroke(),n.beginPath(),n.arc(230,130,30,0,2*Math.PI),n.fillStyle=h,n.fill(),n.clip(),n.fillStyle="#000000",dynamicFont(n,shortener(b.position,!0),230,138,45,30),n.restore(),n.save(),n.textAlign="center",n.font="25px Baloo, FallbackFont",n.lineWidth=3,n.strokeStyle=(l?.light,"#000000"),n.strokeText(c,160,350),n.fillStyle="#ffffff",n.fillText(c,160,350),n.restore(),n.save(),RoundedBox(n,265,330,540,25,10,{clip:!0,fill:{color:f}}),RoundedBox(n,270,335,x,15,5,{clip:!0,fill:{color:s}}),n.restore(),n.save(),n.textAlign="center",n.font="22px Baloo, FallbackFont",n.fillStyle=l?.light?"rgba(0,0,0,0.6)":"rgba(255,255,255,0.6)",n.fillText(p.replace(/{needed}/g,shortener(g)).replace(/{current}/g,shortener(b.xp)),540,320),n.restore(),n.save(),n.textAlign="center",n.font="25px Baloo, FallbackFont",e=t.level+" "+shortener(b.level+1),n.lineWidth=3,n.strokeStyle=(l?.light,"#000000"),n.strokeText(e,920,350),n.fillStyle="#ffffff",n.fillText(e,920,350),n.restore()),xp_1.xp.auto_clean&&(0,xp_1.clean)(),{attachment:r.toBuffer("image/png"),description:"Simply-XP Rank Card",name:"rank.png"}}function RoundedBox(e,a,l,t,o,r,n){var i=n?.roundCorners||{top:!0,bottom:!0};e.beginPath(),e.moveTo(a+(i.top?r:0),l),e.lineTo(a+t-(i.top?r:0),l),i.top&&e.quadraticCurveTo(a+t,l,a+t,l+r),e.lineTo(a+t,l+o-(i.bottom?r:0)),i.bottom&&e.quadraticCurveTo(a+t,l+o,a+t-r,l+o),e.lineTo(a+(i.bottom?r:0),l+o),i.bottom&&e.quadraticCurveTo(a,l+o,a,l+o-r),e.lineTo(a,l+(i.top?r:0)),i.top&&e.quadraticCurveTo(a,l,a+r,l),e.closePath(),n?.fill&&(n?.clip&&e.clip(),n.fill?.color&&(e.fillStyle=n.fill.color),n.fill?.alpha&&(e.globalAlpha=n.fill.alpha),e.fillRect(a,l,t,o)),n?.stroke&&(n.stroke?.color&&(e.strokeStyle=n.stroke.color),n.stroke?.width&&(e.lineWidth=n.stroke.width),e.stroke()),n?.clip&&e.clip()}function shortener(e,a){let l="",t=0;if(!e||0===e)return"0";if(e>Number.MAX_SAFE_INTEGER)return"∞";for(;1e3<=e&&t<8;)e/=1e3,t++;switch(t){case 0:l="";break;case 1:l="K";break;case 2:l="M";break;case 3:l="B";break;case 4:l="T";break;case 5:l="Qa";break;case 6:l="Qi";break;default:l="S+"}return""+e.toFixed(0===t||a?0:2)+l}function dynamicFont(e,a,l,t,o,r){let n=r;for(;0<n&&(e.font=n+"px Baloo, FallbackFont",!(e.measureText(a).width<o));)n--;e.textAlign="center",e.fillText(a,l,t)}Object.defineProperty(exports,"__esModule",{value:!0}),exports.compareCard=compareCard,exports.leaderboardCard=leaderboardCard,exports.rankCard=rankCard,exports.RoundedBox=RoundedBox;let canvas_1=require("@napi-rs/canvas"),xp_1=require("../xp"),xplogs_1=require("./functions/xplogs"),path_1=require("path");
@@ -1,4 +1,3 @@
1
- /// <reference types="node" />
2
1
  /**
3
2
  * Chart options
4
3
  * @property {string} font - Font of the chart
@@ -9,7 +8,7 @@ export interface ChartOptions {
9
8
  fallbackFont?: string;
10
9
  font?: string;
11
10
  limit?: 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10;
12
- theme?: "blue" | "dark" | "discord" | "green" | "orange" | "red" | "space" | "yellow";
11
+ theme?: "blue" | "dark" | "discord" | "green" | "light" | "orange" | "pink" | "red" | "space" | "yellow";
13
12
  type?: "bar" | "doughnut" | "pie";
14
13
  }
15
14
  /**
package/lib/src/charts.js CHANGED
@@ -1,4 +1,3 @@
1
- "use strict";
2
1
  /**
3
2
  * Creates a chart
4
3
  * @async
@@ -7,4 +6,5 @@
7
6
  * @link `Documentation:` https://simplyxp.js.org/docs/next/functions/charts
8
7
  * @returns {Promise<{attachment: Buffer, description: string, name: string}>} Chart attachment
9
8
  * @throws {XpFatal} If invalid parameters are provided, or if there are not enough users to create a chart
10
- */async function charts(e,r={}){var t,a,o,F,l,i,n,s,h;if(!e)throw new xplogs_1.XpFatal({function:"charts()",message:"No Guild ID Provided"});if(!r)throw new xplogs_1.XpFatal({function:"charts()",message:"No Options Provided"});r.theme&&["blue","dark","discord","green","orange","red","space","yellow"].includes(r.theme)||(xplogs_1.XpLog.warn("charts()","Invalid theme provided, defaulting to discord"),r.theme="discord"),r.type&&["bar","doughnut","pie"].includes(r.type)||(xplogs_1.XpLog.warn("charts()","Invalid type provided, defaulting to bar chart"),r.type="bar");let c;if((t=await(0,xp_1.leaderboard)(e,Math.min(Math.max(r?.limit||10,2),10)).catch(e=>{throw new xplogs_1.XpFatal({function:"charts()",message:e.message})})).length<2)throw new xplogs_1.XpFatal({function:"charts()",message:"Not enough users to create a chart"});switch(t.sort((e,t)=>t.position-e.position),await(0,xp_1.registerFont)(r?.font||(0,path_1.join)(__dirname,"fonts","Baloo2-ExtraBold.woff2"),"Baloo"),r.fallbackFont&&await(0,xp_1.registerFont)(r.fallbackFont,"FallbackFont"),r.theme){case"blue":c={background:"#1e1e3c",barColor:"#747fff",pieColors:["#747fff","#2832C2","#59788E","#00d2e7","#281E5D","#a9f5ff","#000e3f","#30edc2","#186c84","#0098ff"],textColor:"#FFFFFF"};break;case"dark":c={background:"#1e1e1e",barColor:"#747474",pieColors:["#1B1D1F","#454C53","#72787F","#999999","#9EA4AA","#CCCCCC","#C9CDD2","#DEDEDE","#E8EBED","#FFFFFF"],textColor:"#FFFFFF"};break;case"discord":c={background:"#36393f",barColor:"#5865F2",pieColors:["#5865F2","#57F287","#FEE75C","#EB459E","#ED4245","#FFFFFF","#000000","#FAA61A","#C04DF9","#00AAFF"],textColor:"#FFFFFF"};break;case"green":c={background:"#1e321e",barColor:"#74ff7f",pieColors:["#00FF00","#008000","#7FFF00","#32CD32","#228B22","#006400","#9ACD32","#00FA9A","#ADFF2F","#7CFC00"],textColor:"#FFFFFF"};break;case"orange":c={background:"#321e1e",barColor:"#ff9f74",pieColors:["#FF8C00","#FF5E0E","#FF4500","#FF6347","#E26310","#F5761A","#FD673A","#FFA500","#FF7F50","#FFD700"],textColor:"#FFFFFF"};break;case"red":c={background:"#321e1e",barColor:"#ff7474",pieColors:["#FF0000","#FF2400","#FF4500","#FF6347","#FF7F50","#FF8C00","#FFA07A","#FFA500","#FFC0CB","#FFD700"],textColor:"#FFFFFF"};break;case"space":c={background:"#001F3F",barColor:"#192E5B",pieColors:["#192E5B","#1F3F7F","#264FA3","#2C5FC7","#337FEA","#3D8FFF","#4D9FFF","#5DAFFF","#6DBFFF","#7DCFFF"],textColor:"#FFFFFF"};break;case"yellow":c={background:"#32321e",barColor:"#ffff74",pieColors:["#FFFD37","#FFEF00","#FDFF00","#DAA520","#F4C430","#E4D00A","#D2B55B","#FFFFE0","#FFFACD","#F5DEB3"],textColor:"#FFFFFF"}}const d=(0,canvas_1.createCanvas)(920,600),p=d.getContext("2d"),f=Math.max(...t.map(e=>e.level));if((0,cards_1.RoundedBox)(p,0,0,d.width,d.height,25,{clip:!0}),p.fillStyle=c.background,p.fillRect(0,0,d.width,d.height),"space"===r.theme){(e=p.createRadialGradient(d.width/2,d.height/2,1,d.width/2,d.height/2,Math.max(d.width,d.height))).addColorStop(0,"#000000"),e.addColorStop(1,"#001F3F"),p.fillStyle=e,p.fillRect(0,0,d.width,d.height),(e=p.createRadialGradient(150,150,10,150,150,100)).addColorStop(0,"#F2F2F2"),e.addColorStop(.8,"#D3D3D3"),e.addColorStop(1,"#001F3F"),p.fillStyle=e,p.beginPath(),p.arc(150,150,100,0,2*Math.PI),p.fill(),a=["#6B6B6B","#AA8F00","#473E83","#456579"];for(let e=0;e<a.length;e++)o=Math.random()*d.width,F=Math.random()*d.height,l=50*Math.random()+30,p.beginPath(),p.arc(o,F,l,0,2*Math.PI),p.fillStyle=a[e]||"#FFFFFF",p.fill();p.filter="blur(5px)",p.drawImage(d,0,0),p.filter="none";for(let e=0;e<100;e++)i=Math.random()*d.width,n=Math.random()*d.height,s=2*Math.random(),p.beginPath(),p.arc(i,n,s,0,2*Math.PI),p.fillStyle="#FFFFFF",p.fill()}let g=d.width-40,C=d.height-40;switch(r.type){case"bar":{h=p.measureText(f.toString()).width,g=d.width-h-100,C=d.height-140;const u=g/t.length-20,b=h+60,m=d.height-70;await Promise.all(t.map(async(e,t)=>{var a,o=(e.level===1/0?1:e.level/f)*C,t=b+t*(20+u),F=m-o,o=(p.save(),(0,cards_1.RoundedBox)(p,t,F,u,o,10,{clip:!0,fill:{color:c.barColor}}),p.restore(),t+u/2),t=(p.fillStyle=c.textColor,p.font="22px Baloo, FallbackFont",e.level.toString()),l=p.measureText(t).width,F=F-10,t=(p.fillText(t,o-l/2,F),e?.name||e.user),l=p.measureText(t).width,F=(p.font=Math.min(Math.floor(u/l*16),18)+"px Baloo, FallbackFont",l=p.measureText(t).width,30+m);"space"===r.theme&&(a=o-(e=l+20)/2,p.fillStyle="rgba(0, 0, 0, 0.5)",p.fillRect(a,F-18,e,25)),p.fillStyle=c.textColor,p.fillText(t,o-l/2,F)}))}break;case"doughnut":{const x=t.reduce((e,t)=>e+t.level,0),w=Math.min(g,C)/3,D=.6*w;let a=-Math.PI/2;const v=d.width/2,y=d.height/2;await Promise.all(t.map(async(e,t)=>{e=a+2*Math.PI*(e.level/x),p.fillStyle=c.pieColors[t%c.pieColors.length]||"#FFFFFF",p.beginPath(),p.moveTo(v+w*Math.cos(a),y+w*Math.sin(a)),p.arc(v,y,w,a,e),p.lineTo(v+D*Math.cos(e),y+D*Math.sin(e)),p.arc(v,y,D,e,a,!0),p.closePath(),p.fill(),a=e}))}break;case"pie":{const k=t.reduce((e,t)=>e+t.level,0),A=Math.min(g,C)/3;let a=-Math.PI/2;const E=d.width/2,M=d.height/2;await Promise.all(t.map(async(e,t)=>{e=a+2*Math.PI*(e.level/k),p.fillStyle=c.pieColors[t%c.pieColors.length]||"#FFFFFF",p.beginPath(),p.moveTo(E,M),p.arc(E,M,A,a,e),p.closePath(),p.fill(),a=e}))}break;default:throw new xplogs_1.XpFatal({function:"charts()",message:"Invalid chart type provided"})}if(["doughnut","pie"].includes(r.type)){const _=d.height-20-20*t.length;p.fillStyle="rgba(0,0,0,0.25)",p.fillRect(15,_-5,200,20*t.length+5),p.font="12px Baloo, FallbackFont",await Promise.all(t.map(async(e,t)=>{var a=c.pieColors[t%c.pieColors.length],t=_+20*t;p.fillStyle=a||"#FFFFFF",p.fillRect(20,t,15,15),p.fillStyle=c.textColor,p.fillText(e?.name||e.user,40,11.5+t)}))}return xp_1.xp.auto_clean&&(0,xp_1.clean)(),{attachment:d.toBuffer("image/png"),description:"Chart",name:"chart.png"}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.charts=void 0;const xp_1=require("../xp"),canvas_1=require("@napi-rs/canvas"),path_1=require("path"),cards_1=require("./cards"),xplogs_1=require("./functions/xplogs");exports.charts=charts;
9
+ */
10
+ async function charts(F,n={}){var e,t,a,o,l,r,i,h,c;if(!F)throw new xplogs_1.XpFatal({function:"charts()",message:"No Guild ID Provided"});if(!n)throw new xplogs_1.XpFatal({function:"charts()",message:"No Options Provided"});n.theme&&["blue","dark","discord","green","light","orange","pink","red","space","yellow"].includes(n.theme)||(xplogs_1.XpLog.warn("charts()","Invalid theme provided, defaulting to discord"),n.theme="discord"),n.type&&["bar","doughnut","pie"].includes(n.type)||(xplogs_1.XpLog.warn("charts()","Invalid type provided, defaulting to bar chart"),n.type="bar");let s;if((e=await(0,xp_1.leaderboard)(F,Math.min(Math.max(n?.limit||10,2),10)).catch(F=>{throw new xplogs_1.XpFatal({function:"charts()",message:F.message})})).length<2)throw new xplogs_1.XpFatal({function:"charts()",message:"Not enough users to create a chart"});switch(await(0,xp_1.registerFont)(n?.font||(0,path_1.join)(__dirname,"fonts","Baloo2-ExtraBold.woff2"),"Baloo"),n.fallbackFont&&await(0,xp_1.registerFont)(n.fallbackFont,"FallbackFont"),n.theme){case"blue":s={background:"#1e1e3c",barColor:"#747fff",pieColors:["#5A6BFF","#52FFF2","#6FB6FF","#30EDC2","#3F8CFF","#1BB8A3","#8CD9FF","#2F53FF","#0098FF","#A9F5FF"],textColor:"#FFFFFF"};break;case"dark":s={background:"#1e1e1e",barColor:"#747474",pieColors:["#FF7A7A","#39FF9D","#4C8BF5","#FFE066","#2BD9FF","#FF5EDB","#C47BFF","#6ED0FF","#FFA53A","#FFCC66"],textColor:"#FFFFFF"};break;case"discord":s={background:"#36393f",barColor:"#5865F2",pieColors:["#5865F2","#57F287","#FEE75C","#EB459E","#ED4245","#FFFFFF","#000000","#FAA61A","#C04DF9","#00AAFF"],textColor:"#FFFFFF"};break;case"green":s={background:"#1e321e",barColor:"#74ff7f",pieColors:["#66FFB2","#4DFFDF","#A8FF66","#32FF9C","#7CFFA3","#3AD7C9","#00D47A","#59FFC2","#1ED1A6","#7AFFCE"],textColor:"#FFFFFF"};break;case"light":s={background:"#f2f2f2",barColor:"#1c1c1c",pieColors:["#FF7A7A","#6ED0FF","#FFCC66","#C47BFF","#2BD9FF","#FFA53A","#FF5EDB","#39FF9D","#FFE066","#4C8BF5"],textColor:"#000000"};break;case"orange":s={background:"#321e1e",barColor:"#ff9f74",pieColors:["#FF8A4C","#FF6E35","#FFD28C","#FF7A45","#FFAA66","#FFC999","#FF9A5E","#FFB76B","#FF8F52","#FFD28C"],textColor:"#FFFFFF"};break;case"pink":s={background:"#3c1e3c",barColor:"#ff74ff",pieColors:["#FF8BFF","#FF6BD1","#A87CFF","#FFB6FF","#7DF7FF","#8FA6FF","#5FA8FF","#CE5CFF","#FF4FA3","#DFA0FF"],textColor:"#FFFFFF"};break;case"red":s={background:"#321e1e",barColor:"#ff7474",pieColors:["#FF6B6B","#FFD166","#FF4F5C","#FFB266","#FF7A85","#FFC099","#FF6F91","#FF8F4D","#FF9A7A","#FFA8B0"],textColor:"#FFFFFF"};break;case"space":s={background:"#001F3F",barColor:"#192E5B",pieColors:["#192E5B","#264FA3","#337FEA","#2C5FC7","#1F3F7F","#3D8FFF","#4D9FFF","#5DAFFF","#6DBFFF","#7DCFFF"],textColor:"#FFFFFF"};break;case"yellow":s={background:"#32321e",barColor:"#ffff74",pieColors:["#FFEF99","#FFE266","#FFB84D","#FFF6C2","#FFD966","#e6ff77ff","#FFCC33","#E6A82E","#D4A741","#FFE8AA"],textColor:"#FFFFFF"}}let d=(0,canvas_1.createCanvas)(920,600),f=d.getContext("2d"),p=Math.max(...e.map(F=>F.level));if((0,cards_1.RoundedBox)(f,0,0,d.width,d.height,25,{clip:!0}),f.fillStyle=s.background,f.fillRect(0,0,d.width,d.height),"space"===n.theme){(F=f.createRadialGradient(d.width/2,d.height/2,1,d.width/2,d.height/2,Math.max(d.width,d.height))).addColorStop(0,"#000000"),F.addColorStop(1,"#001F3F"),f.fillStyle=F,f.fillRect(0,0,d.width,d.height),(F=f.createRadialGradient(150,150,10,150,150,100)).addColorStop(0,"#F2F2F2"),F.addColorStop(.8,"#D3D3D3"),F.addColorStop(1,"#001F3F"),f.fillStyle=F,f.beginPath(),f.arc(150,150,100,0,2*Math.PI),f.fill(),t=["#6B6B6B","#AA8F00","#473E83","#456579"];for(let F=0;F<t.length;F++)a=Math.random()*d.width,o=Math.random()*d.height,l=50*Math.random()+30,f.beginPath(),f.arc(a,o,l,0,2*Math.PI),f.fillStyle=t[F]||"#FFFFFF",f.fill();f.filter="blur(5px)",f.drawImage(d,0,0),f.filter="none";for(let F=0;F<100;F++)r=Math.random()*d.width,i=Math.random()*d.height,h=2*Math.random(),f.beginPath(),f.arc(r,i,h,0,2*Math.PI),f.fillStyle="#FFFFFF",f.fill()}let C=d.width-40,g=d.height-40;switch(n.type){case"bar":{c=f.measureText(p.toString()).width,C=d.width-c-100,g=d.height-140;let r=C/e.length-20,i=c+60,h=d.height-70;e.map((F,e)=>{var t,a=(F.level===1/0?1:F.level/p)*g,e=i+e*(20+r),o=h-a,a=(f.save(),(0,cards_1.RoundedBox)(f,e,o,r,a,10,{clip:!0,fill:{color:s.barColor}}),f.restore(),e+r/2),e=(f.fillStyle=s.textColor,f.font="22px Baloo, FallbackFont",F.level.toString()),l=f.measureText(e).width,o=o-10,e=(f.fillText(e,a-l/2,o),F?.name||F.user),l=f.measureText(e).width,o=(f.font=Math.min(Math.floor(r/l*16),18)+"px Baloo, FallbackFont",l=f.measureText(e).width,30+h);"space"===n.theme&&(t=a-(F=l+20)/2,f.fillStyle="rgba(0, 0, 0, 0.5)",f.fillRect(t,o-18,F,25)),f.fillStyle=s.textColor,f.fillText(e,a-l/2,o)})}break;case"doughnut":{let t=e.reduce((F,e)=>F+e.level,0),a=Math.min(C,g)/3,o=.6*a,l=-Math.PI/2,r=d.width/2,i=d.height/2;e.map((F,e)=>{F=l+2*Math.PI*(F.level/t),f.fillStyle=s.pieColors[e%s.pieColors.length]||"#FFFFFF",f.beginPath(),f.moveTo(r+a*Math.cos(l),i+a*Math.sin(l)),f.arc(r,i,a,l,F),f.lineTo(r+o*Math.cos(F),i+o*Math.sin(F)),f.arc(r,i,o,F,l,!0),f.closePath(),f.fill(),l=F})}break;case"pie":{let t=e.reduce((F,e)=>F+e.level,0),a=Math.min(C,g)/3,o=-Math.PI/2,l=d.width/2,r=d.height/2;e.map((F,e)=>{F=o+2*Math.PI*(F.level/t),f.fillStyle=s.pieColors[e%s.pieColors.length]||"#FFFFFF",f.beginPath(),f.moveTo(l,r),f.arc(l,r,a,o,F),f.closePath(),f.fill(),o=F})}break;default:throw new xplogs_1.XpFatal({function:"charts()",message:"Invalid chart type provided"})}if(["doughnut","pie"].includes(n.type)){let a=d.height-20-20*e.length;f.fillStyle="rgba(0,0,0,0.25)",f.fillRect(15,a-5,200,20*e.length+5),f.font="12px Baloo, FallbackFont",e.map((F,e)=>{var t=s.pieColors[e%s.pieColors.length],e=a+20*e;f.fillStyle=t||"#FFFFFF",f.fillRect(20,e,15,15),f.fillStyle=s.textColor,f.fillText(F?.name||F.user,40,11.5+e)})}return xp_1.xp.auto_clean&&(0,xp_1.clean)(),{attachment:d.toBuffer("image/png"),description:"Chart",name:"chart.png"}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.charts=charts;let xp_1=require("../xp"),canvas_1=require("@napi-rs/canvas"),path_1=require("path"),cards_1=require("./cards"),xplogs_1=require("./functions/xplogs");
@@ -23,7 +23,7 @@ export declare function connect(uri: string, options?: ConnectionOptions): Promi
23
23
  * @param {string} type - NPM Package Name (lowercase)
24
24
  * @param {number} min - Minimum Major Version Number
25
25
  * @param {number} max - Maximum Major Version Number (Optional)
26
- * @returns {Promise<boolean>}
26
+ * @returns {Promise<"too_low" | "ok" | "too_high">} - Version Status
27
27
  * @throws {XpFatal} If the package version is not supported
28
28
  */
29
- export declare function checkPackageVersion(type: string, min: number, max?: number): Promise<boolean>;
29
+ export declare function checkPackageVersion(type: string, min: number, max?: number): Promise<"too_low" | "ok" | "too_high">;
@@ -1,4 +1,3 @@
1
- "use strict";
2
1
  /**
3
2
  * Connect to a database (MongoDB, SQLite)
4
3
  *
@@ -8,12 +7,19 @@
8
7
  * @link `Documentation:` https://simplyxp.js.org/docs/next/functions/connect
9
8
  * @returns {Promise<boolean>}
10
9
  * @throws {XpFatal} If an invalid type is provided or if the value is not provided.
11
- */async function connect(e,t={type:void 0}){var a,{type:o,auto_create:n,auto_clean:r,notify:s,debug:c,xp_rate:i}=t;if(!i||"slow"!==i&&"normal"!==i&&"fast"!==i&&isNaN(i)||(xp_1.xp.xp_rate="slow"===i?.05:"normal"===i?.1:"fast"===i?.5:i),!e)throw new xplogs_1.XpFatal({function:"connect()",message:"No URI Provided"});switch(!1===s&&(xp_1.xp.notify=!1),n&&(xp_1.xp.auto_create=!0),r&&(xp_1.xp.auto_clean=!0),c&&(xp_1.xp.debug=!0),o||(t.type="mongodb",xplogs_1.XpLog.warn("connect()","Database type not provided, defaulting to MongoDB")),o){case"mongodb":if(a=(await Promise.resolve().then(()=>__importStar(require("mongodb")))).MongoClient,!await checkPackageVersion("mongodb",3,6))return xplogs_1.XpLog.err("connect()","MongoDB Version 3 to 6 is required");a=await a.connect(e).catch(e=>{throw new xplogs_1.XpFatal({function:"connect()",message:e.message})}),xp_1.xp.dbType="mongodb",xp_1.xp.database=a||void 0;break;case"sqlite":try{var[p,l]=await Promise.all([Promise.resolve().then(()=>__importStar(require("better-sqlite3"))),checkPackageVersion("better-sqlite3",7,9)]);if(!l)return xplogs_1.XpLog.err("connect()","better-sqlite3 Version 7 to 9 is required");xp_1.xp.database=new p.default(e),xp_1.xp.dbType="sqlite",xp_1.xp.database.exec(`CREATE TABLE IF NOT EXISTS "simply-xps"
10
+ */
11
+ async function connect(e,t={type:void 0}){var o,{type:a,auto_create:n,auto_clean:r,notify:c,debug:p,xp_rate:s}=t;
12
+ /**
13
+ * Returns the package manager used
14
+ * @private
15
+ * @returns {Promise<"yarn" | "npm" | "pnpm">}
16
+ */if(!s||"slow"!==s&&"normal"!==s&&"fast"!==s&&isNaN(s)||(xp_1.xp.xp_rate="slow"===s?.05:"normal"===s?.1:"fast"===s?.5:s),!e)throw new xplogs_1.XpFatal({function:"connect()",message:"No URI Provided"});switch(!1===c&&(xp_1.xp.notify=!1),n&&(xp_1.xp.auto_create=!0),r&&(xp_1.xp.auto_clean=!0),p&&(xp_1.xp.debug=!0),a||(t.type="mongodb",xplogs_1.XpLog.warn("connect()","Database type not provided, defaulting to MongoDB")),a){case"mongodb":switch(await checkPackageVersion("mongodb",3,7)){case"too_low":throw new xplogs_1.XpFatal({function:"connect()",message:"MONGODB V3 OR NEWER IS REQUIRED"});case"too_high":xplogs_1.XpLog.warn("connect()","MONGODB VERSION IS NEWER THAN TESTED (V7) -- CONTINUE WITH CAUTION");break;case"ok":xplogs_1.XpLog.debug("connect()","MongoDB is natively compatible with our package! 🎉")}xplogs_1.XpLog.debug("[connect()]","ATTEMPTING MONGODB CONNECTION"),o=await(await Promise.resolve().then(()=>__importStar(require("mongodb")))).MongoClient.connect(e).catch(e=>{throw new xplogs_1.XpFatal({function:"connect()",message:e.message})}),xp_1.xp.dbType="mongodb",xp_1.xp.database=o||void 0;break;case"sqlite":try{switch(await checkPackageVersion("better-sqlite3",7,12)){case"too_low":throw new xplogs_1.XpFatal({function:"connect()",message:"BETTER-SQLITE3 V7 OR NEWER IS REQUIRED"});case"too_high":xplogs_1.XpLog.warn("connect()","BETTER-SQLITE3 VERSION IS NEWER THAN TESTED (V12) -- CONTINUE WITH CAUTION");break;case"ok":xplogs_1.XpLog.debug("connect()","better-sqlite3 is natively compatible with our package! 🎉")}xp_1.xp.database=new(await Promise.resolve().then(()=>__importStar(require("better-sqlite3")))).default(e),xplogs_1.XpLog.info("[connect()]","Successfully connected to SQLite database."),xp_1.xp.dbType="sqlite",xp_1.xp.database.exec(`CREATE TABLE IF NOT EXISTS "simply-xps"
12
17
  (
13
18
  user TEXT NOT NULL,
14
19
  guild TEXT NOT NULL,
15
20
  name TEXT NOT NULL DEFAULT user,
16
21
  level INTEGER NOT NULL DEFAULT 0,
22
+ flags TEXT DEFAULT NULL,
17
23
  xp INTEGER NOT NULL DEFAULT 0,
18
24
  voice_xp INTEGER DEFAULT 0,
19
25
  voice_time INTEGER DEFAULT 0,
@@ -24,18 +30,13 @@
24
30
  gid TEXT NOT NULL,
25
31
  lvlrole TEXT NOT NULL,
26
32
  lastUpdated TEXT NOT NULL
27
- )`)}catch(e){if("object"==typeof e&&null!==e&&void 0!==(a=e).code&&"MODULE_NOT_FOUND"!==a.code)throw new xplogs_1.XpFatal({function:"connect()",message:a.message})}break;default:throw new xplogs_1.XpFatal({function:"connect()",message:"DATABASE TYPE NOT PROVIDED OR INVALID"})}return!!xp_1.xp.database&&(xplogs_1.XpLog.info("connect()","Connected to database!"),r&&(0,xp_1.clean)({db:!0}),await xp_1.db.findAll("simply-xps").then(e=>{e.filter(e=>e?.xp_rate!==xp_1.xp.xp_rate).map(e=>{xp_1.db.updateOne({collection:"simply-xps",data:{user:e.user,guild:e.guild}},{collection:"simply-xps",data:{user:e.user,guild:e.guild,level:(0,xp_1.convertFrom)(e.xp,"xp"),xp:e.xp,xp_rate:xp_1.xp.xp_rate}})})}),xplogs_1.XpLog.debug("connect()","UPDATED ALL USERS WITH NEW XP RATE"),!0)}
28
- /**
29
- * Returns the package manager used
30
- * @private
31
- * @returns {Promise<"yarn" | "npm" | "pnpm">}
32
- */async function getPackageManager(){const t=(await Promise.resolve().then(()=>__importStar(require("fs")))).existsSync;var e=["yarn.lock","pnpm-lock.yaml","pnpm-lock.json","package-lock.json"].filter(e=>t(e));if(1===e.length){if("yarn.lock"===e[0])return xplogs_1.XpLog.debug("getPackageManager()","Using YARN"),"yarn";if("pnpm-lock.yaml"===e[0]||"pnpm-lock.json"===e[0])return xplogs_1.XpLog.debug("getPackageManager()","Using PNPM"),"pnpm"}return xplogs_1.XpLog.debug("getPackageManager()","Using NPM"),"npm"}
33
+ )`)}catch(e){if("object"==typeof e&&null!==e&&void 0!==(o=e).code&&"MODULE_NOT_FOUND"!==o.code)throw new xplogs_1.XpFatal({function:"connect()",message:o.message})}break;default:throw new xplogs_1.XpFatal({function:"connect()",message:"DATABASE TYPE NOT PROVIDED OR INVALID"})}return!!xp_1.xp.database&&(xplogs_1.XpLog.info("connect()","Connected to database!"),r&&(0,xp_1.clean)({db:!0}),await xp_1.db.findAll("simply-xps").then(e=>{e.filter(e=>e?.xp_rate!==xp_1.xp.xp_rate).map(e=>{xp_1.db.updateOne({collection:"simply-xps",data:{user:e.user,guild:e.guild}},{collection:"simply-xps",data:{user:e.user,guild:e.guild,level:(0,xp_1.convertFrom)(e.xp,"xp"),xp:e.xp,xp_rate:xp_1.xp.xp_rate}})})}),xplogs_1.XpLog.debug("connect()","UPDATED ALL USERS WITH NEW XP RATE"),!0)}async function getPackageManager(){var e,t,o=(await Promise.resolve().then(()=>__importStar(require("fs")))).existsSync;for([e,t]of Object.entries({"yarn.lock":"yarn","pnpm-lock.yaml":"pnpm","pnpm-lock.json":"pnpm","package-lock.json":"npm"}))if(o(e))return xplogs_1.XpLog.debug("getPackageManager()","Using "+t.toUpperCase()),t;return xplogs_1.XpLog.debug("getPackageManager()","No lockfile found, defaulting to NPM"),"npm"}
33
34
  /**
34
35
  * Check database package versions
35
36
  * @private
36
37
  * @param {string} type - NPM Package Name (lowercase)
37
38
  * @param {number} min - Minimum Major Version Number
38
39
  * @param {number} max - Maximum Major Version Number (Optional)
39
- * @returns {Promise<boolean>}
40
+ * @returns {Promise<"too_low" | "ok" | "too_high">} - Version Status
40
41
  * @throws {XpFatal} If the package version is not supported
41
- */async function checkPackageVersion(e,t,a){try{var o=await Promise.resolve(e+"/package.json").then(e=>__importStar(require(e)));return parseInt(o.version.substring(0,1))>=t&&(!a||parseInt(o.version.substring(0,1))<=a)}catch(o){return xplogs_1.XpLog.info("checkPackageVersion()",`Installing ${e} [V${a||t}] | Please wait...`),(0,child_process_1.execSync)(await getPackageManager()+` add ${e}@${a||t}.x.x`),xplogs_1.XpLog.warn("checkPackageVersion()",`Installed ${e}. Please restart!`),process.exit(1)}}var __createBinding=this&&this.__createBinding||(Object.create?function(e,t,a,o){void 0===o&&(o=a);var n=Object.getOwnPropertyDescriptor(t,a);n&&("get"in n?t.__esModule:!n.writable&&!n.configurable)||(n={enumerable:!0,get:function(){return t[a]}}),Object.defineProperty(e,o,n)}:function(e,t,a,o){e[o=void 0===o?a:o]=t[a]}),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),__importStar=this&&this.__importStar||function(e){var t,a;if(e&&e.__esModule)return e;if(t={},null!=e)for(a in e)"default"!==a&&Object.prototype.hasOwnProperty.call(e,a)&&__createBinding(t,e,a);return __setModuleDefault(t,e),t};Object.defineProperty(exports,"__esModule",{value:!0}),exports.checkPackageVersion=exports.connect=void 0;const xplogs_1=require("./functions/xplogs"),child_process_1=require("child_process"),xp_1=require("../xp");exports.connect=connect,exports.checkPackageVersion=checkPackageVersion;
42
+ */async function checkPackageVersion(e,t,o){try{var a=await Promise.resolve(e+"/package.json").then(e=>__importStar(require(e))),n=parseInt(a.version.split(".")[0],10);return n<t?"too_low":o&&o<n?"too_high":"ok"}catch(a){return xplogs_1.XpLog.info("checkPackageVersion()",`Installing ${e} [V${o||t}] | Please wait...`),(0,child_process_1.execSync)(await getPackageManager()+` add ${e}@${o||t}.x.x`),xplogs_1.XpLog.warn("checkPackageVersion()",`Installed ${e}. Please restart!`),process.exit(0)}}var __createBinding=this&&this.__createBinding||(Object.create?function(e,t,o,a){void 0===a&&(a=o);var n=Object.getOwnPropertyDescriptor(t,o);n&&("get"in n?t.__esModule:!n.writable&&!n.configurable)||(n={enumerable:!0,get:function(){return t[o]}}),Object.defineProperty(e,a,n)}:function(e,t,o,a){e[a=void 0===a?o:a]=t[o]}),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),__importStar=this&&this.__importStar||(()=>{var n=function(e){return(n=Object.getOwnPropertyNames||function(e){var t,o=[];for(t in e)Object.prototype.hasOwnProperty.call(e,t)&&(o[o.length]=t);return o})(e)};return function(e){var t,o,a;if(e&&e.__esModule)return e;if(t={},null!=e)for(o=n(e),a=0;a<o.length;a++)"default"!==o[a]&&__createBinding(t,e,o[a]);return __setModuleDefault(t,e),t}})();Object.defineProperty(exports,"__esModule",{value:!0}),exports.connect=connect,exports.checkPackageVersion=checkPackageVersion;let xplogs_1=require("./functions/xplogs"),child_process_1=require("child_process"),xp_1=require("../xp");
package/lib/src/create.js CHANGED
@@ -1,4 +1,3 @@
1
- "use strict";
2
1
  /**
3
2
  * Create a new user in the database
4
3
  * @async
@@ -8,4 +7,5 @@
8
7
  * @link `Documentation:` https://simplyxp.js.org/docs/next/functions/create
9
8
  * @returns {Promise<UserResult>}
10
9
  * @throws {XpFatal} If invalid parameters are provided
11
- */async function create(e,t,r){if(!e)throw new xplogs_1.XpFatal({function:"create()",message:"User ID was not provided"});if(!t)throw new xplogs_1.XpFatal({function:"create()",message:"Guild ID was not provided"});var a;if(r)return await(a=(await Promise.resolve().then(()=>__importStar(require("./functions/database")))).db).findOne({collection:"simply-xps",data:{user:e,guild:t}})||a.createOne({collection:"simply-xps",data:{name:r,user:e,guild:t,level:0,xp:0,xp_rate:xp_1.xp.xp_rate}});throw new xplogs_1.XpFatal({function:"create()",message:"Username was not provided"})}var __createBinding=this&&this.__createBinding||(Object.create?function(e,t,r,a){void 0===a&&(a=r);var i=Object.getOwnPropertyDescriptor(t,r);i&&("get"in i?t.__esModule:!i.writable&&!i.configurable)||(i={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,a,i)}:function(e,t,r,a){e[a=void 0===a?r:a]=t[r]}),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),__importStar=this&&this.__importStar||function(e){var t,r;if(e&&e.__esModule)return e;if(t={},null!=e)for(r in e)"default"!==r&&Object.prototype.hasOwnProperty.call(e,r)&&__createBinding(t,e,r);return __setModuleDefault(t,e),t};Object.defineProperty(exports,"__esModule",{value:!0}),exports.create=void 0;const xplogs_1=require("./functions/xplogs"),xp_1=require("../xp");exports.create=create;
10
+ */
11
+ async function create(e,t,r){if(!e)throw new xplogs_1.XpFatal({function:"create()",message:"User ID was not provided"});if(!t)throw new xplogs_1.XpFatal({function:"create()",message:"Guild ID was not provided"});var n;if(r)return await(n=(await Promise.resolve().then(()=>__importStar(require("./functions/database")))).db).findOne({collection:"simply-xps",data:{user:e,guild:t}})||n.createOne({collection:"simply-xps",data:{name:r,user:e,guild:t,level:0,xp:0,xp_rate:xp_1.xp.xp_rate}});throw new xplogs_1.XpFatal({function:"create()",message:"Username was not provided"})}var __createBinding=this&&this.__createBinding||(Object.create?function(e,t,r,n){void 0===n&&(n=r);var a=Object.getOwnPropertyDescriptor(t,r);a&&("get"in a?t.__esModule:!a.writable&&!a.configurable)||(a={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,n,a)}:function(e,t,r,n){e[n=void 0===n?r:n]=t[r]}),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),__importStar=this&&this.__importStar||(()=>{var a=function(e){return(a=Object.getOwnPropertyNames||function(e){var t,r=[];for(t in e)Object.prototype.hasOwnProperty.call(e,t)&&(r[r.length]=t);return r})(e)};return function(e){var t,r,n;if(e&&e.__esModule)return e;if(t={},null!=e)for(r=a(e),n=0;n<r.length;n++)"default"!==r[n]&&__createBinding(t,e,r[n]);return __setModuleDefault(t,e),t}})();Object.defineProperty(exports,"__esModule",{value:!0}),exports.create=create;let xplogs_1=require("./functions/xplogs"),xp_1=require("../xp");
package/lib/src/fetch.js CHANGED
@@ -1,4 +1,3 @@
1
- "use strict";
2
1
  /**
3
2
  * Fetch user data
4
3
  * @async
@@ -8,4 +7,5 @@
8
7
  * @link `Documentation:` https://simplyxp.js.org/docs/next/functions/fetch
9
8
  * @returns {Promise<{name: string | null, user: string, guild: string, level: number, position: number, xp: number}>}
10
9
  * @throws {XpFatal} If invalid parameters are provided, or if the user data is not found.
11
- */async function fetch(t,e,r){var i;if(!t)throw new xplogs_1.XpFatal({function:"create()",message:"User ID was not provided"});if(!e)throw new xplogs_1.XpFatal({function:"create()",message:"Guild ID was not provided"});(0,xp_1.clean)({db:!0});let n=(i=await(await Promise.resolve().then(()=>__importStar(require("./functions/database")))).db.find("simply-xps",e)).find(e=>e.user===t);if(!n){if(!xp_1.xp.auto_create||!r)throw new xplogs_1.XpFatal({function:"fetch()",message:"User data not found"});n=await(await Promise.resolve().then(()=>__importStar(require("./create")))).create(e,t,r),i.push(n)}return e=i.sort((e,t)=>t.xp-e.xp).findIndex(e=>e.user===t)+1,{name:n?.name,user:n.user,guild:n.guild,level:n.level,position:e,xp:n.xp}}var __createBinding=this&&this.__createBinding||(Object.create?function(e,t,r,i){void 0===i&&(i=r);var n=Object.getOwnPropertyDescriptor(t,r);n&&("get"in n?t.__esModule:!n.writable&&!n.configurable)||(n={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,i,n)}:function(e,t,r,i){e[i=void 0===i?r:i]=t[r]}),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),__importStar=this&&this.__importStar||function(e){var t,r;if(e&&e.__esModule)return e;if(t={},null!=e)for(r in e)"default"!==r&&Object.prototype.hasOwnProperty.call(e,r)&&__createBinding(t,e,r);return __setModuleDefault(t,e),t};Object.defineProperty(exports,"__esModule",{value:!0}),exports.fetch=void 0;const xplogs_1=require("./functions/xplogs"),xp_1=require("../xp");exports.fetch=fetch;
10
+ */
11
+ async function fetch(t,e,r){var n;if(!t)throw new xplogs_1.XpFatal({function:"create()",message:"User ID was not provided"});if(!e)throw new xplogs_1.XpFatal({function:"create()",message:"Guild ID was not provided"});(0,xp_1.clean)({db:!0});let i=(n=await(await Promise.resolve().then(()=>__importStar(require("./functions/database")))).db.find("simply-xps",e)).find(e=>e.user===t);if(!i){if(!xp_1.xp.auto_create||!r)throw new xplogs_1.XpFatal({function:"fetch()",message:"User data not found"});i=await(await Promise.resolve().then(()=>__importStar(require("./create")))).create(e,t,r),n.push(i)}return e=n.sort((e,t)=>t.xp-e.xp).findIndex(e=>e.user===t)+1,{flags:i?.flags,guild:i.guild,user:i.user,name:i?.name,level:i.level,position:e,xp:i.xp}}var __createBinding=this&&this.__createBinding||(Object.create?function(e,t,r,n){void 0===n&&(n=r);var i=Object.getOwnPropertyDescriptor(t,r);i&&("get"in i?t.__esModule:!i.writable&&!i.configurable)||(i={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,n,i)}:function(e,t,r,n){e[n=void 0===n?r:n]=t[r]}),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),__importStar=this&&this.__importStar||(()=>{var i=function(e){return(i=Object.getOwnPropertyNames||function(e){var t,r=[];for(t in e)Object.prototype.hasOwnProperty.call(e,t)&&(r[r.length]=t);return r})(e)};return function(e){var t,r,n;if(e&&e.__esModule)return e;if(t={},null!=e)for(r=i(e),n=0;n<r.length;n++)"default"!==r[n]&&__createBinding(t,e,r[n]);return __setModuleDefault(t,e),t}})();Object.defineProperty(exports,"__esModule",{value:!0}),exports.fetch=fetch;let xplogs_1=require("./functions/xplogs"),xp_1=require("../xp");
@@ -13,6 +13,7 @@ import { Collection } from "mongodb";
13
13
  export interface UserOptions {
14
14
  collection: "simply-xps";
15
15
  data: {
16
+ flags?: Array<number | string>;
16
17
  guild: string;
17
18
  user?: string;
18
19
  name?: string;
@@ -34,9 +35,10 @@ export interface UserOptions {
34
35
  */
35
36
  export interface UserResult {
36
37
  _id?: string;
38
+ flags?: Array<number | string>;
39
+ guild: string;
37
40
  user: string;
38
41
  name?: string;
39
- guild: string;
40
42
  lastUpdated: string;
41
43
  level: number;
42
44
  xp: number;
@@ -1,11 +1,11 @@
1
- "use strict";
2
1
  /**
3
2
  * Handle database errors
4
3
  * @param {Error} error
5
4
  * @param {string} functionName
6
5
  * @returns {void}
7
6
  * @private
8
- */function handleError(e,a){throw new xplogs_1.XpFatal({function:"db."+a,message:e})}Object.defineProperty(exports,"__esModule",{value:!0}),exports.db=void 0;const xplogs_1=require("./xplogs"),xp_1=require("../../xp");class db{
7
+ */
8
+ function handleError(a,e){throw new xplogs_1.XpFatal({function:"db."+e,message:a})}Object.defineProperty(exports,"__esModule",{value:!0}),exports.db=void 0;let xplogs_1=require("./xplogs"),xp_1=require("../../xp");class db{
9
9
  /**
10
10
  * Gets a collection from the database.
11
11
  * @param {collection} collection - The collection to get.
@@ -13,7 +13,7 @@
13
13
  * @returns {Collection} The collection.
14
14
  * @throws {XpFatal} Throws an error if there is no database connection, or database type is invalid.
15
15
  */
16
- static getCollection(e){if(!xp_1.xp.database)throw new xplogs_1.XpFatal({function:"getCollection()",message:"No database connection"});if("mongodb"!==xp_1.xp.dbType)throw new xplogs_1.XpFatal({function:"getCollection()",message:"MongoDB has to be your database type to use this function."});return xp_1.xp.database.db().collection(e)}
16
+ static getCollection(a){if(!xp_1.xp.database)throw new xplogs_1.XpFatal({function:"getCollection()",message:"No database connection"});if("mongodb"!==xp_1.xp.dbType)throw new xplogs_1.XpFatal({function:"getCollection()",message:"MongoDB has to be your database type to use this function."});return xp_1.xp.database.db().collection(a)}
17
17
  /**
18
18
  * Creates one document in the database.
19
19
  *
@@ -22,7 +22,7 @@ static getCollection(e){if(!xp_1.xp.database)throw new xplogs_1.XpFatal({functio
22
22
  * @link https://simplyxp.js.org/docs/next/handlers/database#createOne Documentation
23
23
  * @returns {Promise<UserResult | LevelRoleResult>} The created document.
24
24
  * @throws {XpFatal} Throws an error if there is no database connection.
25
- */static async createOne(e){if(!xp_1.xp.database)throw new xplogs_1.XpFatal({function:"createOne()",message:"No database connection"});switch(xp_1.xp.dbType){case"mongodb":xp_1.xp.database.db().collection(e.collection).insertOne({...e.data,lastUpdated:(new Date).toISOString()}).catch(e=>handleError(e,"createOne()"));break;case"sqlite":"simply-xps"===e.collection?xp_1.xp.database.prepare('INSERT INTO "simply-xps" (user, guild, level, name, lastUpdated, xp, xp_rate) VALUES (?, ?, ?, ?, ?, ?, ?)').run(e.data.user,e.data.guild,e.data.level,e.data?.name,(new Date).toISOString(),e.data.xp,e.data.xp_rate):xp_1.xp.database.prepare('INSERT INTO "simply-xp-levelroles" (gid, lvlrole, lastUpdated) VALUES (?, ?, ?)').run(e.data.guild,JSON.stringify(e.data.lvlrole),(new Date).toISOString())}return db.findOne(e)}
25
+ */static async createOne(a){if(!xp_1.xp.database)throw new xplogs_1.XpFatal({function:"createOne()",message:"No database connection"});switch(xp_1.xp.dbType){case"mongodb":await this.getCollection(a.collection).insertOne({...a.data,lastUpdated:(new Date).toISOString()}).catch(a=>handleError(a,"createOne()"));break;case"sqlite":"simply-xps"===a.collection?xp_1.xp.database.prepare('INSERT INTO "simply-xps" (user, guild, level, name, lastUpdated, xp, xp_rate, flags) VALUES (?, ?, ?, ?, ?, ?, ?, ?)').run(a.data.user,a.data.guild,a.data.level,a.data?.name,(new Date).toISOString(),a.data.xp,a.data.xp_rate,JSON.stringify(a.data?.flags)):xp_1.xp.database.prepare('INSERT INTO "simply-xp-levelroles" (gid, lvlrole, lastUpdated) VALUES (?, ?, ?)').run(a.data.guild,JSON.stringify(a.data.lvlrole),(new Date).toISOString())}return db.findOne(a)}
26
26
  /**
27
27
  * Deletes multiple documents from the database.
28
28
  * @async
@@ -30,7 +30,7 @@ static getCollection(e){if(!xp_1.xp.database)throw new xplogs_1.XpFatal({functio
30
30
  * @link https://simplyxp.js.org/docs/next/handlers/database#deleteMany Documentation
31
31
  * @returns {Promise<boolean>} `true` if the documents were successfully deleted, otherwise `false`.
32
32
  * @throws {XpFatal} Throws an error if there is no database connection.
33
- */static async deleteMany(e){if(!xp_1.xp.database)throw new xplogs_1.XpFatal({function:"deleteMany()",message:"No database connection"});let a;switch(xp_1.xp.dbType){case"mongodb":a=xp_1.xp.database.db().collection(e.collection).deleteMany(e.data).catch(e=>handleError(e,"deleteMany()"));break;case"sqlite":a=("simply-xps"===e.collection?xp_1.xp.database.prepare('DELETE FROM "simply-xps" WHERE guild = ?'):xp_1.xp.database.prepare('DELETE FROM "simply-xp-levelroles" WHERE gid = ?')).run(e.data.guild)}return!!a}
33
+ */static async deleteMany(a){if(!xp_1.xp.database)throw new xplogs_1.XpFatal({function:"deleteMany()",message:"No database connection"});let e;switch(xp_1.xp.dbType){case"mongodb":e=await this.getCollection(a.collection).deleteMany(a.data).catch(a=>handleError(a,"deleteMany()"));break;case"sqlite":e=("simply-xps"===a.collection?xp_1.xp.database.prepare('DELETE FROM "simply-xps" WHERE guild = ?'):xp_1.xp.database.prepare('DELETE FROM "simply-xp-levelroles" WHERE gid = ?')).run(a.data.guild)}return!!e}
34
34
  /**
35
35
  * Deletes one document from the database.
36
36
  *
@@ -39,7 +39,7 @@ static getCollection(e){if(!xp_1.xp.database)throw new xplogs_1.XpFatal({functio
39
39
  * @link https://simplyxp.js.org/docs/next/handlers/database#deleteOne Documentation
40
40
  * @returns {Promise<boolean>} `true` if the document was successfully deleted, otherwise `false`.
41
41
  * @throws {XpFatal} Throws an error if there is no database connection.
42
- */static async deleteOne(a){if(!xp_1.xp.database)throw new xplogs_1.XpFatal({function:"deleteOne()",message:"No database connection"});let e;switch(xp_1.xp.dbType){case"mongodb":e=xp_1.xp.database.db().collection(a.collection).deleteOne(a.data).catch(e=>handleError(e,"deleteOne()"));break;case"sqlite":e="simply-xps"===a.collection?xp_1.xp.database.prepare('DELETE FROM "simply-xps" WHERE guild = ? AND user = ?').run(a.data.guild,a.data.user):(e=(e=await this.find(a.collection,a.data.guild)).filter(e=>e.lvlrole.lvl===a.data.lvlrole.lvl)[0],xp_1.xp.database.prepare('DELETE FROM "simply-xp-levelroles" WHERE gid = ? AND lvlrole = ?').run(a.data.guild,JSON.stringify(e.lvlrole)))}return!!e}
42
+ */static async deleteOne(e){if(!xp_1.xp.database)throw new xplogs_1.XpFatal({function:"deleteOne()",message:"No database connection"});let a;switch(xp_1.xp.dbType){case"mongodb":a=await this.getCollection(e.collection).deleteOne(e.data).catch(a=>handleError(a,"deleteOne()"));break;case"sqlite":a="simply-xps"===e.collection?xp_1.xp.database.prepare('DELETE FROM "simply-xps" WHERE guild = ? AND user = ?').run(e.data.guild,e.data.user):(a=(a=await this.find(e.collection,e.data.guild)).filter(a=>a.lvlrole.lvl===e.data.lvlrole.lvl)[0],xp_1.xp.database.prepare('DELETE FROM "simply-xp-levelroles" WHERE gid = ? AND lvlrole = ?').run(e.data.guild,JSON.stringify(a.lvlrole)))}return!!a}
43
43
  /**
44
44
  * Finds one document in the database.
45
45
  *
@@ -48,7 +48,7 @@ static getCollection(e){if(!xp_1.xp.database)throw new xplogs_1.XpFatal({functio
48
48
  * @link https://simplyxp.js.org/docs/next/handlers/database#findOne Documentation
49
49
  * @returns {Promise<UserResult | LevelRoleResult>} The found document.
50
50
  * @throws {XpFatal} Throws an error if there is no database connection.
51
- */static async findOne(a){if(!xp_1.xp.database)throw new xplogs_1.XpFatal({function:"findOne()",message:"No database connection"});let e;switch(xp_1.xp.dbType){case"mongodb":e="simply-xps"===a.collection?await xp_1.xp.database.db().collection(a.collection).findOne(a.data).catch(e=>handleError(e,"findOne()")):await xp_1.xp.database.db().collection(a.collection).findOne({guild:a.data.guild,"lvlrole.lvl":a.data.lvlrole.lvl}).catch(e=>handleError(e,"findOne()"));break;case"sqlite":e="simply-xps"===a.collection?xp_1.xp.database.prepare('SELECT * FROM "simply-xps" WHERE guild = ? AND user = ?').get(a.data.guild,a.data.user):(e=await this.find(a.collection,a.data.guild)).filter(e=>e.lvlrole.lvl===a.data.lvlrole.lvl)[0]}return e}
51
+ */static async findOne(e){if(!xp_1.xp.database)throw new xplogs_1.XpFatal({function:"findOne()",message:"No database connection"});let a;switch(xp_1.xp.dbType){case"mongodb":a="simply-xps"===e.collection?await this.getCollection(e.collection).findOne(e.data).catch(a=>handleError(a,"findOne()")):await this.getCollection(e.collection).findOne({guild:e.data.guild,"lvlrole.lvl":e.data.lvlrole.lvl}).catch(a=>handleError(a,"findOne()"));break;case"sqlite":a="simply-xps"===e.collection?xp_1.xp.database.prepare('SELECT * FROM "simply-xps" WHERE guild = ? AND user = ?').get(e.data.guild,e.data.user):(a=await this.find(e.collection,e.data.guild)).filter(a=>a.lvlrole.lvl===e.data.lvlrole.lvl)[0]}return a}
52
52
  /**
53
53
  * Finds multiple documents in the database.
54
54
  *
@@ -58,14 +58,14 @@ static getCollection(e){if(!xp_1.xp.database)throw new xplogs_1.XpFatal({functio
58
58
  * @link https://simplyxp.js.org/docs/next/handlers/database#find Documentation
59
59
  * @returns {Promise<UserResult[] | LevelRoleResult[]>} An array of found documents.
60
60
  * @throws {XpFatal} Throws an error if there is no database connection.
61
- */static async find(e,a){if(!xp_1.xp.database)throw new xplogs_1.XpFatal({function:"find()",message:"No database connection"});let t;switch(xp_1.xp.dbType){case"mongodb":t=xp_1.xp.database.db().collection(e).find({guild:a}).toArray().catch(e=>handleError(e,"find()"));break;case"sqlite":"simply-xps"===e?t=xp_1.xp.database.prepare('SELECT * FROM "simply-xps" WHERE guild = ?').all(a):(t=xp_1.xp.database.prepare('SELECT * FROM "simply-xp-levelroles" WHERE gid = ?').all(a)).length&&(t=await Promise.all(t.map(async e=>(e.lvlrole=JSON.parse(e.lvlrole),e))))}return t}
61
+ */static async find(a,e){if(!xp_1.xp.database)throw new xplogs_1.XpFatal({function:"find()",message:"No database connection"});let t;switch(xp_1.xp.dbType){case"mongodb":t=xp_1.xp.database.db().collection(a).find({guild:e}).toArray().catch(a=>handleError(a,"find()"));break;case"sqlite":"simply-xps"===a?(t=xp_1.xp.database.prepare('SELECT * FROM "simply-xps" WHERE guild = ?').all(e)).length&&(t=await Promise.all(t.map(async a=>(a.flags=JSON.parse(a.flags),a)))):(t=xp_1.xp.database.prepare('SELECT * FROM "simply-xp-levelroles" WHERE gid = ?').all(e)).length&&(t=await Promise.all(t.map(async a=>(a.lvlrole=JSON.parse(a.lvlrole),a))))}return t}
62
62
  /**
63
63
  * Finds all documents in a collection.
64
64
  * @param {"simply-xps" | "simply-xp-levelroles"} collection - The collection to search for all documents.
65
65
  * @link https://simplyxp.js.org/docs/next/handlers/database#findAll Documentation
66
66
  * @returns {Promise<UserResult[] | LevelRoleResult[]>} An array of found documents.
67
67
  * @throws {XpFatal} Throws an error if there is no database connection.
68
- */static async findAll(e){if(!xp_1.xp.database)throw new xplogs_1.XpFatal({function:"findAll()",message:"No database connection"});let a;switch(xp_1.xp.dbType){case"mongodb":a=xp_1.xp.database.db().collection(e).find().toArray().catch(e=>handleError(e,"findAll()"));break;case"sqlite":"simply-xps"===e?a=xp_1.xp.database.prepare('SELECT * FROM "simply-xps"').all():(a=xp_1.xp.database.prepare('SELECT * FROM "simply-xp-levelroles"').all()).length&&(a=await Promise.all(a.map(async e=>(e.lvlrole=JSON.parse(e.lvlrole),e))))}return a}
68
+ */static async findAll(a){if(!xp_1.xp.database)throw new xplogs_1.XpFatal({function:"findAll()",message:"No database connection"});let e;switch(xp_1.xp.dbType){case"mongodb":e=xp_1.xp.database.db().collection(a).find().toArray().catch(a=>handleError(a,"findAll()"));break;case"sqlite":"simply-xps"===a?(e=xp_1.xp.database.prepare('SELECT * FROM "simply-xps"').all()).length&&(e=await Promise.all(e.map(async a=>(a.flags=JSON.parse(a.flags),a)))):(e=xp_1.xp.database.prepare('SELECT * FROM "simply-xp-levelroles"').all()).length&&(e=await Promise.all(e.map(async a=>(a.lvlrole=JSON.parse(a.lvlrole),a))))}return e}
69
69
  /**
70
70
  * Updates one document in the database.
71
71
  *
@@ -76,4 +76,4 @@ static getCollection(e){if(!xp_1.xp.database)throw new xplogs_1.XpFatal({functio
76
76
  * @link https://simplyxp.js.org/docs/next/handlers/database#updateOne Documentation
77
77
  * @returns {Promise<UserResult | LevelRoleResult>} The updated document.
78
78
  * @throws {XpFatal} Throws an error if there is no database connection.
79
- */static async updateOne(e,a,t){if(!xp_1.xp.database)throw new xplogs_1.XpFatal({function:"updateOne()",message:"No database connection"});switch(xp_1.xp.dbType){case"mongodb":await xp_1.xp.database.db().collection(a.collection).updateOne(e.data,{$set:{...a.data,lastUpdated:(new Date).toISOString()}},t).catch(e=>handleError(e,"updateOne()"));break;case"sqlite":if("simply-xps"===e.collection&&"simply-xps"===a.collection)xp_1.xp.database.prepare(`UPDATE "simply-xps" SET xp_rate = ?, xp = ?, lastUpdated = ?, level = ? ${a.data?.name?", name = ?":""} WHERE guild = ? AND user = ?`).run(a.data?.name?[a.data.xp_rate,a.data.xp,(new Date).toISOString(),a.data.level,a.data.name,e.data.guild,e.data.user]:[a.data.xp_rate,a.data.xp,(new Date).toISOString(),a.data.level,e.data.guild,e.data.user]);else{if("simply-xp-levelroles"!==e.collection||"simply-xp-levelroles"!==a.collection)throw new xplogs_1.XpFatal({function:"updateOne()",message:"Collection mismatch, expected same collection on both filter and update."});xp_1.xp.database.prepare('UPDATE "simply-xp-levelroles" SET lvlrole = ? WHERE gid = ?').run(JSON.stringify(a.data.lvlrole),e.data.guild)}}return db.findOne(a)}}exports.db=db;
79
+ */static async updateOne(a,e,t){if(!xp_1.xp.database)throw new xplogs_1.XpFatal({function:"updateOne()",message:"No database connection"});switch(xp_1.xp.dbType){case"mongodb":await this.getCollection(e.collection).updateOne(a.data,{$set:{...e.data,lastUpdated:(new Date).toISOString()}},t).catch(a=>handleError(a,"updateOne()"));break;case"sqlite":if("simply-xps"===a.collection&&"simply-xps"===e.collection){if(!(e.data.user&&e.data.guild&&e.data.level&&e.data.xp&&e.data.xp_rate))throw new xplogs_1.XpFatal({function:"updateOne()",message:"User, guild, level, xp, and xp_rate are required fields for updating a user document."});xp_1.xp.database.prepare(`UPDATE "simply-xps" SET xp_rate = ?, xp = ?, lastUpdated = ?, level = ? ${e.data?.name?", name = ?":""} ${e.data?.flags?", flags = ?":""} WHERE guild = ? AND user = ?`).run(e.data?.name?e.data?.flags?[e.data.xp_rate,e.data.xp,(new Date).toISOString(),e.data.level,e.data.name,JSON.stringify(e.data.flags),a.data.guild,a.data.user]:[e.data.xp_rate,e.data.xp,(new Date).toISOString(),e.data.level,e.data.name,a.data.guild,a.data.user]:e.data?.flags?[e.data.xp_rate,e.data.xp,(new Date).toISOString(),e.data.level,JSON.stringify(e.data.flags),a.data.guild,a.data.user]:[e.data.xp_rate,e.data.xp,(new Date).toISOString(),e.data.level,a.data.guild,a.data.user])}else{if("simply-xp-levelroles"!==a.collection||"simply-xp-levelroles"!==e.collection)throw new xplogs_1.XpFatal({function:"updateOne()",message:"Collection mismatch, expected same collection on both filter and update."});xp_1.xp.database.prepare('UPDATE "simply-xp-levelroles" SET lvlrole = ? WHERE gid = ?').run(JSON.stringify(e.data.lvlrole),a.data.guild)}}return db.findOne(e)}}exports.db=db;
@@ -1,4 +1,3 @@
1
- /// <reference types="node" />
2
1
  interface HttpsOptions {
3
2
  body?: object;
4
3
  endpoint?: string;
@@ -1,4 +1,3 @@
1
- "use strict";
2
1
  /**
3
2
  * Send HTTPS Request.
4
3
  * @param {string} url
@@ -12,4 +11,5 @@
12
11
  * @param {number} [options.timeout] - Request Timeout in Milliseconds
13
12
  * @returns {Promise<Object|Buffer|string>} - Returns the response from the request.
14
13
  * @throws {PromiseRejectedResult} - If the request fails.
15
- */function https(e,o={}){return new Promise((s,r)=>{const t=(0,https_1.request)({agent:new https_1.Agent({keepAlive:!0}),headers:o?.headers||{"Content-Type":"application/json"},hostname:new url_1.URL(e).hostname,method:o?.method||"GET",path:o?.endpoint||new url_1.URL(e).pathname},t=>{const e=[];t.on("error",r),t.on("data",t=>e.push(Buffer.from(t))),t.on("end",()=>{o?.statusCode&&t.statusCode!==o?.statusCode&&r({error:"Unexpected Status Code",status:t.statusCode});try{switch(o?.responseType||"json"){case"json":s(JSON.parse(Buffer.concat(e).toString()));break;case"stream":s(Buffer.concat(e));break;default:s(Buffer.concat(e).toString())}}catch(t){r(t)}})}).on("error",r);t.setTimeout(o?.timeout||5e3,()=>{t.destroy(),r({error:"Request Timed Out",status:408})}),o?.body&&t.write(JSON.stringify(o.body)),t.end()})}Object.defineProperty(exports,"__esModule",{value:!0}),exports.https=void 0;const https_1=require("https"),url_1=require("url");exports.https=https;
14
+ */
15
+ function https(t,o={}){return new Promise((r,s)=>{let e=(0,https_1.request)({agent:new https_1.Agent({keepAlive:!0}),headers:o?.headers||{"Content-Type":"application/json"},hostname:new url_1.URL(t).hostname,method:o?.method||"GET",path:o?.endpoint||new url_1.URL(t).pathname},e=>{let t=[];e.on("error",s),e.on("data",e=>t.push(Buffer.from(e))),e.on("end",()=>{o?.statusCode&&e.statusCode!==o?.statusCode&&s({error:"Unexpected Status Code",status:e.statusCode});try{switch(o?.responseType||"json"){case"json":r(JSON.parse(Buffer.concat(t).toString()));break;case"stream":r(Buffer.concat(t));break;default:r(Buffer.concat(t).toString())}}catch(e){s(e)}})}).on("error",s);e.setTimeout(o?.timeout||5e3,()=>{e.destroy(),s({error:"Request Timed Out",status:408})}),o?.body&&e.write(JSON.stringify(o.body)),e.end()})}Object.defineProperty(exports,"__esModule",{value:!0}),exports.https=https;let https_1=require("https"),url_1=require("url");
@@ -1,4 +1,3 @@
1
- "use strict";
2
1
  /**
3
2
  * Helps to clean the database and cache, more in the future, maybe.
4
3
  * @param {CleanOptions} [options={}] - The options.
@@ -6,7 +5,8 @@
6
5
  * @link `Documentation:` https://simplyxp.js.org/docs/next/clean
7
6
  * @returns {void} - Nothing.
8
7
  * @throws {XpFatal} If an error occurs.
9
- */function clean(e={}){e?.db&&xp_1.xp?.database&&xp_1.db.findAll("simply-xps").then(e=>{e.forEach(async e=>{0===e.level&&0===e.xp&&await xp_1.db.deleteOne({collection:"simply-xps",data:{user:e.user,guild:e.guild}})}),xplogs_1.XpLog.debug("clean()","REMOVED ALL USERS WITHOUT XP")}),(0,canvas_1.clearAllCache)(),xplogs_1.XpLog.debug("clean()","CLEARED CANVAS CACHE")}
8
+ */
9
+ function clean(e={}){e?.db&&xp_1.xp?.database&&xp_1.db.findAll("simply-xps").then(e=>{e.forEach(async e=>{0===e.level&&0===e.xp&&await xp_1.db.deleteOne({collection:"simply-xps",data:{user:e.user,guild:e.guild}})}),xplogs_1.XpLog.debug("clean()","REMOVED ALL USERS WITHOUT XP")}),(0,canvas_1.clearAllCache)(),xplogs_1.XpLog.debug("clean()","CLEARED CANVAS CACHE")}
10
10
  /**
11
11
  * Convert XP to level and vice versa.
12
12
  *
@@ -40,4 +40,4 @@
40
40
  * @link `Documentation:` https://simplyxp.js.org/docs/next/Functions/updateOptions
41
41
  * @returns {void} - Nothing.
42
42
  * @throws {XpFatal} If an invalid option is provided.
43
- */function updateOptions(e){if(!e)throw new xplogs_1.XpFatal({function:"updateOptions()",message:"Options were not provided"});if("object"!=typeof e)throw new xplogs_1.XpFatal({function:"updateOptions()",message:"Options must be an object"});if(e?.auto_clean&&(xp_1.xp.auto_clean=!0),e?.auto_create&&(xp_1.xp.auto_create=!0),e?.debug&&(xp_1.xp.debug=!0),e?.notify&&(xp_1.xp.notify=e.notify),e?.xp_rate&&("number"==typeof e.xp_rate||["fast","normal","slow"].includes(e.xp_rate))&&(xp_1.xp.xp_rate="slow"===e.xp_rate?.05:"normal"===e.xp_rate?.1:"fast"===e.xp_rate?.5:e.xp_rate),e.dbOptions&&"object"==typeof e.dbOptions&&e.dbOptions.type&&e.dbOptions.database){var{type:t,database:a}=e.dbOptions;if(!(t&&"mongodb"===t||"sqlite"===t))throw new xplogs_1.XpFatal({function:"updateOptions()",message:"Invalid database type provided"});if(xp_1.xp.dbType=t,a){xp_1.xp.database=a;const p="mongodb"===xp_1.xp.dbType?{name:"MongoDB",type:"mongodb",min:3,max:6}:{name:"Better-SQLite3",type:"better-sqlite3",min:7,max:9};(0,connect_1.checkPackageVersion)(p.type,p.min,p.max).then(e=>{if(!e)throw new xplogs_1.XpFatal({function:"updateOptions()",message:`${p.name} V${p.min} up to V${p.max} is required.`});switch(xp_1.xp.dbType){case"mongodb":xp_1.xp.database.db().command({ping:1}).catch(()=>{throw xp_1.xp.database=void 0,new xplogs_1.XpFatal({function:"updateOptions()",message:"Invalid MongoDB connection"})});break;case"sqlite":try{xp_1.xp.database.prepare("SELECT 1").get()}catch(e){throw new xplogs_1.XpFatal({function:"updateOptions()",message:"Invalid SQLite connection"})}}})}}e?.auto_clean&&clean({db:!0}),xp_1.db.findAll("simply-xps").then(e=>{e.filter(e=>e?.xp_rate!==xp_1.xp.xp_rate).map(async e=>{await xp_1.db.updateOne({collection:"simply-xps",data:{user:e.user,guild:e.guild}},{collection:"simply-xps",data:{user:e.user,guild:e.guild,level:convertFrom(e.xp,"xp"),xp:e.xp,xp_rate:xp_1.xp.xp_rate}})}),xplogs_1.XpLog.debug("updateOptions()","UPDATED ALL USERS WITH NEW XP RATE")})}Object.defineProperty(exports,"__esModule",{value:!0}),exports.updateOptions=exports.registerPlugins=exports.registerFont=exports.convertFrom=exports.clean=void 0;const connect_1=require("../connect"),canvas_1=require("@napi-rs/canvas"),xp_1=require("../../xp"),xplogs_1=require("./xplogs");exports.clean=clean,exports.convertFrom=convertFrom,exports.registerFont=registerFont,exports.registerPlugins=registerPlugins,exports.updateOptions=updateOptions;
43
+ */function updateOptions(e){if(!e)throw new xplogs_1.XpFatal({function:"updateOptions()",message:"Options were not provided"});if("object"!=typeof e)throw new xplogs_1.XpFatal({function:"updateOptions()",message:"Options must be an object"});if(e?.auto_clean&&(xp_1.xp.auto_clean=!0),e?.auto_create&&(xp_1.xp.auto_create=!0),e?.debug&&(xp_1.xp.debug=!0),e?.notify&&(xp_1.xp.notify=e.notify),e?.xp_rate&&("number"==typeof e.xp_rate||["fast","normal","slow"].includes(e.xp_rate))&&(xp_1.xp.xp_rate="slow"===e.xp_rate?.05:"normal"===e.xp_rate?.1:"fast"===e.xp_rate?.5:e.xp_rate),e.dbOptions&&"object"==typeof e.dbOptions&&e.dbOptions.type&&e.dbOptions.database){var{type:t,database:a}=e.dbOptions;if(!(t&&"mongodb"===t||"sqlite"===t))throw new xplogs_1.XpFatal({function:"updateOptions()",message:"Invalid database type provided"});if(xp_1.xp.dbType=t,a){xp_1.xp.database=a;let t="mongodb"===xp_1.xp.dbType?{name:"MONGODB",type:"mongodb",min:3,max:7}:{name:"BETTER-SQLITE3",type:"better-sqlite3",min:7,max:12};(0,connect_1.checkPackageVersion)(t.type,t.min,t.max).then(e=>{switch(e){case"too_low":throw new xplogs_1.XpFatal({function:"updateOptions()",message:`${t.name} V${t.min} OR NEWER IS REQUIRED`});case"too_high":xplogs_1.XpLog.warn("updateOptions()",`${t.name} VERSION IS NEWER THAN TESTED (V${t.max}) -- CONTINUE WITH CAUTION`);break;case"ok":xplogs_1.XpLog.debug("updateOptions()",t.name+" is natively compatible with our package! 🎉")}switch(xp_1.xp.dbType){case"mongodb":xp_1.xp.database.db().command({ping:1}).catch(()=>{throw xp_1.xp.database=void 0,new xplogs_1.XpFatal({function:"updateOptions()",message:"Invalid MongoDB connection"})});break;case"sqlite":try{xp_1.xp.database.prepare("SELECT 1").get()}catch(e){throw new xplogs_1.XpFatal({function:"updateOptions()",message:"Invalid SQLite connection"})}}})}}e?.auto_clean&&clean({db:!0}),xp_1.db.findAll("simply-xps").then(e=>{e.filter(e=>e?.xp_rate!==xp_1.xp.xp_rate).map(async e=>{await xp_1.db.updateOne({collection:"simply-xps",data:{user:e.user,guild:e.guild}},{collection:"simply-xps",data:{user:e.user,guild:e.guild,level:convertFrom(e.xp,"xp"),xp:e.xp,xp_rate:xp_1.xp.xp_rate}})}),xplogs_1.XpLog.debug("updateOptions()","UPDATED ALL USERS WITH NEW XP RATE")})}Object.defineProperty(exports,"__esModule",{value:!0}),exports.clean=clean,exports.convertFrom=convertFrom,exports.registerFont=registerFont,exports.registerPlugins=registerPlugins,exports.updateOptions=updateOptions;let connect_1=require("../connect"),canvas_1=require("@napi-rs/canvas"),xp_1=require("../../xp"),xplogs_1=require("./xplogs");
@@ -1,4 +1,4 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.XpEvents=exports.XpLog=exports.XpFatal=void 0;const xp_1=require("../../xp");class XpFatal extends Error{constructor(e){super(e.function+": "+e.message)}}exports.XpFatal=XpFatal,Object.defineProperty(XpFatal.prototype,"name",{value:"SimplyXpFatal"});class XpLog{static log(e,t,o){var p=XpEvents.eventCallback?.[e],r=e.toUpperCase(),a=t.toUpperCase();p&&"function"==typeof p?p(t,o):console.log(`[SIMPLY XP] ${{debug:"",info:"",error:"",warn:""}[e]}(${r}) ${a}: `+o)}static debug(e,t){xp_1.xp.debug&&XpLog.log("debug",e,t)}
1
+ Object.defineProperty(exports,"__esModule",{value:!0}),exports.XpEvents=exports.XpLog=exports.XpFatal=void 0;let xp_1=require("../../xp");class XpFatal extends Error{constructor(e){super(e.function+": "+e.message)}}exports.XpFatal=XpFatal,Object.defineProperty(XpFatal.prototype,"name",{value:"SimplyXpFatal"});class XpLog{static log(e,t,o){var p=XpEvents.eventCallback?.[e],a=e.toUpperCase(),r=t.toUpperCase();p&&"function"==typeof p?p(t,o):console.log(`[SIMPLY XP] ${{debug:"",info:"",error:"",warn:""}[e]}(${a}) ${r}: `+o)}static debug(e,t){xp_1.xp.debug&&XpLog.log("debug",e,t)}
2
2
  /**
3
3
  * Emits an info log
4
4
  * @param {string} xpFunction - The command or context of the log message
@@ -1,4 +1,3 @@
1
- "use strict";
2
1
  /**
3
2
  * Get array of all users in the leaderboard
4
3
  * @async
@@ -7,4 +6,5 @@
7
6
  * @link `Documentation:` https://simplyxp.js.org/docs/next/functions/leaderboard
8
7
  * @returns {Promise<User[]>} Array of all users in the leaderboard
9
8
  * @throws {XpFatal} If guild ID is not provided or limit is less than 1
10
- */async function leaderboard(e,r){if(r&&!(1<=r))throw new xplogs_1.XpFatal({function:"leaderboard()",message:"Limit must be a number greater than 0"});const a=new Set;return e=e?(await xp_1.db.find("simply-xps",e)).sort((e,r)=>r.xp-e.xp):(await xp_1.db.findAll("simply-xps")).sort((e,r)=>r.xp-e.xp).filter(e=>!a.has(e.user)&&(a.add(e.user),!0)),await Promise.all(e.map(async(e,r)=>(e.position=r+1,e))),e.slice(0,r)}Object.defineProperty(exports,"__esModule",{value:!0}),exports.leaderboard=void 0;const xplogs_1=require("./functions/xplogs"),xp_1=require("../xp");exports.leaderboard=leaderboard;
9
+ */
10
+ async function leaderboard(e,r){if(r&&!(1<=r))throw new xplogs_1.XpFatal({function:"leaderboard()",message:"Limit must be a number greater than 0"});let a,s=new Set;return a=e?(await xp_1.db.find("simply-xps",e)).sort((e,r)=>r.xp-e.xp):(await xp_1.db.findAll("simply-xps")).sort((e,r)=>r.xp-e.xp).filter(e=>!s.has(e.user)&&(s.add(e.user),!0)),await Promise.all(a.map(async(e,r)=>(e.position=r+1,e))),a.slice(0,r)}Object.defineProperty(exports,"__esModule",{value:!0}),exports.leaderboard=leaderboard;let xplogs_1=require("./functions/xplogs"),xp_1=require("../xp");
@@ -1,4 +1,4 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.migrate=void 0;const xplogs_1=require("./functions/xplogs"),xp_1=require("../xp"),connect_1=require("./connect");class migrate{
1
+ Object.defineProperty(exports,"__esModule",{value:!0}),exports.migrate=void 0;let xplogs_1=require("./functions/xplogs"),xp_1=require("../xp"),connect_1=require("./connect");class migrate{
2
2
  /**
3
3
  * Effortlessly migrate from discord-xp to simply-xp.
4
4
  * @async
@@ -7,7 +7,7 @@
7
7
  * @returns {Promise<boolean>} - Returns true if migration is successful
8
8
  * @throws {XpLog.err} - If migration fails.
9
9
  */
10
- static async discord_xp(e=!1){var r=await xp_1.db.getCollection("levels").find().toArray();xplogs_1.XpLog.debug("migrate.discord_xp()",`FOUND ${r.length} DOCUMENTS`);try{for(const t of r)await xp_1.db.findOne({collection:"simply-xps",data:{guild:t.guildID,user:t.userID}})||(await xp_1.db.createOne({collection:"simply-xps",data:{guild:t.guildID,user:t.userID,xp:t.xp,level:(0,xp_1.convertFrom)(t.xp,"xp")}}),e&&await xp_1.db.getCollection("levels").deleteOne({userID:t.userID,guildID:t.guildID}));return!0}catch(e){return xplogs_1.XpLog.err("migrate.discord_xp()",e),!1}}
10
+ static async discord_xp(e=!1){var a,t=await xp_1.db.getCollection("levels").find().toArray();
11
11
  /**
12
12
  * Effortlessly migrate from MongoDB to SQLite. (or vice versa)
13
13
  * @async
@@ -16,4 +16,4 @@ static async discord_xp(e=!1){var r=await xp_1.db.getCollection("levels").find()
16
16
  * @link `Documentation:` https://simplyxp.js.org/docs/next/classes/migrate#migratefromdb
17
17
  * @returns {Promise<boolean>} - Returns true if migration is successful
18
18
  * @throws {XpFatal} - If parameters are not provided correctly
19
- */static async fromDB(e,r){if(!e)throw new xplogs_1.XpFatal({function:"migrate.database()",message:"No database type provided"});if(!r)throw new xplogs_1.XpFatal({function:"migrate.database()",message:"No database connection provided"});if(xp_1.xp.dbType===e)return xplogs_1.XpLog.info("migrate.fromDB()","Same database received, that was unnecessary!");let t;switch(e){case"mongodb":try{if(!await(0,connect_1.checkPackageVersion)("mongodb",4,6))return xplogs_1.XpLog.err("migrate.fromDB()","MongoDB V4 up to V6 is required");t=await r.db().collection("simply-xps").find().toArray()}catch(e){return xplogs_1.XpLog.err("migrate.fromDB()",e),!1}break;case"sqlite":try{if(!await(0,connect_1.checkPackageVersion)("better-sqlite3",7,8))return xplogs_1.XpLog.err("migrate.fromDB()","better-sqlite3 V7 up to V8 is required");t=r.prepare("SELECT * FROM `simply-xps`").all()}catch(e){return xplogs_1.XpLog.err("migrate.fromDB()",e),!1}}return xplogs_1.XpLog.debug("migrate.fromDB()",`FOUND ${t.length} RESULTS`),await Promise.all(t.map(async e=>await xp_1.db.findOne({collection:"simply-xps",data:{guild:e.guild,user:e.user}})?xp_1.db.updateOne({collection:"simply-xps",data:{guild:e.guild,user:e.user}},{collection:"simply-xps",data:{guild:e.guild,user:e.user,name:e.name,xp:e.xp,level:e.level}}):xp_1.db.createOne({collection:"simply-xps",data:{guild:e.guild,user:e.user,xp:e.xp,level:e.level}}))),!0}}exports.migrate=migrate;
19
+ */xplogs_1.XpLog.debug("migrate.discord_xp()",`FOUND ${t.length} DOCUMENTS`);try{for(a of t)await xp_1.db.findOne({collection:"simply-xps",data:{guild:a.guildID,user:a.userID}})||(await xp_1.db.createOne({collection:"simply-xps",data:{guild:a.guildID,user:a.userID,xp:a.xp,level:(0,xp_1.convertFrom)(a.xp,"xp")}}),e&&await xp_1.db.getCollection("levels").deleteOne({userID:a.userID,guildID:a.guildID}));return!0}catch(e){return xplogs_1.XpLog.err("migrate.discord_xp()",e),!1}}static async fromDB(e,a){if(!e)throw new xplogs_1.XpFatal({function:"migrate.database()",message:"No database type provided"});if(!a)throw new xplogs_1.XpFatal({function:"migrate.database()",message:"No database connection provided"});if(xp_1.xp.dbType===e)return xplogs_1.XpLog.info("migrate.fromDB()","Same database received, that was unnecessary!");let t;switch(e){case"mongodb":try{switch(await(0,connect_1.checkPackageVersion)("mongodb",3,7)){case"too_low":throw new xplogs_1.XpFatal({function:"migrate.fromDB()",message:"MongoDB V3 OR NEWER IS REQUIRED"});case"too_high":xplogs_1.XpLog.warn("migrate.fromDB()","MongoDB VERSION IS NEWER THAN TESTED (V7) -- CONTINUE WITH CAUTION");break;case"ok":xplogs_1.XpLog.debug("migrate.fromDB()","MongoDB is natively compatible with our package! 🎉")}t=await a.db().collection("simply-xps").find().toArray()}catch(e){return xplogs_1.XpLog.err("migrate.fromDB()",e),!1}break;case"sqlite":try{switch(await(0,connect_1.checkPackageVersion)("better-sqlite3",7,12)){case"too_low":throw new xplogs_1.XpFatal({function:"migrate.fromDB()",message:"BETTER-SQLITE3 V7 OR NEWER IS REQUIRED"});case"too_high":xplogs_1.XpLog.warn("migrate.fromDB()","BETTER-SQLITE3 VERSION IS NEWER THAN TESTED (V12) -- CONTINUE WITH CAUTION");break;case"ok":xplogs_1.XpLog.debug("migrate.fromDB()","better-sqlite3 is natively compatible with our package! 🎉")}t=a.prepare("SELECT * FROM `simply-xps`").all()}catch(e){return xplogs_1.XpLog.err("migrate.fromDB()",e),!1}}return xplogs_1.XpLog.debug("migrate.fromDB()",`FOUND ${t.length} RESULTS`),await Promise.all(t.map(async e=>await xp_1.db.findOne({collection:"simply-xps",data:{guild:e.guild,user:e.user}})?xp_1.db.updateOne({collection:"simply-xps",data:{guild:e.guild,user:e.user}},{collection:"simply-xps",data:{guild:e.guild,user:e.user,name:e.name,xp:e.xp,level:e.level}}):xp_1.db.createOne({collection:"simply-xps",data:{guild:e.guild,user:e.user,xp:e.xp,level:e.level}}))),!0}}exports.migrate=migrate;
package/lib/src/remove.js CHANGED
@@ -1,4 +1,3 @@
1
- "use strict";
2
1
  /**
3
2
  * Add XP to a user
4
3
  * @async
@@ -9,7 +8,8 @@
9
8
  * @link `Documentation:` https://simplyxp.js.org/docs/next/functions/addlevel
10
9
  * @returns {Promise<UserResult>} - Object of user data on success
11
10
  * @throws {XpFatal} - If parameters are not provided correctly
12
- */async function removeLevel(e,o,t,l){if(!e)throw new xplogs_1.XpFatal({function:"removeLevel()",message:"User ID was not provided"});if(!o)throw new xplogs_1.XpFatal({function:"removeLevel()",message:"Guild ID was not provided"});if(isNaN(t))throw new xplogs_1.XpFatal({function:"removeLevel()",message:"Level was not provided"});var a=await xp_1.db.findOne({collection:"simply-xps",data:{user:e,guild:o}});if(a)return xp_1.db.updateOne({collection:"simply-xps",data:{user:e,guild:o}},{collection:"simply-xps",data:{name:l||a?.name||e,user:e,guild:o,level:a.level-t,xp:(0,xp_1.convertFrom)(a.level-t),xp_rate:xp_1.xp.xp_rate}});if(xp_1.xp.auto_create&&l)return xp_1.db.createOne({collection:"simply-xps",data:{guild:o,user:e,name:l,level:0,xp:0,xp_rate:xp_1.xp.xp_rate}});throw new xplogs_1.XpFatal({function:"removeLevel()",message:"User does not exist"})}
11
+ */
12
+ async function removeLevel(e,l,t,o){if(!e)throw new xplogs_1.XpFatal({function:"removeLevel()",message:"User ID was not provided"});if(!l)throw new xplogs_1.XpFatal({function:"removeLevel()",message:"Guild ID was not provided"});if(isNaN(t))throw new xplogs_1.XpFatal({function:"removeLevel()",message:"Level was not provided"});var a=await xp_1.db.findOne({collection:"simply-xps",data:{user:e,guild:l}});if(a)return xp_1.db.updateOne({collection:"simply-xps",data:{user:e,guild:l}},{collection:"simply-xps",data:{name:o||a?.name||e,user:e,guild:l,level:a.level-t,xp:(0,xp_1.convertFrom)(a.level-t),xp_rate:xp_1.xp.xp_rate}});if(xp_1.xp.auto_create&&o)return xp_1.db.createOne({collection:"simply-xps",data:{guild:l,user:e,name:o,level:0,xp:0,xp_rate:xp_1.xp.xp_rate}});throw new xplogs_1.XpFatal({function:"removeLevel()",message:"User does not exist"})}
13
13
  /**
14
14
  * Add XP to a user.
15
15
  * @async
@@ -20,4 +20,4 @@
20
20
  * @link `Documentation:` https://simplyxp.js.org/docs/next/functions/addxp
21
21
  * @returns {Promise<XPResult>} - Object of user data on success.
22
22
  * @throws {XpFatal} - If parameters are not provided correctly.
23
- */async function removeXP(e,o,t,l){var a;if(!("number"==typeof t||"object"==typeof xp_1.xp&&t.min&&t.max))throw new xplogs_1.XpFatal({function:"addXP()",message:"XP is not a number or object, make sure you are using the correct syntax"});if("object"==typeof t&&(t=Math.floor(Math.random()*(t.max-t.min)+t.min)),!e)throw new xplogs_1.XpFatal({function:"removeXP()",message:"User ID was not provided"});if(!o)throw new xplogs_1.XpFatal({function:"removeXP()",message:"Guild ID was not provided"});let p;if(a=await xp_1.db.findOne({collection:"simply-xps",data:{user:e,guild:o}}))p=await xp_1.db.updateOne({collection:"simply-xps",data:{user:e,guild:o}},{collection:"simply-xps",data:{user:e,guild:o,name:l||a?.name||e,level:(0,xp_1.convertFrom)(a.xp-t,"xp"),xp:a.xp-t,xp_rate:xp_1.xp.xp_rate}}).catch(e=>{throw new xplogs_1.XpFatal({function:"removeXP()",message:e.stack})});else{if(!xp_1.xp.auto_create||!l)throw new xplogs_1.XpFatal({function:"removeXP()",message:"User does not exist"});p=await xp_1.db.createOne({collection:"simply-xps",data:{guild:o,user:e,name:l,level:0,xp:0,xp_rate:xp_1.xp.xp_rate}}).catch(e=>{throw new xplogs_1.XpFatal({function:"removeXP()",message:e.stack})})}return t=xplogs_1.XpEvents.eventCallback,(l=a?.level&&p?.level?p.level!==a.level?p.level-a.level:0:0<p?.level?p.level:0)<0&&t?.levelDown&&"function"==typeof t.levelDown&&t.levelDown(p,await xp_1.roleSetup.getRoles(e,o,{includeNextRoles:!0})),0<l&&t?.levelUp&&"function"==typeof t.levelUp&&t.levelUp(p,await xp_1.roleSetup.getRoles(e,o)),{...p,levelDifference:l}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.removeXP=exports.removeLevel=void 0;const xplogs_1=require("./functions/xplogs"),xp_1=require("../xp");exports.removeLevel=removeLevel,exports.removeXP=removeXP;
23
+ */async function removeXP(e,l,t,o){var a;if(!("number"==typeof t||"object"==typeof xp_1.xp&&t.min&&t.max))throw new xplogs_1.XpFatal({function:"addXP()",message:"XP is not a number or object, make sure you are using the correct syntax"});if("object"==typeof t&&(t=Math.floor(Math.random()*(t.max-t.min)+t.min)),!e)throw new xplogs_1.XpFatal({function:"removeXP()",message:"User ID was not provided"});if(!l)throw new xplogs_1.XpFatal({function:"removeXP()",message:"Guild ID was not provided"});let p;if(a=await xp_1.db.findOne({collection:"simply-xps",data:{user:e,guild:l}}))p=await xp_1.db.updateOne({collection:"simply-xps",data:{user:e,guild:l}},{collection:"simply-xps",data:{user:e,guild:l,name:o||a?.name||e,level:(0,xp_1.convertFrom)(a.xp-t,"xp"),xp:a.xp-t,xp_rate:xp_1.xp.xp_rate}}).catch(e=>{throw new xplogs_1.XpFatal({function:"removeXP()",message:e.stack})});else{if(!xp_1.xp.auto_create||!o)throw new xplogs_1.XpFatal({function:"removeXP()",message:"User does not exist"});p=await xp_1.db.createOne({collection:"simply-xps",data:{guild:l,user:e,name:o,level:0,xp:0,xp_rate:xp_1.xp.xp_rate}}).catch(e=>{throw new xplogs_1.XpFatal({function:"removeXP()",message:e.stack})})}return t=xplogs_1.XpEvents.eventCallback,(o=a?.level&&p?.level?p.level!==a.level?p.level-a.level:0:0<p?.level?p.level:0)<0&&t?.levelDown&&"function"==typeof t.levelDown&&t.levelDown(p,await xp_1.roleSetup.getRoles(e,l,{includeNextRoles:!0})),0<o&&t?.levelUp&&"function"==typeof t.levelUp&&t.levelUp(p,await xp_1.roleSetup.getRoles(e,l)),{...p,levelDifference:o}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.removeLevel=removeLevel,exports.removeXP=removeXP;let xplogs_1=require("./functions/xplogs"),xp_1=require("../xp");
package/lib/src/reset.js CHANGED
@@ -1,4 +1,3 @@
1
- "use strict";
2
1
  /**
3
2
  * Reset user levels to 0 in a guild
4
3
  * @async
@@ -9,4 +8,5 @@
9
8
  * @link `Documentation:` https://simplyxp.js.org/docs/next/functions/reset
10
9
  * @returns {Promise<boolean>}
11
10
  * @throws {XpFatal} If an invalid type is provided or if the value is not provided.
12
- */async function reset(e,t,a=!1,s){var o;if(e&&t)return o={guild:t,user:e,xp_rate:xp_1.xp.xp_rate},await xp_1.db.findOne({collection:"simply-xps",data:o})?(a?await xp_1.db.deleteOne({collection:"simply-xps",data:o}).catch(e=>{throw new xplogs_1.XpFatal({function:"reset()",message:e})}):await xp_1.db.updateOne({collection:"simply-xps",data:{user:e,guild:t}},{collection:"simply-xps",data:{...o,level:0,xp:0}}).catch(e=>{throw new xplogs_1.XpFatal({function:"reset()",message:e})}),!0):xp_1.xp.auto_create&&!a&&s?(await xp_1.db.createOne({collection:"simply-xps",data:o}).catch(e=>{throw new xplogs_1.XpFatal({function:"reset()",message:e.stack})}),!0):xplogs_1.XpLog.info("reset()","User was not found, we did not know what to do without a username.");throw new xplogs_1.XpFatal({function:"reset()",message:"Invalid parameters provided"})}Object.defineProperty(exports,"__esModule",{value:!0}),exports.reset=void 0;const xplogs_1=require("./functions/xplogs"),xp_1=require("../xp");exports.reset=reset;
11
+ */
12
+ async function reset(e,t,a=!1,s){var o;if(e&&t)return o={guild:t,user:e,xp_rate:xp_1.xp.xp_rate},await xp_1.db.findOne({collection:"simply-xps",data:o})?(a?await xp_1.db.deleteOne({collection:"simply-xps",data:o}).catch(e=>{throw new xplogs_1.XpFatal({function:"reset()",message:e})}):await xp_1.db.updateOne({collection:"simply-xps",data:{user:e,guild:t}},{collection:"simply-xps",data:{...o,level:0,xp:0}}).catch(e=>{throw new xplogs_1.XpFatal({function:"reset()",message:e})}),!0):xp_1.xp.auto_create&&!a&&s?(await xp_1.db.createOne({collection:"simply-xps",data:o}).catch(e=>{throw new xplogs_1.XpFatal({function:"reset()",message:e.stack})}),!0):xplogs_1.XpLog.info("reset()","User was not found, we did not know what to do without a username.");throw new xplogs_1.XpFatal({function:"reset()",message:"Invalid parameters provided"})}Object.defineProperty(exports,"__esModule",{value:!0}),exports.reset=reset;let xplogs_1=require("./functions/xplogs"),xp_1=require("../xp");
@@ -1,4 +1,4 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.roleSetup=void 0;const xp_1=require("../xp"),xplogs_1=require("./functions/xplogs");class roleSetup{
1
+ Object.defineProperty(exports,"__esModule",{value:!0}),exports.roleSetup=void 0;let xp_1=require("../xp"),xplogs_1=require("./functions/xplogs");class roleSetup{
2
2
  /**
3
3
  * Add a role to the role setup
4
4
  * @async
@@ -18,7 +18,7 @@ static async add(e,l){if(!e)throw new xplogs_1.XpFatal({function:"roleSetup.add(
18
18
  * @link `Documentation:` https://simplyxp.js.org/docs/next/classes/roleSetup#roleSetupgetRoles
19
19
  * @returns {Promise<string[]>} - Array of role IDs or empty array if none
20
20
  * @throws {XpFatal} If an invalid type is provided or value is not provided.
21
- */static async getRoles(e,l,o={}){if(!e)throw new xplogs_1.XpFatal({function:"roleSetup.getRoles()",message:"User ID was not provided"});if(!l)throw new xplogs_1.XpFatal({function:"roleSetup.getRoles()",message:"Guild ID was not provided"});const t=await xp_1.db.findOne({collection:"simply-xps",data:{user:e,guild:l}});if(e=await roleSetup.list(l),!t||!t?.level)return[];const s=[];return e.forEach(({lvlrole:{lvl:e,role:l}})=>{l&&(e<t.level&&o?.includePreviousRoles||e>t.level&&o?.includeNextRoles||e===t.level)&&s.push(...Array.isArray(l)?l:[l])}),s}
21
+ */static async getRoles(e,l,o={}){if(!e)throw new xplogs_1.XpFatal({function:"roleSetup.getRoles()",message:"User ID was not provided"});if(!l)throw new xplogs_1.XpFatal({function:"roleSetup.getRoles()",message:"Guild ID was not provided"});let t=await xp_1.db.findOne({collection:"simply-xps",data:{user:e,guild:l}}),r=await roleSetup.list(l);if(!t||!t?.level)return[];let s=[];return r.forEach(({lvlrole:{lvl:e,role:l}})=>{l&&(e<t.level&&o?.includePreviousRoles||e>t.level&&o?.includeNextRoles||e===t.level)&&s.push(...Array.isArray(l)?l:[l])}),s}
22
22
  /**
23
23
  * Find a role in roleSetup
24
24
  * @async
package/lib/src/set.js CHANGED
@@ -1,4 +1,3 @@
1
- "use strict";
2
1
  /**
3
2
  * Set user level
4
3
  * @async
@@ -9,7 +8,8 @@
9
8
  * @link `Documentation:` https://simplyxp.js.org/docs/next/functions/setlevel
10
9
  * @returns {Promise<UserResult>} - Object of user data on success
11
10
  * @throws {XpFatal} - If parameters are not provided correctly
12
- */async function setLevel(e,t,l,s){if(!e)throw new xplogs_1.XpFatal({function:"setLevel()",message:"User ID was not provided"});if(!t)throw new xplogs_1.XpFatal({function:"setLevel()",message:"Guild ID was not provided"});if(isNaN(l))throw new xplogs_1.XpFatal({function:"setLevel()",message:"Level was not provided"});if(await xp_1.db.findOne({collection:"simply-xps",data:{user:e,guild:t}}))return xp_1.db.updateOne({collection:"simply-xps",data:{user:e,guild:t}},{collection:"simply-xps",data:{user:e,guild:t,level:l,xp:(0,xp_1.convertFrom)(l),xp_rate:xp_1.xp.xp_rate}});if(xp_1.xp.auto_create&&s)return xp_1.db.createOne({collection:"simply-xps",data:{guild:t,user:e,name:s,level:l,xp:(0,xp_1.convertFrom)(l),xp_rate:xp_1.xp.xp_rate}});throw new xplogs_1.XpFatal({function:"setLevel()",message:"User does not exist"})}
11
+ */
12
+ async function setLevel(e,t,l,p){if(!e)throw new xplogs_1.XpFatal({function:"setLevel()",message:"User ID was not provided"});if(!t)throw new xplogs_1.XpFatal({function:"setLevel()",message:"Guild ID was not provided"});if(isNaN(l))throw new xplogs_1.XpFatal({function:"setLevel()",message:"Level was not provided"});if(await xp_1.db.findOne({collection:"simply-xps",data:{user:e,guild:t}}))return xp_1.db.updateOne({collection:"simply-xps",data:{user:e,guild:t}},{collection:"simply-xps",data:{user:e,guild:t,level:l,xp:(0,xp_1.convertFrom)(l),xp_rate:xp_1.xp.xp_rate}});if(xp_1.xp.auto_create&&p)return xp_1.db.createOne({collection:"simply-xps",data:{guild:t,user:e,name:p,level:l,xp:(0,xp_1.convertFrom)(l),xp_rate:xp_1.xp.xp_rate}});throw new xplogs_1.XpFatal({function:"setLevel()",message:"User does not exist"})}
13
13
  /**
14
14
  * Set user XP
15
15
  * @async
@@ -20,4 +20,4 @@
20
20
  * @link `Documentation:` https://simplyxp.js.org/docs/next/functions/setxp
21
21
  * @returns {Promise<XPResult>} - Object of user data on success
22
22
  * @throws {XpFatal} - If parameters are not provided correctly
23
- */async function setXP(e,t,l,s){var p;if(!e)throw new xplogs_1.XpFatal({function:"setXP()",message:"User ID was not provided"});if(!t)throw new xplogs_1.XpFatal({function:"setXP()",message:"Guild ID was not provided"});if(isNaN(l))throw new xplogs_1.XpFatal({function:"setXP()",message:"XP was not provided"});let o;if(p=await xp_1.db.findOne({collection:"simply-xps",data:{user:e,guild:t}}))o=await xp_1.db.updateOne({collection:"simply-xps",data:{user:e,guild:t}},{collection:"simply-xps",data:{name:s||p?.name||e,user:e,guild:t,level:(0,xp_1.convertFrom)(l),xp:l,xp_rate:xp_1.xp.xp_rate}});else{if(!xp_1.xp.auto_create||!s)throw new xplogs_1.XpFatal({function:"setXP()",message:"User does not exist"});o=await xp_1.db.createOne({collection:"simply-xps",data:{guild:t,user:e,name:s,level:(0,xp_1.convertFrom)(l),xp:l,xp_rate:xp_1.xp.xp_rate}})}return s=xplogs_1.XpEvents.eventCallback,(l=p?.level&&o?.level?o.level!==p.level?o.level-p.level:0:0<o?.level?o.level:0)<0&&s?.levelDown&&"function"==typeof s.levelDown&&s.levelDown(o,await xp_1.roleSetup.getRoles(e,t,{includeNextRoles:!0})),0<l&&s?.levelUp&&"function"==typeof s.levelUp&&s.levelUp(o,await xp_1.roleSetup.getRoles(e,t)),{...o,levelDifference:l}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.setXP=exports.setLevel=void 0;const xplogs_1=require("./functions/xplogs"),xp_1=require("../xp");exports.setLevel=setLevel,exports.setXP=setXP;
23
+ */async function setXP(e,t,l,p){var s;if(!e)throw new xplogs_1.XpFatal({function:"setXP()",message:"User ID was not provided"});if(!t)throw new xplogs_1.XpFatal({function:"setXP()",message:"Guild ID was not provided"});if(isNaN(l))throw new xplogs_1.XpFatal({function:"setXP()",message:"XP was not provided"});let o;if(s=await xp_1.db.findOne({collection:"simply-xps",data:{user:e,guild:t}}))o=await xp_1.db.updateOne({collection:"simply-xps",data:{user:e,guild:t}},{collection:"simply-xps",data:{name:p||s?.name||e,user:e,guild:t,level:(0,xp_1.convertFrom)(l),xp:l,xp_rate:xp_1.xp.xp_rate}});else{if(!xp_1.xp.auto_create||!p)throw new xplogs_1.XpFatal({function:"setXP()",message:"User does not exist"});o=await xp_1.db.createOne({collection:"simply-xps",data:{guild:t,user:e,name:p,level:(0,xp_1.convertFrom)(l),xp:l,xp_rate:xp_1.xp.xp_rate}})}return p=xplogs_1.XpEvents.eventCallback,(l=s?.level&&o?.level?o.level!==s.level?o.level-s.level:0:0<o?.level?o.level:0)<0&&p?.levelDown&&"function"==typeof p.levelDown&&p.levelDown(o,await xp_1.roleSetup.getRoles(e,t,{includeNextRoles:!0})),0<l&&p?.levelUp&&"function"==typeof p.levelUp&&p.levelUp(o,await xp_1.roleSetup.getRoles(e,t)),{...o,levelDifference:l}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.setLevel=setLevel,exports.setXP=setXP;let xplogs_1=require("./functions/xplogs"),xp_1=require("../xp");
@@ -0,0 +1,9 @@
1
+ import { UserResult } from "./functions/database";
2
+ /**
3
+ * Flag a user, currently only supports "modified" and "illegal"
4
+ * @param {string} userId
5
+ * @param {string} guildId
6
+ * @param {Array<number | string> | undefined} flags - "Undefined" will remove the flags
7
+ * @param {string?} username - Username to use if auto_create is enabled
8
+ */
9
+ export declare function setFlags(userId: string, guildId: string, flags: Array<number | string> | undefined, username?: string): Promise<UserResult>;
@@ -0,0 +1 @@
1
+ async function setFlags(e,s,a,l){if(!e)throw new xplogs_1.XpFatal({function:"flagUser()",message:"User ID was not provided"});if(!s)throw new xplogs_1.XpFatal({function:"flagUser()",message:"Guild ID was not provided"});if(a&&!Array.isArray(a))throw new xplogs_1.XpFatal({function:"flagUser()",message:"Flags must be an array of numbers or strings"});var t=await xp_1.db.findOne({collection:"simply-xps",data:{user:e,guild:s}});if(t)return xp_1.db.updateOne({collection:"simply-xps",data:{user:e,guild:s}},{collection:"simply-xps",data:{flags:a,guild:s,user:e,level:t.level,xp:t.xp,xp_rate:xp_1.xp.xp_rate}});if(console.log("FLAGS => NO USER FOUND LMAO"),xp_1.xp.auto_create&&l)return xp_1.db.createOne({collection:"simply-xps",data:{flags:a,guild:s,user:e,name:l,level:0,xp:0,xp_rate:xp_1.xp.xp_rate}});throw new xplogs_1.XpFatal({function:"setLevel()",message:"User does not exist"})}Object.defineProperty(exports,"__esModule",{value:!0}),exports.setFlags=setFlags;let xplogs_1=require("./functions/xplogs"),xp_1=require("../xp");
package/lib/xp.d.ts CHANGED
@@ -24,12 +24,13 @@ export interface Plugin {
24
24
  * @property {number} xp - User XP
25
25
  */
26
26
  export interface User {
27
+ flags?: Array<number | string> | undefined;
27
28
  guild: string;
28
29
  user: string;
29
30
  name?: string | null;
30
- position: number;
31
31
  lastUpdated?: string;
32
32
  level: number;
33
+ position: number;
33
34
  xp: number;
34
35
  }
35
36
  export interface XPClient {
@@ -57,6 +58,7 @@ export { migrate } from "./src/migrate";
57
58
  export { removeLevel, removeXP } from "./src/remove";
58
59
  export { reset } from "./src/reset";
59
60
  export { roleSetup } from "./src/roleSetup";
61
+ export { setFlags } from "./src/setFlags";
60
62
  export { setLevel, setXP } from "./src/set";
61
63
  export { XpEvents } from "./src/functions/xplogs";
62
64
  export declare const xp: XPClient;
package/lib/xp.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.xp = exports.XpEvents = exports.setXP = exports.setLevel = exports.roleSetup = exports.reset = exports.removeXP = exports.removeLevel = exports.migrate = exports.leaderboard = exports.https = exports.fetch = exports.create = exports.updateOptions = exports.registerPlugins = exports.registerFont = exports.convertFrom = exports.clean = exports.connect = exports.rankCard = exports.leaderboardCard = exports.compareCard = exports.charts = exports.db = exports.addXP = exports.addLevel = void 0;
3
+ exports.xp = exports.XpEvents = exports.setXP = exports.setLevel = exports.setFlags = exports.roleSetup = exports.reset = exports.removeXP = exports.removeLevel = exports.migrate = exports.leaderboard = exports.https = exports.create = exports.updateOptions = exports.registerPlugins = exports.registerFont = exports.convertFrom = exports.clean = exports.connect = exports.rankCard = exports.leaderboardCard = exports.compareCard = exports.charts = exports.db = exports.addXP = exports.addLevel = void 0;
4
4
  // FUNCTION/CLASS EXPORTS
5
5
  var add_1 = require("./src/add");
6
6
  Object.defineProperty(exports, "addLevel", { enumerable: true, get: function () { return add_1.addLevel; } });
@@ -38,6 +38,8 @@ var reset_1 = require("./src/reset");
38
38
  Object.defineProperty(exports, "reset", { enumerable: true, get: function () { return reset_1.reset; } });
39
39
  var roleSetup_1 = require("./src/roleSetup");
40
40
  Object.defineProperty(exports, "roleSetup", { enumerable: true, get: function () { return roleSetup_1.roleSetup; } });
41
+ var setFlags_1 = require("./src/setFlags");
42
+ Object.defineProperty(exports, "setFlags", { enumerable: true, get: function () { return setFlags_1.setFlags; } });
41
43
  var set_1 = require("./src/set");
42
44
  Object.defineProperty(exports, "setLevel", { enumerable: true, get: function () { return set_1.setLevel; } });
43
45
  Object.defineProperty(exports, "setXP", { enumerable: true, get: function () { return set_1.setXP; } });
@@ -51,6 +53,6 @@ exports.xp = {
51
53
  debug: false,
52
54
  notify: true,
53
55
  registeredFonts: [],
54
- version: "2.0.0-beta.0-fix.0",
56
+ version: "2.0.0-beta.1",
55
57
  xp_rate: 0.1
56
58
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "simply-xp",
3
- "version": "2.0.0-beta.0-fix.1",
3
+ "version": "2.0.0-beta.2",
4
4
  "description": "The easiest way to implement xp system",
5
5
  "main": "lib/xp.js",
6
6
  "scripts": {
@@ -42,19 +42,19 @@
42
42
  "url": "git+https://github.com/Abadima/simply-xp.git"
43
43
  },
44
44
  "dependencies": {
45
- "@napi-rs/canvas": "0.1.41"
45
+ "@napi-rs/canvas": "0.1.83"
46
46
  },
47
47
  "devDependencies": {
48
- "@eslint/eslintrc": "^3.0.0",
49
- "@types/better-sqlite3": "^7.6.9",
50
- "@types/node": "^20.11.16",
51
- "@typescript-eslint/eslint-plugin": "^6.20.0",
52
- "@typescript-eslint/parser": "^6.20.0",
53
- "better-sqlite3": "^9.4.0",
54
- "eslint": "^8.56.0",
55
- "mongodb": "^6.3.0",
56
- "typescript": "^5.3.3",
57
- "uglify-js": "^3.17.4"
48
+ "@eslint/eslintrc": "^3.3.3",
49
+ "@types/better-sqlite3": "^7.6.13",
50
+ "@types/node": "^24.10.1",
51
+ "@typescript-eslint/eslint-plugin": "^8.48.1",
52
+ "@typescript-eslint/parser": "^8.48.1",
53
+ "better-sqlite3": "12.5.0",
54
+ "eslint": "^9.39.1",
55
+ "mongodb": "^7.0.0",
56
+ "typescript": "^5.9.3",
57
+ "uglify-js": "^3.19.3"
58
58
  },
59
59
  "engines": {
60
60
  "node": ">=15.5.0"
@@ -66,4 +66,4 @@
66
66
  "directories": {
67
67
  "lib": "lib"
68
68
  }
69
- }
69
+ }