gj-boomlings-api 2.0.0 → 2.0.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.
@@ -1 +1,159 @@
1
- module.exports={dlLevel:async function(level){const zlib=require("zlib");if(!level)throw new Error("Please provide a level ID.");if(isNaN(level))throw new Error("The level parameter should be a number.");const{gjReq}=require("../gjReq");const data={levelID:level.toString().trim(),secret:"Wmfd2893gb7"};let res=await gjReq("downloadGJLevel22",data);if(res.data==-1)return{};const XOR=require("../xor");let xor=new XOR;let s=res.data.split("#")[0].split(":");let id=Number(s[1]);let name=s[3];let description=Buffer.from(s[5],"base64url").toString();let levelString=s[7];let version=Number(s[9]);let playerID=Number(s[11]);let difficulty=s[15];let downloads=Number(s[17]);let officialSongID=Number(s[19]);let gameVersion=Number(s[21]);let likes=Number(s[23]);let isDemon=s[25];let stars=Number(s[31]);let isFeatured=s[33];let isEpic=s[35];let objStats=Number(s[37]);let length=Number(s[39]);let copiedID=Number(s[41]);let is2P=s[43];let uploaded=s[45];let updated=s[47];let NGSongID=Number(s[49]);let coins=Number(s[53]);let coinsVerified=s[55];let starReq=Number(s[57]);let isLDM=s[63];let password=xor.decrypt(s[67].split("#")[0],26364);if(password.length==7)password=password.replace("1","");let diffObj={"-10":"Auto",0:"N/A",10:"Easy",20:"Normal",30:"Hard",40:"Harder",50:"Insane"};if(Boolean(Number(isDemon))){diffObj={10:"Easy Demon",20:"Medium Demon",30:"Hard Demon",40:"Insane Demon",50:"Extreme Demon"}}const lengthObj={0:"Tiny",1:"Short",2:"Medium",3:"Long",4:"XL",5:"Platformer"};const versionObj={10:"1.7",18:"1.8",19:"1.9",20:"2.0",21:"2.1",22:"2.2"};const buffer=await new Promise((resolve,reject)=>{zlib.unzip(Buffer.from(levelString,"base64"),(err,buffer)=>{if(err){reject(err)}else{resolve(buffer)}})});const rawData=buffer.toString();const objs=rawData.split(";");objs.shift();let song;const{getOfficialSongInfo}=require("./getOfficialSongInfo");const{getSongInfo}=require("./getSongInfo");if(officialSongID&&!NGSongID){song=getOfficialSongInfo(officialSongID+1)}else if(NGSongID&&!officialSongID){let findSong=await getSongInfo(NGSongID);song=findSong}else if(!officialSongID&&!NGSongID){song=getOfficialSongInfo(1)}let result={id:id,name:name,description:!description?"(No description provided)":description,levelVersion:version,playerID:playerID,difficulty:diffObj[difficulty],stars:stars,downloads:downloads,likes:likes,disliked:likes<0?true:false,length:lengthObj[length],password:password,demon:Boolean(Number(isDemon)),featured:Boolean(Number(isFeatured)),epic:Boolean(Number(isEpic)),objects:objs.length-1,uploaded:uploaded,updated:updated,starsRequested:starReq,gameVersion:versionObj[gameVersion]?versionObj[gameVersion]:"Pre-1.7",ldm:Boolean(Number(isLDM)),copiedFrom:copiedID,large:objStats>4e4?true:false,twoPlayer:Boolean(Number(is2P)),coins:coins,verifiedCoins:Boolean(Number(coinsVerified)),song:song};if(s[69]&&s[68]!="41"){let songsIDArray=[];let sfxIDArray=[];for(let songID of s[69].split(",")){if(songID==NGSongID)continue;songsIDArray.push(Number(songID))}for(let sfx of s[71].split("#")[0].split(",")){sfxIDArray.push(Number(sfx))}result.additionalSongs=songsIDArray;result.sfx=sfxIDArray}return result}};
1
+ module.exports = {
2
+ dlLevel: async function (level) {
3
+ const zlib = require("zlib");
4
+ if (!level) throw new Error("Please provide a level ID.");
5
+ if (isNaN(level)) throw new Error("The level parameter should be a number.");
6
+
7
+ const { gjReq } = require("../gjReq");
8
+
9
+ const data = {
10
+ levelID: level.toString().trim(),
11
+ secret: "Wmfd2893gb7"
12
+ }
13
+
14
+ let res = await gjReq("downloadGJLevel22", data);
15
+ if (res.data == -1) return {};
16
+ const XOR = require("../xor");
17
+ let xor = new XOR;
18
+
19
+ let s = res.data.split("#")[0].split(":");
20
+
21
+ let id = Number(s[1]);
22
+ let name = s[3];
23
+ let description = Buffer.from(s[5], "base64url").toString();
24
+ let levelString = s[7];
25
+ let version = Number(s[9]);
26
+ let playerID = Number(s[11]);
27
+ let difficulty = s[15];
28
+ let downloads = Number(s[17]);
29
+ let officialSongID = Number(s[19]);
30
+ let gameVersion = Number(s[21]);
31
+ let likes = Number(s[23]);
32
+ let isDemon = s[25];
33
+ let stars = Number(s[31]);
34
+ let isFeatured = s[33];
35
+ let isEpic = s[35];
36
+ let objStats = Number(s[37]);
37
+ let length = Number(s[39]);
38
+ let copiedID = Number(s[41]);
39
+ let is2P = s[43];
40
+ let uploaded = s[45];
41
+ let updated = s[47];
42
+ let NGSongID = Number(s[49]);
43
+ let coins = Number(s[53]);
44
+ let coinsVerified = s[55];
45
+ let starReq = Number(s[57]);
46
+ let isLDM = s[63];
47
+ let password = xor.decrypt(s[67].split("#")[0], 26364);
48
+ if (password.length == 7) password = password.replace("1", "");
49
+
50
+ let diffObj = {
51
+ "-10": "Auto",
52
+ 0: "N/A",
53
+ 10: "Easy",
54
+ 20: "Normal",
55
+ 30: "Hard",
56
+ 40: "Harder",
57
+ 50: "Insane"
58
+ }
59
+
60
+ if (Boolean(Number(isDemon))) {
61
+ diffObj = {
62
+ 10: "Easy Demon",
63
+ 20: "Medium Demon",
64
+ 30: "Hard Demon",
65
+ 40: "Insane Demon",
66
+ 50: "Extreme Demon"
67
+ }
68
+ }
69
+
70
+ const lengthObj = {
71
+ 0: "Tiny",
72
+ 1: "Short",
73
+ 2: "Medium",
74
+ 3: "Long",
75
+ 4: "XL",
76
+ 5: "Platformer"
77
+ }
78
+
79
+ const versionObj = {
80
+ 10: "1.7",
81
+ 18: "1.8",
82
+ 19: "1.9",
83
+ 20: "2.0",
84
+ 21: "2.1",
85
+ 22: "2.2"
86
+ }
87
+
88
+ const buffer = await new Promise((resolve, reject) => {
89
+ zlib.unzip(Buffer.from(levelString, "base64"), (err, buffer) => {
90
+ if (err) {
91
+ reject(err);
92
+ } else {
93
+ resolve(buffer);
94
+ }
95
+ });
96
+ })
97
+ const rawData = buffer.toString();
98
+ const objs = rawData.split(";");
99
+ objs.shift();
100
+
101
+ let song;
102
+ const { getOfficialSongInfo } = require("./getOfficialSongInfo");
103
+ const { getSongInfo } = require("./getSongInfo");
104
+ if (officialSongID && !NGSongID) {
105
+ song = getOfficialSongInfo(officialSongID + 1);
106
+ } else if (NGSongID && !officialSongID) {
107
+ let findSong = await getSongInfo(NGSongID);
108
+ song = findSong;
109
+ }else if(!officialSongID&&!NGSongID){
110
+ song = getOfficialSongInfo(1);
111
+ }
112
+
113
+ let result = {
114
+ id: id,
115
+ name: name,
116
+ description: !description ? "(No description provided)" : description,
117
+ levelVersion: version,
118
+ playerID: playerID,
119
+ difficulty: diffObj[difficulty],
120
+ stars: stars,
121
+ downloads: downloads,
122
+ likes: likes,
123
+ disliked: likes < 0 ? true : false,
124
+ length: lengthObj[length],
125
+ password: password,
126
+ demon: Boolean(Number(isDemon)),
127
+ featured: Boolean(Number(isFeatured)),
128
+ epic: Boolean(Number(isEpic)),
129
+ objects: objs.length - 1,
130
+ uploaded: uploaded,
131
+ updated: updated,
132
+ starsRequested: starReq,
133
+ gameVersion: versionObj[gameVersion] ? versionObj[gameVersion] : "Pre-1.7",
134
+ ldm: Boolean(Number(isLDM)),
135
+ copiedFrom: copiedID,
136
+ large: objStats > 4e4 ? true : false,
137
+ twoPlayer: Boolean(Number(is2P)),
138
+ coins: coins,
139
+ verifiedCoins: Boolean(Number(coinsVerified)),
140
+ song: song
141
+ }
142
+
143
+ if (s[69] && s[68] != "41") {
144
+ let songsIDArray = [];
145
+ let sfxIDArray = [];
146
+ for (let songID of s[69].split(",")) {
147
+ if (songID == NGSongID) continue;
148
+ songsIDArray.push(Number(songID));
149
+ }
150
+ for (let sfx of s[71].split("#")[0].split(",")) {
151
+ sfxIDArray.push(Number(sfx));
152
+ }
153
+ result.additionalSongs = songsIDArray;
154
+ result.sfx = sfxIDArray;
155
+ }
156
+
157
+ return result;
158
+ }
159
+ }
@@ -1 +1,159 @@
1
- module.exports={getProfile:async function(name,mode="auto"){const{gjReq}=require("../gjReq");const{rgbToHEX}=require("../misc/rgbToHEX");const colors=require("../misc/colors.json");if(!name)throw new Error("Please provide an account name, player ID or account ID!");if(!["name","accountid","playerid","auto"].includes(mode))throw new Error('Please provide a valid search mode! It\'s either "name", "accountid", "playerid", or "auto"');function decodeUser(array){let accName=array[1];let playerID=Number(array[3]);let secretCoins=Number(array[5]);let userCoins=Number(array[7]);let c1=array[9];let c2=array[11];let stars=Number(array[15]);let moons=Number(array[17]);let diamonds=Number(array[19]);let demons=Number(array[21]);let cp=Number(array[23]);let msg=array[25];let friendReqs=array[27];let commentHistory=array[29];let yt=array[31];let cube=Number(array[33]);let ship=Number(array[35]);let ball=Number(array[37]);let ufo=Number(array[39]);let wave=Number(array[41]);let robot=Number(array[43]);let spider=Number(array[47]);let swing=Number(array[51]);let jetpack=Number(array[53]);let glow=Boolean(Number(array[45]));let explosion=Number(array[49]);let rank=Number(array[55]);let accID=Number(array[57]);let twitter=array[61];let twitch=array[63];let mod=array[65];let msgObj={0:"all",1:"friends",2:"none"};let friendReqsObj={0:"all",1:"none"};let modObj={0:"none",1:"mod",2:"elder"};return{username:accName,playerID:playerID,accountID:accID,rank:rank,stars:stars,diamonds:diamonds,secretCoins:secretCoins,userCoins:userCoins,demons:demons,moons:moons,creatorPoints:cp,c1:rgbToHEX(colors[c1]),c2:rgbToHEX(colors[c2]),cubeID:cube,shipID:ship,ballID:ball,ufoID:ufo,waveID:wave,robotID:robot,spiderID:spider,swingID:swing,jetpackID:jetpack,explosionID:explosion,glow:glow,messages:msgObj[msg],friendRequests:friendReqsObj[friendReqs],commentHistory:msgObj[commentHistory],mod:modObj[mod],youtube:yt,twitter:twitter,twitch:twitch}}async function accIDSearch(){let res=await gjReq("getGJUserInfo20",{targetAccountID:name,secret:"Wmfd2893gb7"});if(res.data==-1)return{};let accArray=res.data.split(":");return decodeUser(accArray)}async function nonAccIDSearch(){let search=await gjReq("getGJUsers20",{str:name,secret:"Wmfd2893gb7"});if(search.data==-1)return{};let targetAccID=search.data.split(":")[21];let res=await gjReq("getGJUserInfo20",{targetAccountID:targetAccID,secret:"Wmfd2893gb7"});let accArray=res.data.split(":");return decodeUser(accArray)}let result;if(mode=="accountid"){const user=await new Promise(resolve=>{accIDSearch().then(u=>resolve(u))});return user}if(mode=="name"||mode=="playerid"){const user=await new Promise(resolve=>{nonAccIDSearch().then(u=>resolve(u))});return user}if(isNaN(name)){const user=await new Promise(resolve=>{nonAccIDSearch().then(u=>resolve(u))});return user}else{let user;const accIDUser=await new Promise(resolve=>{accIDSearch().then(u=>resolve(u))});if(!Object.keys(user).length){const nonAccIDUser=await new Promise(resolve=>{nonAccIDSearch().then(u=>resolve(u))});user=nonAccIDUser}else{user=accIDUser}return user}}};
1
+ module.exports = {
2
+ getProfile: async function (name, mode = "auto") {
3
+ const { gjReq } = require("../gjReq");
4
+ const { rgbToHEX } = require("../misc/rgbToHEX");
5
+ const colors = require("../misc/colors.json");
6
+ if (!name) throw new Error("Please provide an account name, player ID or account ID!")
7
+ if (!["name", "accountid", "playerid", "auto"].includes(mode)) throw new Error("Please provide a valid search mode! It's either \"name\", \"accountid\", \"playerid\", or \"auto\"")
8
+
9
+ function decodeUser(array) {
10
+ let accName = array[1];
11
+ let playerID = Number(array[3]);
12
+ let secretCoins = Number(array[5]);
13
+ let userCoins = Number(array[7]);
14
+ let c1 = array[9];
15
+ let c2 = array[11];
16
+ let stars = Number(array[15]);
17
+ let moons = Number(array[17]);
18
+ let diamonds = Number(array[19]);
19
+ let demons = Number(array[21]);
20
+ let cp = Number(array[23]);
21
+ let msg = array[25];
22
+ let friendReqs = array[27];
23
+ let commentHistory = array[29];
24
+ let yt = array[31];
25
+ let cube = Number(array[33]);
26
+ let ship = Number(array[35]);
27
+ let ball = Number(array[37]);
28
+ let ufo = Number(array[39]);
29
+ let wave = Number(array[41]);
30
+ let robot = Number(array[43]);
31
+ let spider = Number(array[47]);
32
+ let swing = Number(array[51]);
33
+ let jetpack = Number(array[53]);
34
+ let glow = Boolean(Number(array[45]));
35
+ let explosion = Number(array[49]);
36
+ let rank = Number(array[55]);
37
+ let accID = Number(array[57]);
38
+ let twitter = array[61];
39
+ let twitch = array[63];
40
+ let mod = array[65];
41
+
42
+ let msgObj = {
43
+ 0: "all",
44
+ 1: "friends",
45
+ 2: "none"
46
+ }
47
+
48
+ let friendReqsObj = {
49
+ 0: "all",
50
+ 1: "none"
51
+ }
52
+
53
+ let modObj = {
54
+ 0: "none",
55
+ 1: "mod",
56
+ 2: "elder"
57
+ }
58
+
59
+ return {
60
+ username: accName,
61
+ playerID: playerID,
62
+ accountID: accID,
63
+ rank: rank,
64
+ stars: stars,
65
+ diamonds: diamonds,
66
+ secretCoins: secretCoins,
67
+ userCoins: userCoins,
68
+ demons: demons,
69
+ moons: moons,
70
+ creatorPoints: cp,
71
+ c1: rgbToHEX(colors[c1]),
72
+ c2: rgbToHEX(colors[c2]),
73
+ cubeID: cube,
74
+ shipID: ship,
75
+ ballID: ball,
76
+ ufoID: ufo,
77
+ waveID: wave,
78
+ robotID: robot,
79
+ spiderID: spider,
80
+ swingID: swing,
81
+ jetpackID: jetpack,
82
+ explosionID: explosion,
83
+ glow: glow,
84
+ messages: msgObj[msg],
85
+ friendRequests: friendReqsObj[friendReqs],
86
+ commentHistory: msgObj[commentHistory],
87
+ mod: modObj[mod],
88
+ youtube: yt,
89
+ twitter: twitter,
90
+ twitch: twitch
91
+ }
92
+ }
93
+
94
+ async function accIDSearch() {
95
+ let res = await gjReq("getGJUserInfo20", {
96
+ targetAccountID: name,
97
+ secret: "Wmfd2893gb7"
98
+ });
99
+ if (res.data == -1) return {};
100
+ let accArray = res.data.split(":");
101
+
102
+ return decodeUser(accArray);
103
+ }
104
+
105
+ async function nonAccIDSearch() {
106
+ let search = await gjReq("getGJUsers20", {
107
+ str: name,
108
+ secret: "Wmfd2893gb7"
109
+ });
110
+ if (search.data == -1) return {};
111
+ let targetAccID = search.data.split(":")[21];
112
+
113
+ let res = await gjReq("getGJUserInfo20", {
114
+ targetAccountID: targetAccID,
115
+ secret: "Wmfd2893gb7"
116
+ });
117
+ let accArray = res.data.split(":");
118
+
119
+ return decodeUser(accArray);
120
+ }
121
+
122
+ let result;
123
+
124
+ if (mode == "accountid") {
125
+ const user = await new Promise((resolve) => {
126
+ accIDSearch().then(u => resolve(u));
127
+ })
128
+ return user;
129
+ }
130
+
131
+ if (mode == "name" || mode == "playerid") {
132
+ const user = await new Promise((resolve) => {
133
+ nonAccIDSearch().then(u => resolve(u));
134
+ })
135
+ return user;
136
+ }
137
+
138
+ if (isNaN(name)) {
139
+ const user = await new Promise((resolve) => {
140
+ nonAccIDSearch().then(u => resolve(u));
141
+ })
142
+ return user;
143
+ } else {
144
+ let user;
145
+ const accIDUser = await new Promise((resolve) => {
146
+ accIDSearch().then(u => resolve(u));
147
+ })
148
+ if (!Object.keys(user).length) {
149
+ const nonAccIDUser = await new Promise((resolve) => {
150
+ nonAccIDSearch().then(u => resolve(u));
151
+ })
152
+ user = nonAccIDUser;
153
+ } else {
154
+ user = accIDUser;
155
+ }
156
+ return user;
157
+ }
158
+ }
159
+ }
@@ -1 +1,80 @@
1
- module.exports={getSongsLibrary:async function(){const zlib=require("zlib");const fetch=require("node-fetch");let req=await fetch("https://geometrydashfiles.b-cdn.net/music/musiclibrary.dat");let res=await req.text();let libArray;const buffer=await new Promise((resolve,reject)=>{zlib.unzip(Buffer.from(res,"base64"),(err,buffer)=>{if(err){reject(err)}else{resolve(buffer)}})});const rawData=buffer.toString();libArray=rawData.split("|");let library={};library.version=Number(libArray[0]);let genres=[];let rawGenres=libArray[3].split(";");rawGenres.pop();rawGenres.forEach(genre=>{genres.push({id:genre.split(",")[0],name:genre.split(",")[1]})});let artists=[];let rawArtists=libArray[1].split(";");rawArtists.pop();rawArtists.forEach(artist=>{let obj={};obj.id=artist.split(",")[0];obj.name=artist.split(",")[1];if(artist.split(",")[2].trim()!="")obj.website=decodeURIComponent(artist.split(",")[2]);if(artist.split(",")[3].trim()!="")obj.youtube=artist.split(",")[3];artists.push(obj)});let songs=[];let rawSongs=libArray[2].split(";");rawSongs.pop();rawSongs.forEach(song=>{let obj={};obj.id=Number(song.split(",")[0]);obj.name=song.split(",")[1];let songArtist=artists.filter(a=>a.id==song.split(",")[2])[0];obj.artist=songArtist;let size=song.split(",")[3];size=size/1048576;size=size.toFixed(1);obj.size=`${size} MB`;obj.duration=`${song.split(",")[4]}s`;let songGenres=[];let rawSongGenres=song.split(",")[5].split(".");rawSongGenres.shift();rawSongGenres.pop();rawSongGenres.forEach(genre=>{let songGenre=genres.filter(g=>g.id==genre)[0];songGenres.push(songGenre.name)});obj.genres=songGenres;songs.push(obj)});library.songs=songs;return library}};
1
+ module.exports = {
2
+ getSongsLibrary: async function () {
3
+ const zlib = require("zlib");
4
+ const fetch = require("node-fetch");
5
+
6
+ let req = await fetch("https://geometrydashfiles.b-cdn.net/music/musiclibrary.dat");
7
+ let res = await req.text();
8
+
9
+ let libArray;
10
+ const buffer = await new Promise((resolve, reject) => {
11
+ zlib.unzip(Buffer.from(res, "base64"), (err, buffer) => {
12
+ if (err) {
13
+ reject(err);
14
+ } else {
15
+ resolve(buffer);
16
+ }
17
+ });
18
+ })
19
+ const rawData = buffer.toString();
20
+ libArray = rawData.split("|");
21
+
22
+ let library = {};
23
+ library.version = Number(libArray[0]);
24
+
25
+ let genres = [];
26
+ let rawGenres = libArray[3].split(";");
27
+ rawGenres.pop();
28
+ rawGenres.forEach(genre => {
29
+ genres.push({ id: genre.split(",")[0], name: genre.split(",")[1] })
30
+ });
31
+
32
+ let artists = [];
33
+ let rawArtists = libArray[1].split(";");
34
+ rawArtists.pop();
35
+ rawArtists.forEach(artist => {
36
+ let obj = {};
37
+ obj.id = artist.split(",")[0];
38
+ obj.name = artist.split(",")[1];
39
+ if (artist.split(",")[2].trim() != "") obj.website = decodeURIComponent(artist.split(",")[2]);
40
+ if (artist.split(",")[3].trim() != "") obj.youtube = artist.split(",")[3];
41
+ artists.push(obj);
42
+ })
43
+
44
+ let songs = [];
45
+ let rawSongs = libArray[2].split(";");
46
+ rawSongs.pop();
47
+ rawSongs.forEach(song => {
48
+ let obj = {};
49
+
50
+ obj.id = Number(song.split(",")[0]);
51
+ obj.name = song.split(",")[1];
52
+
53
+ let songArtist = artists.filter(a => a.id == song.split(",")[2])[0];
54
+ obj.artist = songArtist;
55
+
56
+ let size = song.split(",")[3];
57
+ size = size / 1048576;
58
+ size = size.toFixed(1);
59
+ obj.size = `${size} MB`;
60
+
61
+ obj.duration = `${song.split(",")[4]}s`;
62
+
63
+ let songGenres = [];
64
+ let rawSongGenres = song.split(",")[5].split(".");
65
+ rawSongGenres.shift();
66
+ rawSongGenres.pop();
67
+ rawSongGenres.forEach(genre => {
68
+ let songGenre = genres.filter(g => g.id == genre)[0];
69
+ songGenres.push(songGenre.name);
70
+ })
71
+ obj.genres = songGenres;
72
+
73
+ songs.push(obj);
74
+ })
75
+
76
+ library.songs = songs;
77
+
78
+ return library;
79
+ }
80
+ }
package/gjReq.js CHANGED
@@ -1 +1,18 @@
1
- const fetch=require("node-fetch");module.exports={gjReq:async function(endpoint,data){let r=await fetch(`https://www.boomlings.com/database/${endpoint.endsWith(".php")?endpoint.split(".php")[0]:endpoint}.php`,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded","User-Agent":" "},body:new URLSearchParams(data)});let res=await r.text();return{data:res,status:r.status}}};
1
+ const fetch = require("node-fetch");
2
+ module.exports = {
3
+ gjReq: async function (endpoint, data) {
4
+ let r = await fetch(`https://www.boomlings.com/database/${endpoint.endsWith(".php") ? endpoint.split(".php")[0] : endpoint}.php`, {
5
+ method: "POST",
6
+ headers: {
7
+ "Content-Type": "application/x-www-form-urlencoded",
8
+ "User-Agent": " "
9
+ },
10
+ body: new URLSearchParams(data)
11
+ });
12
+ let res = await r.text();
13
+ return {
14
+ data: res,
15
+ status: r.status
16
+ }
17
+ }
18
+ };
package/index.js CHANGED
@@ -1,2 +1,36 @@
1
- const{dlLevel}=require("./functions/dlLevel");const{getProfile}=require("./functions/getProfile");const{getSongsLibrary}=require("./functions/getSongsLibrary");const{getSongInfo}=require("./functions/getSongInfo");const{getAccountPosts}=require("./functions/getAccountPosts");const{getGauntlets}=require("./functions/getGauntlets");const{getMapPacks}=require("./functions/getMapPacks");const{getOfficialSongInfo}=require("./functions/getOfficialSongInfo");const{getDailyLevel}=require("./functions/getDailyLevel");const{getWeeklyDemon}=require("./functions/getWeeklyDemon");const{getCreatorScores}=require("./functions/getCreatorScores");const{getTop100}=require("./functions/getTop100");const{reportLevel}=require("./functions/reportLevel");const{uploadMessage}=require("./functions/uploadMessage");const{getMessages}=require("./functions/getMessages");const{dlMessage}=require("./functions/dlMessage");const{getBlockedList}=require("./functions/getBlockedList");const{getFriendsList}=require("./functions/getFriendsList");const{deleteLevel}=require("./functions/deleteLevel");const{blockUser}=require("./functions/blockUser");const{unblockUser}=require("./functions/unblockUser");const{uploadAccountPost}=require("./functions/uploadAccountPost");const{deleteAccountPost}=require("./functions/deleteAccountPost");const{updateLevelDesc}=require("./functions/updateLevelDesc");const{getLevelByID}=require("./functions/getLevelByID");const{searchLevels}=require("./functions/searchLevels");const{getComments}=require("./functions/getComments");const{getTopLists}=require("./functions/getTopLists");const{searchLists}=require("./functions/searchLists");const{getTab}=require("./functions/getTab");const{getUserLevels}=require("./functions/getUserLevels");const{deleteComment}=require("./functions/deleteComment");const{getCommentHistory}=require("./functions/getCommentHistory");const{getLevelScores}=require("./functions/getLevelScores");const{uploadComment}=require("./functions/uploadComment");
2
- module.exports={dlLevel,getProfile,getSongsLibrary,getSongInfo,getAccountPosts,getGauntlets,getMapPacks,getOfficialSongInfo,getDailyLevel,getWeeklyDemon,getCreatorScores,getTop100,reportLevel,uploadMessage,getMessages,dlMessage,getBlockedList,getFriendsList,deleteLevel,blockUser,unblockUser,uploadAccountPost,deleteAccountPost,updateLevelDesc,getLevelByID,searchLevels,getComments,getTopLists,searchLists,getTab,getUserLevels,deleteComment,getCommentHistory,getLevelScores,uploadComment};
1
+ const { dlLevel } = require("./functions/dlLevel");
2
+ const { getProfile } = require("./functions/getProfile");
3
+ const { getSongsLibrary } = require("./functions/getSongsLibrary");
4
+ const { getSongInfo } = require("./functions/getSongInfo");
5
+ const { getAccountPosts } = require("./functions/getAccountPosts");
6
+ const { getGauntlets } = require("./functions/getGauntlets");
7
+ const { getMapPacks } = require("./functions/getMapPacks");
8
+ const { getOfficialSongInfo } = require("./functions/getOfficialSongInfo");
9
+ const { getDailyLevel } = require("./functions/getDailyLevel");
10
+ const { getWeeklyDemon } = require("./functions/getWeeklyDemon");
11
+ const { getCreatorScores } = require("./functions/getCreatorScores");
12
+ const { getTop100 } = require("./functions/getTop100");
13
+ const { reportLevel } = require("./functions/reportLevel");
14
+ const { uploadMessage } = require("./functions/uploadMessage");
15
+ const { getMessages } = require("./functions/getMessages");
16
+ const { dlMessage } = require("./functions/dlMessage");
17
+ const { getBlockedList } = require("./functions/getBlockedList");
18
+ const { getFriendsList } = require("./functions/getFriendsList");
19
+ const { deleteLevel } = require("./functions/deleteLevel");
20
+ const { blockUser } = require("./functions/blockUser");
21
+ const { unblockUser } = require("./functions/unblockUser");
22
+ const { uploadAccountPost } = require("./functions/uploadAccountPost");
23
+ const { deleteAccountPost } = require("./functions/deleteAccountPost");
24
+ const { updateLevelDesc } = require("./functions/updateLevelDesc");
25
+ const { getLevelByID } = require("./functions/getLevelByID");
26
+ const { searchLevels } = require("./functions/searchLevels");
27
+ const { getComments } = require("./functions/getComments");
28
+ const { getTopLists } = require("./functions/getTopLists");
29
+ const { searchLists } = require("./functions/searchLists");
30
+ const { getTab } = require("./functions/getTab");
31
+ const { getUserLevels } = require("./functions/getUserLevels");
32
+ const { deleteComment } = require("./functions/deleteComment");
33
+ const { getCommentHistory } = require("./functions/getCommentHistory");
34
+ const { getLevelScores } = require("./functions/getLevelScores");
35
+ const { uploadComment } = require("./functions/uploadComment");
36
+ module.exports = { dlLevel, getProfile, getSongsLibrary, getSongInfo, getAccountPosts, getGauntlets, getMapPacks, getOfficialSongInfo, getDailyLevel, getWeeklyDemon, getCreatorScores, getTop100, reportLevel, uploadMessage, getMessages, dlMessage, getBlockedList, getFriendsList, deleteLevel, blockUser, unblockUser, uploadAccountPost, deleteAccountPost, updateLevelDesc, getLevelByID, searchLevels, getComments, getTopLists, searchLists, getTab, getUserLevels, deleteComment, getCommentHistory, getLevelScores, uploadComment };
package/misc/GJDecode.js CHANGED
@@ -1 +1,210 @@
1
- const{getOfficialSongInfo}=require("../functions/getOfficialSongInfo");const{rgbToHEX}=require("./rgbToHEX");const colors=require("./colors.json");module.exports=class GJDecode{decodeScoresUser(u){let iconObj={0:"cube",1:"ship",2:"ball",3:"ufo",4:"wave",5:"robot",6:"spider",7:"swing",8:"jetpack"};let s=u.split(":");return{name:s[1],playerID:Number(s[3]),accountID:Number(s[21]),rank:Number(s[9]),stars:Number(s[23]),diamonds:Number(s[29]),secretCoins:Number(s[5]),userCoins:Number(s[7]),demons:Number(s[31]),moons:Number(s[25]),creatorPoints:Number(s[27]),c1:rgbToHEX(colors[s[13]]),c2:rgbToHEX(colors[s[15]]),iconType:iconObj[s[17]]}}decodeSearchResults(res){let levels=res.split("#")[0].split("|");let creators=res.split("#")[1].split("|");let songs=res.split("#")[2].split("~:~");let result=[];let encCreators={};let encSongs={};creators.forEach(c=>{let playerID=c.split(":")[0];let username=c.split(":")[1];encCreators[playerID]=username});songs.forEach(s=>{let sp=s.split("~|~");let songId=sp[1];let songName=sp[3];let songArtistID=sp[5];let songArtist=sp[7];let size=sp[9];let link=sp[13];encSongs[songId]={name:songName,id:Number(songId),artist:songArtist,artistId:Number(songArtistID),fileSize:`${size} MB`,link:decodeURIComponent(link)}});for(const l of levels){let s=l.split(":");let diffObj={"-10":"Auto",0:"Unrated",10:"Easy",20:"Normal",30:"Hard",40:"Harder",50:"Insane"};if(Boolean(Number(s[21]))){diffObj={10:"Easy Demon",20:"Medium Demon",30:"Hard Demon",40:"Insane Demon",50:"Extreme Demon"}}const lengthObj={0:"Tiny",1:"Short",2:"Medium",3:"Long",4:"XL",5:"Platformer"};const versionObj={10:"1.7",18:"1.8",19:"1.9",20:"2.0",21:"2.1",22:"2.2"};let lvl={id:Number(s[1]),name:s[3],levelVersion:Number(s[5]),playerID:Number(s[7]),difficulty:diffObj[s[11]],stars:Number(s[27]),downloads:Number(s[13]),likes:Number(s[19]),disliked:s[19]<0?true:false,length:lengthObj[s[37]],demon:Boolean(Number(s[21])),featured:Boolean(Number(s[29])),epic:Boolean(Number(s[31])),objects:Number(s[33]),starsRequested:Number(s[47]),gameVersion:versionObj[s[17]]?versionObj[s[17]]:"Pre-1.7",copiedFrom:Number(s[39]),large:s[33]>4e4?true:false,twoPlayer:Boolean(Number(s[41])),coins:Number(s[43]),verifiedCoins:Boolean(Number(s[45]))};let officialSongID=Number(s[15]);let songID=Number(s[53]);let playerId=s[7];let song;if(officialSongID==0&&songID!=0||officialSongID!=0&&songID!=0)song=encSongs[songID.toString()];if(officialSongID!=0&&songID==0)song=getOfficialSongInfo(officialSongID+1);if(officialSongID==0&&songID==0)song=getOfficialSongInfo(1);lvl["creator"]=encCreators[playerId]?encCreators[playerId]:"-";lvl["song"]=song;result.push(lvl)}return result}decodeLists(res){let rawLists=res.split("#")[0].split("|");let rawAccounts=res.split("#")[1].split("|");let accounts=[];rawAccounts.forEach(a=>{let s=a.split(":");accounts.push({username:s[1],playerID:Number(s[0]),accountID:s[2]})});let lists=[];let diffObj={"-1":"N/A",0:"Auto",1:"Easy",2:"Normal",3:"Hard",4:"Harder",5:"Insane",6:"Easy Demon",7:"Medium Demon",8:"Hard Demon",9:"Insane Demon",10:"Extreme Demon"};rawLists.forEach(l=>{let s=l.split(":");let rawLvls=s[21].split(",");let lvls=[];for(let lvl of rawLvls){lvls.push(Number(lvl))}let playerID=accounts.filter(a=>a.accountID==s[9])[0].playerID;lists.push({id:Number(s[1]),name:s[3],description:Buffer.from(s[5],"base64").toString(),difficulty:diffObj[s[15]],username:s[11],playerID:playerID,accountID:Number(s[9]),downloads:Number(s[13]),likes:Number(s[17]),diamonds:Number(s[23]),disliked:s[17]<0?true:false,levels:lvls,required:Number(s[25]),uploadedUnix:Number(s[27])})});return lists}};
1
+ const { getOfficialSongInfo } = require("../functions/getOfficialSongInfo");
2
+ const { rgbToHEX } = require("./rgbToHEX");
3
+ const colors = require("./colors.json");
4
+ module.exports = class GJDecode {
5
+ decodeScoresUser(u) {
6
+ let iconObj = {
7
+ 0: "cube",
8
+ 1: "ship",
9
+ 2: "ball",
10
+ 3: "ufo",
11
+ 4: "wave",
12
+ 5: "robot",
13
+ 6: "spider",
14
+ 7: "swing",
15
+ 8: "jetpack"
16
+ }
17
+ let s = u.split(":");
18
+ return {
19
+ name: s[1],
20
+ playerID: Number(s[3]),
21
+ accountID: Number(s[21]),
22
+ rank: Number(s[9]),
23
+ stars: Number(s[23]),
24
+ diamonds: Number(s[29]),
25
+ secretCoins: Number(s[5]),
26
+ userCoins: Number(s[7]),
27
+ demons: Number(s[31]),
28
+ moons: Number(s[25]),
29
+ creatorPoints: Number(s[27]),
30
+ c1: rgbToHEX(colors[s[13]]),
31
+ c2: rgbToHEX(colors[s[15]]),
32
+ iconType: iconObj[s[17]]
33
+ }
34
+ }
35
+ decodeSearchResults(res) {
36
+ let levels = res.split("#")[0].split("|");
37
+ let creators = res.split("#")[1].split("|");
38
+ let songs = res.split("#")[2].split("~:~");
39
+
40
+ let result = [];
41
+
42
+ let encCreators = {};
43
+ let encSongs = {};
44
+
45
+ creators.forEach(c => {
46
+ let playerID = c.split(":")[0];
47
+ let username = c.split(":")[1];
48
+ encCreators[playerID] = username;
49
+ })
50
+
51
+ songs.forEach(s => {
52
+ let sp = s.split("~|~");
53
+ let songId = sp[1];
54
+ let songName = sp[3];
55
+ let songArtistID = sp[5];
56
+ let songArtist = sp[7];
57
+ let size = sp[9];
58
+ let link = sp[13];
59
+
60
+ encSongs[songId] = {
61
+ "name": songName,
62
+ "id": Number(songId),
63
+ "artist": songArtist,
64
+ "artistId": Number(songArtistID),
65
+ "fileSize": `${size} MB`,
66
+ "link": decodeURIComponent(link)
67
+ };
68
+ })
69
+
70
+ for (const l of levels) {
71
+ let s = l.split(":");
72
+
73
+ let diffObj = {
74
+ "-10": "Auto",
75
+ 0: "Unrated",
76
+ 10: "Easy",
77
+ 20: "Normal",
78
+ 30: "Hard",
79
+ 40: "Harder",
80
+ 50: "Insane"
81
+ }
82
+
83
+ if (Boolean(Number(s[21]))) {
84
+ diffObj = {
85
+ 10: "Easy Demon",
86
+ 20: "Medium Demon",
87
+ 30: "Hard Demon",
88
+ 40: "Insane Demon",
89
+ 50: "Extreme Demon"
90
+ }
91
+ }
92
+
93
+ const lengthObj = {
94
+ 0: "Tiny",
95
+ 1: "Short",
96
+ 2: "Medium",
97
+ 3: "Long",
98
+ 4: "XL",
99
+ 5: "Platformer"
100
+ }
101
+
102
+ const versionObj = {
103
+ 10: "1.7",
104
+ 18: "1.8",
105
+ 19: "1.9",
106
+ 20: "2.0",
107
+ 21: "2.1",
108
+ 22: "2.2"
109
+ }
110
+
111
+ let lvl = {
112
+ id: Number(s[1]),
113
+ name: s[3],
114
+ levelVersion: Number(s[5]),
115
+ playerID: Number(s[7]),
116
+ difficulty: diffObj[s[11]],
117
+ stars: Number(s[27]),
118
+ downloads: Number(s[13]),
119
+ likes: Number(s[19]),
120
+ disliked: s[19] < 0 ? true : false,
121
+ length: lengthObj[s[37]],
122
+ demon: Boolean(Number(s[21])),
123
+ featured: Boolean(Number(s[29])),
124
+ epic: Boolean(Number(s[31])),
125
+ objects: Number(s[33]),
126
+ starsRequested: Number(s[47]),
127
+ gameVersion: versionObj[s[17]] ? versionObj[s[17]] : "Pre-1.7",
128
+ copiedFrom: Number(s[39]),
129
+ large: s[33] > 4e4 ? true : false,
130
+ twoPlayer: Boolean(Number(s[41])),
131
+ coins: Number(s[43]),
132
+ verifiedCoins: Boolean(Number(s[45]))
133
+ }
134
+
135
+ let officialSongID = Number(s[15]);
136
+ let songID = Number(s[53]);
137
+ let playerId = s[7];
138
+ let song;
139
+
140
+ if (officialSongID == 0 && songID != 0 || officialSongID != 0 && songID != 0) song = encSongs[songID.toString()];
141
+ if (officialSongID != 0 && songID == 0) song = getOfficialSongInfo(officialSongID + 1);
142
+ if (officialSongID == 0 && songID == 0) song = getOfficialSongInfo(1);
143
+
144
+ lvl['creator'] = encCreators[playerId] ? encCreators[playerId] : "-";
145
+ lvl['song'] = song;
146
+
147
+ result.push(lvl);
148
+ }
149
+ return result;
150
+ }
151
+ decodeLists(res) {
152
+ let rawLists = res.split("#")[0].split("|");
153
+ let rawAccounts = res.split("#")[1].split("|");
154
+
155
+ let accounts = [];
156
+ rawAccounts.forEach(a => {
157
+ let s = a.split(":");
158
+ accounts.push({
159
+ username: s[1],
160
+ playerID: Number(s[0]),
161
+ accountID: s[2]
162
+ })
163
+ })
164
+
165
+ let lists = [];
166
+
167
+ let diffObj = {
168
+ "-1": "N/A",
169
+ "0": "Auto",
170
+ "1": "Easy",
171
+ "2": "Normal",
172
+ "3": "Hard",
173
+ "4": "Harder",
174
+ "5": "Insane",
175
+ "6": "Easy Demon",
176
+ "7": "Medium Demon",
177
+ "8": "Hard Demon",
178
+ "9": "Insane Demon",
179
+ "10": "Extreme Demon"
180
+ }
181
+
182
+ rawLists.forEach(l => {
183
+ let s = l.split(":");
184
+ let rawLvls = s[21].split(",");
185
+ let lvls = [];
186
+ for (let lvl of rawLvls) {
187
+ lvls.push(Number(lvl));
188
+ }
189
+ let playerID = accounts.filter(a => a.accountID == s[9])[0].playerID;
190
+ lists.push({
191
+ id: Number(s[1]),
192
+ name: s[3],
193
+ description: Buffer.from(s[5], "base64").toString(),
194
+ difficulty: diffObj[s[15]],
195
+ username: s[11],
196
+ playerID: playerID,
197
+ accountID: Number(s[9]),
198
+ downloads: Number(s[13]),
199
+ likes: Number(s[17]),
200
+ diamonds: Number(s[23]),
201
+ disliked: s[17] < 0 ? true : false,
202
+ levels: lvls,
203
+ required: Number(s[25]),
204
+ uploadedUnix: Number(s[27])
205
+ })
206
+ })
207
+
208
+ return lists;
209
+ }
210
+ }
@@ -1 +1 @@
1
- {"1":"Fire","2":"Ice","3":"Poison","4":"Shadow","5":"Lava","6":"Bonus","7":"Chaos","8":"Demon","9":"Time","10":"Crystal","11":"Magic","12":"Spike","13":"Monster","14":"Doom","15":"Death","46":"World","47":"Galaxy","48":"Universe","49":"Discord","50":"Split"}
1
+ {"1":"Fire","2":"Ice","3":"Poison","4":"Shadow","5":"Lava","6":"Bonus","7":"Chaos","8":"Demon","9":"Time","10":"Crystal","11":"Magic","12":"Spike","13":"Monster","14":"Doom","15":"Death","21":"Water","35":"Portal","36":"Strange","37":"Fantasy","43":"Castle","46":"World","47":"Galaxy","48":"Universe","49":"Discord","50":"Split"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gj-boomlings-api",
3
- "version": "2.0.0",
3
+ "version": "2.0.1",
4
4
  "description": "A light-weight Geometry Dash API wrapper",
5
5
  "main": "index.js",
6
6
  "scripts": {
package/xor.js CHANGED
@@ -1 +1,5 @@
1
- module.exports=class XOR{xor(r,t){return String.fromCodePoint(...r.split("").map((r,e)=>r.charCodeAt(0)^t.toString().charCodeAt(e%t.toString().length)))}encrypt(r,e=37526){return Buffer.from(this.xor(r,e)).toString("base64").replace(/\//g,"_").replace(/\+/g,"-")}decrypt(r,e=37526){return this.xor(Buffer.from(r.replace(/\//g,"_").replace(/\+/g,"-"),"base64").toString(),e)}};
1
+ module.exports = class XOR {
2
+ xor(str, key) { return String.fromCodePoint(...str.split('').map((char, i) => char.charCodeAt(0) ^ key.toString().charCodeAt(i % key.toString().length))) }
3
+ encrypt(str, key = 37526) { return Buffer.from(this.xor(str, key)).toString('base64').replace(/\//g, '_').replace(/\+/g, '-'); }
4
+ decrypt(str, key = 37526) { return this.xor(Buffer.from(str.replace(/\//g, '_').replace(/\+/g, '-'), 'base64').toString(), key) }
5
+ }