| 60 | }; |
| 61 | |
| 62 | async function genUser(req, res, version) { |
| 63 | let clients = store.get('clients'); |
| 64 | req.query.fmt = req.query.fmt || req.query.format; |
| 65 | |
| 66 | const ip = req.headers['cf-connecting-ip'] || req.headers['x-real-ip'] || req.headers['x-forwarded-for'] || req.connection.remoteAddress; |
| 67 | |
| 68 | if (process.env.spec !== "true" && clients[ip] >= settings.limit) { |
| 69 | return res.status(429).json({ |
| 70 | error: `Whoa, ease up there cowboy. You've requested ${clients[ip]} users in the last minute. Help us keep this service free and spare some bandwidth for other users please :)` |
| 71 | }); |
| 72 | } |
| 73 | |
| 74 | // Legacy versions |
| 75 | if (version in legacy) { |
| 76 | let results = req.query.results || 1; |
| 77 | |
| 78 | if (results > legacy[version].max || results < 1 || isNaN(results) || !Number.isInteger(+results)) { |
| 79 | results = 1; |
| 80 | } |
| 81 | |
| 82 | // Update query results for passing to randomapi |
| 83 | req.query.results = results; |
| 84 | |
| 85 | if (!(ip in clients)) { |
| 86 | clients[ip] = Number(results); |
| 87 | } else { |
| 88 | clients[ip] += Number(results); |
| 89 | } |
| 90 | |
| 91 | const ret = await legRequest(`https://api.randomapi.com/${legacy[version].hash}?noinfo&${qs.stringify(req.query)}`); |
| 92 | if (req.query.fmt === 'json') { |
| 93 | res.setHeader('Content-Type', 'application/json'); |
| 94 | } else if (req.query.fmt === 'xml') { |
| 95 | res.setHeader('Content-Type', 'text/xml'); |
| 96 | } else if (req.query.fmt === 'yaml') { |
| 97 | res.setHeader('Content-Type', 'text/x-yaml'); |
| 98 | } else if (req.query.fmt === 'csv') { |
| 99 | res.setHeader('Content-Type', 'text/csv'); |
| 100 | } else { |
| 101 | res.setHeader('Content-Type', 'text/plain'); |
| 102 | } |
| 103 | |
| 104 | res.setHeader('Cache-Control', 'no-cache'); |
| 105 | |
| 106 | const payload = { |
| 107 | 'bandwidth': ret.length, |
| 108 | 'total': results |
| 109 | }; |
| 110 | payload[version.replace(/\./g, '_')] = results; |
| 111 | |
| 112 | let doc = await Request.findOneAndUpdate( |
| 113 | {date: util.getDateTime()}, |
| 114 | {$setOnInsert: payload}, |
| 115 | { |
| 116 | returnOriginal: false, |
| 117 | upsert: true, |
| 118 | } |
| 119 | ); |