107 lines
3.5 KiB
JavaScript
107 lines
3.5 KiB
JavaScript
require('dotenv').config();
|
|
const express = require('express');
|
|
const axios = require('axios');
|
|
const path = require('path');
|
|
|
|
const port = process.env.PORT || 8080;
|
|
const botToken = process.env.BOT_TOKEN;
|
|
|
|
const app = express();
|
|
app.use(express.json());
|
|
|
|
app.listen(port, () => {
|
|
console.log("Server Listening on PORT:", port);
|
|
});
|
|
|
|
app.get('/', function (req, res) {
|
|
res.sendFile(path.join(__dirname, '/index.html'));
|
|
});
|
|
|
|
const userCache = {};
|
|
|
|
const delay = ms => new Promise(resolve => setTimeout(resolve, ms));
|
|
|
|
async function fetchUserDataWithRetry(userId) {
|
|
let retries = 0;
|
|
let delayTime = 1000;
|
|
|
|
while (retries < 3) {
|
|
try {
|
|
const response = await axios.get(`https://discord.com/api/v10/users/${userId}`, {
|
|
headers: {
|
|
'Authorization': 'Bot ' + botToken
|
|
}
|
|
});
|
|
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 {
|
|
for (const userId of userIds) {
|
|
if (userCache[userId]) {
|
|
preresults[userId] = userCache[userId];
|
|
} 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();
|
|
}
|
|
});
|