ddmaster 3.0.0 → 3.1.0

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ddmaster",
3
- "version": "3.0.0",
3
+ "version": "3.1.0",
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
  }
@@ -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 {
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * ddmaster
3
3
  */
4
- const lib = require('./serverlist');
4
+ const lib = require('./serverlist.js');
5
5
 
6
6
  module.exports = lib;
7
7
 
@@ -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()).servers;
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.servers.find(server =>
126
- convertudptw(server.addresses[0]) === address
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
+ }