UNPKG

flying-squid

Version:
119 lines (102 loc) 3.56 kB
const fs = require('fs') const timeStarted = Math.floor(Date.now() / 1000).toString() const path = require('path') const moment = require('moment') const colors = require('colors') const isInNode = typeof process !== 'undefined' && !process.browser && process.platform !== 'browser' const _servers = [] /** @type {typeof import("readline") | undefined} */ let readline /** @type {import("readline").Interface | undefined} */ let rl if (isInNode) { import(/* webpackIgnore: true */ 'exit-hook').then((hook) => { hook.default(() => { for (const serv of _servers) { serv.log('Server shutting down...') serv.quit() } }) }) readline = require('readline') rl = readline.createInterface({ input: process.stdin, output: process.stdout }) rl.setPrompt('> ') rl.prompt(true) } module.exports.server = function (serv, settings) { _servers.push(serv) serv.on('error', error => serv.err('Server: ' + error.stack)) serv.on('clientError', (client, error) => serv.err('Client ' + client.socket?.remoteAddress + ':' + client.socket.remotePort + ' : ' + error.stack)) serv.on('listening', port => serv.info('Server listening on port ' + port)) serv.on('banned', (banner, bannedUsername, reason) => serv.info(banner.username + ' banned ' + bannedUsername + (reason ? ' (' + reason + ')' : ''))) serv.on('seed', (seed) => serv.info('World seed: ' + seed)) const logFile = path.join('logs', timeStarted + '.log') serv.log = message => { readline?.cursorTo(process.stdout, 0) message = moment().format('MMMM Do YYYY, HH:mm:ss') + ' ' + message message = serv.formatMessage?.(message) ?? message if (!message) return if (!settings.noConsoleOutput) console.log(message) if (!settings.logging) return fs.appendFile(logFile, message + '\n', (err) => { if (err) console.log(err) }) } serv.info = message => { serv.log('[' + colors.green('INFO') + ']: ' + message) } serv.err = message => { serv.log('[' + colors.red('ERROR') + ']: ' + message) } serv.warn = message => { serv.log('[' + colors.yellow('WARN') + ']: ' + message) } if (isInNode) { console.log = (function () { const orig = console.log return function () { readline.cursorTo(process.stdout, 0) let tmp try { tmp = process.stdout // @ts-ignore process.stdout = process.stderr orig.apply(console, arguments) } finally { process.stdout = tmp } rl.prompt(true) } })() } serv.createLog = () => { if (!settings.logging) return fs.mkdir('logs', { recursive: true }, (err) => { if (err) { console.log(err) return } fs.writeFile(logFile, '[INFO]: Started logging...\n', (err) => { if (err) console.log(err) }) }) } rl?.on('line', (data) => { serv.handleCommand(data) rl.prompt(true) }) } module.exports.player = function (player, serv) { player.on('connected', () => serv.info(player.username + ' (' + player._client.socket?.remoteAddress + ') connected')) player.on('spawned', () => serv.info('Position written, spawning player...')) player.on('disconnected', () => serv.info(player.username + ' disconnected')) player.on('chat', ({ message }) => serv.info('<' + player.username + '>' + ' ' + message)) player.on('kicked', (kicker, reason) => serv.info(kicker.username + ' kicked ' + player.username + (reason ? ' (' + reason + ')' : ''))) }