ddmaster 2.2.0 → 2.3.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/README.md CHANGED
@@ -2,101 +2,117 @@
2
2
  позже добавлю другие функции, сейчас пока что только получение сырой инфы и список серверов.
3
3
  Пакет зделан чтобы проще работать с ДДНет серверами.
4
4
 
5
- getDDNetServers() - Возвращает сервера дднет в виде [ 'ip:port' ]
5
+ getDDNetServers() - Возвращает сервера дднет в виде [ 'ip:port' ], принимает второй параметер data. (getrawDDNetServers)
6
6
  getrawDDNetServers() - Возвращает сырую инфу
7
+ convertudptw(addr) - берет что-то типа "tw-0.6+udp://203.86.233.50:8352" и возвращает просто "айпи:порт"
8
+ вот код етой штуки
9
+ "
10
+ function convertudptw(addr) {
11
+ if (typeof addr !== 'string') return null;
12
+ const match = addr.match(/(\d{1,3}(\.\d{1,3}){3}:\d+)/);
13
+ return match ? match[1] : null;
14
+ }
15
+ "
16
+ findDDNetPlayerByName(name) - штука которая возвращает примерно ту же raw дату (как у getrawDDNetServers),
17
+ но отфильтровано где есть нужный игрок.
18
+ Так же можно передавать data как второй параметр, тоесть типа findDDNetPlayerByName(playerName, data) и data тут со структорой как у getrawDDNetServers.
7
19
 
8
20
  Лицензия MIT (./LICENSE)
9
21
 
10
- npm i ddmaster
11
- const ddmaster = require('ddmaster');
22
+ npm i ddmaster устанавливаем
12
23
 
13
24
 
