const express = require("express") const router = express.Router() const bodyParser = require('body-parser') const games = require('./../model/games.js') require('dotenv').config() const RCC_HOST = process.env.RCC_HOST router.use(bodyParser.text({limit: '100mb'})) router.use(async function (req, res, next) { var ip = req.headers['cf-connecting-ip'] || req.socket.remoteAddress.replace(/^.*:/, '') console.log(ip) if (ip === RCC_HOST || ip == "::ffff:"+RCC_HOST){ return next() } return res.status(403) }) router.post('/getV2', async (req, res)=>{ const placeid = req.query.placeId const scope = req.query.scope const game = await games.findOne({idofgame: placeid}).lean() if (!game.datastore){ return res.json({"data": [{"Key": {"Scope": req.body.qkeys[0], "Target": "KEY", "Key": req.body.qkeys[1]}, "Value": "nil"}]}) } const datastore = JSON.parse(game.datastore) // first make sure database exists then make sure scope exists finally make sure key exists inside scope if (datastore[req.body.qkeys[2]] && datastore[req.body.qkeys[2]][req.body.qkeys[0]] && datastore[req.body.qkeys[2]][req.body.qkeys[0]][req.body.qkeys[1]]){ // 2 = database name // 1 = Key name // 0 = scope var wow = {"data": [{"Key": {"Scope": req.body.qkeys[0], "Target": "KEY", "Key": req.body.qkeys[1]}, "Value": datastore[req.body.qkeys[2]][req.body.qkeys[0]][req.body.qkeys[1]].value}]}; //console.log(req.body) console.dir(wow,{ depth: null }) return res.json(wow) } return res.json({"data": [{"Key": {"Scope": req.body.qkeys[0], "Target": "KEY", "Key": req.body.qkeys[1]}, "Value": "nil"}]}) }); router.post('/set', async (req, res)=>{ const placeid = req.query.placeId const game = await games.findOne({idofgame: placeid}).lean() if (!game){ return res.sendStatus(404) } let currentdatastore if (!game.datastore){ try{ await games.updateOne({idofgame: placeid}, { $set: { datastore: JSON.stringify({[req.query.key]: {[req.query.scope]: {[req.query.target]: {value: req.body.value}},type: req.query.type}}) } }, function(err, doc) { //console.log(err) }) }catch{ } return res.json({"data": [{"Key": {"Scope": req.query.key, "Target": "KEY", "Key": [req.query.target]}, "Value": req.body.value}]}) } currentdatastore = JSON.parse(game.datastore) if (currentdatastore[req.query.key]){ // if database name already exists console.log('1') if (currentdatastore[req.query.key][[req.query.scope]]){ // if database scope already exists console.log('2') if (currentdatastore[req.query.key][req.query.scope][req.query.target]){ // key already stored overwrite it console.log('3') currentdatastore[req.query.key][req.query.scope][req.query.target] = {value: req.body.value} }else{ console.log('4') currentdatastore[req.query.key][req.query.scope][req.query.target] = {value: req.body.value} // database scope exists but key doesn't so generate it } }else{ currentdatastore[req.query.key][req.query.scope] = {[req.query.target]: {value: req.body.value}} // scope doesn't exist } }else{ currentdatastore[req.query.key] = {[req.query.scope]: {[req.query.target]: {value: req.body.value}},type: req.query.type} // database doesn't exist make sure to pass database type as well } try{ await games.updateOne({idofgame: placeid}, { $set: { datastore: JSON.stringify(currentdatastore) } }, function(err, doc) { //console.log(err) }) }catch{ } //console.log(req.body) res.json({"data": [{"Key": {"Scope": req.query.key, "Target": "KEY", "Key": [req.query.target]}, "Value": req.body.value}]}) }) router.post("/increment", async (req, res) => { const placeid = req.query.placeId const game = await games.findOne({idofgame: placeid}).lean() if (!game){ return res.sendStatus(404) } let currentdatastore if (!game.datastore){ res.json({"data": {}}) } currentdatastore = JSON.parse(game.datastore) if (currentdatastore[req.query.key] && currentdatastore[req.query.key][req.query.scope] && currentdatastore[req.query.key][req.query.scope][req.query.target]){ let value = parseFloat(currentdatastore[req.query.key][req.query.scope][req.query.target].value) if (!isNaN(parseFloat(value)) === true){ // is number let newvalue = value += parseFloat(req.query.value) currentdatastore[req.query.key][req.query.scope][req.query.target].value = newvalue.toString() try{ await games.updateOne({idofgame: placeid}, { $set: { datastore: JSON.stringify(currentdatastore) } }, function(err, doc) { //console.log(err) }) }catch{ } //console.log(req.body) return res.json({"data": [{"Key": {"Scope": req.query.key, "Target": "KEY", "Key": [req.query.target]}, "Value": parseFloat(currentdatastore[req.query.key][req.query.scope][req.query.target].value)}]}) } } res.json({"data": {}}) }) router.post("/getSortedValues", async (req, res) => { const placeid = req.query.placeId const game = await games.findOne({idofgame: placeid}).lean() if (!game){ return res.sendStatus(404) } if (!game.datastore){ return res.json({"data":{"Entries":[],"ExclusiveStartKey":null}}) } const datastore = JSON.parse(game.datastore) // first make sure database exists then make sure scope exists if (datastore[req.query.key] && datastore[req.query.key][req.query.scope]){ function paginate(array, page_size, page_number) { // human-readable page numbers usually start with 1, so we reduce 1 in the first argument return array.slice((page_number - 1) * page_size, page_number * page_size); } let wow = {"data":{"Entries":[],"ExclusiveStartKey":null}} //console.log(datastore[req.query.key][req.query.scope]) const pageNumber = req.query.exclusiveStartKey??1 for (const [key, value] of Object.entries(datastore[req.query.key][req.query.scope])) { wow.data.Entries.push({Target: key,Value: value.value}) } if (req.query.ascending === "False"){ // descending order wow.data.Entries.sort((a, b) => a.Value - b.Value).reverse(); }else{ //ascending wow.data.Entries.sort((a, b) => a.Value - b.Value) } wow.data.Entries = paginate(wow.data.Entries,req.query.pageSize,pageNumber) if (Object.entries(datastore[req.query.key][req.query.scope]).length > pageNumber * req.query.pageSize ){ // if the next page exists fill the exclusivestartkey wow.data.ExclusiveStartKey = (parseFloat(pageNumber) + 1).toString() } //console.log(req.body) //console.dir(wow,{ depth: null }) return res.json(wow) } return res.json({"data":{"Entries":[],"ExclusiveStartKey":null}}) }) module.exports = router