@icgio/clients-config 1.0.241 → 1.0.243

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,2 +1,2 @@
1
- secretread.js:ae5e95e8df2a4f839915bd6e0a641e56cb71b4ac6574f64f851f69ae4aeb92cb
1
+ secretread.js:ac58db0913adee5ac3e30f8e8a342a2faf342de9447cbe31a3d62c45ac15fb43
2
2
  data-source.js:a88043810676f6017be94bbcc357f8f0d439890c6698cc0b02941b605e7dbd9a
@@ -26,6 +26,9 @@
26
26
  "BONG": {
27
27
  "Mexc": ["BONGUSDT"]
28
28
  },
29
+ "BVT": {
30
+ "Mexc": ["BVTUSDT"]
31
+ },
29
32
  "CARAC": {
30
33
  "Xt": ["CARACUSDT"]
31
34
  },
@@ -296,6 +299,7 @@
296
299
  "BCHEM": [],
297
300
  "BOMBO": [],
298
301
  "BONG": [],
302
+ "BVT": [],
299
303
  "CARAC": [],
300
304
  "CARE": [],
301
305
  "CAVADA": [],
@@ -392,6 +396,9 @@
392
396
  "BONG": {
393
397
  "BONGUSDT": ["Mexc"]
394
398
  },
399
+ "BVT": {
400
+ "BVTUSDT": ["Mexc"]
401
+ },
395
402
  "CARAC": {
396
403
  "CARACUSDT": ["Xt"]
397
404
  },
@@ -664,6 +671,11 @@
664
671
  "trades": 1,
665
672
  "orderbook": 1
666
673
  },
674
+ "BVT": {
675
+ "balance": 1,
676
+ "trades": 1,
677
+ "orderbook": 1
678
+ },
667
679
  "CARE": {
668
680
  "balance": 1,
669
681
  "trades": 1,
@@ -984,6 +996,7 @@
984
996
  "AXL": true,
985
997
  "BCHEM": true,
986
998
  "BOMBO": true,
999
+ "BVT": true,
987
1000
  "CARE": true,
988
1001
  "CAVADA": true,
989
1002
  "CFN": true,
@@ -1067,6 +1080,7 @@
1067
1080
  "BCHEM": true,
1068
1081
  "BOMBO": true,
1069
1082
  "BONG": true,
1083
+ "BVT": true,
1070
1084
  "CARE": true,
1071
1085
  "CFN": true,
1072
1086
  "CP": true,
@@ -1145,6 +1159,7 @@
1145
1159
  "BCHEM": [1, 2, 5, 10, 20, 50, 100],
1146
1160
  "BOMBO": [10, 50, 100],
1147
1161
  "BONG": [2, 5, 10],
1162
+ "BVT": [1, 2, 5, 10, 20, 50, 100],
1148
1163
  "CARAC": [2, 5, 10],
1149
1164
  "CARE": [2, 5, 10],
1150
1165
  "CAVADA": [2, 5, 10],
@@ -1224,6 +1239,7 @@
1224
1239
  "AXL": ["BTC", "ETH"],
1225
1240
  "BCHEM": ["BTC", "ETH"],
1226
1241
  "BONG": ["BTC", "ETH"],
1242
+ "BVT": ["BTC", "ETH"],
1227
1243
  "CARAC": ["BTC", "ETH"],
1228
1244
  "CARE": ["BTC", "ETH"],
1229
1245
  "CAVADA": ["BTC", "ETH"],
@@ -1304,6 +1320,7 @@
1304
1320
  "BCHEM": "-4802690196",
1305
1321
  "BOMBO": "-4212190164",
1306
1322
  "BONG": "-4232215006",
1323
+ "BVT": "-4802263491",
1307
1324
  "CARAC": "-4103921001",
1308
1325
  "CARE": "-1002118117567",
1309
1326
  "CAVADA": "-4272163031",
@@ -1376,6 +1393,11 @@
1376
1393
  "ZUSHI": "-4279552239"
1377
1394
  },
1378
1395
  "balance_premium": {
1396
+ "BVT": {
1397
+ "mexc_1": {
1398
+ "BVT": 35000
1399
+ }
1400
+ },
1379
1401
  "IONX": {
1380
1402
  "mexc_1": {
1381
1403
  "IONX": 10000000
@@ -1400,6 +1422,7 @@
1400
1422
  "AVALOX": "icg",
1401
1423
  "AXL": "icg",
1402
1424
  "BCHEM": "icg",
1425
+ "BVT": "icg",
1403
1426
  "CFN": "icg",
1404
1427
  "CP": "icg",
1405
1428
  "DCC": "icg",
@@ -1449,6 +1472,10 @@
1449
1472
  "username": "bchem@icg.io",
1450
1473
  "password": "dktx74ew2HY5oWt"
1451
1474
  },
1475
+ "BVT": {
1476
+ "username": "bvt@icg.io",
1477
+ "password": "DhnK4CXBaenTQR9"
1478
+ },
1452
1479
  "CFN": {
1453
1480
  "username": "cfn@icg.io",
1454
1481
  "password": "VS2hP7mVoPsIs4P"
@@ -1561,5 +1588,8 @@
1561
1588
  "username": "xpunk@icg.io",
1562
1589
  "password": "8RzbhsGazXnjVpn"
1563
1590
  }
1591
+ },
1592
+ "server_config_admin_whitelist_ips": {
1593
+ "BVT": []
1564
1594
  }
1565
1595
  }
