simply-xp 2.0.0-beta.0-fix.0 → 2.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/src/cards.js CHANGED
@@ -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({collection:"simply-xps",data:{guild: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
+ */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;
@@ -8,13 +8,13 @@
8
8
  * @link `Documentation:` https://simplyxp.js.org/docs/next/functions/connect
9
9
  * @returns {Promise<boolean>}
10
10
  * @throws {XpFatal} If an invalid type is provided or if the value is not provided.
11
- */
12
- 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"
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"
13
12
  (
14
13
  user TEXT NOT NULL,
15
14
  guild TEXT NOT NULL,
16
15
  name TEXT NOT NULL DEFAULT user,
17
16
  level INTEGER NOT NULL DEFAULT 0,
17
+ flags TEXT DEFAULT NULL,
18
18
  xp INTEGER NOT NULL DEFAULT 0,
19
19
  voice_xp INTEGER DEFAULT 0,
20
20
  voice_time INTEGER DEFAULT 0,
@@ -30,8 +30,7 @@ async function connect(e,t={type:void 0}){var a,{type:o,auto_create:n,auto_clean
30
30
  * Returns the package manager used
31
31
  * @private
32
32
  * @returns {Promise<"yarn" | "npm" | "pnpm">}
33
- */
34
- 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
+ */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"}
35
34
  /**
36
35
  * Check database package versions
37
36
  * @private
@@ -40,4 +39,4 @@ async function getPackageManager(){const t=(await Promise.resolve().then(()=>__i
40
39
  * @param {number} max - Maximum Major Version Number (Optional)
41
40
  * @returns {Promise<boolean>}
42
41
  * @throws {XpFatal} If the package version is not supported
43
- */async function checkPackageVersion(t,a,o){try{var e=await Promise.resolve(t+"/package.json").then(e=>__importStar(require(e)));return parseInt(e.version.substring(0,1))>=a&&(!o||parseInt(e.version.substring(0,1))<=o)}catch(e){return xplogs_1.XpLog.info("checkPackageVersion()",`Installing ${t} [V${o||a}] | Please wait...`),(0,child_process_1.execSync)(await getPackageManager()+` add ${t}@${o||a}.x.x`),xplogs_1.XpLog.warn("checkPackageVersion()",`Installed ${t}. 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,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;
package/lib/src/create.js CHANGED
@@ -8,5 +8,4 @@
8
8
  * @link `Documentation:` https://simplyxp.js.org/docs/next/functions/create
9
9
  * @returns {Promise<UserResult>}
10
10
  * @throws {XpFatal} If invalid parameters are provided
11
- */
12
- 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;
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;
package/lib/src/fetch.js CHANGED
@@ -8,4 +8,4 @@
8
8
  * @link `Documentation:` https://simplyxp.js.org/docs/next/functions/fetch
9
9
  * @returns {Promise<{name: string | null, user: string, guild: string, level: number, position: number, xp: number}>}
10
10
  * @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({collection:"simply-xps",data:{guild: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)}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;
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,{flags:n?.flags,guild:n.guild,user:n.user,name:n?.name,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;
@@ -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;
@@ -135,12 +137,13 @@ export declare class db {
135
137
  * Finds multiple documents in the database.
136
138
  *
137
139
  * @async
138
- * @param {UserOptions | LevelRoleOptions} query - The query to search for multiple documents.
140
+ * @param {"simply-xps" | "simply-xp-levelroles"} collection - The collection to search for multiple documents.
141
+ * @param {string} guild - The guild ID to search for.
139
142
  * @link https://simplyxp.js.org/docs/next/handlers/database#find Documentation
140
143
  * @returns {Promise<UserResult[] | LevelRoleResult[]>} An array of found documents.
141
144
  * @throws {XpFatal} Throws an error if there is no database connection.
142
145
  */
143
- static find(query: UserOptions | LevelRoleOptions): Promise<UserResult[] | LevelRoleResult[]>;
146
+ static find(collection: "simply-xps" | "simply-xp-levelroles", guild: string): Promise<UserResult[] | LevelRoleResult[]>;
144
147
  /**
145
148
  * Finds all documents in a collection.
146
149
  * @param {"simply-xps" | "simply-xp-levelroles"} collection - The collection to search for all documents.
@@ -5,7 +5,7 @@
5
5
  * @param {string} functionName
6
6
  * @returns {void}
7
7
  * @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{
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;const 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)).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,23 +48,24 @@ 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)).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
  *
55
55
  * @async
56
- * @param {UserOptions | LevelRoleOptions} query - The query to search for multiple documents.
56
+ * @param {"simply-xps" | "simply-xp-levelroles"} collection - The collection to search for multiple documents.
57
+ * @param {string} guild - The guild ID to search for.
57
58
  * @link https://simplyxp.js.org/docs/next/handlers/database#find Documentation
58
59
  * @returns {Promise<UserResult[] | LevelRoleResult[]>} An array of found documents.
59
60
  * @throws {XpFatal} Throws an error if there is no database connection.
60
- */static async find(e){if(!xp_1.xp.database)throw new xplogs_1.XpFatal({function:"find()",message:"No database connection"});let a;switch(xp_1.xp.dbType){case"mongodb":a=xp_1.xp.database.db().collection(e.collection).find(e.data).toArray().catch(e=>handleError(e,"find()"));break;case"sqlite":"simply-xps"===e.collection?a=xp_1.xp.database.prepare('SELECT * FROM "simply-xps" WHERE guild = ?').all(e.data.guild):(a=xp_1.xp.database.prepare('SELECT * FROM "simply-xp-levelroles" WHERE gid = ?').all(e.data.guild)).length&&(a=await Promise.all(a.map(async e=>(e.lvlrole=JSON.parse(e.lvlrole),e))))}return a}
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}
61
62
  /**
62
63
  * Finds all documents in a collection.
63
64
  * @param {"simply-xps" | "simply-xp-levelroles"} collection - The collection to search for all documents.
64
65
  * @link https://simplyxp.js.org/docs/next/handlers/database#findAll Documentation
65
66
  * @returns {Promise<UserResult[] | LevelRoleResult[]>} An array of found documents.
66
67
  * @throws {XpFatal} Throws an error if there is no database connection.
67
- */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}
68
69
  /**
69
70
  * Updates one document in the database.
70
71
  *
@@ -75,4 +76,4 @@ static getCollection(e){if(!xp_1.xp.database)throw new xplogs_1.XpFatal({functio
75
76
  * @link https://simplyxp.js.org/docs/next/handlers/database#updateOne Documentation
76
77
  * @returns {Promise<UserResult | LevelRoleResult>} The updated document.
77
78
  * @throws {XpFatal} Throws an error if there is no database connection.
78
- */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;
@@ -7,4 +7,4 @@
7
7
  * @link `Documentation:` https://simplyxp.js.org/docs/next/functions/leaderboard
8
8
  * @returns {Promise<User[]>} Array of all users in the leaderboard
9
9
  * @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({collection:"simply-xps",data:{guild: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;
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;
@@ -35,7 +35,7 @@ static async add(e,l){if(!e)throw new xplogs_1.XpFatal({function:"roleSetup.add(
35
35
  * @link `Documentation:` https://simplyxp.js.org/docs/next/classes/roleSetup#roleSetuplist
36
36
  * @returns {Promise<LevelRoleResult[]>} - The level role object
37
37
  * @throws {XpFatal} If there are no roles in the guild.
38
- */static async list(e){if(e)return xp_1.db.find({collection:"simply-xp-levelroles",data:{guild:e,lvlrole:{lvl:null,role:null}}});throw new xplogs_1.XpFatal({function:"roleSetup.list()",message:"Guild ID was not provided"})}
38
+ */static async list(e){if(e)return xp_1.db.find("simply-xp-levelroles",e);throw new xplogs_1.XpFatal({function:"roleSetup.list()",message:"Guild ID was not provided"})}
39
39
  /**
40
40
  * Remove a level from the role setup
41
41
  * @async
@@ -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
+ "use strict";async function setFlags(e,s,t,a){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(t&&!Array.isArray(t))throw new xplogs_1.XpFatal({function:"flagUser()",message:"Flags must be an array of numbers or strings"});var l=await xp_1.db.findOne({collection:"simply-xps",data:{user:e,guild:s}});if(l)return xp_1.db.updateOne({collection:"simply-xps",data:{user:e,guild:s}},{collection:"simply-xps",data:{flags:t,guild:s,user:e,level:l.level,xp:l.xp,xp_rate:xp_1.xp.xp_rate}});if(console.log("FLAGS => NO USER FOUND LMAO"),xp_1.xp.auto_create&&a)return xp_1.db.createOne({collection:"simply-xps",data:{flags:t,guild:s,user:e,name:a,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=void 0;const xplogs_1=require("./functions/xplogs"),xp_1=require("../xp");exports.setFlags=setFlags;
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.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;
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.0",
3
+ "version": "2.0.0-beta.1",
4
4
  "description": "The easiest way to implement xp system",
5
5
  "main": "lib/xp.js",
6
6
  "scripts": {
@@ -45,14 +45,14 @@
45
45
  "@napi-rs/canvas": "0.1.41"
46
46
  },
47
47
  "devDependencies": {
48
- "@eslint/eslintrc": "^3.0.0",
49
- "@types/better-sqlite3": "^7.6.8",
50
- "@types/node": "^20.11.5",
51
- "@typescript-eslint/eslint-plugin": "^6.19.0",
52
- "@typescript-eslint/parser": "^6.19.0",
53
- "better-sqlite3": "^9.3.0",
54
- "eslint": "^8.56.0",
55
- "mongodb": "^6.3.0",
48
+ "@eslint/eslintrc": "^3.0.2",
49
+ "@types/better-sqlite3": "^7.6.9",
50
+ "@types/node": "^20.11.24",
51
+ "@typescript-eslint/eslint-plugin": "^6.21.0",
52
+ "@typescript-eslint/parser": "^6.21.0",
53
+ "better-sqlite3": "^9.4.3",
54
+ "eslint": "^8.57.0",
55
+ "mongodb": "^6.4.0",
56
56
  "typescript": "^5.3.3",
57
57
  "uglify-js": "^3.17.4"
58
58
  },