From d3ac55f71b101ec3c67866ea740aa86c8c1c7012 Mon Sep 17 00:00:00 2001 From: luluwaffless Date: Thu, 17 Oct 2024 14:23:53 -0300 Subject: [PATCH] commit --- .gitignore | 4 ++ config.js | 34 +++++++++ index.js | 134 +++++++++++++++++++++++++++++++++++ package.json | 15 ++++ public/icon.png | Bin 0 -> 304340 bytes public/index.html | 175 ++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 362 insertions(+) create mode 100644 .gitignore create mode 100644 config.js create mode 100644 index.js create mode 100644 package.json create mode 100644 public/icon.png create mode 100644 public/index.html diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..adf60c3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.env +package-lock.json +node_modules/ +public/logs.txt \ No newline at end of file diff --git a/config.js b/config.js new file mode 100644 index 0000000..8869a9e --- /dev/null +++ b/config.js @@ -0,0 +1,34 @@ +export default { + users: { + 3887932258: { + name: "luucc_ss", + displayName: "lulu", + preDisplay: "a", + } + /* + 99060139: { + name: "JuliaMinegirl", + displayName: "julia", + preDisplay: "a" + }, + 99451656: { + name: "Crisminegirl", + displayName: "cris", + preDisplay: "a" + }, + 104607645: { + name: "TexWillerHS", + displayName: "tex", + preDisplay: "o" + },*/ + }, + discord: { + status: "JuliaMinegirl πŸŽ€", + name: "rbxuserspy", + displayName: "rbx user spy :3", + description: "stalkeando a julia minegirl", + vcStatusId: "1296162311308054528", + updatesTcId: "1296158553702400040" + }, + port: 80 +}; \ No newline at end of file diff --git a/index.js b/index.js new file mode 100644 index 0000000..2f72e7a --- /dev/null +++ b/index.js @@ -0,0 +1,134 @@ +import config from "./config.js"; +import fs from "node:fs"; +import axios from "axios"; +import dotenv from "dotenv"; +import express from "express"; +import { Client, GatewayIntentBits, ActivityType, ButtonBuilder, ButtonStyle, ActionRowBuilder } from "discord.js"; +dotenv.config(); +const app = express(); +app.use(express.static("public")); +let sessionInfo = { checks: 0, users: {}, erd: 0, efd: 0, esm: 0, startTime: new Date().toISOString(), nextCheck: "" }; +let tc; +Object.keys(config.users).forEach((user) => { + sessionInfo.users[user] = { + lastStatus: -1, + lastStatusBegin: "", + lastLocation: "", + placeId: null, + gameId: null, + status: 0 + }; +}); +async function log(data) { + return fs.appendFileSync("public/logs.txt", `[${new Date().toISOString()}] ${data}\n`); +}; +const send = async (c) => await tc.send(c).catch((err) => { + sessionInfo.esm += 1; + log(`❌ Line 19: Error sending message: ${error}`); +}); +function timeSince(isostr) { + const timestamp = new Date(isostr).getTime(); + const now = new Date().getTime(); + const diff = now - timestamp; + const hours = Math.floor(diff / (1000 * 60 * 60)); + const minutes = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60)); + const seconds = Math.floor((diff % (1000 * 60)) / 1000); + let parts = []; + if (hours && hours > 0) parts.push(`${hours} hora${hours != 1 ? "s" : ""}`); + if (minutes && minutes > 0) parts.push(`${minutes} minuto${minutes != 1 ? "s" : ""}`); + if (seconds && seconds > 0) parts.push(`${seconds} segundo${seconds != 1 ? "s" : ""}`); + return parts.length > 0 ? parts.join(", ") : "agora"; +}; +app.get("/info", (_, res) => { + res.json(sessionInfo); +}); +app.get("/config", (_, res) => { + res.json(config); +}); +app.get("/check", async function (_, res) { + await check(true); + res.json(sessionInfo); +}); +app.get("/user", (req, res) => { + const response = config.users[req.query.id]; + response ? res.json(response) : res.sendStatus(404); +}); +const statusEmoji = ['⚫', 'πŸ”΅', '🟒', '🟠', '❔']; +const statusText = ['offline', 'online', 'jogando', 'no studio', 'invisΓ­vel']; +async function check(individual) { + await axios.post("https://presence.roblox.com/v1/presence/users", { "userIds": Object.keys(sessionInfo.users) }, { + headers: { + "accept": "application/json", + "Content-Type": "application/json", + "Cookie": process.env.cookie + }, withCredentials: true + }) + .then(function (response) { + if (response.data["userPresences"] && response.data.userPresences.length > 0) { + response.data.userPresences.forEach((presence) => { + console.log(presence); + const { userPresenceType, lastLocation, placeId, gameId, userId } = presence; + if (userPresenceType != sessionInfo.users[presence.userId].status || presence.gameId != sessionInfo.users[presence.userId].gameId) { + sessionInfo.users[userId].lastStatus = sessionInfo.users[userId].status; + sessionInfo.users[userId].status = userPresenceType; + sessionInfo.users[userId].placeId = placeId; + sessionInfo.users[userId].gameId = gameId; + if (presence.userPresenceType === 2 && placeId && gameId) { + const button = new ButtonBuilder() + .setLabel('entrar') + .setURL(`https://deepblox.onrender.com/experiences/start?placeId=${placeId}&gameInstanceId=${gameId}`) + .setStyle(ButtonStyle.Link); + const row = new ActionRowBuilder() + .addComponents(button); + send({ + content: `\`🟒\` **[${config.users[userId].preDisplay} ${config.users[userId].displayName}]()** estΓ‘ jogando [${lastLocation}](https://www.roblox.com/games/${placeId})${sessionInfo.users[userId].lastStatus > 0 ? `\n-# ficou ${statusText[sessionInfo.users[userId].lastStatus]}${sessionInfo.users[userId].lastStatus === 2 ? " " + sessionInfo.users[userId].lastLocation : ""} por ${timeSince(sessionInfo.users[userId].lastStatusBegin)}` : ""}`, + components: [row] + }); + } else { + send(`\`${statusEmoji[userPresenceType]}\` **[${config.users[userId].preDisplay} ${config.users[userId].displayName}]()** estΓ‘ ${statusText[userPresenceType]}${sessionInfo.users[userId].lastStatus > 0 ? `\n-# ficou ${statusText[sessionInfo.users[userId].lastStatus]}${sessionInfo.users[userId].lastStatus === 2 ? " " + sessionInfo.users[userId].lastLocation : ""} por ${timeSince(sessionInfo.users[userId].lastStatusBegin)}` : ""}`); + }; + sessionInfo.users[userId].lastLocation = lastLocation; + sessionInfo.users[presence.userId].lastStatusBegin = new Date().toISOString(); + }; + }); + } else { + log(`❌ Line 214: Error reading data: ${response.data}`); + }; + }) + .catch(function (error) { + sessionInfo.efd += 1; + log(`❌ Line 219: Error fetching data: ${error}`); + }); + sessionInfo.checks += 1; + if (!individual) sessionInfo.nextCheck = new Date(new Date().getTime() + 30000).toISOString(); +}; +const client = new Client({ intents: [GatewayIntentBits.Guilds] }); + +const changeName = (n, c) => { if (c.name != n) return c.setName(n); }; +client.on('ready', async function () { + tc = await client.channels.fetch(config.discord.updatesTcId); + const vc = await client.channels.fetch(config.discord.vcStatusId); + await changeName("bot: online 🟒", vc); + client.user.setPresence({ + activities: [{ + name: config.discord.status, + type: ActivityType.Watching + }], + status: 'online' + }); + check(); + setInterval(check, 30000); + app.listen(config.port, function () { + console.log("βœ… http://localhost:" + config.port); + }); + log("🟒 Online"); + for (let evt of ['SIGTERM', 'SIGINT', 'SIGHUP']) { + process.on(evt, async function () { + process.stdin.resume(); + await changeName("bot: offline πŸ”΄", vc); + await log("πŸ”΄ Offline"); + process.exit(); + }); + }; +}); +client.login(process.env.token); \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..4c20cc4 --- /dev/null +++ b/package.json @@ -0,0 +1,15 @@ +{ + "name": "rbxuserspy", + "version": "1.0.0", + "main": "index.js", + "type": "module", + "scripts": { + "start": "node ." + }, + "dependencies": { + "axios": "^1.7.7", + "discord.js": "^14.16.3", + "dotenv": "^16.4.5", + "express": "^4.21.1" + } +} \ No newline at end of file diff --git a/public/icon.png b/public/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d8b7ec464137f7bc0aeedc2e749d80964d1c305e GIT binary patch literal 304340 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