import * as xor from './xor'; import * as hashes from './hash'; const handleRequestsAt = ['downloadGJLevel22', 'downloadGJLevel21', 'downloadGJLevel20', 'downloadGJLevel19', 'downloadGJLevel']; module.exports = (app) : void => { let downloadLevel = async (req, res) => { let level = await app.get('db').collection('levels').findOneAndUpdate({ id: Number(req.body.levelID) }, { $inc: { downloads: 1 } }); if (level.value == null) return res.status(200).send('-1'); level = level.value; let gameVer = Number(req.body.gameVersion || 1); let xorPassword = level.password; let description = level.description; if (gameVer > 19) { if (level.password != 0) xorPassword = xor.encode(String(level.password), '26364'); } else { description = Buffer.from(description, 'base64').toString('utf8'); } let response = `1:${level.id}:2:${level.name}:3:${description}:4:${level.levelData}:5:${1 /* level version, placeholder*/}:6:${level.userID}:8:10:9:${level.difficulty}:10:${level.downloads}:11:1:12:${level.audioTrack}:13:${level.gameVersion}:14:${level.likes}:17:${Number(level.difficulty >= 60)}:43:${Math.max((level.difficulty - 60) / 10, 0)}:25:${Number(level.auto)}:18:${level.stars}:19:${Number(level.featured)}:42:${Number(level.epic)}:45:${level.objects}:15:${level.length}:30:${level.original}:31:1:28:${0 /* upload date */}:29:${0 /* update date*/}:35:${level.songID}:36:${level.extraData}:37:${level.coins}:38:${Number(level.ratedCoins)}:39:${level.requestedStars}:46:1:47:2:48:1:40:${Number(level.hasLDM)}:27:${xorPassword}`; response += `#${hashes.hashLevel(level.levelData)}#`; level.demon = level.difficulty >= 60; let extraData = ['userID', 'stars', 'demon', 'id', 'ratedCoins', 'featured'].map(key => Number(level[key])).join(','); extraData += `,${level.password},${0 /* featured id */}`; response += `${hashes.hashSolo2(extraData)}#${extraData}`; res.status(200).send(response); }; for (let i in handleRequestsAt) app.post('/' + app.get('config').addtopath + 'database/' + handleRequestsAt[i] + '.php', downloadLevel); };