it's the beginning of the end

rob added strict rate limits, everyone  h*cking panic
This commit is contained in:
GDColon 2020-11-12 20:32:15 -05:00
parent f9f2cbf06b
commit 8768afa90e
23 changed files with 70 additions and 39 deletions

View file

@ -58,10 +58,16 @@ module.exports = async (app, req, res) => {
comment.levelID = x[1] || req.params.id
comment.playerID = x[3]
comment.accountID = y[16]
comment.form = ['icon', 'ship', 'ball', 'ufo', 'wave', 'robot', 'spider'][Number(y[14])]
comment.color = (comment.playerID == "16" ? "50,255,255" : x[12] || "255,255,255")
if (x[10] > 0) comment.percent = +x[10]
comment.moderator = +x[11] || 0
comment.icon = {
form: ['icon', 'ship', 'ball', 'ufo', 'wave', 'robot', 'spider'][+y[14]],
icon: +y[9],
col1: +y[10],
col2: +y[11],
glow: +y[15] > 0
}
}
if (i == 0 && req.query.type != "commentHistory") {

View file

@ -38,7 +38,7 @@ module.exports = async (app, req, res) => {
let topless = form == "bird" && req.query.topless
let autoSize = req.query.size == "auto"
let sizeParam = autoSize || (req.query.size && !isNaN(req.query.size))
if (outline == "0") outline = false;
if (outline == "0" || outline == "false") outline = false;
if (iconID && iconID.toString().length == 1) iconID = "0" + iconID;

View file

@ -1,12 +1,14 @@
const request = require('request')
const {GoogleSpreadsheet} = require('google-spreadsheet');
const sheet = new GoogleSpreadsheet('1ADIJvAkL0XHGBDhO7PP9aQOuK3mPIKB2cVPbshuBBHc'); // accurate leaderboard spreadsheet
// const request = require('request')
// const {GoogleSpreadsheet} = require('google-spreadsheet');
// const sheet = new GoogleSpreadsheet('1ADIJvAkL0XHGBDhO7PP9aQOuK3mPIKB2cVPbshuBBHc'); // accurate leaderboard spreadsheet
let lastIndex = {"stars": 0, "coins": 0, "demons": 0}
let caches = [{"stars": null, "coins": null, "demons": null}, {"stars": null, "coins": null, "demons": null}] // 0 for JSON, 1 for GD
// let lastIndex = {"stars": 0, "coins": 0, "demons": 0}
// let caches = [{"stars": null, "coins": null, "demons": null}, {"stars": null, "coins": null, "demons": null}] // 0 for JSON, 1 for GD
module.exports = async (app, req, res, post) => {
return res.send([]) // this really do be a bruh moment
if (app.offline || !app.sheetsKey || app.endpoint != "http://boomlings.com/database/") return res.send([])
let gdMode = post || req.query.hasOwnProperty("gd")
let cache = caches[gdMode ? 1 : 0]

View file

@ -32,6 +32,13 @@ module.exports = async (app, req, res) => {
x.coins = +x[13]
x.playerID = x[2]
x.date = x[42] + app.config.timestampSuffix
x.icon = {
form: ['icon', 'ship', 'ball', 'ufo', 'wave', 'robot', 'spider'][+x[14]],
icon: +x[9],
col1: +x[10],
col2: +x[11],
glow: +x[15] > 0
}
keys.forEach(k => delete x[k])
})

View file

@ -34,6 +34,13 @@ module.exports = async (app, req, res) => {
x.coins = +x[13]
x.usercoins = +x[17]
x.diamonds = +x[46]
x.icon = {
form: ['icon', 'ship', 'ball', 'ufo', 'wave', 'robot', 'spider'][+x[14]],
icon: +x[9],
col1: +x[10],
col2: +x[11],
glow: +x[15] > 0
}
keys.forEach(k => delete x[k])
})
return res.send(scores)

View file

@ -29,7 +29,6 @@ module.exports = async (app, req, res, api, getLevels) => {
let account = app.parseResponse(body)
if (!foundID && app.config.cacheAccountIDs) app.accountCache[username.toLowerCase()] = [account[16], account[2]]
else console.log(app.accountCache)
let userData = {
username: account[1],

View file

@ -1,5 +1,5 @@
@import url('https://fonts.googleapis.com/css?family=Roboto');
@font-face {font-family: Oxygene2; src: url('https://gdcolon.com/assets/Oxygene2.ttf')}
@font-face {font-family: Pusab; src: url('./../assets/Pusab.ttf')}
.gdButton {
cursor: pointer;

BIN
assets/trophies/0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

BIN
assets/trophies/1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

BIN
assets/trophies/2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5 KiB

BIN
assets/trophies/3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

BIN
assets/trophies/4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

BIN
assets/trophies/5.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4 KiB

BIN
assets/trophies/6.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

BIN
assets/trophies/7.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

View file

@ -349,6 +349,7 @@
<p>coins: Number of secret coins</p>
<p>usercoins: Number of user coins</p>
<p>diamonds: Number of diamonds</p>
<p>icon: The icon preview showed next to the player's name</p>
</div>
<br>
@ -444,6 +445,7 @@
<p>percent: Percent on the level</p>
<p>coins: Number of coins obtained (0-3)</p>
<p>date: Time since score was submitted (sent as "x days/weeks/months" ago, since it's all the API sends)</p>
<p>icon: The icon preview showed next to the player's name</p>
</div>
<br>
@ -495,10 +497,10 @@
<p class="red">username: The commenter's username</p>
<p class="red">playerID: The commenter's ID</p>
<p class="red">accountID: The commenter's account ID</p>
<p class="red">form: The form of the commenter's icon</p>
<p class="red">percent: The commenter's percent on the level, if provided</p>
<p class="red">color: The RGB font color of the comment. Note that the yellow author text is not included</p>
<p class="red">moderator: If type of moderator the commenter is. Returns 0 (none), 1 (mod) or 2 (elder, green text)</p>
<p class="red">icon: The icon preview showed next to the commenter's name</p>
<p class="blue">results: The total number of comments (first comment only, doesn't work with comment history)</p>
<p class="blue">pages: The total number of pages, starting at 1</p>
<p class="blue">range: The index of comments that were fetched</p>

View file

@ -251,7 +251,7 @@ fetch(`../api${!history ? window.location.pathname : "/comments/" + lvl.playerID
commentHTML = !compact ? `
<div class="commentBG ${bgCol}">
<div class="comment" commentID="${x.ID}">
<img class="inline" src="../icon/${userLink}?form=${x.form}" height=21% style="margin-right: 0.8%">
<img class="inline" src="../icon/icon?form=${x.icon.form}&icon=${x.icon.icon}&col1=${x.icon.col1}&col2=${x.icon.col2}&glow=${x.icon.glow}&size=auto" height=21% style="margin-right: 0.8%">
<a href=../${x.accountID == "0" ? `search/${x.playerID}?user` : `../u/${userLink}`}>
<h2 class="inline gdButton ${x.accountID == "0" ? "green unregistered" : ""}">${userName}</h2></a>
${modNumber > 0 ? `<img class="inline" src="../assets/mod${modNumber == 2 ? "-elder" : ""}.png" height=18% style="margin-left: 0.6%;">` : ""}
@ -276,7 +276,7 @@ fetch(`../api${!history ? window.location.pathname : "/comments/" + lvl.playerID
: `
<div class="commentBG compactBG ${bgCol}">
<div class="comment compact" commentID="${x.ID}">
<img class="inline" src="../icon/${userLink}?form=${x.form}" height=21% style="margin-right: 0.8%">
<img class="inline" src="../icon/icon?form=${x.icon.form}&icon=${x.icon.icon}&col1=${x.icon.col1}&col2=${x.icon.col2}&glow=${x.icon.glow}&size=auto" height=21% style="margin-right: 0.8%">
<a href=../${x.accountID == "0" ? `search/${x.playerID}?user` : `../u/${userLink}`}>
<h2 class="inline gdButton ${x.accountID == "0" ? "green unregistered" : ""}">${userName}</h2></a>
${modNumber > 0 ? `<img class="inline" src="../assets/mod${modNumber == 2 ? "-elder" : ""}.png" height=18% style="margin-left: 0.6%;">` : ""}
@ -368,7 +368,7 @@ $('#autoMode').click(function() {
document.title = "[LIVE] " + document.title
$('#liveText').show()
$('#autoMode').attr('src', `../assets/stopbutton.png`)
interval = setInterval(function() { appendComments(true) }, 2000)
interval = setInterval(function() { appendComments(true) }, 3000)
}
else {
document.title = document.title.slice(6)

View file

@ -70,12 +70,12 @@
</body>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/jquery.lazy/1.7.9/jquery.lazy.min.js"></script>
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/jquery.lazy/1.7.9/jquery.lazy.plugins.min.js"></script>
<script async type="text/javascript" src="../assets/sizecheck.js"></script>
<script type="text/javascript" src="../assets/dragscroll.js"></script>
<script>
let trophies = [1, 5, 10, 25, 50, 100, 250]
let demonID = Math.round(window.location.pathname.split('/')[2])
if (!demonID || demonID > 250 || demonID < 1) window.location.href = "../../../"
@ -108,7 +108,7 @@ fetch(`https://pointercrate.com/api/v1/demons/${demonID}/`).then(res => res.json
<div class="center" style="position:absolute; transform:scale(0.82) translate(-28vh, -10vh); height: 10%; width: 12.5%;">
<div class="inline" style="width: 50%; margin: 0% 20% 0% 10%; transform:translateY(-15%)"><h2 class="inline center" style="transform:scale(${1-shift[0]}) translateX(-${shift[1]}%)">${y+1}</h2></div>
<img class="inline spaced lazyLoad" data-src="../icon/${x.player.name}" height="120%" style="margin-bottom: 0%; transform:scale(1.1)">
<img class="inline spaced" src="../trophies/${trophies.findIndex(z => y+1 <= z) + 1}.png" height="120%" style="margin-bottom: 0%; transform:scale(1.1)">
</div>
<div style="${!x.video ? "display: none; " : ""}position:absolute; width: 12.5%; height: 15%; right: 0%">
@ -122,7 +122,6 @@ fetch(`https://pointercrate.com/api/v1/demons/${demonID}/`).then(res => res.json
})
$('#loading').hide();
$('.lazyLoad').Lazy({ appendScroll: '#searchBox' });
})
$(document).keydown(function(k) {

View file

@ -25,7 +25,7 @@
</div>
<div class="popup" id="infoDiv">
<div class="fancybox bounce center supercenter">
<div class="fancybox bounce center supercenter" style="width: 80vh">
<h2 class="smaller center" style="font-size: 5.5vh">Leaderboard Info</h2>
<p class="bigger center" id="infoText" style="line-height: 5vh; margin-top: 1.5vh"></p>
<img src="../assets/ok.png" width=20%; class="gdButton center" onclick="$('.popup').hide()">
@ -75,12 +75,13 @@
<script>
let sort = "stars"
let trophies = [1, 3, 5, 10, 25, 50, 100]
let top250Text =
`The <g>Top 250<> leaderboard contains the <g>top 250 players<>, sorted by <y>star<> value. However, due to <o>hackers<> flooding the leaderboard, this leaderboard has been <b>frozen<> for well over 2 years and displays <o>very outdated information<>.`
let accurateText =
`The <g>Accurate Leaderboard<> is a highly accurate, hacker-proof leaderboard with <y>proper stats and positioning<> (unlike the regular one). It is managed by <b>XShadowWizardX, Pepper360, Octeract<>, and many many other helpers. You can check out their interactive <a target="_blank" href="https://docs.google.com/spreadsheets/d/10lbPnDYJXhbtlA0ls0cGjjX_osFSG559IDrTbhgPHvc"><span style="color:aqua; text-decoration: underline">leaderboard spreadsheet here<></a>.`
`The <g>Accurate Leaderboard<> is a highly accurate, hacker-proof leaderboard with <y>proper stats and positioning<> (unlike the regular one). It is managed by <b>XShadowWizardX, Pepper360, Octeract<>, and many many other helpers. Be sure to check out their <a target="_blank" href="https://docs.google.com/spreadsheets/d/10lbPnDYJXhbtlA0ls0cGjjX_osFSG559IDrTbhgPHvc"><span style="color:aqua; text-decoration: underline">interactive leaderboard spreadsheet<></a> or join their <a target="_blank" href="https://discord.gg/Uz7pd4d"><span style="color:aqua; text-decoration: underline">Discord server<></a>.`
let creatorText =
`The <g>Creators Leaderboard<> is sorted by <g>creator points<>, rather than stars. A player's <g>creator points<> (CP) is calculated by counting their number of <y>star rated<> levels, plus an extra point for every level that has been <b>featured<>, plus an additional point for <o>epic rated<> levels.`
@ -108,7 +109,7 @@ function leaderboard(val) {
$('#searchBox').html(`<div style="height: 4.5%"></div>`)
$('.ranking').remove()
if (val == type && res != -1) res.forEach((x, y) => {
if (val == type && res != -1 && res.length) res.forEach((x, y) => {
$('#searchBox').append(`<div class="searchresult leaderboardSlot">
<h2 class="small inline gdButton" style="margin-top: 1.5%"><a href="../u/${x.username}">${x.username}</a></h2>
@ -124,13 +125,23 @@ function leaderboard(val) {
</h3>
<div class="center ranking" style="position:absolute; transform:scale(0.82) translate(-20.7vh, -20vh); height: 10%; width: 12.5%;">
<img class="spaced lazyLoad" data-src="./icon/${x.username}" height="150%"
style="margin-bottom: 0%; transform:scale(1.1)">
${type == "accurate" ? `<img class="spaced" src="./trophies/${trophies.findIndex(z => x.rank <= z) + 1}.png" height="150%" style="margin-bottom: 0%; transform:scale(1.1)">` :
`<img class="spaced lazyLoad" data-src="./icon/icon?form=${x.icon.form}&icon=${x.icon.icon}&col1=${x.icon.col1}&col2=${x.icon.col2}&glow=${x.icon.glow}&size=auto" height="150%" style="margin-bottom: 0%; transform:scale(1.1)">`}
<h2 class="small" style="margin-top: 2%">${x.rank}</h2>
</div>
</div>`)
})
else if (type == "accurate") {
$('#searchBox').append(`<div style="width: 100%">
<h1 style="margin-top: 14%"class="center">The Accurate Leaderboard<br>is temporarily disabled</h1>
<p class="center" style="padding: 0% 10%">Due to RobTop's new <span style="color: yellow">API enforcements</span>, the Accurate Leaderboard is <span style="color: cyan">no longer able to load reliably</span>. A fix is being worked on and will hopefully be released in <span style="color: lime">a day or two</span>.</p>
</div>`)
}
$('#searchBox').append('<div style="height: 4.5%"></div>')
$('#loading').hide();
$('.lazyLoad').Lazy({ appendScroll: '#searchBox' });

View file

@ -98,7 +98,7 @@ function leaderboard() {
<div class="center" style="position:absolute; transform:scale(0.82) translate(-28vh, -10vh); height: 10%; width: 12.5%;">
<div class="inline" style="width: 50%; margin: 0% 20% 0% 10%; transform:translateY(-15%)"><h2 class="inline center" style="transform:scale(${1-shift[0]}) translateX(-${shift[1]}%)">${x.rank}</h2></div>
<img class="inline spaced lazyLoad" data-src="../icon/${x.username}" height="120%" style="margin-bottom: 0%; transform:scale(1.1)">
<img class="inline spaced lazyLoad" data-src="../icon/icon?form=${x.icon.form}&icon=${x.icon.icon}&col1=${x.icon.col1}&col2=${x.icon.col2}&glow=${x.icon.glow}&size=auto" height="120%" style="margin-bottom: 0%; transform:scale(1.1)">
</div>
<div class="center" style="position:absolute; height: 10%; width: 12.5%;">
@ -109,12 +109,10 @@ function leaderboard() {
</div>`)
})
$('.lazyLoad').Lazy({ appendScroll: '#searchBox' });
$('#searchBox').append('<div style="height: 4.5%"></div>')
loading = false;
$('#loading').hide();
$('.lazyLoad').Lazy({
appendScroll: '#searchBox'
});
})
}

View file

@ -1,5 +1,5 @@
<head>
<title>#GDBrowserIsOverParty</title>
<title>Geometry Dash Browser!</title>
<meta charset="utf-8">
<link href="../css/browser.css?v=1" type="text/css" rel="stylesheet">
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-135255146-3"></script><script>window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);}gtag('js', new Date());gtag('config', 'UA-135255146-3');</script>
@ -39,15 +39,14 @@
let line = 0
let dialogue = [
"Ah frick, here we go again.", "Happy to see me?", "Aw, that's a shame", "Wondering what happened to GDBrowser?",
"Well, we got IP banned", "By RubRub himself", "...again", "Not entirely sure why this time", "Fear not, though.",
"Things will be worked out ASAP", "And if I obey RubRub's orders...",
"Hi there!", "Wondering what happened to GDBrowser?", "Well, we got IP banned", "By RubRub himself", "Probably because of spam",
"Fear not, though.", "Things will be worked out ASAP", "And if I obey RubRub's orders...",
"We'll be back in no time", "Plus you get to hang out with me!", "But in the meantime", "Yeah nothing is gonna work",
"API is down as well", "But keep in mind we're on GitHub", "So you can use GDBrowser locally",
"Gotta be big brain for that though...", "At least the icon kit is okay", "Well, mostly", "Anywhooo",
"Enjoy your time here in the Vault", "I'm sure you'll find something to do", "Just stay six feet from me",
"...", ".....", "Yeah that's all I have to say", "You can stop clicking now",
"I'm just gonna repeat myself", "Like my iPod stuck on replay", "*ahem*"
"I'm just gonna repeat myself", "*ahem*"
]
$("#glubfub").click(function() {

View file

@ -92,13 +92,13 @@
</h3>
<div class="lightBox center" id="iconsDiv" style="margin: 2% auto; width: 105vh">
<img src="../icon/[[USERNAME]]?form=cube" title="Cube [[ICON]]">
<img src="../icon/[[USERNAME]]?form=ship" title="Ship [[SHIP]]" style="height: 8%">
<img src="../icon/[[USERNAME]]?form=ball" title="Ball [[BALL]]" >
<img src="../icon/[[USERNAME]]?form=ufo" title="UFO [[UFO]]">
<img src="../icon/[[USERNAME]]?form=wave" title="Wave [[WAVE]]" style="height: 7%">
<img src="../icon/[[USERNAME]]?form=robot" title="Robot [[ROBOT]]" >
<img src="../icon/[[USERNAME]]?form=spider" title="Spider [[SPIDER]]">
<img src="../icon/icon?form=cube&icon=[[ICON]]&col1=[[COL1]]&col2=[[COL2]]&glow=[[GLOW]]" title="Cube [[ICON]]">
<img src="../icon/icon?form=ship&icon=[[SHIP]]&col1=[[COL1]]&col2=[[COL2]]&glow=[[GLOW]]" title="Ship [[SHIP]]" style="height: 8%">
<img src="../icon/icon?form=ball&icon=[[BALL]]&col1=[[COL1]]&col2=[[COL2]]&glow=[[GLOW]]" title="Ball [[BALL]]" >
<img src="../icon/icon?form=ufo&icon=[[UFO]]&col1=[[COL1]]&col2=[[COL2]]&glow=[[GLOW]]" title="UFO [[UFO]]">
<img src="../icon/icon?form=wave&icon=[[WAVE]]&col1=[[COL1]]&col2=[[COL2]]&glow=[[GLOW]]" title="Wave [[WAVE]]" style="height: 7%">
<img src="../icon/icon?form=robot&icon=[[ROBOT]]&col1=[[COL1]]&col2=[[COL2]]&glow=[[GLOW]]" title="Robot [[ROBOT]]" >
<img src="../icon/icon?form=spider&icon=[[SPIDER]]&col1=[[COL1]]&col2=[[COL2]]&glow=[[GLOW]]" title="Spider [[SPIDER]]">
<img src="../deatheffects/[[DEATHEFFECT]].png" title="Death Effect [[DEATHEFFECT]]" id="deatheffect">
</div>

View file

@ -87,7 +87,7 @@ app.clean = function(text) {if (!text || typeof text != "string") return text; e
// ASSETS
let assets = ['css', 'assets', 'blocks', 'deatheffects', 'difficulty', 'gauntlets', 'gdicon', 'iconkitbuttons', 'levelstyle', 'objects']
let assets = ['css', 'assets', 'blocks', 'deatheffects', 'difficulty', 'gauntlets', 'gdicon', 'iconkitbuttons', 'levelstyle', 'objects', 'trophies']
app.use('/css', express.static(__dirname + '/assets/css'));
app.use('/assets', express.static(__dirname + '/assets', {maxAge: "7d"}));
app.use('/blocks', express.static(__dirname + '/assets/blocks', {maxAge: "7d"}));
@ -98,6 +98,7 @@ app.use('/gdicon', express.static(__dirname + '/icons/iconkit', {maxAge: "7d"}))
app.use('/iconkitbuttons', express.static(__dirname + '/assets/iconkitbuttons', {maxAge: "7d"}));
app.use('/levelstyle', express.static(__dirname + '/assets/initial', {maxAge: "7d"}));
app.use('/objects', express.static(__dirname + '/assets/objects', {maxAge: "7d"}));
app.use('/trophies', express.static(__dirname + '/assets/trophies', {maxAge: "7d"}));
// POST REQUESTS