diff --git a/config.js b/config.js index a199791..7407187 100644 --- a/config.js +++ b/config.js @@ -1,5 +1,5 @@ module.exports = { - maintenance: true, + maintenance: false, mongodb: "mongodb+srv://root:RzIhDff90LKkOOjw@cluster0.jo9hd.mongodb.net/?retryWrites=true&w=majority", bot: { id: "934087523649609768", @@ -50,6 +50,6 @@ module.exports = { }, users: { owner: ["755297485328482356"], - verificator: ["755297485328482356", "759037138929975297"], + verificator: ["755297485328482356"], } } \ No newline at end of file diff --git a/index.js b/index.js index aad7396..e7e80d1 100644 --- a/index.js +++ b/index.js @@ -43,6 +43,9 @@ client.on('ready', () => { // Login client.login(client.config.bot.token); bsl.login(bsl.config.bot.bsl.token); +bsl.on('rateLimit', (info) => { + console.log(`Rate limit hit ${info.timeDifference ? info.timeDifference : info.timeout ? info.timeout : 'Unknown timeout '}`) +}) // Node Error Handler process.on('uncaughtException', function (err) { console.log(err); diff --git a/package-lock.json b/package-lock.json index a412217..9174a96 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,6 +17,7 @@ "discord.js": "^14.1.1", "ejs": "^3.1.8", "express": "^4.18.1", + "express-rate-limit": "^6.5.1", "express-session": "^1.17.3", "memorystore": "^1.6.7", "mongoose": "^6.5.0", @@ -1091,6 +1092,17 @@ "node": ">= 0.10.0" } }, + "node_modules/express-rate-limit": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.5.1.tgz", + "integrity": "sha512-pxO6ioBLd3i8IHL+RmJtL4noYzte5fugoMdaDabtU4hcg53+x0QkTwfPtM7vWD0YUaXQgNj9NRdzmps+CHEHlA==", + "engines": { + "node": ">= 12.9.0" + }, + "peerDependencies": { + "express": "^4 || ^5" + } + }, "node_modules/express-session": { "version": "1.17.3", "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.3.tgz", @@ -4187,6 +4199,12 @@ "vary": "~1.1.2" } }, + "express-rate-limit": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.5.1.tgz", + "integrity": "sha512-pxO6ioBLd3i8IHL+RmJtL4noYzte5fugoMdaDabtU4hcg53+x0QkTwfPtM7vWD0YUaXQgNj9NRdzmps+CHEHlA==", + "requires": {} + }, "express-session": { "version": "1.17.3", "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.3.tgz", diff --git a/package.json b/package.json index 8f99662..abcb100 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,7 @@ "discord.js": "^14.1.1", "ejs": "^3.1.8", "express": "^4.18.1", + "express-rate-limit": "^6.5.1", "express-session": "^1.17.3", "memorystore": "^1.6.7", "mongoose": "^6.5.0", diff --git a/website/index.js b/website/index.js index 27389c1..0e5a2b5 100644 --- a/website/index.js +++ b/website/index.js @@ -19,6 +19,17 @@ var api = require('./routers/api'); var client = require('../index'); app.set('view engine', 'ejs'); app.set('views', path.join(__dirname, '/views')); +const rateLimit = require('express-rate-limit') +const limiter = rateLimit({ + windowMs: 1 * 60 * 1000, + max: 100, + standardHeaders: true, + legacyHeaders: false, + message: + 'Too many requests from this IP, please try again after a few minutes.', +}) +app.use("/api", limiter) +app.use('/api', api); if(global.config.maintenance) { console.log(colors.red("[MAINTENANCE]") + " Bot is in maintenance mode."); app.get('/', (req, res) => { @@ -141,10 +152,10 @@ app.get('/servers', async (req, res) => { }); app.get('/tag/:id', async (req, res) => { - var id = req.params.id; + var id = req.params.id.toLowerCase(); var bot = await bots.find({ tags: id }); res.render('tags/index', { - bot: bot, + bots: bot, user: req.user, tag: id, }); @@ -170,17 +181,9 @@ app.get("/sitemap.xml", async function (req, res) { app.get('/invite', function (req, res) { res.redirect(client.config.bot.bsl.invite); }); -app.use((req, res, next) => { - if (res.statusCode === 404) { - req.session.error = "Page not found"; - res.redirect('/'); - } else if (res.statusCode === 500) { - req.session.error = "Internal server error"; - res.redirect('/'); - } else { - req.session.error = "Page not found"; - res.redirect('/'); - } +app.use((err, req, res, next) => { + console.error(err.stack) + res.status(500).send('Something broke!') }) app.listen(client.config.server.port, () => { console.log(colors.green("Website: "), 'Your app is listening on port ' + port); diff --git a/website/routers/api/v1/index.js b/website/routers/api/v1/index.js index 20c7f51..e8ee62f 100644 --- a/website/routers/api/v1/index.js +++ b/website/routers/api/v1/index.js @@ -30,7 +30,7 @@ router.get('/search/:id', function (req, res) { serverArray.push({ "name": server.name, "id": server.id, "description": server.description, type: "bot" }); }); res.json({ - serverArray + array: serverArray }) } @@ -49,7 +49,7 @@ const applyText = (canvas, text) => { const { createCanvas, loadImage, Image } = require('canvas') const { readFile } = require('fs/promises'); -router.get('/server/:id', function (req, res) { +router.get('/server/banner/:id', function (req, res) { // Get one server and draw it on the canvas servers.findOne({ id: req.params.id }, async function (err, server) { if (err) throw err; @@ -81,7 +81,7 @@ router.get('/server/:id', function (req, res) { context.font = '30px sans-serif'; context.fillStyle = '#ffffff'; - context.fillText(`BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB`, canvas.width / 2.7, canvas.height / 1.8); + context.fillText(serverName, canvas.width / 2.7, canvas.height / 1.8); context.font = '18px sans-serif'; context.fillText(`🙍♂️ ${serverMembers}`, canvas.width / 2.7, canvas.height / 1.1); @@ -189,7 +189,7 @@ router.get('/bots/search/:id', function (req, res) { } }); }); -router.get('/bots/check/:id', function (req, res) { +router.get('/bots/checkvote/:id', function (req, res) { votes.findOne({ user: req.params.id }, function (err, vote) { if (err) { res.status(503).json({ diff --git a/website/views/index.ejs b/website/views/index.ejs index 96f4d38..be41502 100644 --- a/website/views/index.ejs +++ b/website/views/index.ejs @@ -34,15 +34,15 @@ type: 'GET', success: function(data) { var html = ''; - if(!data.serverArray.length) html = '
These bots are tagged with <%= tag %>
+: <%= bot.votes || 0 %> <%if(bot.servers) { %>: <%= bot.servers %><% } %> +
++ <%= bot.description %> +
+