const express = require("express") const router = express.Router() const { requireAuth } = require("./../../middleware/authmiddleware") const bodyParser = require("body-parser") const User = require("./../../model/user.js") router.use(bodyParser.json()) function selectKeys(obj, keysArray) { let result = {} for (let i = 0; i < keysArray.length; i++) { if (keysArray[i] in obj === true) { result[keysArray[i]] = obj[keysArray[i]] } } return result } router.get("/", requireAuth, async (req, res) => { const filtered = selectKeys(req.userdocument, [ "username", "coins", "userid", "admin", "ugcpermission", "moderation", "colors", "inventory", "joindate", "lastclaimofcurrency", "membership", "friendrequests", "friends", "badges", "status", "timesincelastrequest", "avatartype", "discordid", "bio", "recentlyplayed", "css", ]) //console.log(filtered.recentlyplayedgames) filtered._2faenabled = false if (req.userdocument?.twofasecrets) { const json = JSON.parse(req.userdocument.twofasecrets) if (json.verified === true) { filtered._2faenabled = true } } return res.json(filtered) }) router.post("/recentgames", requireAuth, async (req, res) => { const response = await User.findOne({ userid: req.userdocument.userid }) .lean() .populate({ path: "recentlyplayedgames", select: [ "useridofowner", "nameofgame", "numberofplayers", "version", "visits", ], populate: { path: "owner", select: ["username"] }, }) .select("recentlyplayed") return res.json(response.recentlyplayedgames) }) router.post("/requestfriends", requireAuth, async (req, res) => { let response = await User.findOne({ userid: req.userdocument.userid }) .lean() .populate({ path: "friendsdata", select: ["username", "status", "timesincelastrequest"], }) .select("friends") let friendsdata = [] if (response.friendsdata) { response.friendsdata.forEach(function (item, index) { let status = { status: "Offline" } if (item.status) { status = JSON.parse(item.status) } const actualTimeMilliseconds = new Date().getTime() if ( (item.timesincelastrequest && actualTimeMilliseconds - item.timesincelastrequest >= 60000 * 3 /*3 minutes*/ && status && status.status.includes("Playing") === false) || (item.timesincelastrequest && actualTimeMilliseconds - item.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" item.status = JSON.stringify(status) status = JSON.parse(item.status) } if ( (item.timesincelastrequest && actualTimeMilliseconds - item.timesincelastrequest <= 60000 * 3 /*3 minutes*/ && status && status.status.includes("Playing") === false) || (item.timesincelastrequest && actualTimeMilliseconds - item.timesincelastrequest <= 60000 * 3 /*3 minutes*/ && !status) ) { status.status = "Online" item.status = JSON.stringify(status) status = JSON.parse(item.status) } item.status = status friendsdata.push(item) }) } // playing is 1st online is second and offline is last :) friendsdata.sort((a, b) => { if ( a.status.status.includes("Playing") === true && b.status.status !== "Playing" ) { return -1 // a should appear before b } else if ( a.status.status.includes("Playing") === false && b.status.status.includes("Playing") === true ) { return 1 // a should appear after b } else if ( a.status.status === "Online" && b.status.status === "Offline" ) { return -1 // a should appear before b } else if ( a.status.status === "Offline" && b.status.status === "Online" ) { return 1 // a should appear after b } else { return 0 // the order of a and b doesn't matter } }) return res.json(friendsdata) }) module.exports = router