14
- getrawDDNetServers() пример
15
- [{
16
- "addresses": [
17
- "tw-0.6+udp://203.86.233.50:8352",
18
- "tw-0.7+udp://203.86.233.50:8352"
19
- ],
20
- "community": "ddnet",
21
- "location": "as:hk",
22
- "info": {
23
- "max_clients": 63,
24
- "max_players": 63,
25
- "passworded": false,
26
- "game_type": "DDraceNetwork",
27
- "flag": 156,
28
- "name": "DDNet CHN1 香港 - Moderate 中阶",
29
- "map": {
30
- "name": "Weapons",
31
- "sha256": "8d6d0f5724dbec496d2ed88dc50c80ff09fdc6fd3d60bd2e1de6d3e666544054",
32
- "size": 625069
33
- },
34
- "version": "0.6.4, 19.6",
35
- "client_score_kind": "time",
36
- "requires_login": false,
37
- "clients": [
38
- {
39
- "name": "Rabbit Doll",
40
- "clan": "兔玩偶",
41
- "country": -1,
42
- "score": -9999,
43
- "is_player": true,
44
- "skin": {
45
- "name": "rongrongtu_blue"
46
- },
47
- "afk": false,
48
- "team": 0
49
- },
50
- {
51
- "name": "Nyakori's",
52
- "clan": "兔玩偶",
53
- "country": -1,
54
- "score": -9999,
55
- "is_player": true,
56
- "skin": {
57
- "name": "rongrongtu_pink"
58
- },
59
- "afk": false,
60
- "team": 0
61
- },
62
- {
63
- "name": "18687017299",
64
- "clan": "糖糖教",
65
- "country": -1,
66
- "score": -9999,
67
- "is_player": true,
68
- "skin": {
69
- "name": "Shadow Catsk"
70
- },
71
- "afk": true,
72
- "team": 0
73
- },
74
- {
75
- "name": "pbAdq",
76
- "clan": "",
77
- "country": -1,
78
- "score": 2167,
79
- "is_player": true,
80
- "skin": {
81
- "name": "maotouying"
82
- },
83
- "afk": false,
84
- "team": 0
85
- },
86
- {
87
- "name": "549120418",
88
- "clan": "日月教",
89
- "country": 156,
90
- "score": -9999,
91
- "is_player": true,
92
- "skin": {
93
- "name": "ghostjtj",
94
- "color_body": 14810880,
95
- "color_feet": 16776960
25
+ const ddmaster = require('ddmaster'); рекуирим
26
+
27
+
28
+ getrawDDNetServers() пример того что выдаст (будет много серверов, но тут только один)
29
+ [
30
+ {
31
+ "addresses": [
32
+ "tw-0.6+udp://203.86.233.50:8352",
33
+ "tw-0.7+udp://203.86.233.50:8352"
34
+ ],
35
+ "community": "ddnet",
36
+ "location": "as:hk",
37
+ "info": {
38
+ "max_clients": 63,
39
+ "max_players": 63,
40
+ "passworded": false,
41
+ "game_type": "DDraceNetwork",
42
+ "flag": 156,
43
+ "name": "DDNet CHN1 香港 - Moderate 中阶",
44
+ "map": {
45
+ "name": "Weapons",
46
+ "sha256": "8d6d0f5724dbec496d2ed88dc50c80ff09fdc6fd3d60bd2e1de6d3e666544054",
47
+ "size": 625069
96
48
  },
97
- "afk": false,
98
- "team": 0
99
- }
100
- ]
101
- }
102
- }]
49
+ "version": "0.6.4, 19.6",
50
+ "client_score_kind": "time",
51
+ "requires_login": false,
52
+ "clients": [
53
+ {
54
+ "name": "Rabbit Doll",
55
+ "clan": "兔玩偶",
56
+ "country": -1,
57
+ "score": -9999,
58
+ "is_player": true,
59
+ "skin": {
60
+ "name": "rongrongtu_blue"
61
+ },
62
+ "afk": false,
63
+ "team": 0
64
+ },
65
+ {
66
+ "name": "Nyakori's",
67
+ "clan": "兔玩偶",
68
+ "country": -1,
69
+ "score": -9999,
70
+ "is_player": true,
71
+ "skin": {
72
+ "name": "rongrongtu_pink"
73
+ },
74
+ "afk": false,
75
+ "team": 0
76
+ },
77
+ {
78
+ "name": "18687017299",
79
+ "clan": "糖糖教",
80
+ "country": -1,
81
+ "score": -9999,
82
+ "is_player": true,
83
+ "skin": {
84
+ "name": "Shadow Catsk"
85
+ },
86
+ "afk": true,
87
+ "team": 0
88
+ },
89
+ {
90
+ "name": "pbAdq",
91
+ "clan": "",
92
+ "country": -1,
93
+ "score": 2167,
94
+ "is_player": true,
95
+ "skin": {
96
+ "name": "maotouying"
97
+ },
98
+ "afk": false,
99
+ "team": 0
100
+ },
101
+ {
102
+ "name": "549120418",
103
+ "clan": "日月教",
104
+ "country": 156,
105
+ "score": -9999,
106
+ "is_player": true,
107
+ "skin": {
108
+ "name": "ghostjtj",
109
+ "color_body": 14810880,
110
+ "color_feet": 16776960
111
+ },
112
+ "afk": false,
113
+ "team": 0
114
+ }
115
+ ]
116
+ }
117
+ }
118
+ ]
package/index.js CHANGED
@@ -1,6 +1,20 @@
1
+ /**
2
+ * ddmaster
3
+ */
1
4
  const lib = require('./testserverlist');
5
+ // по моему такое декларирование не работает.
6
+
2
7
  module.exports = lib;
3
8
 
4
9
  if (require.main === module) (async () =>{
5
- console.log(JSON.stringify(await lib.getrawDDNetServers(), null, 2))
10
+ console.log(
11
+ JSON.stringify(
12
+ await lib.getDDNetServers(
13
+ await lib.findDDNetPlayerByName('0374_bober')
14
+ ),
15
+ null,
16
+ 1
17
+ )
18
+ ); // тестовый вызов
19
+ // console.log(await lib.getrawDDNetServers());
6
20
  })();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ddmaster",
3
- "version": "2.2.0",
3
+ "version": "2.3.1",
4
4
  "description": "Позволяет опрашивать мастер-сервер дднета",
5
5
  "main": "index.js",
6
6
  "scripts": {
package/serverlist.js ADDED
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Делает запрос на мастер сервер ДДНета.
3
+ * @returns Сервера ДДНета но в сыром виде.
4
+ */
5
+ async function getrawDDNetServers() {
6
+ try {
7
+ const response = await fetch('https://master1.ddnet.org/ddnet/15/servers.json');
8
+ if (!response.ok) throw new Error(`Ошибка при запросе: ${response.status}`);
9
+ const data = await response.json();
10
+ return data;
11
+ } catch (error) {
12
+ console.error(error);
13
+ return null;
14
+ }
15
+ }
16
+
17
+ /**
18
+ *
19
+ * @param {string} addr - берёт примерно такое "tw-0.7+udp://152.89.254.27:8310"
20
+ * @returns {string|null} 152.89.254.27:8310 возвращает чистый адрес (если addr не валидный то null)
21
+ */
22
+ function convertudptw(addr) {
23
+ if (typeof addr !== 'string') return null;
24
+ const match = addr.match(/(\d{1,3}(\.\d{1,3}){3}:\d+)/);
25
+ return match ? match[1] : null;
26
+ }
27
+
28
+ /**
29
+ * Делает запрос на мастер сервер ДДНета.
30
+ * @param {Object|null} data - опционально, сырая data от getrawDDNetServers(). Если не передана, функция сама её получит.
31
+ * @returns Сервера ДДНета если все пошло хорошо. ['ip:port']
32
+ */
33
+ async function getDDNetServers(data = null) {
34
+ try {
35
+ const servers = data || (await getrawDDNetServers()).servers;
36
+ if (!servers) return [];
37
+
38
+ const ipv4WithPorts = [];
39
+
40
+ for (const server of servers) {
41
+ server.addresses.forEach(addr => {
42
+ const converted = convertudptw(addr);
43
+ if (converted == null) return;
44
+ ipv4WithPorts.push(converted);
45
+ });
46
+ }
47
+ return [...new Set(ipv4WithPorts)];
48
+ } catch (err) {
49
+ console.error('Ошибка getDDNetServers:', err.message);
50
+ return [];
51
+ }
52
+ }
53
+
54
+ /**
55
+ * Ищет игрока по имени на всех серверах ДДНета.
56
+ * Возвращает ПОЛНУЮ инфу о серверах (как getrawDDNetServers),
57
+ * но только те сервера, где есть игрок с таким именем.
58
+ *
59
+ * @param {string} playerName - имя игрока, ищется строго через ===
60
+ * @param {Object|null} data - опционально, сырая data от getrawDDNetServers().
61
+ * @returns {Promise<Array>} Массив серверов (как в getrawDDNetServers().servers),
62
+ * на которых найден игрок.
63
+ */
64
+ async function findDDNetPlayerByName(playerName, data = null) {
65
+ if (typeof playerName !== 'string') {
66
+ throw new TypeError('playerName должен быть строкой');
67
+ }
68
+
69
+ try {
70
+ const raw = data || await getrawDDNetServers();
71
+ if (!raw || !Array.isArray(raw.servers)) return [];
72
+
73
+ const resultServers = [];
74
+
75
+ for (const server of raw.servers) {
76
+ const info = server.info;
77
+ if (!info || !Array.isArray(info.clients)) continue;
78
+
79
+ const hasPlayer = info.clients.some(client => client.name === playerName);
80
+ if (hasPlayer) {
81
+ resultServers.push(server);
82
+ }
83
+ }
84
+
85
+ let servers = resultServers;
86
+ return servers;
87
+ } catch (err) {
88
+ console.error('Ошибка при поиске игрока:', err);
89
+ return [];
90
+ }
91
+ }
92
+
93
+ module.exports = { getDDNetServers, getrawDDNetServers, convertudptw, findDDNetPlayerByName };
package/testserverlist.js DELETED
@@ -1,51 +0,0 @@
1
- /**
2
- * Делает запрос на мастер сервер ДДНета.
3
- * @returns Сервера ДДНета но в сыром виде.
4
- */
5
- async function getrawDDNetServers() {
6
- try {
7
- const response = await fetch('https://master1.ddnet.org/ddnet/15/servers.json');
8
- if (!response.ok) throw new Error(`Ошибка при запросе: ${response.status}`);
9
- const data = await response.json();
10
- return data;
11
- } catch (error) {
12
- console.error(error);
13
- return null;
14
- }
15
- }
16
-
17
- /**
18
- *
19
- * @param {string} addr - берёт примерно такое "tw-0.7+udp://152.89.254.27:8310"
20
- * @returns {string|null} 152.89.254.27:8310 возвращает чистый адрес (если addr не валидный то null)
21
- */
22
- function convertudptw(addr = 'string') {
23
- const match = addr.match(/(\d{1,3}(\.\d{1,3}){3}:\d+)/);
24
- return match[1];
25
- }
26
-
27
- /**
28
- * Делает запрос на мастер сервер ДДНета.
29
- * @returns Сервера ДДНета если все пошло хорошо. ['ip:port']
30
- */
31
- async function getDDNetServers() {
32
- try {
33
- const response = await fetch('https://master1.ddnet.org/ddnet/15/servers.json');
34
- if (!response.ok) throw new Error(`Ошибка при запросе: ${response.status}`);
35
-
36
- const { servers } = await response.json();
37
- const ipv4WithPorts = [];
38
-
39
- for (const server of servers) {
40
- server.addresses.forEach(addr => {
41
- ipv4WithPorts.push(convertudptw(addr));
42
- });
43
- }
44
- return [...new Set(ipv4WithPorts)];
45
- } catch (err) {
46
- console.error('Ошибка:', err.message);
47
- return [];
48
- }
49
- }
50
-
51
- module.exports = { getDDNetServers, getrawDDNetServers, convertudptw }