From 526f1d103e86066771ff21ea61879f226be0556f Mon Sep 17 00:00:00 2001 From: InvalidLenni <68335355+InvalidLenni@users.noreply.github.com> Date: Fri, 14 Jan 2022 15:32:05 +0100 Subject: [PATCH 1/4] Add guild widgets --- app.js | 115 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 app.js diff --git a/app.js b/app.js new file mode 100644 index 0000000..730b3d3 --- /dev/null +++ b/app.js @@ -0,0 +1,115 @@ +// Definitions +const express = require("express"), + cors = require("cors"), + app = express(); + +const { Client, Intents } = require('discord.js'); + +app.use(cors()); + +/// OAuth2 +const fetch = require("node-fetch") +const randomstring = require("randomstring"); + +require("dotenv").config() +const PORT = process.env.PORT || '80'; +const CLIENT_SECRET = process.env.port || 'WmrM3betfCuAIfAP2uFkivIhDn8soUfk'; + +// api things + + +var corsOptions = { + origin: '*', + optionsSuccessStatus: 200 +} + +const Discord = require("discord.js"), + client = new Discord.Client({ intents: [Intents.FLAGS.GUILD_MEMBERS] }) +/// Intent: { intents: [Intents.FLAGS.GUILD_MEMBERS, Intents.FLAGS.GUILD] } + +const name = require("../package.json").name, + description = require("../package.json").description, + version = require("../package.json").version, + author = require("../package.json").author, + url = require("../package.json").repository.url; + +// ROUTES +app.get("/", cors(corsOptions), (req, res) => { + const mainpage = ({"API": `${name}`, "\description": `${description}`, "API Version is": `${version}`, "The Github Rep": `${url}` }); + return res.send(mainpage) +}); + + +app.get("/callback", cors(corsOptions), (req, res) => { + const fragment = new URLSearchParams(); + const [accessToken, tokenType] = [fragment.get('code'), fragment.get('token_type')]; + + if (!accessToken) { + const callback = (`Hello! Here is your api token: ${fragment.get('code')}`); + return res.send(callback) + } + fetch('https://discord.com/api/users/@me', { + headers: { + authorization: `${tokenType} ${accessToken}`, + }, + }) + .then(result => result.json()) + .then(response => { + return + }) + .catch(console.error); + console.log(accessToken) + const callback = (`Hello! Here is your api token: ${fragment.get('code')}`); + return res.send(callback) +}); + + +app.get("/v1", cors(corsOptions), (req, res) => { + const v1page = (`Oops! The v1 route is only for the v1.X.X version! https://invalidlenni.gitbook.io/disweb/ for Documentation`); + return res.send(v1page) +}); + +// GET USER INFORMATION +app.get("/v1/user/:userID", cors(corsOptions), (req, res) => { + client.users.fetch(req.params.userID).then((user) => { + const results = ({ username: `${user.username}`, is_bot: user.bot, discriminator: `${user.discriminator}`, avatar_url: `${user.displayAvatarURL({ format: "png", size: 4096, dynamic: true })}`, banner_url: `${user.bannerURL({ format: "png", dynamic: true })}`, creation_date: `${user.createdAt}`, creation_timestamp: user.createdTimestamp}); + return res.send(results); + }); +}); + +// THE BOT MUST BE ON THE GUILD FOR FETCH THE GUILD INFORMATIONS! +app.get("/v1/guild/:guildID", cors(corsOptions), (req, res) => { + client.guilds.fetch(req.params.guildID).then((guild) => { + const results = ({ guildID: `${guild.id}`, guildname: `${guild.name}`, guildicon_url: `${guild.iconURL({ size: 4096, dynamic: true })}`, guildroles_count: `${guild.roles.cache.size}`, guildusers_count: `${guild.members.cache.size}`, guildemojis_count: `${guild.emojis.cache.size}`, guildownerID: `${guild.ownerID}`, guildcreation_date: `${guild.createdAt}`, guildcreation_timestamp: guild.createdTimestamp}); + return res.send(results); + }); +}); + +app.get("/v1/widget/:GUILDID", cors(corsOptions), (req, res) => { + client.fetchGuildWidget(req.params.GUILDID).then((widget) => { + const results = ({ guildID: `${widget.guild.id}`, guildname: `${widget.guild.name}`, guildicon_url: `${widget.guild.iconURL({ size: 4096, dynamic: true })}`, guildroles_count: `${widget.guild.roles.cache.size}`, guildusers_count: `${widget.guild.members.cache.size}`, guildemojis_count: `${widget.guild.emojis.cache.size}`, guildownerID: `${widget.guild.ownerID}`, guildcreation_date: `${widget.guild.createdAt}`, guildcreation_timestamp: widget.guild.createdTimestamp}); + return res.send(results); + }); +}); + +app.use(function (req, res, next) { + res.status(404).send("Sorry, can't find that!") +}); + +app.use(function (req, res, next) { + res.status(201).send("Missing parameters!") +}); + + +app.use(function (req, res, next) { + res.status(403).send("Missing access") +}); + +// API START +client.on("ready", () => { + console.log(`The API is now online! Bot: ${client.user.username}`) +}); + +app.listen(PORT, console.log(`discord-web-api is listing to`, PORT)); + +client.login(process.env.TOKEN); \ No newline at end of file From f469b15c17223ffc0bce7377d231d980ca9db47c Mon Sep 17 00:00:00 2001 From: InvalidLenni <68335355+InvalidLenni@users.noreply.github.com> Date: Mon, 7 Feb 2022 15:55:30 +0100 Subject: [PATCH 2/4] Add files via upload --- api/app.js | 54 +++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 45 insertions(+), 9 deletions(-) diff --git a/api/app.js b/api/app.js index 2f9212a..da0b083 100644 --- a/api/app.js +++ b/api/app.js @@ -3,12 +3,17 @@ const express = require("express"), cors = require("cors"), app = express(); -app.use(cors()); +const { Client, Intents } = require('discord.js'); +app.use(cors()); +/// OAuth2 +const fetch = require("node-fetch") +const randomstring = require("randomstring"); require("dotenv").config() const PORT = process.env.PORT || '80'; +const CLIENT_SECRET = process.env.port || 'WmrM3betfCuAIfAP2uFkivIhDn8soUfk'; // api things @@ -19,7 +24,8 @@ var corsOptions = { } const Discord = require("discord.js"), - client = new Discord.Client(); + client = new Discord.Client({ intents: [Intents.FLAGS.GUILD_MEMBERS] }) +/// Intent: { intents: [Intents.FLAGS.GUILD_MEMBERS, Intents.FLAGS.GUILD] } const name = require("../package.json").name, description = require("../package.json").description, @@ -33,15 +39,38 @@ app.get("/", cors(corsOptions), (req, res) => { return res.send(mainpage) }); +app.get("/callback", cors(corsOptions), (req, res) => { + const fragment = new URLSearchParams(); + const [accessToken, tokenType] = [fragment.get('code'), fragment.get('token_type')]; + + if (!accessToken) { + const callback = (`Hello! Here is your api token: ${fragment.get('code')}`); + return res.send(callback) + } + fetch('https://discord.com/api/users/@me', { + headers: { + authorization: `${tokenType} ${accessToken}`, + }, + }) + .then(result => result.json()) + .then(response => { + return + }) + .catch(console.error); + console.log(accessToken) + const callback = (`Hello! Here is your api token: ${fragment.get('code')}`); + return res.send(callback) +}); + app.get("/v1", cors(corsOptions), (req, res) => { - const v1page = (`This is the v1 page from ${name}`); + const v1page = (`Oops! The v1 route is only for the v1 version! https://invalidlenni.gitbook.io/disweb/ for Documentation`); return res.send(v1page) }); // GET USER INFORMATION app.get("/v1/user/:userID", cors(corsOptions), (req, res) => { client.users.fetch(req.params.userID).then((user) => { - const results = ({ username: `${user.username}`, bot: user.bot, discriminator: `${user.discriminator}`, avatar_url: `${user.displayAvatarURL({ format: "png", size: 4096, dynamic: true })}`, creation_date: `${user.createdAt}`, creation_timestamp: user.createdTimestamp}); + const results = ({ username: `${user.username}`, is_bot: user.bot, discriminator: `${user.discriminator}`, avatar_url: `${user.displayAvatarURL({ format: "png", size: 4096, dynamic: true })}`, banner_url: `${user.bannerURL({ format: "png", dynamic: true })}`, creation_date: `${user.createdAt}`, creation_timestamp: user.createdTimestamp}); return res.send(results); }); }); @@ -49,26 +78,33 @@ app.get("/v1/user/:userID", cors(corsOptions), (req, res) => { // THE BOT MUST BE ON THE GUILD FOR FETCH THE GUILD INFORMATIONS! app.get("/v1/guild/:guildID", cors(corsOptions), (req, res) => { client.guilds.fetch(req.params.guildID).then((guild) => { - const results = ({ guildID: `${guild.id}`, guildname: `${guild.name}`, guildicon_url: `${guild.iconURL({ size: 4096, dynamic: true })}`, guildroles_count: `${guild.roles.cache.size}`, guildusers_count: `${guild.members.cache.size}`, guildemojis_count: `${guild.emojis.cache.size}`, guildownerID: `${guild.ownerID}`, guildcreation_date: `${guild.createdAt}`, guildcreation_timestamp: guild.createdTimestamp }); + const results = ({ guildID: `${guild.id}`, guildname: `${guild.name}`, guildicon_url: `${guild.iconURL({ size: 4096, dynamic: true })}`, guildroles_count: `${guild.roles.cache.size}`, guildusers_count: `${guild.members.cache.size}`, guildemojis_count: `${guild.emojis.cache.size}`, guildownerID: `${guild.ownerID}`, guildcreation_date: `${guild.createdAt}`, guildcreation_timestamp: guild.createdTimestamp}); + return res.send(results); + }); +}); + +app.get("/v1/invites/:INVITEURL", cors(corsOptions), (req, res) => { + client.invite.fetch(req.params.INVITEURL).then((invite) => { + const results = ({ guildID: `${invite.guild.id}`, guildname: `${invite.guild.name}`, guildicon_url: `${invite.guild.iconURL({ size: 4096, dynamic: true })}`, guildroles_count: `${invite.guild.roles.cache.size}`, guildusers_count: `${invite.guild.members.cache.size}`, guildemojis_count: `${invite.guild.emojis.cache.size}`, guildownerID: `${invite.guild.ownerID}`, guildcreation_date: `${invite.guild.createdAt}`, guildcreation_timestamp: invite.guild.createdTimestamp}); return res.send(results); }); }); app.use(function (req, res, next) { - res.status(404).send("Sorry, can't find that! The route is [/vX/user/:USERID] or [/vX/guild/:GUILDID]") + res.status(404).json({ message: '404: Not found', code: 404}) }); app.use(function (req, res, next) { - res.status(201).send("Missing parm") + res.status(201).send({ message: '201: Missing parameters', code: 201}) }); app.use(function (req, res, next) { - res.status(403).send("Missing access") + res.status(403).send({ message: '403: Missing access', code: 403}) }); app.use(function (req, res, next) { - res.status(500).send("Internal Server Error") + res.status(500).send({ message: '500: Internal Server Error', code: 500}) }); // API START From 6c852374b70a51ed2f5a557160efe626fcd0a49c Mon Sep 17 00:00:00 2001 From: InvalidLenni <68335355+InvalidLenni@users.noreply.github.com> Date: Tue, 8 Feb 2022 16:34:40 +0100 Subject: [PATCH 3/4] Add all ratelimits --- app.js | 260 ++++++++++++++++++++++++++++++++------------------------- 1 file changed, 146 insertions(+), 114 deletions(-) diff --git a/app.js b/app.js index 730b3d3..5064078 100644 --- a/app.js +++ b/app.js @@ -1,115 +1,147 @@ -// Definitions -const express = require("express"), - cors = require("cors"), - app = express(); - -const { Client, Intents } = require('discord.js'); - -app.use(cors()); - -/// OAuth2 -const fetch = require("node-fetch") -const randomstring = require("randomstring"); - -require("dotenv").config() -const PORT = process.env.PORT || '80'; -const CLIENT_SECRET = process.env.port || 'WmrM3betfCuAIfAP2uFkivIhDn8soUfk'; - -// api things - - -var corsOptions = { - origin: '*', - optionsSuccessStatus: 200 -} - -const Discord = require("discord.js"), - client = new Discord.Client({ intents: [Intents.FLAGS.GUILD_MEMBERS] }) -/// Intent: { intents: [Intents.FLAGS.GUILD_MEMBERS, Intents.FLAGS.GUILD] } - -const name = require("../package.json").name, - description = require("../package.json").description, - version = require("../package.json").version, - author = require("../package.json").author, - url = require("../package.json").repository.url; - -// ROUTES -app.get("/", cors(corsOptions), (req, res) => { - const mainpage = ({"API": `${name}`, "\description": `${description}`, "API Version is": `${version}`, "The Github Rep": `${url}` }); - return res.send(mainpage) -}); - - -app.get("/callback", cors(corsOptions), (req, res) => { - const fragment = new URLSearchParams(); - const [accessToken, tokenType] = [fragment.get('code'), fragment.get('token_type')]; - - if (!accessToken) { - const callback = (`Hello! Here is your api token: ${fragment.get('code')}`); - return res.send(callback) - } - fetch('https://discord.com/api/users/@me', { - headers: { - authorization: `${tokenType} ${accessToken}`, - }, - }) - .then(result => result.json()) - .then(response => { - return - }) - .catch(console.error); - console.log(accessToken) - const callback = (`Hello! Here is your api token: ${fragment.get('code')}`); - return res.send(callback) -}); - - -app.get("/v1", cors(corsOptions), (req, res) => { - const v1page = (`Oops! The v1 route is only for the v1.X.X version! https://invalidlenni.gitbook.io/disweb/ for Documentation`); - return res.send(v1page) -}); - -// GET USER INFORMATION -app.get("/v1/user/:userID", cors(corsOptions), (req, res) => { - client.users.fetch(req.params.userID).then((user) => { - const results = ({ username: `${user.username}`, is_bot: user.bot, discriminator: `${user.discriminator}`, avatar_url: `${user.displayAvatarURL({ format: "png", size: 4096, dynamic: true })}`, banner_url: `${user.bannerURL({ format: "png", dynamic: true })}`, creation_date: `${user.createdAt}`, creation_timestamp: user.createdTimestamp}); - return res.send(results); - }); -}); - -// THE BOT MUST BE ON THE GUILD FOR FETCH THE GUILD INFORMATIONS! -app.get("/v1/guild/:guildID", cors(corsOptions), (req, res) => { - client.guilds.fetch(req.params.guildID).then((guild) => { - const results = ({ guildID: `${guild.id}`, guildname: `${guild.name}`, guildicon_url: `${guild.iconURL({ size: 4096, dynamic: true })}`, guildroles_count: `${guild.roles.cache.size}`, guildusers_count: `${guild.members.cache.size}`, guildemojis_count: `${guild.emojis.cache.size}`, guildownerID: `${guild.ownerID}`, guildcreation_date: `${guild.createdAt}`, guildcreation_timestamp: guild.createdTimestamp}); - return res.send(results); - }); -}); - -app.get("/v1/widget/:GUILDID", cors(corsOptions), (req, res) => { - client.fetchGuildWidget(req.params.GUILDID).then((widget) => { - const results = ({ guildID: `${widget.guild.id}`, guildname: `${widget.guild.name}`, guildicon_url: `${widget.guild.iconURL({ size: 4096, dynamic: true })}`, guildroles_count: `${widget.guild.roles.cache.size}`, guildusers_count: `${widget.guild.members.cache.size}`, guildemojis_count: `${widget.guild.emojis.cache.size}`, guildownerID: `${widget.guild.ownerID}`, guildcreation_date: `${widget.guild.createdAt}`, guildcreation_timestamp: widget.guild.createdTimestamp}); - return res.send(results); - }); -}); - -app.use(function (req, res, next) { - res.status(404).send("Sorry, can't find that!") -}); - -app.use(function (req, res, next) { - res.status(201).send("Missing parameters!") -}); - - -app.use(function (req, res, next) { - res.status(403).send("Missing access") -}); - -// API START -client.on("ready", () => { - console.log(`The API is now online! Bot: ${client.user.username}`) -}); - -app.listen(PORT, console.log(`discord-web-api is listing to`, PORT)); - +// Definitions +const express = require("express"), + cors = require("cors"), + app = express(); + +const { Client, Intents } = require('discord.js'); + +app.use(cors()); + +/// OAuth2 +const fetch = require("node-fetch") +const randomstring = require("randomstring"); + +require("dotenv").config() +const PORT = process.env.PORT || '80'; +const CLIENT_SECRET = process.env.port || 'WmrM3betfCuAIfAP2uFkivIhDn8soUfk'; + +// api things + + +var corsOptions = { + origin: '*', + optionsSuccessStatus: 200 +} + +const Discord = require("discord.js"), + client = new Discord.Client({ intents: [Intents.FLAGS.GUILD_MEMBERS] }) +/// Intent: { intents: [Intents.FLAGS.GUILD_MEMBERS, Intents.FLAGS.GUILD] } + +const name = require("../package.json").name, + description = require("../package.json").description, + version = require("../package.json").version, + author = require("../package.json").author, + url = require("../package.json").repository.url; + + /* const apiLimiter = rateLimit({ + windowMs: 15 * 60 * 1000, // 15 minutes + max: 100, // Limit each IP to 100 requests per `window` (here, per 15 minutes) + standardHeaders: true, // Return rate limit info in the `RateLimit-*` headers + legacyHeaders: false, // Disable the `X-RateLimit-*` headers + })*/ + +// Ratelimits +const userLimiter = rateLimit({ + windowMs: 60 * 60 * 5, // 5 minutes + max: 5, // Limit each IP to 5 user requests per `window` (here, per minute) + message: + 'You are being ratelimited! Try again later.', + standardHeaders: true, // Return rate limit info in the `RateLimit-*` headers + legacyHeaders: false, // Disable the `X-RateLimit-*` headers +}) + +const guildLimiter = rateLimit({ + windowMs: 60 * 60 * 5, // 5 minutes + max: 5, // Limit each IP to 5 user requests per `window` (here, per minute) + message: + 'You are being ratelimited! Try again later.', + standardHeaders: true, // Return rate limit info in the `RateLimit-*` headers + legacyHeaders: false, // Disable the `X-RateLimit-*` headers +}) + + +// ROUTES +app.get("/", cors(corsOptions), (req, res) => { + const mainpage = ({"API": `${name}`, "\description": `${description}`, "Made by": `${author}`, "API Version is": `${version}`, "The Github Rep": `${url}` }); + return res.send(mainpage) +}); + +app.get("/callback", cors(corsOptions), (req, res) => { + const fragment = new URLSearchParams(); + const [accessToken, tokenType] = [fragment.get('code'), fragment.get('token_type')]; + + if (!accessToken) { + const callback = (`Hello! Here is your api token: ${fragment.get('code')}`); + return res.send(callback) + } + fetch('https://discord.com/api/users/@me', { + headers: { + authorization: `${tokenType} ${accessToken}`, + }, + }) + .then(result => result.json()) + .then(response => { + return + }) + .catch(console.error); + console.log(accessToken) + const callback = (`Hello! Here is your api token: ${fragment.get('code')}`); + return res.send(callback) +}); + +app.get("/v1", cors(corsOptions), (req, res) => { + const v1page = (`Oops! The v1 route is only for the v1 version! https://invalidlenni.gitbook.io/disweb/ for Documentation`); + return res.send(v1page) +}); + +// GET USER INFORMATION +app.get("/v1/user/:userID", userLimiter, cors(corsOptions), (req, res) => { + client.users.fetch(req.params.userID).then((user) => { + const results = ({ username: `${user.username}`, is_bot: user.bot, discriminator: `${user.discriminator}`, avatar_url: `${user.displayAvatarURL({ format: "png", size: 4096, dynamic: true })}`, banner_url: `${user.bannerURL({ format: "png", dynamic: true })}`, creation_date: `${user.createdAt}`, creation_timestamp: user.createdTimestamp}); + return res.send(results); + }); +}); + +// THE BOT MUST BE ON THE GUILD FOR FETCH THE GUILD INFORMATIONS! +app.get("/v1/guild/:guildID", guildLimiter, cors(corsOptions), (req, res) => { + client.guilds.fetch(req.params.guildID).then((guild) => { + const results = ({ guildID: `${guild.id}`, guildname: `${guild.name}`, guildicon_url: `${guild.iconURL({ size: 4096, dynamic: true })}`, guildroles_count: `${guild.roles.cache.size}`, guildusers_count: `${guild.members.cache.size}`, guildemojis_count: `${guild.emojis.cache.size}`, guildownerID: `${guild.ownerID}`, guildcreation_date: `${guild.createdAt}`, guildcreation_timestamp: guild.createdTimestamp}); + return res.send(results); + }); +}); + +app.get("/v1/invites/:INVITEURL", guildLimiter, cors(corsOptions), (req, res) => { + client.invite.fetch(req.params.INVITEURL).then((invite) => { + const results = ({ guildID: `${invite.guild.id}`, guildname: `${invite.guild.name}`, guildicon_url: `${invite.guild.iconURL({ size: 4096, dynamic: true })}`, guildroles_count: `${invite.guild.roles.cache.size}`, guildusers_count: `${invite.guild.members.cache.size}`, guildemojis_count: `${invite.guild.emojis.cache.size}`, guildownerID: `${invite.guild.ownerID}`, guildcreation_date: `${invite.guild.createdAt}`, guildcreation_timestamp: invite.guild.createdTimestamp}); + return res.send(results); + }); +}); + + +// Error +app.use(function (req, res, next) { + res.status(404).json({ message: '404: Not found', code: 404}) +}); + +app.use(function (req, res, next) { + res.status(201).send({ message: '201: Missing parameters', code: 201}) +}); + + +app.use(function (req, res, next) { + res.status(403).send({ message: '403: Missing access', code: 403}) +}); + +app.use(function (req, res, next) { + res.status(500).send({ message: '500: Internal Server Error', code: 500}) +}); + + +// API START +client.on("ready", () => { + console.log(`The API is now online! Bot: ${client.user.username}`) +}); + +app.listen(PORT, console.log(`disweb is listing to`, PORT)); + client.login(process.env.TOKEN); \ No newline at end of file From bf770a7f0ff04b7ff824bc29159c5a958253b3a4 Mon Sep 17 00:00:00 2001 From: InvalidLenni <68335355+InvalidLenni@users.noreply.github.com> Date: Tue, 8 Feb 2022 16:38:03 +0100 Subject: [PATCH 4/4] Add files via upload --- package.json | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index e2eac14..81b4ee7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "disweb", - "version": "1.0.1", + "version": "1.1.0", "description": "A simple & easy2use API for obtaining information about a discord user, discord bot or discord guild and their use for some purpose on websites!", "main": "./api/app.js", "scripts": { @@ -8,20 +8,25 @@ }, "repository": { "type": "git", - "url": "https://github.com/diswebsite/disweb" + "url": "https://github.com/diswebsite/disweb/.git" + }, + "bugs":{ + "type": "github", + "url": "https://github.com/diswebsite/disweb/issues/new" }, "keywords": [ "discord-web-api", "discord-user-api", "discord-website-api" ], - "author": "InvalidLenni", + "author": "Diswebsite", "license": "MIT", "dependencies": { "cors": "^2.8.5", - "discord.js": "^12.5.1", + "discord.js": "^13.4.0", "dotenv": "^8.2.0", "express": "^4.17.1", - "nodemon": "^2.0.15" + "nodemon": "^2.0.15", + "randomstring": "^1.2.1" } }