mirror of
https://github.com/minescope/mineping.git
synced 2025-07-15 00:34:40 +03:00
Compare commits
13 Commits
v1.1.1
...
9d25aaf4ea
Author | SHA1 | Date | |
---|---|---|---|
9d25aaf4ea
|
|||
c735604c38
|
|||
afdaa9eb3e
|
|||
435899309f | |||
13e6b8c6ff | |||
d7256eabe7
|
|||
afa2c3025f
|
|||
6c297d0b8c
|
|||
283e9b32c6 | |||
354fa212a6 | |||
d9bf4cfb3f | |||
9dace3748b
|
|||
0aa73655b1
|
@ -1,6 +1,6 @@
|
|||||||
# mineping
|
# mineping
|
||||||
|
|
||||||
`mineping` is a Javasript library thar provides Minecraft server ping protocol implementation. It can be used to collect information about the server, such as MODT, current online, server icon (java edition only) and etc.
|
This JavaScript library provides an implementation of the Minecraft server ping protocol. **It allows you to gather information about a Minecraft server**, such as the MOTD, current online players, server icon (Java Edition only), and more.
|
||||||
|
|
||||||
Mirror on my [<img src="https://git.zeldon.ru/assets/img/logo.svg" align="center" width="20" height="20"/> Git](https://git.zeldon.ru/zeldon/mineping)
|
Mirror on my [<img src="https://git.zeldon.ru/assets/img/logo.svg" align="center" width="20" height="20"/> Git](https://git.zeldon.ru/zeldon/mineping)
|
||||||
|
|
||||||
@ -10,6 +10,8 @@ Mirror on my [<img src="https://git.zeldon.ru/assets/img/logo.svg" align="center
|
|||||||
|
|
||||||
## Install
|
## Install
|
||||||
|
|
||||||
|
To install `mineping`, simply run the following command:
|
||||||
|
|
||||||
```
|
```
|
||||||
npm i @minescope/mineping
|
npm i @minescope/mineping
|
||||||
```
|
```
|
||||||
@ -17,6 +19,7 @@ npm i @minescope/mineping
|
|||||||
## Loading and configuration the module
|
## Loading and configuration the module
|
||||||
|
|
||||||
### ES Modules (ESM)
|
### ES Modules (ESM)
|
||||||
|
If you are using ES Modules, you can import the library like this:
|
||||||
|
|
||||||
```js
|
```js
|
||||||
import { pingJava, pingBedrock } from '@minescope/mineping';
|
import { pingJava, pingBedrock } from '@minescope/mineping';
|
||||||
@ -59,5 +62,7 @@ console.log(data);
|
|||||||
|
|
||||||
## Acknowledgements
|
## Acknowledgements
|
||||||
|
|
||||||
|
Special thanks to the following projects:
|
||||||
|
|
||||||
- [mcping](https://github.com/Scetch/mcping) crate for Rust
|
- [mcping](https://github.com/Scetch/mcping) crate for Rust
|
||||||
- [mcping-js](https://github.com/Cryptkeeper/mcping-js) library for quering Minecraft Java Edition servers
|
- [mcping-js](https://github.com/Cryptkeeper/mcping-js) library for quering Minecraft Java Edition servers
|
||||||
|
@ -13,6 +13,7 @@ const results = await Promise.allSettled(pingPromises);
|
|||||||
for (let result of results) {
|
for (let result of results) {
|
||||||
if (result.status === 'rejected') {
|
if (result.status === 'rejected') {
|
||||||
console.error(result.reason);
|
console.error(result.reason);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log(result.value);
|
console.log(result.value);
|
||||||
|
@ -12,37 +12,6 @@ import dgram from 'dgram';
|
|||||||
|
|
||||||
const START_TIME = new Date().getTime();
|
const START_TIME = new Date().getTime();
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a buffer with the specified length.
|
|
||||||
* @param {number} length - The length of the buffer.
|
|
||||||
* @returns {Buffer} - The created buffer.
|
|
||||||
*/
|
|
||||||
const createBuffer = (length) => {
|
|
||||||
const buffer = Buffer.alloc(length);
|
|
||||||
buffer[0] = 0x01;
|
|
||||||
return buffer;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Writes a BigInt value to the buffer at the specified offset using big-endian byte order.
|
|
||||||
* @param {Buffer} buffer - The buffer to write to.
|
|
||||||
* @param {number} value - The BigInt value to write.
|
|
||||||
* @param {number} offset - The offset in the buffer to write the value.
|
|
||||||
*/
|
|
||||||
const writeBigInt64BE = (buffer, value, offset) => {
|
|
||||||
buffer.writeBigInt64BE(BigInt(value), offset);
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Copies the specified hex value to the buffer at the specified offset.
|
|
||||||
* @param {Buffer} buffer - The buffer to copy to.
|
|
||||||
* @param {string} hex - The hex value to copy.
|
|
||||||
* @param {number} offset - The offset in the buffer to copy the value.
|
|
||||||
*/
|
|
||||||
const copyHexToBuffer = (buffer, hex, offset) => {
|
|
||||||
Buffer.from(hex, 'hex').copy(buffer, offset);
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reads a BigInt value from the buffer at the specified offset using big-endian byte order.
|
* Reads a BigInt value from the buffer at the specified offset using big-endian byte order.
|
||||||
* @param {Buffer} buffer - The buffer to read from.
|
* @param {Buffer} buffer - The buffer to read from.
|
||||||
@ -71,7 +40,7 @@ const readStringFromBuffer = (buffer, offset) => {
|
|||||||
*/
|
*/
|
||||||
const parseAdvertiseString = (advertiseStr) => {
|
const parseAdvertiseString = (advertiseStr) => {
|
||||||
const parts = advertiseStr.split(';');
|
const parts = advertiseStr.split(';');
|
||||||
return {
|
const parsedParts = {
|
||||||
gameId: parts[0],
|
gameId: parts[0],
|
||||||
description: parts[1],
|
description: parts[1],
|
||||||
protocolVersion: parts[2],
|
protocolVersion: parts[2],
|
||||||
@ -81,6 +50,8 @@ const parseAdvertiseString = (advertiseStr) => {
|
|||||||
name: parts[7],
|
name: parts[7],
|
||||||
mode: parts[8]
|
mode: parts[8]
|
||||||
};
|
};
|
||||||
|
|
||||||
|
return parsedParts;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -90,10 +61,11 @@ const parseAdvertiseString = (advertiseStr) => {
|
|||||||
* @see {@link https://wiki.vg/Raknet_Protocol#Unconnected_Ping}
|
* @see {@link https://wiki.vg/Raknet_Protocol#Unconnected_Ping}
|
||||||
*/
|
*/
|
||||||
const UNCONNECTED_PING = (pingId) => {
|
const UNCONNECTED_PING = (pingId) => {
|
||||||
const buffer = createBuffer(35);
|
const buffer = Buffer.alloc(33);
|
||||||
writeBigInt64BE(buffer, pingId, 1);
|
buffer.writeUInt8(0x01, 0);
|
||||||
copyHexToBuffer(buffer, '00ffff00fefefefefdfdfdfd12345678', 9);
|
buffer.writeBigInt64LE(BigInt(pingId), 1);
|
||||||
writeBigInt64BE(buffer, 0, 25);
|
Buffer.from("00ffff00fefefefefdfdfdfd12345678", "hex").copy(buffer, 9);
|
||||||
|
buffer.writeBigInt64LE(BigInt(0), 25);
|
||||||
return buffer;
|
return buffer;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -174,8 +146,9 @@ const ping = (host, port = 19132, cb, timeout = 5000) => {
|
|||||||
case 0x1c: {
|
case 0x1c: {
|
||||||
const pong = UNCONNECTED_PONG(msg);
|
const pong = UNCONNECTED_PONG(msg);
|
||||||
const clientData = {
|
const clientData = {
|
||||||
|
name: pong.name,
|
||||||
version: {
|
version: {
|
||||||
name: pong.name,
|
gameVersion: pong.gameVersion,
|
||||||
protocol: pong.protocolVersion
|
protocol: pong.protocolVersion
|
||||||
},
|
},
|
||||||
players: {
|
players: {
|
||||||
|
15
lib/java.js
15
lib/java.js
@ -8,16 +8,15 @@
|
|||||||
import net from 'net';
|
import net from 'net';
|
||||||
import varint from './varint.js';
|
import varint from './varint.js';
|
||||||
|
|
||||||
const PROTOCOL_VERSION = 0;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Ping a Minecraft Java server.
|
* Ping a Minecraft Java server.
|
||||||
* @param {string} host The host of the Java server.
|
* @param {string} host The host of the Java server.
|
||||||
* @param {number} [port=25565] The port of the Java server.
|
* @param {number} [port=25565] The port of the Java server.
|
||||||
* @param {function} cb The callback function to handle the ping response.
|
* @param {function} cb The callback function to handle the ping response.
|
||||||
* @param {number} [timeout=5000] The timeout duration in milliseconds.
|
* @param {number} [timeout=5000] The timeout duration in milliseconds.
|
||||||
|
* @param {number} [protocolVersion=-1] The protocol version of the Java client.
|
||||||
*/
|
*/
|
||||||
function ping(host, port = 25565, cb, timeout = 5000) {
|
function ping(host, port = 25565, cb, timeout = 5000, protocolVersion = -1) {
|
||||||
const socket = net.createConnection(({ host, port }));
|
const socket = net.createConnection(({ host, port }));
|
||||||
|
|
||||||
// Set manual timeout interval.
|
// Set manual timeout interval.
|
||||||
@ -56,7 +55,7 @@ function ping(host, port = 25565, cb, timeout = 5000) {
|
|||||||
socket.on('connect', () => {
|
socket.on('connect', () => {
|
||||||
const handshake = varint.concat([
|
const handshake = varint.concat([
|
||||||
varint.encodeInt(0),
|
varint.encodeInt(0),
|
||||||
varint.encodeInt(PROTOCOL_VERSION),
|
varint.encodeInt(protocolVersion),
|
||||||
varint.encodeInt(host.length),
|
varint.encodeInt(host.length),
|
||||||
varint.encodeString(host),
|
varint.encodeString(host),
|
||||||
varint.encodeUShort(port),
|
varint.encodeUShort(port),
|
||||||
@ -118,7 +117,7 @@ function ping(host, port = 25565, cb, timeout = 5000) {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Asynchronously ping Minecraft Java server.
|
* Asynchronously ping Minecraft Java server.
|
||||||
* The optional `options` argument can be an object with a `ping` (default is `25565`) or/and `timeout` (default is `5000`) property.
|
* The optional `options` argument can be an object with a `port` (default is `25565`) or/and `timeout` (default is `5000`) or/and `protocolVersion` (default is `-1`) property.
|
||||||
* @param {string} host The Java server address.
|
* @param {string} host The Java server address.
|
||||||
* @param {import('../types/index.js').PingOptions} options The configuration for pinging Minecraft Java server.
|
* @param {import('../types/index.js').PingOptions} options The configuration for pinging Minecraft Java server.
|
||||||
* @returns {Promise<import('../types/index.js').JavaPingResponse>}
|
* @returns {Promise<import('../types/index.js').JavaPingResponse>}
|
||||||
@ -126,11 +125,11 @@ function ping(host, port = 25565, cb, timeout = 5000) {
|
|||||||
export function pingJava(host, options = {}) {
|
export function pingJava(host, options = {}) {
|
||||||
if (!host) throw new Error('Host argument is not provided');
|
if (!host) throw new Error('Host argument is not provided');
|
||||||
|
|
||||||
const { port = 25565, timeout = 5000 } = options;
|
const { port = 25565, timeout = 5000, protocolVersion = -1 } = options;
|
||||||
|
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
ping(host, port, (res, err) => {
|
ping(host, port, (res, err) => {
|
||||||
err ? reject(err) : resolve(res);
|
err ? reject(err) : resolve(res);
|
||||||
}, timeout);
|
}, timeout, protocolVersion);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@minescope/mineping",
|
"name": "@minescope/mineping",
|
||||||
"version": "1.1.1",
|
"version": "1.3.0",
|
||||||
"description": "Ping both Minecraft Bedrock and Java servers.",
|
"description": "Ping both Minecraft Bedrock and Java servers.",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"types": "types/index.d.ts",
|
"types": "types/index.d.ts",
|
||||||
|
12
types/lib/bedrock.d.ts
vendored
12
types/lib/bedrock.d.ts
vendored
@ -2,14 +2,15 @@
|
|||||||
* @param port The server port.
|
* @param port The server port.
|
||||||
* @param timeout The read/write socket timeout.
|
* @param timeout The read/write socket timeout.
|
||||||
*/
|
*/
|
||||||
export type PingOptions = {
|
export type BedrockPingOptions = {
|
||||||
port: number,
|
port?: number | undefined,
|
||||||
timeout: number;
|
timeout?: number | undefined;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type BedrockPingResponse = {
|
export type BedrockPingResponse = {
|
||||||
|
name: string;
|
||||||
version: {
|
version: {
|
||||||
name: string;
|
gameVersion: string;
|
||||||
protocol: string;
|
protocol: string;
|
||||||
};
|
};
|
||||||
players: {
|
players: {
|
||||||
@ -26,6 +27,7 @@ export type BedrockPingResponse = {
|
|||||||
* The optional `options` argument can be an object with a `ping` (default is `19132`) or/and `timeout` (default is `5000`) property.
|
* The optional `options` argument can be an object with a `ping` (default is `19132`) or/and `timeout` (default is `5000`) property.
|
||||||
*
|
*
|
||||||
* @param host The Bedrock server address.
|
* @param host The Bedrock server address.
|
||||||
|
* @param options The configuration for pinging Minecraft Bedrock server.
|
||||||
*
|
*
|
||||||
* ```js
|
* ```js
|
||||||
* import { pingBedrock } from '@minescope/mineping';
|
* import { pingBedrock } from '@minescope/mineping';
|
||||||
@ -45,5 +47,5 @@ export type BedrockPingResponse = {
|
|||||||
* ```
|
* ```
|
||||||
* @see [source](https://github.com/minescope/mineping/blob/915edbec9c9ad811459458600af3531ec0836911/lib/bedrock.js#L204)
|
* @see [source](https://github.com/minescope/mineping/blob/915edbec9c9ad811459458600af3531ec0836911/lib/bedrock.js#L204)
|
||||||
*/
|
*/
|
||||||
export function pingBedrock(host: string, options?: PingOptions): Promise<BedrockPingResponse>;
|
export function pingBedrock(host: string, options?: BedrockPingOptions): Promise<BedrockPingResponse>;
|
||||||
|
|
||||||
|
13
types/lib/java.d.ts
vendored
13
types/lib/java.d.ts
vendored
@ -1,4 +1,13 @@
|
|||||||
import { PingOptions } from "./bedrock";
|
/**
|
||||||
|
* @param port The server port.
|
||||||
|
* @param timeout The read/write socket timeout.
|
||||||
|
* @param protocolVersion The protocol version.
|
||||||
|
*/
|
||||||
|
export type JavaPingOptions = {
|
||||||
|
port?: number | undefined,
|
||||||
|
timeout?: number | undefined,
|
||||||
|
protocolVersion?: number | undefined;
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* JSON format chat component used for description field.
|
* JSON format chat component used for description field.
|
||||||
@ -67,5 +76,5 @@ export type JavaPingResponse = {
|
|||||||
* ```
|
* ```
|
||||||
* @see [source](https://github.com/minescope/mineping/blob/915edbec9c9ad811459458600af3531ec0836911/lib/java.js#L117)
|
* @see [source](https://github.com/minescope/mineping/blob/915edbec9c9ad811459458600af3531ec0836911/lib/java.js#L117)
|
||||||
*/
|
*/
|
||||||
export function pingJava(host: string, options?: PingOptions): Promise<JavaPingResponse>;
|
export function pingJava(host: string, options?: JavaPingOptions): Promise<JavaPingResponse>;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user