ddmaster 3.0.0 → 3.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.js +2 -19
- package/package.json +5 -2
- package/{bin.js → src/bin.ts} +10 -9
- package/src/index.ts +19 -0
- package/{serverlist.js → src/serverlist.ts} +15 -14
- package/src/types.ts +43 -0
- package/tsconfig.json +43 -0
package/index.js
CHANGED
|
@@ -1,19 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
*/
|
|
4
|
-
const lib = require('./serverlist');
|
|
5
|
-
|
|
6
|
-
module.exports = lib;
|
|
7
|
-
|
|
8
|
-
if (require.main === module) (async () =>{
|
|
9
|
-
console.log(
|
|
10
|
-
JSON.stringify(
|
|
11
|
-
await lib.getDDNetServers(
|
|
12
|
-
await lib.findDDNetPlayerByName('0374_bober')
|
|
13
|
-
),
|
|
14
|
-
null,
|
|
15
|
-
1
|
|
16
|
-
)
|
|
17
|
-
); // тестовый вызов
|
|
18
|
-
// console.log(await lib.getrawDDNetServers());
|
|
19
|
-
})();
|
|
1
|
+
const ddmaster = require('./lib/index.js');
|
|
2
|
+
module.exports = ddmaster;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ddmaster",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.1.1",
|
|
4
4
|
"description": "Позволяет опрашивать мастер-сервер дднета",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -13,5 +13,8 @@
|
|
|
13
13
|
"author": "0374flop",
|
|
14
14
|
"license": "MIT",
|
|
15
15
|
"type": "commonjs",
|
|
16
|
-
"bin": "./bin.js"
|
|
16
|
+
"bin": "./bin.js",
|
|
17
|
+
"devDependencies": {
|
|
18
|
+
"@types/node": "^25.2.3"
|
|
19
|
+
}
|
|
17
20
|
}
|
package/{bin.js → src/bin.ts}
RENAMED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
const ddmaster = require('./index');
|
|
3
|
+
const ddmaster = require('./index.js');
|
|
4
|
+
|
|
4
5
|
|
|
5
6
|
const [command, ...args] = process.argv.slice(2);
|
|
6
7
|
|
|
7
8
|
if (command === "find") {
|
|
8
|
-
ddmaster.findDDNetPlayerByName(args.join(" ")).then(async servers => {
|
|
9
|
+
ddmaster.findDDNetPlayerByName(args.join(" ")).then(async (servers: import('./types').DDNetServer[]) => {
|
|
9
10
|
if (servers.length === 0) {
|
|
10
11
|
console.log("Player not found on any server.");
|
|
11
12
|
return;
|
|
@@ -13,25 +14,25 @@ if (command === "find") {
|
|
|
13
14
|
|
|
14
15
|
console.log(`Count of servers: ${servers.length}`);
|
|
15
16
|
console.log((await ddmaster.getDDNetServers(servers)).join("\n"));
|
|
16
|
-
}).catch(err => {
|
|
17
|
+
}).catch((err: Error) => {
|
|
17
18
|
console.error('Error:', err);
|
|
18
19
|
});
|
|
19
20
|
} else if (command === "list") {
|
|
20
|
-
ddmaster.getDDNetServers().then(servers => {
|
|
21
|
+
ddmaster.getDDNetServers().then((servers: string[]) => {
|
|
21
22
|
console.log(servers.join("\n"));
|
|
22
|
-
}).catch(err => {
|
|
23
|
+
}).catch((err: Error) => {
|
|
23
24
|
console.error('Error:', err);
|
|
24
25
|
});
|
|
25
26
|
} else if (command === "raw") {
|
|
26
|
-
ddmaster.getrawDDNetServers().then(servers => {
|
|
27
|
+
ddmaster.getrawDDNetServers().then((servers: import('./types').DDNetServer[]) => {
|
|
27
28
|
console.log(JSON.stringify(servers, null, 2));
|
|
28
|
-
}).catch(err => {
|
|
29
|
+
}).catch((err: Error) => {
|
|
29
30
|
console.error('Error:', err);
|
|
30
31
|
});
|
|
31
32
|
} else if (command === "info") {
|
|
32
|
-
ddmaster.getinfoserver(args[0]).then(server => {
|
|
33
|
+
ddmaster.getinfoserver(args[0]).then((server: import('./types').DDNetServer) => {
|
|
33
34
|
console.log(JSON.stringify(server, null, 2));
|
|
34
|
-
}).catch(err => {
|
|
35
|
+
}).catch((err: Error) => {
|
|
35
36
|
console.error('Error:', err);
|
|
36
37
|
});
|
|
37
38
|
} else {
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ddmaster
|
|
3
|
+
*/
|
|
4
|
+
const lib = require('./serverlist.js');
|
|
5
|
+
|
|
6
|
+
module.exports = lib;
|
|
7
|
+
|
|
8
|
+
if (require.main === module) (async () =>{
|
|
9
|
+
console.log(
|
|
10
|
+
JSON.stringify(
|
|
11
|
+
await lib.getDDNetServers(
|
|
12
|
+
await lib.findDDNetPlayerByName('0374_bober')
|
|
13
|
+
),
|
|
14
|
+
null,
|
|
15
|
+
1
|
|
16
|
+
)
|
|
17
|
+
); // тестовый вызов
|
|
18
|
+
// console.log(await lib.getrawDDNetServers());
|
|
19
|
+
})();
|
|
@@ -18,7 +18,7 @@ if (typeof fetch === 'undefined') {
|
|
|
18
18
|
* Делает запрос на мастер сервер ДДНета.
|
|
19
19
|
* @returns Сервера ДДНета но в сыром виде.
|
|
20
20
|
*/
|
|
21
|
-
async function getrawDDNetServers() {
|
|
21
|
+
async function getrawDDNetServers(): Promise<{ servers: import('./types').DDNetServer[] } | null> {
|
|
22
22
|
try {
|
|
23
23
|
const response = await fetch('https://master1.ddnet.org/ddnet/15/servers.json');
|
|
24
24
|
if (!response.ok) throw new Error(`Ошибка при запросе: ${response.status}`);
|
|
@@ -35,7 +35,7 @@ async function getrawDDNetServers() {
|
|
|
35
35
|
* @param {string} addr - берёт примерно такое "tw-0.7+udp://152.89.254.27:8310"
|
|
36
36
|
* @returns {string|null} 152.89.254.27:8310 возвращает чистый адрес (если addr не валидный то null)
|
|
37
37
|
*/
|
|
38
|
-
function convertudptw(addr) {
|
|
38
|
+
function convertudptw(addr: string) {
|
|
39
39
|
if (typeof addr !== 'string') return null;
|
|
40
40
|
const match = addr.match(/(\d{1,3}(\.\d{1,3}){3}:\d+)/);
|
|
41
41
|
return match ? match[1] : null;
|
|
@@ -48,15 +48,15 @@ function convertudptw(addr) {
|
|
|
48
48
|
*/
|
|
49
49
|
async function getDDNetServers(data = null) {
|
|
50
50
|
try {
|
|
51
|
-
const servers = data || (await getrawDDNetServers())
|
|
51
|
+
const servers = data || (await getrawDDNetServers())?.servers;
|
|
52
52
|
if (!servers) {
|
|
53
53
|
return [];
|
|
54
54
|
}
|
|
55
55
|
|
|
56
|
-
const ipv4WithPorts = [];
|
|
56
|
+
const ipv4WithPorts: string[] = [];
|
|
57
57
|
|
|
58
58
|
for (const server of servers) {
|
|
59
|
-
server.addresses.forEach(addr => {
|
|
59
|
+
server.addresses.forEach((addr: string) => {
|
|
60
60
|
const converted = convertudptw(addr);
|
|
61
61
|
if (converted == null) return;
|
|
62
62
|
ipv4WithPorts.push(converted);
|
|
@@ -79,7 +79,7 @@ async function getDDNetServers(data = null) {
|
|
|
79
79
|
* @returns {Promise<Array>} Массив серверов (как в getrawDDNetServers().servers),
|
|
80
80
|
* на которых найден игрок.
|
|
81
81
|
*/
|
|
82
|
-
async function findDDNetPlayerByName(playerName, data = null) {
|
|
82
|
+
async function findDDNetPlayerByName(playerName: string, data = null) {
|
|
83
83
|
if (typeof playerName !== 'string') {
|
|
84
84
|
throw new TypeError('playerName должен быть строкой');
|
|
85
85
|
}
|
|
@@ -96,7 +96,7 @@ async function findDDNetPlayerByName(playerName, data = null) {
|
|
|
96
96
|
const info = server.info;
|
|
97
97
|
if (!info || !Array.isArray(info.clients)) continue;
|
|
98
98
|
|
|
99
|
-
const hasPlayer = info.clients.some(client => client.name === playerName);
|
|
99
|
+
const hasPlayer = info.clients.some((client: import('./types').ServerClient) => client.name === playerName);
|
|
100
100
|
if (hasPlayer) {
|
|
101
101
|
resultServers.push(server);
|
|
102
102
|
}
|
|
@@ -108,23 +108,24 @@ async function findDDNetPlayerByName(playerName, data = null) {
|
|
|
108
108
|
}
|
|
109
109
|
}
|
|
110
110
|
|
|
111
|
-
function filterbycommunity(servers, community) {
|
|
111
|
+
function filterbycommunity(servers: import('./types').DDNetServer[], community: string) {
|
|
112
112
|
return servers.filter(server => server.community === community);
|
|
113
113
|
}
|
|
114
114
|
|
|
115
|
-
function filterbylocation(servers, location) {
|
|
115
|
+
function filterbylocation(servers: import('./types').DDNetServer[], location: string) {
|
|
116
116
|
return servers.filter(server => server.location?.toLowerCase() === location?.toLowerCase());
|
|
117
117
|
}
|
|
118
118
|
|
|
119
|
-
function filterbylocationincludes(servers, location) {
|
|
119
|
+
function filterbylocationincludes(servers: import('./types').DDNetServer[], location: string) {
|
|
120
120
|
return servers.filter(server => server.location?.toLowerCase().includes(location?.toLowerCase()));
|
|
121
121
|
}
|
|
122
122
|
|
|
123
|
-
async function getinfoserver(address) {
|
|
123
|
+
async function getinfoserver(address: string) {
|
|
124
124
|
const servers = await getrawDDNetServers();
|
|
125
|
-
const server = servers
|
|
126
|
-
|
|
127
|
-
|
|
125
|
+
const server = servers?.servers.find((server: import('./types').DDNetServer) => {
|
|
126
|
+
if (server.addresses) return false;
|
|
127
|
+
return convertudptw(server.addresses[0]) === address;
|
|
128
|
+
});
|
|
128
129
|
return server;
|
|
129
130
|
}
|
|
130
131
|
|
package/src/types.ts
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export interface DDNetServer {
|
|
2
|
+
addresses: string[];
|
|
3
|
+
community: string;
|
|
4
|
+
location: string;
|
|
5
|
+
info: ServerInfo;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export interface ServerInfo {
|
|
9
|
+
max_clients: number;
|
|
10
|
+
max_players: number;
|
|
11
|
+
passworded: boolean;
|
|
12
|
+
game_type: string;
|
|
13
|
+
flag: number;
|
|
14
|
+
name: string;
|
|
15
|
+
map: ServerMap;
|
|
16
|
+
version: string;
|
|
17
|
+
client_score_kind: string;
|
|
18
|
+
requires_login: boolean;
|
|
19
|
+
clients: ServerClient[];
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface ServerMap {
|
|
23
|
+
name: string;
|
|
24
|
+
sha256: string;
|
|
25
|
+
size: number;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface ServerClient {
|
|
29
|
+
name: string;
|
|
30
|
+
clan: string;
|
|
31
|
+
country: number;
|
|
32
|
+
score: number;
|
|
33
|
+
is_player: boolean;
|
|
34
|
+
skin: ClientSkin;
|
|
35
|
+
afk: boolean;
|
|
36
|
+
team: number;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface ClientSkin {
|
|
40
|
+
name: string;
|
|
41
|
+
color_body?: number;
|
|
42
|
+
color_feet?: number;
|
|
43
|
+
}
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
// Visit https://aka.ms/tsconfig to read more about this file
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
// File Layout
|
|
5
|
+
"rootDir": "./src",
|
|
6
|
+
"outDir": "./lib",
|
|
7
|
+
|
|
8
|
+
// Environment Settings
|
|
9
|
+
// See also https://aka.ms/tsconfig/module
|
|
10
|
+
"module": "nodenext",
|
|
11
|
+
"target": "esnext",
|
|
12
|
+
"types": ["node"],
|
|
13
|
+
// For nodejs:
|
|
14
|
+
// "lib": ["esnext"],
|
|
15
|
+
// "types": ["node"],
|
|
16
|
+
// and npm install -D @types/node
|
|
17
|
+
|
|
18
|
+
// Other Outputs
|
|
19
|
+
"sourceMap": false,
|
|
20
|
+
"declaration": true,
|
|
21
|
+
"declarationMap": false,
|
|
22
|
+
|
|
23
|
+
// Stricter Typechecking Options
|
|
24
|
+
"noUncheckedIndexedAccess": true,
|
|
25
|
+
"exactOptionalPropertyTypes": true,
|
|
26
|
+
|
|
27
|
+
// Style Options
|
|
28
|
+
// "noImplicitReturns": true,
|
|
29
|
+
// "noImplicitOverride": true,
|
|
30
|
+
// "noUnusedLocals": true,
|
|
31
|
+
// "noUnusedParameters": true,
|
|
32
|
+
// "noFallthroughCasesInSwitch": true,
|
|
33
|
+
// "noPropertyAccessFromIndexSignature": true,
|
|
34
|
+
|
|
35
|
+
// Recommended Options
|
|
36
|
+
"strict": true,
|
|
37
|
+
"verbatimModuleSyntax": true,
|
|
38
|
+
"isolatedModules": true,
|
|
39
|
+
"noUncheckedSideEffectImports": true,
|
|
40
|
+
"moduleDetection": "force",
|
|
41
|
+
"skipLibCheck": true,
|
|
42
|
+
}
|
|
43
|
+
}
|