@icgio/clients-config 1.0.151 → 1.0.153

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:3802209d447fdbe5b946f0cc0c0c98d5f296a1213b8dd1d5d420e2aa3d89ae03
1
+ secretread.js:04a705cff1a9482ac11c4e53f9589eaf85143758036ff92629db9a244040a5fd
2
2
  data-source.js:7914c8a583a6dc1ed54909da44dbaf3b76c39adb98a63706ad277cc23de7b81b
@@ -1,61 +1,61 @@
1
- const benchmarks = {
2
- min_balance: {
3
- ULTI: {
4
- bybitv5_1: {
5
- USDT: 7000,
6
- },
7
- },
8
- },
9
- orderbook_depth_in_quote_cur: {
10
- AVALOX: {
11
- gatev4: {
12
- AVALOXUSDT: [[0.01, 1000]],
13
- },
14
- },
15
- LUCIC: {
16
- xt: {
17
- LUCICUSDT: [[0.01, 1000]],
18
- },
19
- },
20
- MAK: {
21
- bitget: {
22
- MAKUSDT: [[0.01, 500]],
23
- },
24
- bybitv5: {
25
- MAKUSDT: [[0.01, 500]],
26
- },
27
- },
28
- },
29
- ask_bid_spread: {
30
- AVALOX: {
31
- gatev4: {
32
- AVALOXUSDT: 0.01,
33
- },
34
- },
35
- MAK: {
36
- bitget: {
37
- MAKUSDT: 0.01,
38
- },
39
- bybitv5: {
40
- MAKUSDT: 0.01,
41
- },
42
- },
43
- },
44
- volume_24h_in_quote_cur: {
45
- ETHF: {
46
- mexc: {
47
- ETHFUSDT: 50000,
48
- },
49
- htx: {
50
- ETHFUSDT: 50000,
51
- },
52
- },
53
- MAK: {
54
- bitget: {
55
- MAKUSDT: 300000,
56
- },
57
- },
58
- },
59
- }
60
-
61
- module.exports = benchmarks
1
+ const benchmarks = {
2
+ min_balance: {
3
+ ULTI: {
4
+ bybitv5_1: {
5
+ USDT: 7000,
6
+ },
7
+ },
8
+ },
9
+ orderbook_depth_in_quote_cur: {
10
+ AVALOX: {
11
+ gatev4: {
12
+ AVALOXUSDT: [[0.01, 1000]],
13
+ },
14
+ },
15
+ LUCIC: {
16
+ xt: {
17
+ LUCICUSDT: [[0.01, 1000]],
18
+ },
19
+ },
20
+ MAK: {
21
+ bitget: {
22
+ MAKUSDT: [[0.01, 500]],
23
+ },
24
+ bybitv5: {
25
+ MAKUSDT: [[0.01, 500]],
26
+ },
27
+ },
28
+ },
29
+ ask_bid_spread: {
30
+ AVALOX: {
31
+ gatev4: {
32
+ AVALOXUSDT: 0.01,
33
+ },
34
+ },
35
+ MAK: {
36
+ bitget: {
37
+ MAKUSDT: 0.01,
38
+ },
39
+ bybitv5: {
40
+ MAKUSDT: 0.01,
41
+ },
42
+ },
43
+ },
44
+ volume_24h_in_quote_cur: {
45
+ ETHF: {
46
+ mexc: {
47
+ ETHFUSDT: 50000,
48
+ },
49
+ htx: {
50
+ ETHFUSDT: 50000,
51
+ },
52
+ },
53
+ MAK: {
54
+ bitget: {
55
+ MAKUSDT: 300000,
56
+ },
57
+ },
58
+ },
59
+ }
60
+
61
+ module.exports = benchmarks
package/config.js CHANGED
@@ -1,107 +1,107 @@
1
- const _ = require('lodash')
2
- const config_data = require('./config.json')
3
-
4
- const client_exchange_pairs = config_data.client_exchange_pairs
5
- module.exports.client_exchange_pairs = client_exchange_pairs
6
-
7
- const client_not_include_exchanges = config_data.client_not_include_exchanges
8
- module.exports.client_not_include_exchanges = client_not_include_exchanges
9
-
10
- const client_pair_main_exchanges = config_data.client_pair_main_exchanges
11
- module.exports.client_pair_main_exchanges = client_pair_main_exchanges
12
-
13
- let client_exchange_currencies = {}
14
- for (let client in client_exchange_pairs) {
15
- for (let exchange in client_exchange_pairs[client]) {
16
- _.set(
17
- client_exchange_currencies,
18
- [client, exchange],
19
- client_exchange_pairs[client][exchange].map((pair) => pair.replace(client, ''))
20
- )
21
- client_exchange_currencies[client][exchange].push(client)
22
- }
23
- }
24
- module.exports.client_exchange_currencies = client_exchange_currencies
25
-
26
- /*
27
- {
28
- AAAXXX: [Huobi, Okx],
29
- CCCXXX: [Binance, Bitz]
30
- }
31
- */
32
- let client_pair_exchanges = {}
33
- _.keys(client_exchange_pairs).map((cur) =>
34
- _.keys(client_exchange_pairs[cur]).map((exchange) => {
35
- client_exchange_pairs[cur][exchange].map((pair) => {
36
- if (!client_pair_exchanges[cur] || !client_pair_exchanges[cur][pair]) {
37
- _.set(client_pair_exchanges, [cur, pair], [])
38
- }
39
- client_pair_exchanges[cur][pair].push(exchange)
40
- })
41
- })
42
- )
43
- module.exports.client_pair_exchanges = client_pair_exchanges
44
-
45
- /*
46
- {
47
- Binance: [AAAXXX, AAAYYY, BBBYYY, BBBZZZ],
48
- Huobi: [CCCXXX, CCCYYY, DDDZZZ]
49
- }
50
- */
51
- let exchange_pairs = {}
52
- _.values(client_exchange_pairs).map((exchange_pair_dict) => _.forEach(exchange_pair_dict, (v, k) => (exchange_pairs[k] = _.concat(exchange_pairs[k] ? exchange_pairs[k] : [], v))))
53
- module.exports.exchange_pairs = exchange_pairs
54
-
55
- /*
56
- {
57
- CVT: [CVTBTC, CVTETH],
58
- HSC: [HSCETH, HSCUSDT]
59
- }
60
- */
61
- module.exports.client_pairs = _.fromPairs(Object.keys(client_exchange_pairs).map((cur) => [cur, _.union(..._.values(client_exchange_pairs[cur]))]))
62
-
63
- /*
64
- {
65
- CVT: [Binance, Bitz],
66
- HSC: [Gatev4, Kkcoin]
67
- }
68
- */
69
- module.exports.client_exchanges = _.fromPairs(Object.keys(client_exchange_pairs).map((cur) => [cur, _.keys(client_exchange_pairs[cur])]))
70
-
71
- /*
72
- {
73
- CVT: [CVT, BTC, ETH, USDT],
74
- HSC: [HSC, ETH, USDT]
75
- }
76
- */
77
- module.exports.client_currencies_with_stables = _.fromPairs(
78
- Object.keys(client_exchange_pairs).map((cur) => [cur, [cur, 'BTC', 'ETH', 'USD', 'USDT', 'USDC', 'CNYT', 'KRW', 'THB', 'TUSD', 'BNB', 'PAX']])
79
- )
80
-
81
- const clients_reporter_interval = config_data.clients_reporter_interval
82
- module.exports.clients_reporter_interval = clients_reporter_interval
83
-
84
- const balance_premium = config_data.balance_premium
85
- module.exports.balance_premium = balance_premium
86
-
87
- const client_enabled = config_data.client_enabled
88
- module.exports.client_enabled = client_enabled
89
-
90
- const client_levels = config_data.client_levels
91
- module.exports.client_levels = client_levels
92
-
93
- const client_price_index_curs = config_data.client_price_index_curs
94
- module.exports.client_price_index_curs = client_price_index_curs
95
-
96
- const client_telegram_ids = config_data.client_telegram_ids
97
- module.exports.client_telegram_ids = client_telegram_ids
98
- module.exports.telegram_id_clients = _.invertBy(client_telegram_ids)
99
-
100
- const client_additional_telegram_ids = config_data.client_additional_telegram_ids
101
- module.exports.client_additional_telegram_ids = client_additional_telegram_ids
102
-
103
- const client_telegram_sender = config_data.client_telegram_sender
104
- module.exports.client_telegram_sender = client_telegram_sender
105
-
106
- const client_dashboard_credentials = config_data.client_dashboard_credentials
107
- module.exports.client_dashboard_credentials = client_dashboard_credentials
1
+ const _ = require('lodash')
2
+ const config_data = require('./config.json')
3
+
4
+ const client_exchange_pairs = config_data.client_exchange_pairs
5
+ module.exports.client_exchange_pairs = client_exchange_pairs
6
+
7
+ const client_not_include_exchanges = config_data.client_not_include_exchanges
8
+ module.exports.client_not_include_exchanges = client_not_include_exchanges
9
+
10
+ const client_pair_main_exchanges = config_data.client_pair_main_exchanges
11
+ module.exports.client_pair_main_exchanges = client_pair_main_exchanges
12
+
13
+ let client_exchange_currencies = {}
14
+ for (let client in client_exchange_pairs) {
15
+ for (let exchange in client_exchange_pairs[client]) {
16
+ _.set(
17
+ client_exchange_currencies,
18
+ [client, exchange],
19
+ client_exchange_pairs[client][exchange].map((pair) => pair.replace(client, ''))
20
+ )
21
+ client_exchange_currencies[client][exchange].push(client)
22
+ }
23
+ }
24
+ module.exports.client_exchange_currencies = client_exchange_currencies
25
+
26
+ /*
27
+ {
28
+ AAAXXX: [Huobi, Okx],
29
+ CCCXXX: [Binance, Bitz]
30
+ }
31
+ */
32
+ let client_pair_exchanges = {}
33
+ _.keys(client_exchange_pairs).map((cur) =>
34
+ _.keys(client_exchange_pairs[cur]).map((exchange) => {
35
+ client_exchange_pairs[cur][exchange].map((pair) => {
36
+ if (!client_pair_exchanges[cur] || !client_pair_exchanges[cur][pair]) {
37
+ _.set(client_pair_exchanges, [cur, pair], [])
38
+ }
39
+ client_pair_exchanges[cur][pair].push(exchange)
40
+ })
41
+ })
42
+ )
43
+ module.exports.client_pair_exchanges = client_pair_exchanges
44
+
45
+ /*
46
+ {
47
+ Binance: [AAAXXX, AAAYYY, BBBYYY, BBBZZZ],
48
+ Huobi: [CCCXXX, CCCYYY, DDDZZZ]
49
+ }
50
+ */
51
+ let exchange_pairs = {}
52
+ _.values(client_exchange_pairs).map((exchange_pair_dict) => _.forEach(exchange_pair_dict, (v, k) => (exchange_pairs[k] = _.concat(exchange_pairs[k] ? exchange_pairs[k] : [], v))))
53
+ module.exports.exchange_pairs = exchange_pairs
54
+
55
+ /*
56
+ {
57
+ CVT: [CVTBTC, CVTETH],
58
+ HSC: [HSCETH, HSCUSDT]
59
+ }
60
+ */
61
+ module.exports.client_pairs = _.fromPairs(Object.keys(client_exchange_pairs).map((cur) => [cur, _.union(..._.values(client_exchange_pairs[cur]))]))
62
+
63
+ /*
64
+ {
65
+ CVT: [Binance, Bitz],
66
+ HSC: [Gatev4, Kkcoin]
67
+ }
68
+ */
69
+ module.exports.client_exchanges = _.fromPairs(Object.keys(client_exchange_pairs).map((cur) => [cur, _.keys(client_exchange_pairs[cur])]))
70
+
71
+ /*
72
+ {
73
+ CVT: [CVT, BTC, ETH, USDT],
74
+ HSC: [HSC, ETH, USDT]
75
+ }
76
+ */
77
+ module.exports.client_currencies_with_stables = _.fromPairs(
78
+ Object.keys(client_exchange_pairs).map((cur) => [cur, [cur, 'BTC', 'ETH', 'USD', 'USDT', 'USDC', 'CNYT', 'KRW', 'THB', 'TUSD', 'BNB', 'PAX']])
79
+ )
80
+
81
+ const clients_reporter_interval = config_data.clients_reporter_interval
82
+ module.exports.clients_reporter_interval = clients_reporter_interval
83
+
84
+ const balance_premium = config_data.balance_premium
85
+ module.exports.balance_premium = balance_premium
86
+
87
+ const client_enabled = config_data.client_enabled
88
+ module.exports.client_enabled = client_enabled
89
+
90
+ const client_levels = config_data.client_levels
91
+ module.exports.client_levels = client_levels
92
+
93
+ const client_price_index_curs = config_data.client_price_index_curs
94
+ module.exports.client_price_index_curs = client_price_index_curs
95
+
96
+ const client_telegram_ids = config_data.client_telegram_ids
97
+ module.exports.client_telegram_ids = client_telegram_ids
98
+ module.exports.telegram_id_clients = _.invertBy(client_telegram_ids)
99
+
100
+ const client_additional_telegram_ids = config_data.client_additional_telegram_ids
101
+ module.exports.client_additional_telegram_ids = client_additional_telegram_ids
102
+
103
+ const client_telegram_sender = config_data.client_telegram_sender
104
+ module.exports.client_telegram_sender = client_telegram_sender
105
+
106
+ const client_dashboard_credentials = config_data.client_dashboard_credentials
107
+ module.exports.client_dashboard_credentials = client_dashboard_credentials
package/config.json CHANGED
@@ -31,7 +31,8 @@
31
31
  "Xt": ["LUCICUSDT"]
