added user id array support
This commit is contained in:
3
extended-user-info-api/.gitignore
vendored
3
extended-user-info-api/.gitignore
vendored
@@ -1 +1,2 @@
|
|||||||
.env
|
.env
|
||||||
|
node_modules/
|
@@ -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();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
Reference in New Issue
Block a user