311 lines
6.9 KiB
JavaScript
311 lines
6.9 KiB
JavaScript
const express = require("express")
|
|
const router = express.Router()
|
|
const user = require("./../..//model/user.js")
|
|
const games = require("./../../model/games.js")
|
|
const RelativeTime = require("@yaireo/relative-time")
|
|
const relativeTime = new RelativeTime()
|
|
const bodyParser = require("body-parser")
|
|
router.use(bodyParser.json())
|
|
|
|
router.get("/:id", async (req, res) => {
|
|
var id = req.params.id
|
|
if (isNaN(parseFloat(id)) === true) {
|
|
return res.json({ error: true })
|
|
}
|
|
const response = await user
|
|
.findOne({ userid: id })
|
|
.lean()
|
|
.select("-inventory")
|
|
|
|
if (!response) {
|
|
return res.json({ error: true, message: "404" })
|
|
}
|
|
|
|
let status = { status: "Offline" }
|
|
if (response.status) {
|
|
status = JSON.parse(response.status)
|
|
}
|
|
const actualTimeMilliseconds = new Date().getTime()
|
|
if (
|
|
(response.timesincelastrequest &&
|
|
actualTimeMilliseconds - response.timesincelastrequest >=
|
|
60000 * 3 /*3 minutes*/ &&
|
|
status &&
|
|
status.status.includes("Playing") === false) ||
|
|
(response.timesincelastrequest &&
|
|
actualTimeMilliseconds - response.timesincelastrequest >=
|
|
60000 * 3 /*3 minutes*/ &&
|
|
!status)
|
|
) {
|
|
// been 3 minutes since last request mark as offline make sure we don't mark them offline while they are playing a game
|
|
status.status = "Offline"
|
|
response.status = JSON.stringify(status)
|
|
status = JSON.parse(response.status)
|
|
}
|
|
if (
|
|
(response.timesincelastrequest &&
|
|
actualTimeMilliseconds - response.timesincelastrequest <=
|
|
60000 * 3 /*3 minutes*/ &&
|
|
status &&
|
|
status.status.includes("Playing") === false) ||
|
|
(response.timesincelastrequest &&
|
|
actualTimeMilliseconds - response.timesincelastrequest <=
|
|
60000 * 3 /*3 minutes*/ &&
|
|
!status)
|
|
) {
|
|
status.status = "Online"
|
|
response.status = JSON.stringify(status)
|
|
status = JSON.parse(response.status)
|
|
}
|
|
|
|
return res.json({
|
|
error: false,
|
|
userinfo: {
|
|
joindate: response.joindate,
|
|
joindateepoch: new Date(response._id.getTimestamp()).getTime(),
|
|
lastonline: relativeTime.from(
|
|
new Date(response.timesincelastrequest),
|
|
),
|
|
lastonlineepoch: response.timesincelastrequest,
|
|
coins: response.coins,
|
|
username: response.username,
|
|
userid: response.userid,
|
|
friends: response.friends,
|
|
admin: response.admin,
|
|
discordid: response.discordid,
|
|
membership: response.membership,
|
|
bio: response.bio,
|
|
status,
|
|
followers: response.followers?.length,
|
|
css: response.css,
|
|
aboutme: response.aboutme,
|
|
},
|
|
})
|
|
})
|
|
|
|
router.post("/:id/inventory", async (req, res) => {
|
|
var id = req.params.id
|
|
const resultsPerPage = 5
|
|
let page = req.body.page ?? 0
|
|
if (page != 0) {
|
|
page -= 1
|
|
}
|
|
let filter = req.body.filter ?? "Shirts"
|
|
console.log(req.body)
|
|
filter = filter.charAt(0).toUpperCase() + filter.slice(1)
|
|
console.log(filter)
|
|
let onlywearing = req.body.onlywearing ?? false
|
|
if (isNaN(parseFloat(id)) === true) {
|
|
return res.json({ error: true })
|
|
}
|
|
console.log(onlywearing)
|
|
let response
|
|
if (onlywearing === true) {
|
|
response = await user.aggregate([
|
|
{
|
|
$match: {
|
|
userid: parseInt(id),
|
|
},
|
|
},
|
|
{
|
|
$project: {
|
|
inventory: 1,
|
|
},
|
|
},
|
|
{
|
|
$unwind: {
|
|
path: "$inventory",
|
|
},
|
|
},
|
|
{
|
|
$match: {
|
|
"inventory.Equipped": true,
|
|
},
|
|
},
|
|
{
|
|
$group: {
|
|
_id: "$_id",
|
|
inventory: {
|
|
$push: "$inventory",
|
|
},
|
|
},
|
|
},
|
|
])
|
|
} else {
|
|
response = await user.aggregate([
|
|
{
|
|
$match: {
|
|
userid: parseInt(id),
|
|
},
|
|
},
|
|
{
|
|
$project: {
|
|
inventory: 1,
|
|
},
|
|
},
|
|
{
|
|
$unwind: {
|
|
path: "$inventory",
|
|
},
|
|
},
|
|
{
|
|
$match: {
|
|
"inventory.Type": filter,
|
|
},
|
|
},
|
|
{
|
|
$group: {
|
|
_id: "$_id",
|
|
inventory: {
|
|
$push: "$inventory",
|
|
},
|
|
},
|
|
},
|
|
{
|
|
$project: {
|
|
inventory: {
|
|
$slice: [
|
|
"$inventory",
|
|
parseFloat(page) * resultsPerPage,
|
|
resultsPerPage,
|
|
],
|
|
},
|
|
},
|
|
},
|
|
])
|
|
}
|
|
await user.populate(response, {
|
|
path: "inventory.itemdata",
|
|
select: "Name",
|
|
})
|
|
console.log(response?.[0]?.inventory?.length)
|
|
if (!response[0]?.inventory) {
|
|
return res.json({ error: false, inventory: [] })
|
|
}
|
|
if (onlywearing === true) {
|
|
// we aren't gonna use pagination for equipped yet cause lazy and its only used on peoples profiles anyways
|
|
return res.json({ error: false, inventory: response?.[0]?.inventory })
|
|
}
|
|
let responsecount
|
|
if (onlywearing === true) {
|
|
responsecount = (
|
|
await user.aggregate([
|
|
{ $match: { userid: parseInt(id) } },
|
|
{ $project: { inventory: 1 } },
|
|
{ $unwind: { path: "$inventory" } },
|
|
{
|
|
$match: {
|
|
"inventory.Type": filter,
|
|
"inventory.Equipped": onlywearing,
|
|
},
|
|
},
|
|
{ $count: "inventory" },
|
|
])
|
|
)[0].inventory
|
|
} else {
|
|
responsecount = (
|
|
await user.aggregate([
|
|
{ $match: { userid: parseInt(id) } },
|
|
{ $project: { inventory: 1 } },
|
|
{ $unwind: { path: "$inventory" } },
|
|
{ $match: { "inventory.Type": filter } },
|
|
{ $count: "inventory" },
|
|
])
|
|
)[0].inventory
|
|
}
|
|
console.log(responsecount)
|
|
//const responsecount = await user.aggregate([ { $match : { userid : id } },{$project: { count: { $size:"$inventory" }}}]) // alternative yea
|
|
|
|
if (!response) {
|
|
return res.json({ error: true, message: "404" })
|
|
}
|
|
|
|
return res.json({
|
|
error: false,
|
|
inventory: response?.[0]?.inventory,
|
|
pages: Math.ceil(Math.max(responsecount / resultsPerPage, 1)),
|
|
})
|
|
})
|
|
|
|
router.get("/:id/creations", async (req, res) => {
|
|
var id = req.params.id
|
|
if (isNaN(parseFloat(id)) === true) {
|
|
return res.json({ error: true })
|
|
}
|
|
const response = await user.findOne({ userid: id }).lean()
|
|
|
|
if (!response) {
|
|
return res.status(404).json({ error: true, message: "Not found" })
|
|
}
|
|
|
|
const gameresponse = await games
|
|
.find({ useridofowner: id })
|
|
.lean()
|
|
.select([
|
|
"idofgame",
|
|
"version",
|
|
"nameofgame",
|
|
"numberofplayers",
|
|
"visits",
|
|
"useridofowner",
|
|
])
|
|
|
|
return res.json(gameresponse)
|
|
})
|
|
|
|
router.get("/:id/visits", async (req, res) => {
|
|
var id = req.params.id
|
|
if (isNaN(parseFloat(id)) === true) {
|
|
return res.json({ error: true })
|
|
}
|
|
const response = await user.findOne({ userid: id }).lean()
|
|
|
|
if (!response) {
|
|
return res.status(404).json({ error: true, message: "Not found" })
|
|
}
|
|
|
|
const visits = await games.aggregate([
|
|
{ $match: { useridofowner: parseFloat(id) } },
|
|
{
|
|
$group: {
|
|
_id: null,
|
|
visits: {
|
|
$sum: "$visits",
|
|
},
|
|
},
|
|
},
|
|
])
|
|
|
|
return res.json({ error: false, visits: visits[0]?.visits || 0 })
|
|
})
|
|
|
|
router.get("/usernametoid/:id", async (req, res) => {
|
|
var id = req.params.id
|
|
|
|
const response = await user
|
|
.findOne({ username: { $regex: id, $options: "i" } })
|
|
.lean()
|
|
|
|
if (!response) {
|
|
console.log(response)
|
|
return res.json({ error: true })
|
|
}
|
|
|
|
return res.json({ error: false, userid: response.userid })
|
|
})
|
|
|
|
router.get("/discordidtouserid/:id", async (req, res) => {
|
|
var id = req.params.id
|
|
|
|
const response = await user.findOne({ discordid: id }).lean()
|
|
|
|
if (!response) {
|
|
console.log(response)
|
|
return res.json({ error: true })
|
|
}
|
|
|
|
return res.json({ error: false, userid: response.userid })
|
|
})
|
|
|
|
module.exports = router
|