32
32
  },
33
33
  "MAK": {
34
- "Bitget": ["MAKUSDT"]
34
+ "Bitget": ["MAKUSDT"],
35
+ "Bybitv5": ["MAKUSDT"]
35
36
  },
36
37
  "OPUL": {
37
38
  "Gatev4": ["OPULUSDT"],
@@ -56,6 +57,9 @@
56
57
  "TITAN": {
57
58
  "Gatev4": ["TITANUSDT"]
58
59
  },
60
+ "TKT": {
61
+ "Mexc": ["TKTUSDT"]
62
+ },
59
63
  "ULTI": {
60
64
  "Bybitv5": ["ULTIUSDT"]
61
65
  }
@@ -103,7 +107,7 @@
103
107
  "LUCICUSDT": ["Xt"]
104
108
  },
105
109
  "MAK": {
106
- "MAKUSDT": ["Bitget"]
110
+ "MAKUSDT": ["Bitget", "Bybitv5"]
107
111
  },
108
112
  "OPUL": {
109
113
  "OPULUSDT": ["Gatev4", "Kucoin", "Weex"]
@@ -122,6 +126,9 @@
122
126
  "TITAN": {
123
127
  "TITANUSDT": ["Gatev4"]
124
128
  },
129
+ "TKT": {
130
+ "TKTUSDT": ["Mexc"]
131
+ },
125
132
  "ULTI": {
126
133
  "ULTIUSDT": ["Bybitv5"]
127
134
  }
@@ -197,6 +204,11 @@
197
204
  "trades": 1,
198
205
  "orderbook": 1
199
206
  },
