@icgio/clients-config 1.0.268 → 1.0.269

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.
@@ -1 +1 @@
1
- v:1:
1
+ v:1:
@@ -1,2 +1,2 @@
1
- secretread.js:1debaa92d9f5725c273b950128def5d8dd6cf057630a00188618dae4ff434130
1
+ secretread.js:a1a3ec539cce1ddc65a7c7ad26f2bbe0adcd23141c28c06f9393861de1b11c3f
2
2
  data-source.js:a88043810676f6017be94bbcc357f8f0d439890c6698cc0b02941b605e7dbd9a
package/config.json CHANGED
@@ -12,6 +12,9 @@
12
12
  "Mexc": ["CCDOGUSDT"],
13
13
  "Xt": ["CCDOGUSDT"]
14
14
  },
15
+ "FREEZONE": {
16
+ "Mexc": ["FREEZONEUSDT"]
17
+ },
15
18
  "HKBITEX-BTC": {
16
19
  "Hkbitex": ["BTCUSD", "BTCHKD"]
17
20
  },
@@ -39,6 +42,9 @@
39
42
  "Mexc": ["MINDFAKUSDT"],
40
43
  "Xt": ["MINDFAKUSDT"]
41
44
  },
45
+ "MECO": {
46
+ "Mexc": ["MECOUSDT"]
47
+ },
42
48
  "OPUL": {
43
49
  "Ascendex": ["OPULUSDT"],
44
50
  "Gate": ["OPULUSDT"],
@@ -60,12 +66,14 @@
60
66
  "ARMY": [],
61
67
  "B3TR": [],
62
68
  "CCDOG": [],
69
+ "FREEZONE": [],
63
70
  "HKBITEX-BTC": [],
64
71
  "HKBITEX-ETH": [],
65
72
  "JYAI": [],
66
73
  "LBAI": [],
67
74
  "LUCIC": [],
68
75
  "MINDFAK": [],
76
+ "MECO": [],
69
77
  "OPUL": [],
70
78
  "SARA": [],
71
79
  "SWFTC": ["Lbank"]
@@ -80,6 +88,9 @@
80
88
  "CCDOG": {
81
89
  "CCDOGUSDT": ["Xt"]
82
90
  },
91
+ "FREEZONE": {
92
+ "FREEZONEUSDT": ["Mexc"]
93
+ },
83
94
  "HKBITEX-BTC": {
84
95
  "BTCUSD": ["Hkbitex"],
85
96
  "BTCHKD": ["Hkbitex"]
@@ -103,6 +114,9 @@
103
114
  "MINDFAK": {
104
115
  "MINDFAKUSDT": ["Mexc", "Xt"]
105
116
  },
117
+ "MECO": {
118
+ "MECOUSDT": ["Mexc"]
119
+ },
106
120
  "OPUL": {
107
121
  "OPULUSDT": ["Gate", "Kucoin"]
108
122
  },
@@ -133,6 +147,12 @@
133
147
  "orderbook": 1,
134
148
  "deposits_withdrawals": 1
135
149
  },
150
+ "FREEZONE": {
151
+ "balance": 1,
152
+ "trades": 1,
153
+ "orderbook": 1,
154
+ "deposits_withdrawals": 1
155
+ },
136
156
  "HKBITEX-BTC": {
137
157
  "balance": 1,
138
158
  "trades": 1,
@@ -169,6 +189,12 @@
169
189
  "orderbook": 1,
170
190
  "deposits_withdrawals": 1
171
191
  },
192
+ "MECO": {
193
+ "balance": 1,
194
+ "trades": 1,
195
+ "orderbook": 1,
196
+ "deposits_withdrawals": 1
197
+ },
172
198
  "OPUL": {
173
199
  "balance": 1,
174
200
  "trades": 1,
@@ -193,12 +219,14 @@
193
219
  "ARMY": true,
194
220
  "B3TR": true,
195
221
  "CCDOG": true,
222
+ "FREEZONE": true,
196
223
  "HKBITEX-BTC": true,
197
224
  "HKBITEX-ETH": true,
198
225
  "JYAI": true,
199
226
  "LBAI": true,
200
227
  "LUCIC": true,
201
228
  "MINDFAK": true,
229
+ "MECO": true,
202
230
  "OPUL": true,
203
231
  "SARA": true,
204
232
  "SWFTC": true
@@ -208,12 +236,14 @@
208
236
  "ARMY": true,
209
237
  "B3TR": true,
210
238
  "CCDOG": true,
239
+ "FREEZONE": true,
211
240
  "HKBITEX-BTC": true,
212
241
  "HKBITEX-ETH": true,
213
242
  "JYAI": true,
214
243
  "LBAI": true,
215
244
  "LUCIC": true,
216
245
  "MINDFAK": true,
246
+ "MECO": true,
217
247
  "OPUL": true,
218
248
  "SARA": true,
219
249
  "SWFTC": true
@@ -226,12 +256,14 @@
226
256
  "ARMY": true,
227
257
  "B3TR": true,
228
258
  "CCDOG": true,
259
+ "FREEZONE": true,
229
260
  "HKBITEX-BTC": true,
230
261
  "HKBITEX-ETH": true,
231
262
  "JYAI": true,
232
263
  "LBAI": true,
233
264
  "LUCIC": true,
234
265
  "MINDFAK": true,
266
+ "MECO": true,
235
267
  "OPUL": true,
236
268
  "SARA": true,
237
269
  "SWFTC": true
@@ -242,12 +274,14 @@
242
274
  "ARMY": [1, 2, 5, 10, 20, 50, 100],
243
275
  "B3TR": [1, 2, 5, 10, 20, 50, 100],
244
276
  "CCDOG": [1, 2, 5, 10, 20, 50, 100],
277
+ "FREEZONE": [1, 2, 5, 10, 20, 50, 100],
245
278
  "HKBITEX-BTC": [1, 2, 5, 10, 20, 50, 100],
246
279
  "HKBITEX-ETH": [1, 2, 5, 10, 20, 50, 100],
247
280
  "JYAI": [1, 2, 5, 10, 20, 50, 100],
248
281
  "LBAI": [1, 2, 5, 10, 20, 50, 100],
249
282
  "LUCIC": [1, 2, 5, 10, 20, 50, 100],
250
283
  "MINDFAK": [1, 2, 5, 10, 20, 50, 100],
284
+ "MECO": [1, 2, 5, 10, 20, 50, 100],
251
285
  "OPUL": [1, 2, 5, 10, 20, 50, 100],
252
286
  "SARA": [1, 2, 5, 10, 20, 50, 100],
253
287
  "SWFTC": [1, 2, 5, 10, 20, 50, 100]
@@ -256,12 +290,14 @@
256
290
  "ARMY": ["BTC", "ETH"],
257
291
  "B3TR": ["BTC", "ETH"],
258
292
  "CCDOG": ["BTC", "ETH"],
293
+ "FREEZONE": ["BTC", "ETH"],
259
294
  "HKBITEX-BTC": ["BTC", "ETH"],
260
295
  "HKBITEX-ETH": ["BTC", "ETH"],
261
296
  "JYAI": ["BTC", "ETH"],
262
297
  "LBAI": ["BTC", "ETH"],
263
298
  "LUCIC": ["BTC", "ETH"],
264
299
  "MINDFAK": ["BTC", "ETH"],
300
+ "MECO": ["BTC", "ETH"],
265
301
  "OPUL": ["BTC", "ETH"],
266
302
  "SARA": ["BTC", "ETH"],
267
303
  "SWFTC": ["BTC", "ETH"]
@@ -270,12 +306,14 @@
270
306
  "ARMY": "-4733838023",
271
307
  "B3TR": "-4957633893",
272
308
  "CCDOG": "-4866473272",
309
+ "FREEZONE": "-5013286765",
273
310
  "HKBITEX-BTC": "-4837808085",
274
311
  "HKBITEX-ETH": "-4837808085",
275
312
  "JYAI": "-4787448589",
276
313
  "LBAI": "-4939231107",
277
314
  "LUCIC": "-4701729001",
278
315
  "MINDFAK": "-4869618531",
316
+ "MECO": "-4963129044",
279
317
  "OPUL": "-4581926908",
280
318
  "SARA": "-4660700305",
281
319
  "SWFTC": "-1002067948127"
@@ -293,12 +331,14 @@
293
331
  "ARMY": "icg",
294
332
  "B3TR": "icg",
295
333
  "CCDOG": "icg",
334
+ "FREEZONE": "icg",
296
335
  "HKBITEX-BTC": "icg",
297
336
  "HKBITEX-ETH": "icg",
298
337
  "JYAI": "icg",
299
338
  "LBAI": "icg",
300
339
  "LUCIC": "icg",
301
340
  "MINDFAK": "icg",
341
+ "MECO": "icg",
302
342
  "OPUL": "icg",
303
343
  "SARA": "icg",
304
344
  "SWFTC": "icg"
@@ -308,12 +348,14 @@
308
348
  "ARMY": { "username": "army@icg.io" },
309
349
  "B3TR": { "username": "b3tr@icg.io" },
310
350
  "CCDOG": { "username": "ccdog@icg.io" },
351
+ "FREEZONE": { "username": "freezone@icg.io" },
311
352
  "HKBITEX-BTC": { "username": "hkbitex-btc@icg.io" },
312
353
  "HKBITEX-ETH": { "username": "hkbitex-eth@icg.io" },
313
354
  "JYAI": { "username": "jyai@icg.io" },
314
355
  "LBAI": { "username": "lbai@icg.io" },
315
356
  "LUCIC": { "username": "lucic@icg.io" },
316
357
  "MINDFAK": { "username": "mindfak@icg.io" },
358
+ "MECO": { "username": "meco@icg.io" },
317
359
  "OPUL": { "username": "opul@icg.io" },
318
360
  "SARA": { "username": "sara@icg.io" },
319
361
  "SUPERADMIN": { "username": "superadmin@icg.io" },
@@ -325,12 +367,14 @@
325
367
  "ARMY": ["172.105.237.102", "139.162.90.70"],
326
368
  "B3TR": ["172.105.237.102", "139.162.122.208"],
327
369
  "CCDOG": ["172.105.237.102", "139.162.102.147"],
370
+ "FREEZONE": ["172.105.237.102"],
328
371
  "HKBITEX-BTC": ["172.105.237.102", "43.199.155.62"],
329
372
  "HKBITEX-ETH": ["172.105.237.102", "43.198.204.90"],
330
373
  "JYAI": ["172.105.237.102", "139.162.123.194"],
331
374
  "LBAI": ["172.105.237.102", "172.104.124.67"],
332
375
  "LUCIC": ["172.105.237.102", "172.104.86.202"],
333
376
  "MINDFAK": ["172.105.237.102", "139.162.103.204"],
377
+ "MECO": ["172.105.237.102"],
334
378
  "OPUL": ["172.105.237.102", "172.104.127.200"],
335
379
  "SARA": ["172.105.237.102", "139.162.86.213"],
336
380
  "SWFTC": ["172.105.237.102", "172.105.208.166"]
Binary file
package/index.js CHANGED
@@ -1,19 +1,19 @@
1
- function safe_require(path) {
2
- try {
3
- return require(path)
4
- } catch (error) {
5
- if (error.code === 'MODULE_NOT_FOUND') {
6
- return {}
7
- } else {
8
- throw error
9
- }
10
- }
11
- }
12
-
13
- module.exports = {
14
- config: safe_require('./config.js'),
15
- secretread: safe_require('./secretread.js').secret,
16
- secretread_shared: safe_require('./secretread.js').shared,
17
- 'data-source': safe_require('./data-source.js'),
18
- benchmarks: safe_require('./config-benchmarks.js'),
19
- }
1
+ function safe_require(path) {
2
+ try {
3
+ return require(path)
4
+ } catch (error) {
5
+ if (error.code === 'MODULE_NOT_FOUND') {
6
+ return {}
7
+ } else {
8
+ throw error
9
+ }
10
+ }
11
+ }
12
+
13
+ module.exports = {
14
+ config: safe_require('./config.js'),
15
+ secretread: safe_require('./secretread.js').secret,
16
+ secretread_shared: safe_require('./secretread.js').shared,
17
+ 'data-source': safe_require('./data-source.js'),
18
+ benchmarks: safe_require('./config-benchmarks.js'),
19
+ }
package/package.json CHANGED
@@ -1,27 +1,27 @@
1
- {
2
- "name": "@icgio/clients-config",
3
- "version": "1.0.268",
4
- "description": "",
5
- "main": "index.js",
6
- "scripts": {
7
- "test": "echo \"Error: no test specified\" && exit 1"
8
- },
9
- "repository": {
10
- "type": "git",
11
- "url": "git+https://github.com/icgio/clients-config.git"
12
- },
13
- "author": "",
14
- "license": "ISC",
15
- "bugs": {
16
- "url": "https://github.com/icgio/clients-config/issues"
17
- },
18
- "homepage": "https://github.com/icgio/clients-config#readme",
19
- "dependencies": {
20
- "lodash": "^4.17.20"
21
- },
22
- "devDependencies": {
23
- "fs-extra": "^11.2.0",
24
- "node-cmd": "^5.0.0",
25
- "prompt": "^1.3.0"
26
- }
27
- }
1
+ {
2
+ "name": "@icgio/clients-config",
3
+ "version": "1.0.269",
4
+ "description": "",
5
+ "main": "index.js",
6
+ "scripts": {
7
+ "test": "echo \"Error: no test specified\" && exit 1"
8
+ },
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "git+https://github.com/icgio/clients-config.git"
12
+ },
13
+ "author": "",
14
+ "license": "ISC",
15
+ "bugs": {
16
+ "url": "https://github.com/icgio/clients-config/issues"
17
+ },
18
+ "homepage": "https://github.com/icgio/clients-config#readme",
19
+ "dependencies": {
20
+ "lodash": "^4.17.20"
21
+ },
22
+ "devDependencies": {
23
+ "fs-extra": "^11.2.0",
24
+ "node-cmd": "^5.0.0",
25
+ "prompt": "^1.3.0"
26
+ }
27
+ }
Binary file
@@ -1,278 +1,278 @@
1
- const fs = require('fs')
2
- const prompt = require('prompt')
3
-
4
- const config_file_path = './config.json'
5
- const config_archive_file_path = './config-archive.json'
6
-
7
- prompt.start()
8
-
9
- function read_config_file(path) {
10
- return new Promise((resolve, reject) => {
11
- fs.readFile(path, 'utf8', (err, data) => {
12
- if (err) reject(err)
13
- else resolve(data)
14
- })
15
- })
16
- }
17
-
18
- function write_config_file(data, path) {
19
- return new Promise((resolve, reject) => {
20
- fs.writeFile(path, JSON.stringify(data, null, 2), 'utf8', (err) => {
21
- if (err) return reject(err)
22
- else resolve()
23
- })
24
- })
25
- }
26
-
27
- function process_config() {
28
- try {
29
- const schema = {
30
- properties: {
31
- action: {
32
- description: 'Enter the action ( add, delete )',
33
- pattern: /^(add|delete)$/,
34
- message: 'Action must be one of "add", "delete"',
35
- required: true,
36
- },
37
- client_name: {
38
- description: 'Enter the client name you want to perform the action on',
39
- required: true,
40
- },
41
- },
42
- }
43
-
44
- prompt.get(schema, (err, result) => {
45
- if (err) {
46
- console.error(err)
47
- return
48
- }
49
-
50
- switch (result.action) {
51
- case 'add':
52
- add_client(result.client_name)
53
- break
54
- case 'delete':
55
- delete_client(result.client_name)
56
- break
57
- default:
58
- console.log('Invalid action')
59
- break
60
- }
61
- })
62
- } catch (error) {
63
- console.error(`Error processing the config file: ${error}`)
64
- }
65
- }
66
-
67
- function delete_client(client_name) {
68
- read_config_file(config_file_path)
69
- .then((config_file_data) => {
70
- config_file_data = JSON.parse(config_file_data)
71
-
72
- update_config_archive(config_file_data, client_name)
73
- .then(() => {
74
- delete config_file_data.client_exchange_pairs[client_name]
75
- delete config_file_data.client_pair_main_exchanges[client_name]
76
- delete config_file_data.client_not_include_exchanges[client_name]
77
- delete config_file_data.client_levels[client_name]
78
- delete config_file_data.client_price_index_curs[client_name]
79
- delete config_file_data.client_telegram_ids[client_name]
80
- delete config_file_data.clients_reporter_interval[client_name]
81
-
82
- for (let key in config_file_data.client_enabled) {
83
- if (config_file_data.client_enabled.hasOwnProperty(key)) {
84
- delete config_file_data.client_enabled[key][client_name]
85
- }
86
- }
87
-
88
- write_config_file(config_file_data, config_file_path)
89
- .then(() => {
90
- console.log(`Client '${client_name}' has been deleted successfully.`)
91
- })
92
- .catch((err) => {
93
- console.error(`Error writing to config file: ${err}`)
94
- })
95
- })
96
- .catch((err) => {
97
- console.error(`Error updating config archive: ${err}`)
98
- })
99
- })
100
- .catch((err) => {
101
- console.error(`Error reading config file: ${err}`)
102
- })
103
- }
104
-
105
- function add_client(client_name) {
106
- const schema = {
107
- properties: {
108
- client_exchange_pairs: {
109
- description: 'Enter client exchange pairs (JSON format i.e { "Mexc": ["RWXUSDT"], "Bitget": ["RWXUSDT"] } )',
110
- required: true,
111
- pattern: /^\{.*\}$/,
112
- message: 'Please enter a valid JSON object.',
113
- },
114
- client_not_include_exchanges: {
115
- description: 'Enter client not include exchanges (Comma-separated values, e.g., Jubi, Lbank)',
116
- required: false,
117
- },
118
- client_pair_main_exchanges: {
119
- description: 'Enter client pair main exchanges (JSON format i.e {"ETHUSDT": ["Bitget", "Gate"]} )',
120
- required: true,
121
- pattern: /^\{.*\}$/,
122
- message: 'Please enter a valid JSON object.',
123
- },
124
- clients_reporter_interval: {
125
- description: 'Enter clients reporter interval (JSON format i.e { "balance": 1, "trades": 1, "orderbook": 1} )',
126
- required: true,
127
- pattern: /^\{.*\}$/,
128
- message: 'Please enter a valid JSON object.',
129
- },
130
- client_levels: {
131
- description: 'Enter client levels (Comma-separated values, e.g. 2, 5, 10 ) ',
132
- required: true,
133
- },
134
- client_price_index_curs: {
135
- description: 'Enter client benchmarks (Comma-separated values, e.g., BTC,ETH)',
136
- required: false,
137
- },
138
- client_telegram_ids: {
139
- description: 'Enter client telegram ids i.e 1233457 ',
140
- required: true,
141
- },
142
- },
143
- }
144
- read_config_file(config_file_path)
145
- .then((config_file_data) => {
146
- prompt.get(schema, (err, result) => {
147
- if (err) {
148
- console.error(err)
149
- return
150
- }
151
- config_file_data = JSON.parse(config_file_data)
152
-
153
- let exchange_pairs = result.client_exchange_pairs.trim()
154
- exchange_pairs = JSON.parse(exchange_pairs)
155
-
156
- let pair_exchanges = result.client_pair_main_exchanges.trim()
157
- pair_exchanges = JSON.parse(pair_exchanges)
158
-
159
- let reporter_interval = result.clients_reporter_interval.trim()
160
- reporter_interval = JSON.parse(reporter_interval)
161
-
162
- let not_include_exchanges = []
163
- if (result.client_not_include_exchanges) {
164
- not_include_exchanges = result.client_not_include_exchanges.split(',').map((value) => value.trim())
165
- not_include_exchanges.sort()
166
- }
167
-
168
- let benchmarks = []
169
- if (result.client_price_index_curs) {
170
- benchmarks = result.client_price_index_curs.split(',').map((value) => value.trim())
171
- benchmarks.sort()
172
- }
173
- let levels = result.client_levels.split(',').map((value) => Number(value.trim()))
174
-
175
- config_file_data.client_exchange_pairs[client_name] = exchange_pairs
176
- config_file_data.client_pair_main_exchanges[client_name] = pair_exchanges
177
-
178
- config_file_data.clients_reporter_interval[client_name] = reporter_interval
179
-
180
- config_file_data.client_not_include_exchanges[client_name] = not_include_exchanges
181
- config_file_data.client_levels[client_name] = levels
182
- config_file_data.client_price_index_curs[client_name] = benchmarks
183
-
184
- config_file_data.client_telegram_ids[client_name] = result.client_telegram_ids
185
-
186
- config_file_data.client_exchange_pairs = sort(config_file_data.client_exchange_pairs)
187
- config_file_data.client_pair_main_exchanges = sort(config_file_data.client_pair_main_exchanges)
188
- config_file_data.clients_reporter_interval = sort(config_file_data.clients_reporter_interval)
189
- config_file_data.client_not_include_exchanges = sort(config_file_data.client_not_include_exchanges)
190
- config_file_data.client_levels = sort(config_file_data.client_levels)
191
- config_file_data.client_price_index_curs = sort(config_file_data.client_price_index_curs)
192
- config_file_data.client_telegram_ids = sort(config_file_data.client_telegram_ids)
193
-
194
- write_config_file(config_file_data, config_file_path)
195
- .then(() => {
196
- console.log(`Client '${client_name}' has been added successfully.`)
197
- })
198
- .catch((err) => {
199
- console.error(`Error writing to config file: ${err}`)
200
- })
201
- })
202
- })
203
- .catch((err) => {
204
- console.error(`Error reading config file: ${err}`)
205
- })
206
- }
207
-
208
- function update_config_archive(config_file_data, client_name) {
209
- return new Promise((resolve, reject) => {
210
- read_config_file(config_archive_file_path)
211
- .then((config_archive_data) => {
212
- try {
213
- config_archive_data = JSON.parse(config_archive_data)
214
- } catch (error) {
215
- console.error(`Error parsing config archive data: ${error}`)
216
- reject(error)
217
- }
218
-
219
- config_archive_data.client_exchange_pairs[client_name] = config_file_data.client_exchange_pairs[client_name]
220
- config_archive_data.client_pair_main_exchanges[client_name] = config_file_data.client_pair_main_exchanges[client_name]
221
- config_archive_data.clients_reporter_interval[client_name] = config_file_data.clients_reporter_interval[client_name]
222
- config_archive_data.client_not_include_exchanges[client_name] = config_file_data.client_not_include_exchanges[client_name]
223
- config_archive_data.client_levels[client_name] = config_file_data.client_levels[client_name]
224
- config_archive_data.client_price_index_curs[client_name] = config_file_data.client_price_index_curs[client_name]
225
- config_archive_data.client_telegram_ids[client_name] = config_file_data.client_telegram_ids[client_name]
226
-
227
- if (!config_archive_data.client_enabled) {
228
- config_archive_data.client_enabled = {}
229
- }
230
- for (let key in config_file_data.client_enabled) {
231
- if (config_file_data.client_enabled.hasOwnProperty(key)) {
232
- if (!config_archive_data.client_enabled[key]) {
233
- config_archive_data.client_enabled[key] = {}
234
- }
235
- config_archive_data.client_enabled[key][client_name] = config_file_data.client_enabled[key][client_name]
236
- }
237
- }
238
-
239
- config_archive_data.client_exchange_pairs = sort(config_archive_data.client_exchange_pairs)
240
- config_archive_data.client_pair_main_exchanges = sort(config_archive_data.client_pair_main_exchanges)
241
- config_archive_data.clients_reporter_interval = sort(config_archive_data.clients_reporter_interval)
242
- config_archive_data.client_not_include_exchanges = sort(config_archive_data.client_not_include_exchanges)
243
- config_archive_data.client_levels = sort(config_archive_data.client_levels)
244
- config_archive_data.client_price_index_curs = sort(config_archive_data.client_price_index_curs)
245
- config_archive_data.client_telegram_ids = sort(config_archive_data.client_telegram_ids)
246
-
247
- for (let key in config_archive_data.client_enabled) {
248
- if (config_archive_data.client_enabled.hasOwnProperty(key)) {
249
- config_archive_data.client_enabled[key] = sort(config_archive_data.client_enabled[key])
250
- }
251
- }
252
-
253
- write_config_file(config_archive_data, config_archive_file_path)
254
- .then(() => {
255
- resolve()
256
- })
257
- .catch((err) => {
258
- console.error(`Error writing to config file: ${err}`)
259
- reject(err)
260
- })
261
- })
262
- .catch((err) => {
263
- console.error(`Error reading config archive file: ${err}`)
264
- reject(err)
265
- })
266
- })
267
- }
268
-
269
- function sort(obj) {
270
- return Object.keys(obj)
271
- .sort()
272
- .reduce((result, key) => {
273
- result[key] = obj[key]
274
- return result
275
- }, {})
276
- }
277
-
278
- process_config()
1
+ const fs = require('fs')
2
+ const prompt = require('prompt')
3
+
4
+ const config_file_path = './config.json'
5
+ const config_archive_file_path = './config-archive.json'
6
+
7
+ prompt.start()
8
+
9
+ function read_config_file(path) {
10
+ return new Promise((resolve, reject) => {
11
+ fs.readFile(path, 'utf8', (err, data) => {
12
+ if (err) reject(err)
13
+ else resolve(data)
14
+ })
15
+ })
16
+ }
17
+
18
+ function write_config_file(data, path) {
19
+ return new Promise((resolve, reject) => {
20
+ fs.writeFile(path, JSON.stringify(data, null, 2), 'utf8', (err) => {
21
+ if (err) return reject(err)
22
+ else resolve()
23
+ })
24
+ })
25
+ }
26
+
27
+ function process_config() {
28
+ try {
29
+ const schema = {
30
+ properties: {
31
+ action: {
32
+ description: 'Enter the action ( add, delete )',
33
+ pattern: /^(add|delete)$/,
34
+ message: 'Action must be one of "add", "delete"',
35
+ required: true,
36
+ },
37
+ client_name: {
38
+ description: 'Enter the client name you want to perform the action on',
39
+ required: true,
40
+ },
41
+ },
42
+ }
43
+
44
+ prompt.get(schema, (err, result) => {
45
+ if (err) {
46
+ console.error(err)
47
+ return
48
+ }
49
+
50
+ switch (result.action) {
51
+ case 'add':
52
+ add_client(result.client_name)
53
+ break
54
+ case 'delete':
55
+ delete_client(result.client_name)
56
+ break
57
+ default:
58
+ console.log('Invalid action')
59
+ break
60
+ }
61
+ })
62
+ } catch (error) {
63
+ console.error(`Error processing the config file: ${error}`)
64
+ }
65
+ }
66
+
67
+ function delete_client(client_name) {
68
+ read_config_file(config_file_path)
69
+ .then((config_file_data) => {
70
+ config_file_data = JSON.parse(config_file_data)
71
+
72
+ update_config_archive(config_file_data, client_name)
73
+ .then(() => {
74
+ delete config_file_data.client_exchange_pairs[client_name]
75
+ delete config_file_data.client_pair_main_exchanges[client_name]
76
+ delete config_file_data.client_not_include_exchanges[client_name]
77
+ delete config_file_data.client_levels[client_name]
78
+ delete config_file_data.client_price_index_curs[client_name]
79
+ delete config_file_data.client_telegram_ids[client_name]
80
+ delete config_file_data.clients_reporter_interval[client_name]
81
+
82
+ for (let key in config_file_data.client_enabled) {
83
+ if (config_file_data.client_enabled.hasOwnProperty(key)) {
84
+ delete config_file_data.client_enabled[key][client_name]
85
+ }
86
+ }
87
+
88
+ write_config_file(config_file_data, config_file_path)
89
+ .then(() => {
90
+ console.log(`Client '${client_name}' has been deleted successfully.`)
91
+ })
92
+ .catch((err) => {
93
+ console.error(`Error writing to config file: ${err}`)
94
+ })
95
+ })
96
+ .catch((err) => {
97
+ console.error(`Error updating config archive: ${err}`)
98
+ })
99
+ })
100
+ .catch((err) => {
101
+ console.error(`Error reading config file: ${err}`)
102
+ })
103
+ }
104
+
105
+ function add_client(client_name) {
106
+ const schema = {
107
+ properties: {
108
+ client_exchange_pairs: {
109
+ description: 'Enter client exchange pairs (JSON format i.e { "Mexc": ["RWXUSDT"], "Bitget": ["RWXUSDT"] } )',
110
+ required: true,
111
+ pattern: /^\{.*\}$/,
112
+ message: 'Please enter a valid JSON object.',
113
+ },
114
+ client_not_include_exchanges: {
115
+ description: 'Enter client not include exchanges (Comma-separated values, e.g., Jubi, Lbank)',
116
+ required: false,
117
+ },
118
+ client_pair_main_exchanges: {
119
+ description: 'Enter client pair main exchanges (JSON format i.e {"ETHUSDT": ["Bitget", "Gate"]} )',
120
+ required: true,
121
+ pattern: /^\{.*\}$/,
122
+ message: 'Please enter a valid JSON object.',
123
+ },
124
+ clients_reporter_interval: {
125
+ description: 'Enter clients reporter interval (JSON format i.e { "balance": 1, "trades": 1, "orderbook": 1} )',
126
+ required: true,
127
+ pattern: /^\{.*\}$/,
128
+ message: 'Please enter a valid JSON object.',
129
+ },
130
+ client_levels: {
131
+ description: 'Enter client levels (Comma-separated values, e.g. 2, 5, 10 ) ',
132
+ required: true,
133
+ },
134
+ client_price_index_curs: {
135
+ description: 'Enter client benchmarks (Comma-separated values, e.g., BTC,ETH)',
136
+ required: false,
137
+ },
138
+ client_telegram_ids: {
139
+ description: 'Enter client telegram ids i.e 1233457 ',
140
+ required: true,
141
+ },
142
+ },
143
+ }
144
+ read_config_file(config_file_path)
145
+ .then((config_file_data) => {
146
+ prompt.get(schema, (err, result) => {
147
+ if (err) {
148
+ console.error(err)
149
+ return
150
+ }
151
+ config_file_data = JSON.parse(config_file_data)
152
+
153
+ let exchange_pairs = result.client_exchange_pairs.trim()
154
+ exchange_pairs = JSON.parse(exchange_pairs)
155
+
156
+ let pair_exchanges = result.client_pair_main_exchanges.trim()
157
+ pair_exchanges = JSON.parse(pair_exchanges)
158
+
159
+ let reporter_interval = result.clients_reporter_interval.trim()
160
+ reporter_interval = JSON.parse(reporter_interval)
161
+
162
+ let not_include_exchanges = []
163
+ if (result.client_not_include_exchanges) {
164
+ not_include_exchanges = result.client_not_include_exchanges.split(',').map((value) => value.trim())
165
+ not_include_exchanges.sort()
166
+ }
167
+
168
+ let benchmarks = []
169
+ if (result.client_price_index_curs) {
170
+ benchmarks = result.client_price_index_curs.split(',').map((value) => value.trim())
171
+ benchmarks.sort()
172
+ }
173
+ let levels = result.client_levels.split(',').map((value) => Number(value.trim()))
174
+
175
+ config_file_data.client_exchange_pairs[client_name] = exchange_pairs
176
+ config_file_data.client_pair_main_exchanges[client_name] = pair_exchanges
177
+
178
+ config_file_data.clients_reporter_interval[client_name] = reporter_interval
179
+
180
+ config_file_data.client_not_include_exchanges[client_name] = not_include_exchanges
181
+ config_file_data.client_levels[client_name] = levels
182
+ config_file_data.client_price_index_curs[client_name] = benchmarks
183
+
184
+ config_file_data.client_telegram_ids[client_name] = result.client_telegram_ids
185
+
186
+ config_file_data.client_exchange_pairs = sort(config_file_data.client_exchange_pairs)
187
+ config_file_data.client_pair_main_exchanges = sort(config_file_data.client_pair_main_exchanges)
188
+ config_file_data.clients_reporter_interval = sort(config_file_data.clients_reporter_interval)
189
+ config_file_data.client_not_include_exchanges = sort(config_file_data.client_not_include_exchanges)
190
+ config_file_data.client_levels = sort(config_file_data.client_levels)
191
+ config_file_data.client_price_index_curs = sort(config_file_data.client_price_index_curs)
192
+ config_file_data.client_telegram_ids = sort(config_file_data.client_telegram_ids)
193
+
194
+ write_config_file(config_file_data, config_file_path)
195
+ .then(() => {
196
+ console.log(`Client '${client_name}' has been added successfully.`)
197
+ })
198
+ .catch((err) => {
199
+ console.error(`Error writing to config file: ${err}`)
200
+ })
201
+ })
202
+ })
203
+ .catch((err) => {
204
+ console.error(`Error reading config file: ${err}`)
205
+ })
206
+ }
207
+
208
+ function update_config_archive(config_file_data, client_name) {
209
+ return new Promise((resolve, reject) => {
210
+ read_config_file(config_archive_file_path)
211
+ .then((config_archive_data) => {
212
+ try {
213
+ config_archive_data = JSON.parse(config_archive_data)
214
+ } catch (error) {
215
+ console.error(`Error parsing config archive data: ${error}`)
216
+ reject(error)
217
+ }
218
+
219
+ config_archive_data.client_exchange_pairs[client_name] = config_file_data.client_exchange_pairs[client_name]
220
+ config_archive_data.client_pair_main_exchanges[client_name] = config_file_data.client_pair_main_exchanges[client_name]
221
+ config_archive_data.clients_reporter_interval[client_name] = config_file_data.clients_reporter_interval[client_name]
222
+ config_archive_data.client_not_include_exchanges[client_name] = config_file_data.client_not_include_exchanges[client_name]
223
+ config_archive_data.client_levels[client_name] = config_file_data.client_levels[client_name]
224
+ config_archive_data.client_price_index_curs[client_name] = config_file_data.client_price_index_curs[client_name]
225
+ config_archive_data.client_telegram_ids[client_name] = config_file_data.client_telegram_ids[client_name]
226
+
227
+ if (!config_archive_data.client_enabled) {
228
+ config_archive_data.client_enabled = {}
229
+ }
230
+ for (let key in config_file_data.client_enabled) {
231
+ if (config_file_data.client_enabled.hasOwnProperty(key)) {
232
+ if (!config_archive_data.client_enabled[key]) {
233
+ config_archive_data.client_enabled[key] = {}
234
+ }
235
+ config_archive_data.client_enabled[key][client_name] = config_file_data.client_enabled[key][client_name]
236
+ }
237
+ }
238
+
239
+ config_archive_data.client_exchange_pairs = sort(config_archive_data.client_exchange_pairs)
240
+ config_archive_data.client_pair_main_exchanges = sort(config_archive_data.client_pair_main_exchanges)
241
+ config_archive_data.clients_reporter_interval = sort(config_archive_data.clients_reporter_interval)
242
+ config_archive_data.client_not_include_exchanges = sort(config_archive_data.client_not_include_exchanges)
243
+ config_archive_data.client_levels = sort(config_archive_data.client_levels)
244
+ config_archive_data.client_price_index_curs = sort(config_archive_data.client_price_index_curs)
245
+ config_archive_data.client_telegram_ids = sort(config_archive_data.client_telegram_ids)
246
+
247
+ for (let key in config_archive_data.client_enabled) {
248
+ if (config_archive_data.client_enabled.hasOwnProperty(key)) {
249
+ config_archive_data.client_enabled[key] = sort(config_archive_data.client_enabled[key])
250
+ }
251
+ }
252
+
253
+ write_config_file(config_archive_data, config_archive_file_path)
254
+ .then(() => {
255
+ resolve()
256
+ })
257
+ .catch((err) => {
258
+ console.error(`Error writing to config file: ${err}`)
259
+ reject(err)
260
+ })
261
+ })
262
+ .catch((err) => {
263
+ console.error(`Error reading config archive file: ${err}`)
264
+ reject(err)
265
+ })
266
+ })
267
+ }
268
+
269
+ function sort(obj) {
270
+ return Object.keys(obj)
271
+ .sort()
272
+ .reduce((result, key) => {
273
+ result[key] = obj[key]
274
+ return result
275
+ }, {})
276
+ }
277
+
278
+ process_config()