UNPKG

dashtools

Version:

Library for interacting with Geometry Dash servers

149 lines (145 loc) 5.3 kB
import { genericRequest } from "./generic.js" import * as constants from "../constants.js" import * as utils from "../utils.js" export function getLeaderboards(type, instance, params, callback, options, secret) { genericRequest("getLeaderboards", {type}, function(data) { let dr = data.split("|") let d = dr.filter(e => !!e) let users = d.map(u => utils.parseUser(u)) callback({ users, emptyUsers: dr.length - d.length }) }, instance, params, options, secret) } export function getLevelScores(levelID, type, opts, instance, params, callback, options, secret) { let s1 = (opts.attempts || 0) + 8354 let s2 = (opts.bestAttemptClicks || 0) + 3991 let s3 = (opts.bestAttemptTime || 0) + 4085 let s4 = utils.generateLeaderboardSeed((opts.bestAttemptClicks || 0), (opts.percentage || 0), (opts.bestAttemptTime || 0), 1) let s6 = "0" if (opts.percentages) s6 = opts.percentages.map((v, i, a) => { let prev = a[i - 1] if (!prev) prev = 0 return v - prev }).join(",") let s7 = utils.rs(10) let s9 = (opts.coins || 0) + 5819 // accountID,levelID,percentage,bestAttemptTime,bestAttemptClicks,attempts,levelSeed,pbDiffs,1,coins,timelyID let values = [ instance.account.accountID, levelID, (opts.percentage || 0), (opts.bestAttemptTime || 0), (opts.bestAttemptClicks || 0), (opts.attempts || 0), s4, s6, 1, (opts.coins || 0), (opts.timelyID || 0) ] let chk = utils.chk(values, constants.KEYS.LEVEL_LEADERBOARD, constants.SALTS.LEVEL_LEADERBOARDS + s7) let percentage = opts.percentage opts = { time: 0, points: 0, plat: 0, mode: 1, type, s1, s2, s3, s4: s4 + 1482, s5: 2000 + Math.floor(Math.random() * 1999), s6: utils.base64Encode(utils.xor(s6, constants.KEYS.LEVEL)), s7, s8: opts.attempts || 0, s9, s10: opts.timelyID || 0, levelID, chk, accountID: instance.account.accountID, gjp2: utils.gjp2(instance.account.password), uuid: instance.account.playerID, udid: instance.account.udid } if (percentage) opts.percent = percentage genericRequest("getLevelLeaderboards", opts, function(data) { if (data == -1 || data == "-01") throw new Error(data) let scores = data.split("|").map(u => utils.parseUser(u)) for (let i = 0; i < scores.length; i++) { scores[i].percentage = scores[i].stars delete scores[i].stars } callback(scores) }, instance, params, options, secret) } export function getPlatformerLevelScores(levelID, type, mode, opts, instance, params, callback, options, secret) { let bestAttemptTime = opts.bestAttemptTime if (!bestAttemptTime) { if (opts.time) bestAttemptTime = Math.floor(opts.time / 1000) else bestAttemptTime = 0 } let s1 = (opts.attempts || 0) + 8354 let s2 = (opts.bestAttemptClicks || 0) + 3991 let s3 = bestAttemptTime + 4085 let s4 = utils.generatePlatformerLeaderboardSeed((opts.time || 0), (opts.points || 0)) let s6 = "0" if (opts.percentages) s6 = opts.percentages.map((v, i, a) => { let prev = a[i - 1] if (!prev) prev = 0 return v - prev }).join(",") let s7 = utils.rs(10) let s9 = (opts.coins || 0) + 5819 // accountID,levelID,percentage,bestAttemptTime,bestAttemptClicks,attempts,levelSeed,pbDiffs,1,coins,timelyID let values = [ instance.account.accountID, levelID, (opts.percentage || 0), bestAttemptTime, (opts.bestAttemptClicks || 0), (opts.attempts || 0), s4, s6, 1, (opts.coins || 0), (opts.timelyID || 0) ] let chk = utils.chk(values, constants.KEYS.LEVEL_LEADERBOARD, constants.SALTS.LEVEL_LEADERBOARDS + s7) let percentage = opts.percentage || 0 if (s6 == "0") s6 = percentage opts = { time: (opts.time || 0), points: (opts.points || 0), plat: 1, mode, type, s1, s2, s3, s4: s4 + 1482, s5: 2000 + Math.floor(Math.random() * 1999), s6: utils.base64Encode(utils.xor(s6, constants.KEYS.LEVEL)), s7, s8: opts.attempts || 0, s9, s10: opts.timelyID || 0, levelID, chk, accountID: instance.account.accountID, gjp2: utils.gjp2(instance.account.password), uuid: instance.account.playerID, udid: instance.account.udid } if (percentage) opts.percent = percentage genericRequest("getPlatformerLevelLeaderboards", opts, function(data) { if (data == -1 || data == "-01") throw new Error(data) let scores = data.split("|").map(u => utils.parseUser(u)) for (let i = 0; i < scores.length; i++) { if (mode == 0) scores[i].time = scores[i].stars else scores[i].points = scores[i].stars delete scores[i].stars } callback(scores) }, instance, params, options, secret) }