Skip to content
This repository has been archived by the owner on Dec 1, 2023. It is now read-only.

Commit

Permalink
Merge Job Cleanup PR from fasko-web/job-cleanup
Browse files Browse the repository at this point in the history
2.0.2 - Job Cleanup
  • Loading branch information
fasko-web authored Feb 26, 2021
2 parents 63924aa + 96d4901 commit a8d65c4
Show file tree
Hide file tree
Showing 8 changed files with 114 additions and 110 deletions.
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,8 @@ Config Name | Information
`game` | The game your server is running on. Must be supported by [GameDig](https://github.com/gamedig/node-gamedig#games-list). Default: `'garrysmod'`
`ip` | Your game server's IP address.
`port` | Your game server's port. Set to false if unused. Default: `27015`

`query_port` | Your game server's separate query port. Expects an integer if set. Default `false`
`max_players` | Your game server's max players. Only necessary if the query is having trouble detecting accurate count. Default: `false`

##### Bot Settings - `server.bot`
Config Name | Information
Expand Down
4 changes: 4 additions & 0 deletions config/default.toml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,10 @@
ip = '00.00.000.000'
port = 27015 # Set to false or remove if not needed

# Extra optional settings for game servers with weird queries
query_port = false # Set if the game's server requires querying a specific port, expects an integer
max_players = false # Set if the game's server query has trouble detecting max players, expects an integer

# Discord Bot Settings
[server.bot]
token = '' # Discord bot token for this game server
Expand Down
104 changes: 30 additions & 74 deletions jobs/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,37 +3,31 @@ const jf = require('jsonfile');
const queryWeb = require('./web.js');
const queryServer = require('./server.js');
const queryPtero = require('./pterodactyl.js');
const cacheUtils = require('../utils/cache.js');

module.exports = async function query(client_id, server) {
let cache = jf.readFileSync(`./cache/${server.abbr}.json`, { throws: false })
let cache = jf.readFileSync(`./cache/${server.abbr}.json`, { throws: false });

let response = (cache) ? {
state: cache.current_state,
connect: cache.connect,
players: cache.players,
maxPlayers: cache.max_players,
map: cache.map,
lastQueryTimes: cache.last_query_times
} : {
state: 'off',
connect: ((server.port) ? `${server.ip}:${server.port}`: server.ip),
players: '0',
maxPlayers: 'N/A',
map: 'N/A'
let response = {
state: (cache) ? cache.current_state : 'off',
connect: (cache) ? cache.connect : ((server.port) ? `${server.ip}:${server.port}`: server.ip),
players: (cache) ? cache.players : '0',
maxPlayers: (cache) ? cache.max_players : 'N/A',
map: (cache) ? cache.map : 'N/A',
lastQueryTimes: (cache) ? cache.last_query_times : false
};

const intervals = {
web: (!process.env.WEB_QUERY_INTERVAL) ? '30 seconds' : process.env.WEB_QUERY_INTERVAL,
server: (!process.env.SERVER_QUERY_INTERVAL) ? '1 minute' : process.env.SERVER_QUERY_INTERVAL,
ptero: (!process.env.PTERODACTYL_QUERY_INTERVAL) ? '15 seconds' : process.env.PTERODACTYL_QUERY_INTERVAL,
web: process.env.WEB_QUERY_INTERVAL || '30 seconds',
server: process.env.SERVER_QUERY_INTERVAL || '1 minute',
ptero: process.env.PTERODACTYL_QUERY_INTERVAL || '15 seconds'
};

let state = response.state;
let currentState = response.state;
let lqt = response.lastQueryTimes;
let webQueryTime = (lqt && lqt.web !== false) ? new Date(lqt.web) : false;
let serverQueryTime = (lqt && lqt.server !== false) ? new Date(lqt.server) : false;

let state = response.state;
let currentState = response.state;
let pteroQueryTime = (lqt && lqt.ptero !== false) ? new Date(lqt.ptero) : false;

try {
Expand All @@ -50,12 +44,15 @@ module.exports = async function query(client_id, server) {
break;
default: // Queries Game Server
if (!serverQueryTime || serverQueryTime < new Date((new Date) - humanInterval(intervals.server))) {
response = await queryServer(server.ip, server.port, server.game);
response = await queryServer(server.ip, server.port, server.game, server.query_port);
serverQueryTime = new Date;
console.log('[EVENT]', `(${server.name}) Server queried.`);
}
}
state = response.state;
response.maxPlayers = (server.max_players > 0 && response.maxPlayers !== server.max_players)
? server.max_players
: response.maxPlayers;

// Queries Pterodactyl
if (server.pterodactyl && server.pterodactyl.enabled) {
Expand All @@ -73,17 +70,15 @@ module.exports = async function query(client_id, server) {
//console.log(state, response);

let onlineActivity = 'Server Online';
if (server.bot.status.players) {
if (server.bot.status.map) {
onlineActivity = `${response.players}/${response.maxPlayers} on ${response.map}`
} else {
onlineActivity = `${response.players}/${response.maxPlayers}`
}
if (server.bot.status.players && server.bot.status.map) {
onlineActivity = `${response.players}/${response.maxPlayers} on ${response.map}`;
} else if (server.bot.status.players) {
onlineActivity = `${response.players}/${response.maxPlayers}`
} else if (server.bot.status.map) {
onlineActivity = response.map
}

const data = {
const presence = {
on: {
status: 'online',
activity: (state !== 'on' || response.maxPlayers === 'N/A') ? 'Fetching Info..' : onlineActivity
Expand All @@ -105,8 +100,8 @@ module.exports = async function query(client_id, server) {
activity: 'Panel Error'
}
}
const status = data[currentState].status;
const activity = data[currentState].activity;
const status = presence[currentState].status;
const activity = presence[currentState].activity;

const json = {
bot_id: client_id,
Expand All @@ -125,52 +120,13 @@ module.exports = async function query(client_id, server) {
return new Promise((resolve, reject) => {
jf.readFile(`./cache/${server.abbr}.json`, function(err, obj) {
if (obj && obj.last_query_times) {
switch(true) {
case (server.pterodactyl && server.pterodactyl.enabled):
if (obj.last_query_times.ptero === json.last_query_times.ptero.toISOString()) {
switch(true) {
case (server.api && server.api.enabled):
if (obj.last_query_times.web !== json.last_query_times.web.toISOString()) {
jf.writeFile(`./cache/${server.abbr}.json`, json, function(err) {
if (err) return console.log(err);
console.log('[EVENT]', `(${server.name}) Cache updated.`);
});
};
break;
default:
if (obj.last_query_times.server !== json.last_query_times.server.toISOString()) {
jf.writeFile(`./cache/${server.abbr}.json`, json, function(err) {
if (err) return console.log(err);
console.log('[EVENT]', `(${server.name}) Cache updated.`);
});
};
}
return;
} else {
jf.writeFile(`./cache/${server.abbr}.json`, json, function(err) {
if (err) return console.log(err);
console.log('[EVENT]', `(${server.name}) Cache updated.`);
});
}
break;
default:
switch(true) {
case (server.api && server.api.enabled):
if (obj.last_query_times.web === json.last_query_times.web.toISOString()) return;
break;
default:
if (obj.last_query_times.server === json.last_query_times.server.toISOString()) return;
}
jf.writeFile(`./cache/${server.abbr}.json`, json, function(err) {
if (err) return console.log(err);
console.log('[EVENT]', `(${server.name}) Cache updated.`);
});
cacheUtils.ensureAllCaches(server, obj, json);
if (!server.pterodactyl.enabled) {
cacheUtils.ensureWebCache(server, obj, json);
cacheUtils.ensureServerCache(server, obj, json);
}
} else {
jf.writeFile(`./cache/${server.abbr}.json`, json, function(err) {
if (err) return console.log(err);
console.log('[EVENT]', `(${server.name}) Cache updated.`);
});
cacheUtils.writeCache(server, json);
}
})
resolve({ activity: activity, status: status });
Expand Down
7 changes: 4 additions & 3 deletions jobs/server.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
const GameDig = require('gamedig');

module.exports = (ip, port = false, game = 'garrysmod') => {
module.exports = (ip, port = false, game = 'garrysmod', queryPort = false) => {
qp = queryPort || port;
const response = GameDig.query({
type: game,
host: ip,
...(port && { port : port.toString() }),
...(port && { givenPortOnly: true })
...(qp && { port : qp.toString() }),
...(qp && { givenPortOnly: true })
}).then((state) => {
return {
state: 'on',
Expand Down
10 changes: 5 additions & 5 deletions jobs/web.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,13 @@ module.exports = async (ip, port = false, api) => {
if (res.statusCode === 200) {
const body = await res.json();
if (body[api.server_id] && body[api.server_id].map.toString() !== 'N/A') {
const server = body[api.server_id];
const state = body[api.server_id];
return {
state: 'on',
connect: server.connect || `${server.ip}:${server.port}`,
players: server.players.toString(),
maxPlayers: server.maxPlayers.toString() || server.max_players.toString(),
map: server.map
connect: state.connect || state.address || `${state.ip}:${state.port}`,
players: (state.players >= 0) ? state.players.toString() : state.players.length.toString(),
maxPlayers: state.maxPlayers.toString() || state.max_players.toString(),
map: state.map || false
}
} else {
console.log('[ERROR]', body);
Expand Down
50 changes: 25 additions & 25 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,10 @@
"dependencies": {
"@iarna/toml": "^2.2.5",
"bent": "^7.3.12",
"da-slash": "https://github.com/fasko-web/da-slash",
"da-slash": "git+https://github.com/fasko-web/da-slash.git",
"discord.js": "^12.5.1",
"dotenv": "^8.2.0",
"gamedig": "^2.0.27",
"gamedig": "^3.0.0",
"human-interval": "^2.0.1",
"jsonfile": "^6.1.0",
"p-ratelimit": "^1.0.1"
Expand Down
42 changes: 42 additions & 0 deletions utils/cache.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
const jf = require('jsonfile');

function writeCache(server, json) {
jf.writeFile(`./cache/${server.abbr}.json`, json, (err) => {
if (err) return console.error(err);
console.log('[EVENT]', `(${server.name}) Cache updated.`);
});
}

function ensureServerCache(server, obj, json) {
if (!server.api.enabled) {
if (obj.last_query_times.server !== json.last_query_times.server.toISOString()) {
return writeCache(server, json);
}
}
}

function ensureWebCache(server, obj, json) {
if (server.api && server.api.enabled) {
if (obj.last_query_times.web !== json.last_query_times.web.toISOString()) {
return writeCache(server, json);
}
}
}

function ensureAllCaches(server, obj, json) {
if (server.pterodactyl && server.pterodactyl.enabled) {
if (obj.last_query_times.ptero === json.last_query_times.ptero.toISOString()) {
ensureWebCache(server, obj, json);
ensureServerCache(server, obj, json);
} else {
return writeCache(server, json);
}
}
}

module.exports = {
writeCache,
ensureServerCache,
ensureWebCache,
ensureAllCaches
};

0 comments on commit a8d65c4

Please sign in to comment.