package/config.json CHANGED
@@ -4,9 +4,6 @@
4
4
  "Bitrue": ["ARMYUSDT"],
5
5
  "Mexc": ["ARMYUSDT"]
6
6
  },
7
- "BVT": {
8
- "Mexc": ["BVTUSDT"]
9
- },
10
7
  "CCDOG": {
11
8
  "Bitmart": ["CCDOGUSDT"],
12
9
  "Mexc": ["CCDOGUSDT"],
@@ -72,7 +69,6 @@
72
69
  },
73
70
  "client_not_include_exchanges": {
74
71
  "ARMY": [],
75
- "BVT": [],
76
72
  "CCDOG": [],
77
73
  "GO": [],
78
74
  "HKBITEX-BTC": [],
@@ -93,9 +89,6 @@
93
89
  "ARMY": {
94
90
  "ARMYUSDT": ["Mexc"]
95
91
  },
96
- "BVT": {
97
- "BVTUSDT": ["Mexc"]
98
- },
99
92
  "CCDOG": {
100
93
  "CCDOGUSDT": ["Xt"]
101
94
  },
@@ -153,11 +146,6 @@
153
146
  "trades": 1,
154
147
  "orderbook": 1
155
148
  },
156
- "BVT": {
157
- "balance": 1,
158
- "trades": 1,
159
- "orderbook": 1
160
- },
161
149
  "CCDOG": {
162
150
  "balance": 1,
163
151
  "trades": 1,
@@ -237,7 +225,6 @@
237
225
  "client_enabled": {
238
226
  "balance": {
239
227
  "ARMY": true,
240
- "BVT": true,
241
228
  "CCDOG": true,
242
229
  "GO": true,
243
230
  "HKBITEX-BTC": true,
@@ -261,7 +248,6 @@
261
248
  "trades_detail": {},
262
249
  "trades": {
263
250
  "ARMY": true,
264
- "BVT": true,
265
251
  "CCDOG": true,
266
252
  "GO": true,
267
253
  "HKBITEX-BTC": true,
@@ -285,7 +271,6 @@
285
271
  },
286
272
  "client_levels": {
287
273
  "ARMY": [1, 2, 5, 10, 20, 50, 100],
288
- "BVT": [1, 2, 5, 10, 20, 50, 100],
289
274
  "CCDOG": [1, 2, 5, 10, 20, 50, 100],
290
275
  "GO": [1, 2, 5, 10, 20, 50, 100],
291
276
  "HKBITEX-BTC": [1, 2, 5, 10, 20, 50, 100],
@@ -304,7 +289,6 @@
304
289
  },
305
290
  "client_price_index_curs": {
306
291
  "ARMY": ["BTC", "ETH"],
307
- "BVT": ["BTC", "ETH"],
308
292
  "CCDOG": ["BTC", "ETH"],
309
293
  "GO": ["BTC", "ETH"],
310
294
  "HKBITEX-BTC": ["BTC", "ETH"],
@@ -323,7 +307,6 @@
323
307
  },
324
308
  "client_telegram_ids": {
325
309
  "ARMY": "-4733838023",
326
- "BVT": "-4802263491",
327
310
  "CCDOG": "-4866473272",
328
311
  "GO": "-4822577824",
329
312
  "HKBITEX-BTC": "-4837808085",
@@ -341,11 +324,6 @@
341
324
  "TACC": "-4874959768"
342
325
  },
343
326
  "balance_premium": {
344
- "BVT": {
345
- "mexc_1": {
346
- "BVT": 35000
347
- }
348
- },
349
327
  "SWFTC": {
350
328
  "coinbase_1": {
351
329
  "SWFTC": 5000000,
@@ -356,7 +334,6 @@
356
334
  "client_additional_telegram_ids": {},
357
335
  "client_telegram_sender": {
358
336
  "ARMY": "icg",
359
- "BVT": "icg",
360
337
  "CCDOG": "icg",
361
338
  "GO": "icg",
362
339
  "HKBITEX-BTC": "icg",
@@ -382,10 +359,6 @@
382
359
  "username": "army@icg.io",
383
360
  "password": "GUeDh6im6W3ZSXL"
384
361
  },
385
- "BVT": {
386
- "username": "bvt@icg.io",
387
- "password": "DhnK4CXBaenTQR9"
388
- },
389
362
  "CCDOG": {
390
363
  "username": "ccdog@icg.io",
391
364
  "password": "s9d1kmkNcRIsDN3"
@@ -438,6 +411,10 @@
438
411
  "username": "sara@icg.io",
439
412
  "password": "5PNgIqLM0msiWNf"
440
413
  },
414
+ "SUPERADMIN": {
415
+ "username": "superadmin@icg.io",
416
+ "password": "vUmU5Jeoo67g18QR"
417
+ },
441
418
  "SWFTC": {
442
419
  "username": "swftc@icg.io",
443
420
  "password": "XeH7kUVRjsEisQ0"
@@ -457,7 +434,6 @@
457
434
  },
458
435
  "server_config_admin_whitelist_ips": {
459
436
  "ARMY": [],
460
- "BVT": [],
461
437
  "CCDOG": [],
462
438
  "GO": [],
463
439
  "HKBITEX-BTC": [],
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.241",
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.243",
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()