207
+ "TKT": {
208
+ "balance": 1,
209
+ "trades": 1,
210
+ "orderbook": 1
211
+ },
200
212
  "ULTI": {
201
213
  "balance": 1,
202
214
  "trades": 1,
@@ -218,6 +230,7 @@
218
230
  "SHRAP": true,
219
231
  "SWFTC": true,
220
232
  "TITAN": true,
233
+ "TKT": true,
221
234
  "ULTI": true
222
235
  },
223
236
  "balance_cur": {
@@ -243,6 +256,7 @@
243
256
  "SHRAP": true,
244
257
  "SWFTC": true,
245
258
  "TITAN": true,
259
+ "TKT": true,
246
260
  "ULTI": true
247
261
  },
248
262
  "orderbook": {
@@ -264,6 +278,7 @@
264
278
  "SHRAP": [1, 2, 5, 10, 20, 50, 100],
265
279
  "SWFTC": [1, 2, 5, 10, 20, 50, 100],
266
280
  "TITAN": [1, 2, 5, 10, 20, 50, 100],
281
+ "TKT": [1, 2, 5, 10, 20, 50, 100],
267
282
  "ULTI": [1, 2, 5, 10, 20, 50, 100]
268
283
  },
269
284
  "client_price_index_curs": {
@@ -281,6 +296,7 @@
281
296
  "SHRAP": ["BTC", "ETH"],
282
297
  "SWFTC": ["BTC", "ETH"],
283
298
  "TITAN": ["BTC", "ETH"],
299
+ "TKT": ["BTC", "ETH"],
284
300
  "ULTI": ["BTC", "ETH"]
285
301
  },
