|
import express from 'express'; |
|
import Osu from 'nodesu'; |
|
import {RateLimiter} from 'limiter'; |
|
import config from './config.json'; |
|
let app = express(); |
|
|
|
// osu! stuff |
|
let osuChat = new Osu.chat(config.osu.chat); |
|
let osuApi = new Osu.api(config.osu.api); |
|
osuChat.on('connected', () => { |
|
console.log('Connected to osu! bancho chat.'); |
|
}); |
|
osuChat.on('error', (err) => { |
|
console.log('osu! chat ERROR - ' + err); |
|
}); |
|
|
|
// Rate limit osu! chat |
|
let osuChatLimiter = new RateLimiter(1, 'second'); // idk, but Tillerino is on this, but he may be on special terms |
|
|
|
// Express handlers |
|
app.get('/', (req, res) => { |
|
res.send('get-osu-requester v1'); |
|
}); |
|
|
|
let osuMapRegex = /osu.ppy.sh\/(s|b)\/(\d+)/i; |
|
app.get('/api/osu_request', (req, res) => { |
|
// Initial checks |
|
if (!req.query.user || !req.query.requester) return res.send('The custom URL handler is not setup properly...'); // No user defined or requester name not here |
|
if (config.allowedUsers.indexOf(req.query.user) === -1) return res.send('Access Denied'); // Not in allowed users. |
|
if (!req.query.map) return res.send('Invalid osu! map.'); // No map given |
|
|
|
console.log(`Received API request: user - ${req.query.user}, requester - ${req.query.requester}, map - ${req.query.map}`); |
|
// Kinda get started... |
|
let osuMapMatch = osuMapRegex.exec(req.query.map); |
|
if (!osuMapMatch) return res.send('Invalid osu! map.'); // Did not meet regex requirements |
|
|
|
// Now lookup map |
|
let mapType = osuMapMatch[1]; // /s|b |
|
let mapID = osuMapMatch[2]; |
|
osuApi.getBeatmaps(osuApi.beatmap.byLetter(mapID, mapType), osuApi.mode.all, (err, resp) => { |
|
if (err) { |
|
console.log('osu! api get ERROR - ' + err); |
|
return res.send('There is currently an issue with the osu! servers, please try again later.'); |
|
} |
|
if (resp.length < 1) return res.send('Invalid osu! map.'); // No map, blank response |
|
|
|
let map = resp[0]; |
|
console.log(`Found osu! map for '${req.query.requester}' [${req.query.user}] -- ${map.artist} - ${map.title}`); |
|
let rankedStatus = osuApi.beatmap.approvalStatus[map.approved]; |
|
|
|
let msgToSend = `${req.query.requester} > [${rankedStatus}] ${map.artist} - ${map.title} [${map.version}] (mapped by ${map.creator}) <${(+map.difficultyrating).toFixed(2)}★ ${map.bpm}BPM>`; |
|
let osuToSend = `${req.query.requester} > [${rankedStatus}] [http://osu.ppy.sh/${mapType}/${mapID} ${map.artist} - ${map.title} [${map.version}]] (mapped by ${map.creator}) <${(+map.difficultyrating).toFixed(2)}★ ${map.bpm}BPM>`; |
|
|
|
osuChatLimiter.removeTokens(1, (err, remainingRequests) => { |
|
osuChat.client.say(req.query.user, osuToSend); |
|
}); |
|
res.send(msgToSend); |
|
}); |
|
}); |
|
|
|
// Start express server |
|
app.listen(3000, () => { |
|
console.log('Listening on port 3000'); |
|
}); |
|
// Connect to osu! chat |
|
osuChat.connect() |