misc: add mcserver
This commit is contained in:
parent
0a6417c0f7
commit
a94e042831
1 changed files with 153 additions and 0 deletions
|
@ -11,6 +11,7 @@ const {
|
||||||
const GoogleImages = require("google-images");
|
const GoogleImages = require("google-images");
|
||||||
const {tinycolor, random: randomColor} = require("@ctrl/tinycolor");
|
const {tinycolor, random: randomColor} = require("@ctrl/tinycolor");
|
||||||
const sharp = require("sharp");
|
const sharp = require("sharp");
|
||||||
|
const net = require("node:net");
|
||||||
|
|
||||||
const imagesClient = new GoogleImages(hf.apikeys.gimg, hf.apikeys.google);
|
const imagesClient = new GoogleImages(hf.apikeys.gimg, hf.apikeys.google);
|
||||||
|
|
||||||
|
@ -682,3 +683,155 @@ color.callback = async function (msg, line, args, {truerandom}) {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
hf.registerCommand(color);
|
hf.registerCommand(color);
|
||||||
|
|
||||||
|
function writeVarInt(value) {
|
||||||
|
let buf = Buffer.alloc(0);
|
||||||
|
|
||||||
|
do {
|
||||||
|
let temp = value & 0b01111111;
|
||||||
|
|
||||||
|
value >>>= 7;
|
||||||
|
|
||||||
|
if (value != 0) {
|
||||||
|
temp |= 0b10000000;
|
||||||
|
}
|
||||||
|
|
||||||
|
buf = Buffer.concat([buf, Buffer.from([temp])]);
|
||||||
|
} while (value != 0);
|
||||||
|
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
const ident = Buffer.from("HiddenPhox (c7.pm) ", "utf8");
|
||||||
|
const identPort = Buffer.alloc(2);
|
||||||
|
identPort.writeUInt16BE(3);
|
||||||
|
|
||||||
|
const handshake = Buffer.concat([
|
||||||
|
writeVarInt(0x0),
|
||||||
|
writeVarInt(1073741953),
|
||||||
|
writeVarInt(ident.length),
|
||||||
|
ident,
|
||||||
|
identPort,
|
||||||
|
writeVarInt(1),
|
||||||
|
]);
|
||||||
|
const handshakeWithLength = Buffer.concat([
|
||||||
|
writeVarInt(handshake.length),
|
||||||
|
handshake,
|
||||||
|
]);
|
||||||
|
|
||||||
|
const status = Buffer.concat([writeVarInt(1), writeVarInt(0x0)]);
|
||||||
|
|
||||||
|
const HANDSHAKE_PACKET = Buffer.concat(handshakeWithLength, status);
|
||||||
|
|
||||||
|
const formattingToAnsi = {
|
||||||
|
r: "0",
|
||||||
|
l: "1",
|
||||||
|
m: "9",
|
||||||
|
n: "4",
|
||||||
|
o: "3",
|
||||||
|
0: "30",
|
||||||
|
1: "34",
|
||||||
|
2: "32",
|
||||||
|
3: "36",
|
||||||
|
4: "31",
|
||||||
|
5: "35",
|
||||||
|
6: "33",
|
||||||
|
7: "37",
|
||||||
|
8: "90",
|
||||||
|
9: "94",
|
||||||
|
a: "92",
|
||||||
|
b: "96",
|
||||||
|
c: "91",
|
||||||
|
d: "95",
|
||||||
|
e: "93",
|
||||||
|
f: "97",
|
||||||
|
};
|
||||||
|
|
||||||
|
const mcserver = new Command("mcserver");
|
||||||
|
mcserver.category = CATEGORY;
|
||||||
|
mcserver.helpText = "Query a Minecraft server";
|
||||||
|
mcserver.callback = async function (msg, line) {
|
||||||
|
if (!line || line == "") return "Arguments required.";
|
||||||
|
|
||||||
|
const [ip, port] = line.split(":");
|
||||||
|
|
||||||
|
const data = await new Promise((resolve, reject) => {
|
||||||
|
const timeout = setTimeout(() => resolve("timeout"), 5000);
|
||||||
|
|
||||||
|
const client = net.createConnection({
|
||||||
|
host: ip,
|
||||||
|
port: port ?? 25565,
|
||||||
|
timeout: 5000,
|
||||||
|
});
|
||||||
|
client.on("connect", async function () {
|
||||||
|
client.write(HANDSHAKE_PACKET);
|
||||||
|
});
|
||||||
|
let totalData = Buffer.alloc(0);
|
||||||
|
client.on("data", function (data) {
|
||||||
|
totalData = Buffer.concat(totalData, data);
|
||||||
|
});
|
||||||
|
|
||||||
|
client.on("close", function (err) {
|
||||||
|
if (err) return reject(err);
|
||||||
|
const dataAsString = totalData.toString().trim();
|
||||||
|
console.log(dataAsString);
|
||||||
|
const json = JSON.parse(
|
||||||
|
dataAsString.slice(
|
||||||
|
dataAsString.indexOf("{"),
|
||||||
|
dataAsString.lastIndexOf("}") + 1
|
||||||
|
)
|
||||||
|
);
|
||||||
|
clearTimeout(timeout);
|
||||||
|
return resolve(json);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
if (data == "timeout") {
|
||||||
|
return "Timed out trying to query.";
|
||||||
|
} else {
|
||||||
|
const motd = data.description.text.replace(
|
||||||
|
/\u00a7([a-f0-9k-or])/gi,
|
||||||
|
(formatting) => {
|
||||||
|
const ansi = formattingToAnsi[formatting];
|
||||||
|
return ansi ? `\x1b[${ansi}m` : "";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
const players = data.players?.sample?.map((player) => player.name) ?? [];
|
||||||
|
const totalPlayers = `(${data.players.online}/${data.players.max})`;
|
||||||
|
let image;
|
||||||
|
if (data.favicon) {
|
||||||
|
image = Buffer.from(data.favicon.slice(data.favicon.indexOf(",")));
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
embed: {
|
||||||
|
title: `Server info for: \`${line}\``,
|
||||||
|
fields: [
|
||||||
|
{
|
||||||
|
name: "MOTD",
|
||||||
|
value: `\`\`\`ansi\n${motd}\n\`\`\``,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Version",
|
||||||
|
value: `${data.version.name} (\`${data.version.protocol}\`)`,
|
||||||
|
inline: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: `Players ${players.length > 0 ? totalPlayers : ""}`,
|
||||||
|
value: players.length > 0 ? players.join(", ") : totalPlayers,
|
||||||
|
inline: players.length == 0,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
thumbnail: image && {
|
||||||
|
url: "attachment://icon.png",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
file: {
|
||||||
|
file: image,
|
||||||
|
name: "icon.png",
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
hf.registerCommand(mcserver);
|
||||||
|
|
Loading…
Reference in a new issue