286
302
  "client_telegram_ids": {
@@ -298,6 +314,7 @@
298
314
  "SHRAP": "-1001996867582",
299
315
  "SWFTC": "-1002067948127",
300
316
  "TITAN": "-4710863832",
317
+ "TKT": "-4946654975",
301
318
  "ULTI": "-4897875978"
302
319
  },
303
320
  "balance_premium": {
@@ -329,6 +346,7 @@
329
346
  "SHRAP": "icg",
330
347
  "SWFTC": "icg",
331
348
  "TITAN": "icg",
349
+ "TKT": "icg",
332
350
  "ULTI": "icg"
333
351
  },
334
352
  "client_dashboard_credentials": {
@@ -392,6 +410,10 @@
392
410
  "username": "titan@icg.io",
393
411
  "password": "PWW8Te4dPDoDS76"
394
412
  },
413
+ "TKT": {
414
+ "username": "tkt@icg.io",
415
+ "password": "oEwbg6MmKnTym1O"
416
+ },
395
417
  "ULTI": {
396
418
  "username": "ulti@icg.io",
397
419
  "password": "Jzrq83y7vQxAnWz"
Binary file
package/package.json CHANGED
@@ -1,27 +1,27 @@
1
- {
2
- "name": "@icgio/clients-config",
3
- "version": "1.0.151",
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.153",
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", "Gatev4"]} )',
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", "Gatev4"]} )',
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()