MeteoriteH/Back/routes/games.js

322 lines
8.4 KiB
JavaScript

const express = require("express")
const router = express.Router()
const { requireAuth } = require("./../middleware/authmiddleware")
const games = require("./../model/games.js")
const catalog = require("./../model/item.js")
const { grabAuth } = require("./../middleware/grabauth.js")
const rcc = require("./../model/rcc.js")
const rcc2018 = require("./../model/rcc2018.js")
const rcc2020 = require("./../model/rcc2020.js")
const rcctalk = require("./../rcctalk")
const rcctalk2018 = require("./../rcctalk2018")
const bodyParser = require("body-parser")
router.use(bodyParser.json())
router.post("/scroll", async (req, res) => {
const resultsPerPage = 10
let cursor = req.body.cursor >= 0 ? req.body.cursor : 0
let type = req.body.type ? req.body.type : "Popular"
let allowed = [
"idofgame",
"version",
"nameofgame",
"numberofplayers",
"visits",
"useridofowner",
]
try {
if (type === "Popular") {
const response = await games
.find()
.sort({ numberofplayers: "descending", idofgame: 1 })
.skip(0 + parseFloat(cursor) * resultsPerPage)
.limit(10)
.lean()
.select(allowed)
.populate("owner", "username")
return res.json(response)
}
if (type === "OurRecommendations") {
const featured = await games
.find({ featured: true })
.skip(0 + parseFloat(cursor) * resultsPerPage)
.limit(10)
.lean()
.select(allowed)
.populate("owner", "username")
return res.json(featured)
}
if (type === "Visits") {
const mostvisitedresponse = await games
.find()
.sort({ visits: "descending", idofgame: 1 })
.skip(0 + parseFloat(cursor) * resultsPerPage)
.limit(10)
.lean()
.select(allowed)
.populate("owner", "username")
return res.json(mostvisitedresponse)
}
if (type === "NewestArrivals") {
const newest = await games
.find()
.sort({ idofgame: "descending" })
.skip(0 + parseFloat(cursor) * resultsPerPage)
.limit(10)
.lean()
.select(allowed)
.populate("owner", "username")
return res.json(newest)
}
return res.json({ status: "error", error: "wtf" })
} catch (error) {
console.log(error)
return res.json({ status: "error", error: "wtf" })
}
})
router.post("/firstpaint", async (req, res) => {
const resultsPerPage = 10
let cursor = 0
let allowed = [
"idofgame",
"version",
"nameofgame",
"numberofplayers",
"visits",
"useridofowner",
]
try {
const response = await games
.find()
.sort({ numberofplayers: "descending", idofgame: 1 })
.skip(0 + parseFloat(cursor) * resultsPerPage)
.limit(10)
.lean()
.select(allowed)
.populate("owner", "username")
const featured = await games
.find({ featured: true })
.skip(0 + parseFloat(cursor) * resultsPerPage)
.limit(10)
.lean()
.select(allowed)
.populate("owner", "username")
const mostvisitedresponse = await games
.find()
.sort({ visits: "descending", idofgame: 1 })
.skip(0 + parseFloat(cursor) * resultsPerPage)
.limit(10)
.lean()
.select(allowed)
.populate("owner", "username")
const newest = await games
.find()
.sort({ idofgame: "descending" })
.skip(0 + parseFloat(cursor) * resultsPerPage)
.limit(10)
.lean()
.select(allowed)
.populate("owner", "username")
return res.json({
Popular: { array: response },
OurRecommendations: { array: featured },
Visits: { array: mostvisitedresponse },
NewestArrivals: { array: newest },
})
} catch (error) {
console.log(error)
return res.json({ status: "error", error: "wtf" })
}
})
router.post("/shutdown", requireAuth, async (req, res) => {
const { gameid } = req.body
if (isNaN(parseFloat(gameid)) === true) {
return res.json({ status: "error", error: "Not found" })
}
const gamedoc = await games.findOne({ idofgame: gameid }).lean()
//console.log(response)
if (!gamedoc) {
return res.json({ status: "error", error: "Not found" })
}
if (
gamedoc.useridofowner != req.userdocument.userid &&
req.userdocument.admin === false
) {
// make sure we only let game owners and admins shut down the game
return res.json({ status: "error", error: "Not Authorized" })
}
if (gamedoc.version === "2018" || gamedoc.version === "2020") {
let instance = await rcc2018
.findOne({ PlaceId: gamedoc.idofgame })
.lean()
if (!instance) {
instance = await rcc2020
.findOne({ PlaceId: gamedoc.idofgame })
.lean()
if (!instance) {
return res.json({ status: "error", error: "Game not open." })
}
}
await rcc2018.deleteOne({ PlaceId: gamedoc.idofgame })
await rcc2020.deleteOne({ PlaceId: gamedoc.idofgame })
rcctalk2018.CloseJob("game" + gamedoc.idofgame)
}
if (gamedoc.version === "2016") {
const instance = await rcc.findOne({ PlaceId: gamedoc.idofgame }).lean()
if (!instance) {
return res.json({ status: "error", error: "Game not open." })
}
await rcc.deleteOne({ PlaceId: gamedoc.idofgame })
rcctalk.CloseJob("game" + gamedoc.idofgame)
}
return res.json({ status: "success", message: "Done!" })
})
router.post("/evictplayer", requireAuth, async (req, res) => {
const { gameid, userid } = req.body
if (isNaN(parseFloat(userid)) === true) {
return res.json({ status: "error", error: "Not found" })
}
const gamedoc = await games.findOne({ idofgame: gameid }).lean()
//console.log(response)
if (!gamedoc) {
return res.json({ status: "error", error: "Not found" })
}
if (
gamedoc.useridofowner != req.userdocument.userid &&
req.userdocument.admin === false
) {
// make sure we only let game owners and admins shut down the game
return res.json({ status: "error", error: "Not Authorized" })
}
if (gamedoc.version === "2018" || gamedoc.version === "2020") {
let instance = await rcc2018
.findOne({ PlaceId: gamedoc.idofgame })
.lean()
if (!instance) {
instance = await rcc2020
.findOne({ PlaceId: gamedoc.idofgame })
.lean()
if (!instance) {
return res.json({ status: "error", error: "Game not open." })
}
}
rcctalk2018.Execute("game" + gamedoc.idofgame, {
Mode: "EvictPlayer",
Settings: { PlayerId: userid },
})
}
if (gamedoc.version === "2016") {
const instance = await rcc.findOne({ PlaceId: gamedoc.idofgame }).lean()
if (!instance) {
return res.json({ status: "error", error: "Game not open." })
}
let kickscript = `for v, player in pairs(game:GetService("Players"):GetChildren()) do
print(player.UserId)
local tokick = ${userid}
if player.UserId == tokick then
player:Kick()
end
end`
rcctalk.Execute("game" + gamedoc.idofgame, kickscript)
}
return res.json({ status: "success", message: "Done!" })
})
router.get("/gameinfo/:id", async (req, res) => {
var id = req.params.id
if (isNaN(parseFloat(id)) === true) {
return res.json({ status: "error", error: "Not found" })
}
const response = await games
.findOne({ idofgame: id })
.lean()
.select([
"idofgame",
"version",
"nameofgame",
"numberofplayers",
"visits",
"useridofowner",
"players",
"descrption",
])
.populate("owner", "username")
//console.log(response)
//console.log(response)
if (!response) {
return res.json({ status: "error", error: "Not found" })
}
const date = new Date(response._id.getTimestamp())
response.creationdate =
date.getMonth() + 1 + "/" + date.getDate() + "/" + date.getFullYear()
return res.json({ error: false, gameinfo: response })
})
router.get("/gameinfo/:id/store", async (req, res) => {
var id = req.params.id
if (isNaN(parseFloat(id)) === true) {
return res.json({ status: "error", error: "Not found" })
}
const response = await catalog.find({ associatedgameid: id }).lean()
//console.log(response)
if (!response) {
return res.json({ status: "error", error: "Not found" })
}
return res.json({ status: "success", gameinfo: response })
})
router.post("/search", async (req, res) => {
const resultsPerPage = 100
let cursor = req.body.cursor >= 0 ? req.body.cursor : 0
function escapeRegex(text) {
return text?.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&")
}
const regex = new RegExp(escapeRegex(req.body.searchquery), "gi")
//const pages = await User.countDocuments({username: regex})/resultsPerPage
const response = await games
.find({ nameofgame: regex })
.limit(resultsPerPage)
.skip(0 + parseFloat(cursor) * resultsPerPage)
.lean()
.select([
"idofgame",
"version",
"nameofgame",
"numberofplayers",
"visits",
"useridofowner",
"players",
"descrption",
])
return res.json(response)
})
module.exports = router