mhstatus
Version:
a cmdline tool to check the status of minehut servers
225 lines (218 loc) • 9.15 kB
JavaScript
// https://api.minehut.com/server/${args[0]}?byName=true
// >> https://api.bennydoesstuff.me/
// https://api.ashcon.app/mojang/v2/user/${n}
// https://playerdb.co/
import fetch from "node-fetch";
import chalk from "chalk";
import boxen from "boxen";
import config from "./config.js";
import clui from "clui";
import * as helper from "./helper.js";
import { credits } from "./credits.js";
// let goes here
let last_online = false;
let timed = false;
let short = false;
let connected_servers = new Array();
let connected_server_statuses = new Array();
let init_time = new String();
let desc = new String();
let cs /*, pl */ = new String();
const args = process.argv.slice(2);
const spinner = new clui.Spinner("", config.spinner_type[helper.random_integer(0, config.spinner_type.length - 1)]);
spinner.start();
spinner.message("retrieving data...");
if (args[0] == undefined || !args[0]) {
console.log(chalk.red.bold("(mhstatus || mhs || mh) [server] [options]"));
console.log(chalk.red.bold("\nOptions:"));
console.log(chalk.cyan.bold(config.help_msg));
process.exit();
} else if (args.includes("--debug") || args.includes("--d") || args.includes("-d") == true) {
console.log("version: " + chalk.cyan.bold(config.version));
console.log("args: " + chalk.cyan.bold(args.join(", ")));
process.exit();
} else if (args.includes("credits") == true) {
credits();
process.exit();
} else if (args.includes("--spin2win") == true) {
helper.syncSetTimeout(() => {
spinner.stop();
process.exit();
}, 5000);
} else if ((args.includes("--time") || args.includes("-time") || args.includes("-t")) == true) {
if (args[1] != undefined || args[1]) {
timed = true;
init_time = new Date().getTime();
} else {
console.log(chalk.red("-t requires a server argument"));
}
} else if ((args.includes("--version") || args.includes("--v") || args.includes("-v")) == true) {
console.log(chalk.cyan.bold(config.version));
process.exit();
} else if ((args.includes("--short") || args.includes("--s") || args.includes("-s")) == true) {
if (args[1] != undefined || args[1]) {
short = true;
} else {
console.log(chalk.red("-s requires a server argument"));
}
}
// --api goes here
if (args[0].includes("-") == true) {
console.log(chalk.red("server argument cannot contain -"));
console.log(chalk.grey.italic("did you just try to input an option as a server name?"));
process.exit();
}
const resp = await fetch(`https://api.minehut.com/server/${args[0]}?byName=true`)
.then((response) => response.json())
.then(spinner.message("formatting data..."));
if (resp.ok == false) {
console.error("Server not found");
spinner.stop();
}
if (resp.server.connectedServers.length != 0) {
let i = 1;
for (const s of resp.server.connectedServers) {
const sresp = await fetch(`https://api.minehut.com/server/${s}`)
.then((response) => response.json())
.then(spinner.message(`retrieving connected servers, ${i}/${resp.server.connectedServers.length}`))
.then(i++);
const server = sresp.server.name;
const server_status = sresp.server.online;
connected_servers.push(server);
if (server_status == true) connected_server_statuses.push("online");
else connected_server_statuses.push(`offline (${helper.timeDifference(new Date().getTime(), sresp.server.last_online)})`);
}
}
// pl goes here
if (timed == true) {
if (resp.server.playerCount == 0) {
console.log(chalk.red.bold("cannot time a server with no players"));
process.exit();
}
console.log(chalk.cyan.bold(`entire process took ${new Date().getTime() - init_time}ms`));
// api times goes here
}
const relative_creation_date = helper.timeDifference(new Date().getTime(), resp.server.creation);
if (!resp.server.maxPlayers) resp.server.maxPlayers = "0";
if (resp.server.online == false) {
last_online = "(" + helper.timeDifference(new Date().getTime(), resp.server.last_online) + ")";
} else {
last_online = " ";
}
if (resp.server.rawPlan != "") {
resp.server.rawPlan = "(" + resp.server.rawPlan + ")";
}
const online = resp.server.online ? chalk.green.bold("online") : chalk.red.bold("offline");
const visibility = resp.server.visibility ? chalk.green.bold("public") : chalk.red.bold("private");
const credits_per_day = Math.ceil(resp.server.credits_per_day);
let categories = resp.server.categories.join(", ");
if (resp.server.connectedServers.length != 0) {
for (let c = 0; c < connected_servers.length; c++) {
if (connected_server_statuses[c] == "online") {
cs += `${chalk.blue.bold(">>")} ${connected_servers[c]} - ${chalk.green.bold(connected_server_statuses[c])}`;
if (c != connected_servers.length - 1) cs += "\n";
} else if (connected_server_statuses[c] == "offline") {
cs += `${chalk.red.bold(">>")} ${connected_servers[c]} - ${chalk.red.bold(connected_server_statuses[c])}\n`;
if (c != connected_servers.length - 1) cs += "\n";
}
}
}
if (resp.server.connectedServers.length == 0) cs = "none";
if (resp.server.categories.length == 0) categories = "none";
// properties go here
if (short == false) {
desc = `
${online} ${chalk.grey.bold(last_online)}
${chalk.cyan.bold(resp.server.playerCount + "/" + resp.server.maxPlayers + " players")}
created on: ${chalk.blue.bold(new Date(resp.server.creation).toUTCString())}
${chalk.blue.bold(">>")} ${relative_creation_date}
server type: ${chalk.blue.bold(resp.server.server_version_type)}
server plan: ${chalk.blue.bold(resp.server.activeServerPlan)} ${chalk.cyan.bold(resp.server.rawPlan)}
categories: ${chalk.blue.bold(categories)}
credit cost: ${chalk.blue.bold(credits_per_day)} credits per day
connected servers:
${cs}
`;
} else {
desc = `
${online} ${chalk.grey.bold(last_online)}
${chalk.cyan.bold(resp.server.playerCount + "/" + resp.server.maxPlayers + " players")}
`;
}
spinner.stop();
console.log(
boxen(desc, {
title: `${chalk.cyan(resp.server.name_lower + ".minehut.gg")}`,
titleAlignment: "left",
borderStyle: "round",
})
);
// pl:
// if (resp.server.playerCount !== 0) {
// if (api == "playerdb") {
// var spinner = new clui.Spinner("", ["◜", "◠", "◝", "◞", "◡", "◟"]);
// if (timed == false) spinner.start();
// for (const n of resp.server.players) {
// const nr = await fetch(`https://playerdb.co/api/player/minecraft/${n}`)
// .then((response) => response.json())
// .then(i++);
// if (nr.error == true) {
// pl = pl + "(bedrock player)";
// }
// const username = nr.data.player.username;
// if (i == 1) pl = username + "\n";
// else pl = pl + username + "\n";
// if (timed == true) {
// let time = new Date().getTime() - init_time;
// console.log(chalk[helper.random_chalk_color()].bold(`api call #${i} took ${time / 1000}s (${time}ms)`));
// a.push(time);
// }
// if (i == resp.server.playerCount && timed == false) {
// spinner.stop();
// }
// }
// } // else if (api == "ashcon") {
// // if (args.some((e) => regex.test(e)) == false) console.log(chalk.magenta.bold("using api ashcon"));
// // for (const n of resp.server.players) {
// // const onlineplayers = await fetch(`https://api.ashcon.app/mojang/v2/user/${n}`)
// // .then((response) => response.json())
// // .then(i++);
// // var username = onlineplayers.username;
// // if (onlineplayers.error == true) {
// // pl = pl + "(BEDROCK PLAYER)" + "\n";
// // bedrock = false;
// // } else pl = pl + username.replace(".", "(BEDROCK) ") + "\n";
// // if (timed == true) {
// // let now_time = new Date().getTime();
// // let time = now_time - init_time;
// // console.log(chalk[helper.random_chalk_color()].bold(`api call #${i} took ${time / 1000}s (${time}ms)`));
// // a.push(time);
// // }
// // }
// // }
// } else {
// pl = pl + "none lmfao";
// }
// properties
// const whitelist_status = resp.server["white-list"] ? chalk.green.bold("is whitelisted") : chalk.red.bold("is not whitelisted");
// const hardcore = resp.server.server_properties.hardcore ? chalk.bgRed("is hardcore") : chalk.red.bold("is not hardcore");
// const border = resp.server.server_properties["max-world-size"];
// const tick_speed = resp.server.server_properties["max-tick-time"];
// const world_name = resp.server.server_properties["level-name"];
// const spawn_game_mode = resp.server.server_properties.gamemode;
// --api
//} else if ((args.includes("--api") || args.includes("-api")) == true) {
// api = args[args.findIndex((value) => /-?-api/.test(value)) + 1];
// if (api == undefined || (api !== "ashcon" && api !== "playerdb")) {
// console.log(chalk.red("ashcon, playerdb (default, faster sometimes)"));
// process.exit();
// }
// }
// let
// let a = new Array();
// let api = "playerdb";
// let i = new Number();
// api times
// console.log(chalk.magenta.bold(`uuid to username api calls (total) took: ${a.reduce((previousValue, currentValue) => previousValue + currentValue, 0)}ms`));
// console.log(chalk.green.bold(`${i} api calls`));