-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
7 changed files
with
667 additions
and
8 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1,159 @@ | ||
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}}; | ||
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; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1,159 @@ | ||
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}}}; | ||
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; | ||
} | ||
} | ||
} |
Oops, something went wrong.