209 lines
7.5 KiB
JavaScript
209 lines
7.5 KiB
JavaScript
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 |