added user id array support

This commit is contained in:
Yannik
2023-08-18 15:32:09 +02:00
parent ed4149e7a7
commit cbc0c85c76
2 changed files with 85 additions and 45 deletions

View File

@@ -1 +1,2 @@
.env .env
node_modules/

View File

@@ -1,10 +1,10 @@
require('dotenv').config(); require('dotenv').config();
const request = require('request');
const express = require('express'); const express = require('express');
const axios = require('axios');
const path = require('path'); const path = require('path');
var port = process.env.PORT || 8080; const port = process.env.PORT || 8080;
var botToken = process.env.BOT_TOKEN; const botToken = process.env.BOT_TOKEN;
const app = express(); const app = express();
app.use(express.json()); app.use(express.json());
@@ -17,51 +17,90 @@ app.get('/', function (req, res) {
res.sendFile(path.join(__dirname, '/index.html')); res.sendFile(path.join(__dirname, '/index.html'));
}); });
app.get("/:userIds", async (req, res) => { const userCache = {};
const userIds = req.params.userIds.split(",");
const results = {};
const promises = userIds.map(async userId => { const delay = ms => new Promise(resolve => setTimeout(resolve, ms));
const options = {
url: `https://discord.com/api/v10/users/${userId}`,
headers: {
'Authorization': 'Bot ' + botToken
}
};
return new Promise((resolve, reject) => { async function fetchUserDataWithRetry(userId) {
request(options, (error, response, body) => { let retries = 0;
if (!error && response.statusCode == 200) { let delayTime = 1000;
var preuser = JSON.parse(body);
var user = { while (retries < 3) {
"global_name": preuser.global_name, try {
"public_flags": preuser.public_flags, const response = await axios.get(`https://discord.com/api/v10/users/${userId}`, {
"flags": preuser.flags, headers: {
"accent_color": preuser.accent_color, 'Authorization': 'Bot ' + botToken
"avatar_decoration": preuser.avatar_decoration,
"banner": preuser.banner,
"banner_color": preuser.banner_color,
};
if (preuser.avatar_decoration == null)
user.avatar_decoration = null;
else
user.avatar_decoration = "https://cdn.discordapp.com/avatar-decorations/" + preuser.id + "/" + preuser.avatar_decoration + ".png";
if (preuser.banner == null)
user.banner_url = null;
else
user.banner_url = "https://cdn.discordapp.com/banners/" + preuser.id + "/" + preuser.banner + ".png";
results[userId] = user;
resolve();
} else {
reject(response.statusCode);
} }
}); });
}); return response.data;
}); } catch (error) {
if (error.response && error.response.status === 429) {
const retryAfter = error.response.headers['retry-after'] || delayTime;
console.error("Rate limited. Retrying after", retryAfter, "ms");
await delay(retryAfter);
delayTime *= 2;
retries++;
} else {
console.error("Error fetching user data:", error);
return null;
}
}
}
return null;
}
app.get("/:userIds", async (req, res) => {
const userIds = req.params.userIds.split(",");
var results = {};
var preresults = {};
try { try {
await Promise.all(promises); for (const userId of userIds) {
res.send(results); if (userCache[userId]) {
} catch (errorStatusCode) { preresults[userId] = userCache[userId];
res.status(errorStatusCode).send("Error fetching user data."); } else {
const userData = await fetchUserDataWithRetry(userId);
if (userData !== null) {
userCache[userId] = userData;
preresults[userId] = userData;
} else {
preresults[userId] = { error: "User not found or API error" };
}
}
}
console.log("Results:", preresults);
for (var preresult in preresults) {
var result = {
"global_name": preresult.global_name,
"public_flags": preresult.public_flags,
"flags": preresult.flags,
"accent_color": preresult.accent_color,
"avatar_decoration": preresult.avatar_decoration,
"banner": preresult.banner,
"banner_color": preresult.banner_color,
};
if (preresult.avatar_decoration == null)
result.avatar_decoration = null;
else
result.avatar_decoration = "https://cdn.discordapp.com/avatar-decorations/" + preresult.id + "/" + preresult.avatar_decoration + ".png";
if (preresult.banner == null)
result.banner_url = null;
else
result.banner_url = "https://cdn.discordapp.com/banners/" + preresult.id + "/" + preresult.banner + ".png";
results[preresult.id] = result;
}
res.send(preresults); //should be results
} catch (error) {
console.error("Error:", error);
res.status(500).json({ error: "Internal server error" });
}
});
app.use((err, req, res, next) => {
if (err) {
console.error("Error:", err);
res.status(500).json({ error: "Internal server error" });
} else {
next();
} }
}); });