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 {tinycolor, random: randomColor} = require("@ctrl/tinycolor");
 | 
			
		||||
const sharp = require("sharp");
 | 
			
		||||
const net = require("node:net");
 | 
			
		||||
 | 
			
		||||
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);
 | 
			
		||||
 | 
			
		||||
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…
	
	Add table
		Add a link
		
	
		Reference in a new issue