Files
mc-tracker/src/scanner/scanner.ts

65 lines
1.7 KiB
TypeScript
Raw Normal View History

2024-01-01 03:45:00 +00:00
import cron from "node-cron";
2024-01-01 19:43:19 +00:00
import { database, serverManager, websocketServer } from "..";
import Server, { ServerStatus } from "../server/server";
2024-01-01 03:45:00 +00:00
import Config from "../../data/config.json";
2024-01-01 17:04:19 +00:00
import { logger } from "../utils/logger";
2024-01-01 03:45:00 +00:00
export default class Scanner {
constructor() {
2024-01-01 17:04:19 +00:00
logger.info("Loading scanner database");
2024-01-01 03:45:00 +00:00
cron.schedule(Config.scanner.updateCron, () => {
this.scanServers();
});
}
/**
* Start a server scan to ping all servers.
*/
private async scanServers(): Promise<void> {
2024-01-01 17:04:19 +00:00
logger.info(`Scanning servers ${serverManager.getServers().length}`);
2024-01-01 03:45:00 +00:00
// ping all servers in parallel
await Promise.all(
serverManager.getServers().map((server) => this.scanServer(server))
);
2024-01-01 17:04:19 +00:00
logger.info("Finished scanning servers");
2024-01-01 03:45:00 +00:00
}
/**
* Scans a server and inserts the ping into the database.
*
* @param server the server to scan
* @returns a promise that resolves when the server has been scanned
*/
async scanServer(server: Server): Promise<void> {
2024-01-01 17:04:19 +00:00
//logger.info(`Scanning server ${server.getIP()} - ${server.getType()}`);
2024-01-01 03:45:00 +00:00
let response;
let online = false;
try {
response = await server.pingServer();
2024-01-01 03:45:00 +00:00
if (response == undefined) {
return; // Server is offline
}
online = true;
} catch (err) {
2024-01-01 17:04:19 +00:00
logger.info(`Failed to ping ${server.getIP()}`, err);
2024-01-01 19:43:19 +00:00
websocketServer.sendServerError(server, ServerStatus.OFFLINE);
2024-01-01 03:45:00 +00:00
return;
}
if (!online || !response) {
return; // Server is offline
}
2024-01-01 17:04:19 +00:00
database.insertPing(server, response);
2024-01-01 19:43:19 +00:00
const isNewRecord = database.insertRecord(server, response);
// todo: send all server pings at once
websocketServer.sendNewPing(server, response, isNewRecord);
2024-01-01 03:45:00 +00:00
}
}