const express = require('express');
const app = express();
const port = 2428;
const server = app.listen(port, () => console.log(`ARNweb API running on port ${port}`))
var io = require('socket.io').listen(server, { path: '/chat/socket.io' })
var striptags = require('striptags');
var MarkdownIt = require('markdown-it'),
md = new MarkdownIt();
var users = [];
const style = require('ansi-styles');
const os = require("os");
const si = require('systeminformation');
var sysInfo;
const gameQuery = require('game-server-query');
const fs = require('fs');
let rawdata = fs.readFileSync(__dirname + "/node_modules/game-server-query/games.json");
const games = JSON.parse(rawdata);
// Request documentation
app.get('/', (req, res) =>
res.sendFile(__dirname + "/index.html")
);
// Function for easy server broadcasts
function serverMsg(content) {
return {
'username': 'Server',
'mailHash': '470965550d3f019830c421f0535d9268',
'message': content
}
}
// Socket.io server side
io.on('connection', function (socket) {
// Send identification request to client
socket.emit('user_identify');
// Bind username and mailhash to client
socket.on('user_login', function (user) {
socket.username = user.username;
socket.mailHash = user.mailHash;
if (users.length > 0) {
socket.emit('message_receive', serverMsg(`Hello ${socket.username}, welcome to ARNweb Chat. The following people are currently online: ${users.join(', ')}`));
} else {
socket.emit('message_receive', serverMsg(`Hello ${socket.username}, welcome to ARNweb Chat. You are the only one here at the moment`));
}
io.emit('message_receive', serverMsg(`${socket.username} has connected`));
users.push(socket.username);
});
// Send disconnect broadcast to all clients
socket.on('disconnect', function () {
io.emit('message_receive', serverMsg(`${socket.username} has disconnected`));
users.splice(users.indexOf(socket.username), 1);
});
// Handle messages
socket.on('message_send', function (message) {
// Build message data for clients
var message = striptags(message, '
');
if (message !== '') {
message = md.render(message);
message = message.replace(/\r?\n/g, '
');
var msg = {
'username': socket.username,
'mailHash': socket.mailHash,
'message': message
}
// Send message to clients
io.emit('message_receive', msg);
} else {
socket.emit('message_receive', serverMsg(`Empty messages will not be sent.`));
}
});
});
// Chat socket and info
app.get('/chat/', function (req, res) {
// Server browser
res.json({
"status": "online",
"users": users
});
});
// System info
app.get('/system/', function (req, res) {
var time = new Date();
sysInfo = {
"hostname": os.hostname(),
"type": os.type(),
"load": os.loadavg(),
"time": si.time()
};
si.cpuTemperature(function (data) {
sysInfo["temp"] = data;
});
si.mem(function (data) {
sysInfo["mem"] = data;
});
si.fsSize(function (data) {
sysInfo["fs"] = data;
res.json(sysInfo);
})
});
// cURL
app.get('/curl/', function (req, res) {
const userAgent = req.headers['user-agent'];
if (userAgent.search(/curl|wget/i) !== -1) {
res.send(`
${style.green.open}Hello Green!${style.green.close}
${style.red.open}Hello Red!${style.red.close}
`);
} else {
res.send('Only cURL requests!');
}
});
app.get('/css/:stylesheet', function (req, res) {
res.sendFile(__dirname + '/css/' + req.params.stylesheet);
});
// Game servers
app.get('/:type/:host', function (req, res) {
if (games[req.params.type] != undefined) {
gameQuery(
{
type: req.params.type,
host: req.params.host
},
function (state) {
res.json(state);
}
);
} else {
res.json({ "error": "Error: Game type unknown." });
}
});