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