├── .gitignore
├── Dockerfile
├── README.md
├── docker-compose.yml
├── heroku.yml
├── package-lock.json
├── package.json
└── src
├── callbackQuery
├── cancel.js
├── follow.js
├── followReplyMessage.js
├── followTime.js
├── index.js
├── price.js
└── priceReplyMessage.js
├── commands
├── cancel.js
├── cancelAll.js
├── follow.js
├── help.js
├── index.js
├── latestStatus.js
├── price.js
├── start.js
└── subscribers.js
├── config
└── index.js
├── cron.js
├── helpers
└── database.js
├── index.js
├── models
└── Notification.js
├── services
├── CurrencyService.js
├── NotificationService.js
├── RabbitMQService.js
└── TelegramService.js
└── utils
├── CryptoCurrency.json
├── forex.json
├── formatCurrencyMessage.js
├── getNotificationMessage.js
└── sortCryptoArray.js
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | lerna-debug.log*
8 |
9 | # Diagnostic reports (https://nodejs.org/api/report.html)
10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
11 |
12 | # Runtime data
13 | pids
14 | *.pid
15 | *.seed
16 | *.pid.lock
17 |
18 | # Directory for instrumented libs generated by jscoverage/JSCover
19 | lib-cov
20 |
21 | # Coverage directory used by tools like istanbul
22 | coverage
23 | *.lcov
24 |
25 | # nyc test coverage
26 | .nyc_output
27 |
28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
29 | .grunt
30 |
31 | # Bower dependency directory (https://bower.io/)
32 | bower_components
33 |
34 | # node-waf configuration
35 | .lock-wscript
36 |
37 | # Compiled binary addons (https://nodejs.org/api/addons.html)
38 | build/Release
39 |
40 | # Dependency directories
41 | node_modules/
42 | jspm_packages/
43 |
44 | # TypeScript v1 declaration files
45 | typings/
46 |
47 | # TypeScript cache
48 | *.tsbuildinfo
49 |
50 | # Optional npm cache directory
51 | .npm
52 |
53 | # Optional eslint cache
54 | .eslintcache
55 |
56 | # Microbundle cache
57 | .rpt2_cache/
58 | .rts2_cache_cjs/
59 | .rts2_cache_es/
60 | .rts2_cache_umd/
61 |
62 | # Optional REPL history
63 | .node_repl_history
64 |
65 | # Output of 'npm pack'
66 | *.tgz
67 |
68 | # Yarn Integrity file
69 | .yarn-integrity
70 |
71 | # dotenv environment variables file
72 | .env
73 | .env.test
74 |
75 | # parcel-bundler cache (https://parceljs.org/)
76 | .cache
77 |
78 | # Next.js build output
79 | .next
80 |
81 | # Nuxt.js build / generate output
82 | .nuxt
83 | dist
84 |
85 | # Gatsby files
86 | .cache/
87 | # Comment in the public line in if your project uses Gatsby and *not* Next.js
88 | # https://nextjs.org/blog/next-9-1#public-directory-support
89 | # public
90 |
91 | # vuepress build output
92 | .vuepress/dist
93 |
94 | # Serverless directories
95 | .serverless/
96 |
97 | # FuseBox cache
98 | .fusebox/
99 |
100 | # DynamoDB Local files
101 | .dynamodb/
102 |
103 | # TernJS port file
104 | .tern-port
105 |
106 | .DS_Store
107 | *.rdb
108 |
109 | test/
110 |
111 | .idea
--------------------------------------------------------------------------------
/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM node:14-alpine
2 |
3 | WORKDIR /usr/app
4 |
5 | COPY package*.json ./
6 |
7 | # install dependencies
8 | RUN npm install --only=production
9 |
10 | COPY . .
11 |
12 | CMD [ "npm", "start" ]
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Telegram Cryptocurrency Notification Bot
2 |
3 | Telegram'da belirlediğiniz dakika, saat ve gün aralığında size istediğiniz para ve kripto para biriminin anlık fiyatını mesaj olarak gönderip piyasadan haberdar olmanızı sağlar.
4 |
5 | [Telegram Bot Link](https://t.me/CryptoCurrency_NotificationBot)
6 |
7 | [](https://www.codefactor.io/repository/github/mercan/telegramcryptocurrencybot)
8 |
9 | ## Kullanılan Teknolojiler
10 |
11 | Docker, NodeJS, MongoDB, RabbitMQ
12 |
13 | ## Sponsor
14 |
15 | [Finage](https://finage.co.uk/) finansal veriler için.
16 |
--------------------------------------------------------------------------------
/docker-compose.yml:
--------------------------------------------------------------------------------
1 | version: "3.4"
2 | services:
3 | node:
4 | build: .
5 | env_file: .env
6 | volumes:
7 | - .:/app
8 |
--------------------------------------------------------------------------------
/heroku.yml:
--------------------------------------------------------------------------------
1 | build:
2 | docker:
3 | web: Dockerfile
4 | worker: Dockerfile
5 |
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "telegramdovizbot",
3 | "version": "1.0.0",
4 | "lockfileVersion": 2,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "telegramdovizbot",
9 | "version": "1.0.0",
10 | "license": "ISC",
11 | "dependencies": {
12 | "amqplib": "^0.8.0",
13 | "dotenv": "^14.3.2",
14 | "mongoose": "^6.1.8",
15 | "node-cron": "^3.0.0",
16 | "node-fetch": "^2.6.7",
17 | "node-telegram-bot-api": "^0.56.0"
18 | },
19 | "engines": {
20 | "node": ">=16.3.0"
21 | }
22 | },
23 | "node_modules/@types/node": {
24 | "version": "17.0.13",
25 | "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.13.tgz",
26 | "integrity": "sha512-Y86MAxASe25hNzlDbsviXl8jQHb0RDvKt4c40ZJQ1Don0AAL0STLZSs4N+6gLEO55pedy7r2cLwS+ZDxPm/2Bw=="
27 | },
28 | "node_modules/@types/webidl-conversions": {
29 | "version": "6.1.1",
30 | "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-6.1.1.tgz",
31 | "integrity": "sha512-XAahCdThVuCFDQLT7R7Pk/vqeObFNL3YqRyFZg+AqAP/W1/w3xHaIxuW7WszQqTbIBOPRcItYJIou3i/mppu3Q=="
32 | },
33 | "node_modules/@types/whatwg-url": {
34 | "version": "8.2.1",
35 | "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.1.tgz",
36 | "integrity": "sha512-2YubE1sjj5ifxievI5Ge1sckb9k/Er66HyR2c+3+I6VDUUg1TLPdYYTEbQ+DjRkS4nTxMJhgWfSfMRD2sl2EYQ==",
37 | "dependencies": {
38 | "@types/node": "*",
39 | "@types/webidl-conversions": "*"
40 | }
41 | },
42 | "node_modules/ajv": {
43 | "version": "6.12.6",
44 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
45 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
46 | "dependencies": {
47 | "fast-deep-equal": "^3.1.1",
48 | "fast-json-stable-stringify": "^2.0.0",
49 | "json-schema-traverse": "^0.4.1",
50 | "uri-js": "^4.2.2"
51 | },
52 | "funding": {
53 | "type": "github",
54 | "url": "https://github.com/sponsors/epoberezkin"
55 | }
56 | },
57 | "node_modules/amqplib": {
58 | "version": "0.8.0",
59 | "resolved": "https://registry.npmjs.org/amqplib/-/amqplib-0.8.0.tgz",
60 | "integrity": "sha512-icU+a4kkq4Y1PS4NNi+YPDMwdlbFcZ1EZTQT2nigW3fvOb6AOgUQ9+Mk4ue0Zu5cBg/XpDzB40oH10ysrk2dmA==",
61 | "dependencies": {
62 | "bitsyntax": "~0.1.0",
63 | "bluebird": "^3.7.2",
64 | "buffer-more-ints": "~1.0.0",
65 | "readable-stream": "1.x >=1.1.9",
66 | "safe-buffer": "~5.2.1",
67 | "url-parse": "~1.5.1"
68 | },
69 | "engines": {
70 | "node": ">=10"
71 | }
72 | },
73 | "node_modules/amqplib/node_modules/isarray": {
74 | "version": "0.0.1",
75 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
76 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
77 | },
78 | "node_modules/amqplib/node_modules/readable-stream": {
79 | "version": "1.1.14",
80 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
81 | "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
82 | "dependencies": {
83 | "core-util-is": "~1.0.0",
84 | "inherits": "~2.0.1",
85 | "isarray": "0.0.1",
86 | "string_decoder": "~0.10.x"
87 | }
88 | },
89 | "node_modules/amqplib/node_modules/string_decoder": {
90 | "version": "0.10.31",
91 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
92 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
93 | },
94 | "node_modules/array.prototype.findindex": {
95 | "version": "2.1.0",
96 | "resolved": "https://registry.npmjs.org/array.prototype.findindex/-/array.prototype.findindex-2.1.0.tgz",
97 | "integrity": "sha512-25kJHCjXltdtljjwcyKvCTywmbUAeTJVB2ADVe0oP4jcefsd+K9pJJ3IdHPahLICoszcCLoNF+evWpEduzBlng==",
98 | "dependencies": {
99 | "define-properties": "^1.1.3",
100 | "es-abstract": "^1.17.4"
101 | }
102 | },
103 | "node_modules/asn1": {
104 | "version": "0.2.6",
105 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
106 | "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
107 | "dependencies": {
108 | "safer-buffer": "~2.1.0"
109 | }
110 | },
111 | "node_modules/assert-plus": {
112 | "version": "1.0.0",
113 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
114 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
115 | "engines": {
116 | "node": ">=0.8"
117 | }
118 | },
119 | "node_modules/asynckit": {
120 | "version": "0.4.0",
121 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
122 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
123 | },
124 | "node_modules/aws-sign2": {
125 | "version": "0.7.0",
126 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
127 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
128 | "engines": {
129 | "node": "*"
130 | }
131 | },
132 | "node_modules/aws4": {
133 | "version": "1.11.0",
134 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz",
135 | "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA=="
136 | },
137 | "node_modules/base64-js": {
138 | "version": "1.5.1",
139 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
140 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
141 | "funding": [
142 | {
143 | "type": "github",
144 | "url": "https://github.com/sponsors/feross"
145 | },
146 | {
147 | "type": "patreon",
148 | "url": "https://www.patreon.com/feross"
149 | },
150 | {
151 | "type": "consulting",
152 | "url": "https://feross.org/support"
153 | }
154 | ]
155 | },
156 | "node_modules/bcrypt-pbkdf": {
157 | "version": "1.0.2",
158 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
159 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
160 | "dependencies": {
161 | "tweetnacl": "^0.14.3"
162 | }
163 | },
164 | "node_modules/bitsyntax": {
165 | "version": "0.1.0",
166 | "resolved": "https://registry.npmjs.org/bitsyntax/-/bitsyntax-0.1.0.tgz",
167 | "integrity": "sha512-ikAdCnrloKmFOugAfxWws89/fPc+nw0OOG1IzIE72uSOg/A3cYptKCjSUhDTuj7fhsJtzkzlv7l3b8PzRHLN0Q==",
168 | "dependencies": {
169 | "buffer-more-ints": "~1.0.0",
170 | "debug": "~2.6.9",
171 | "safe-buffer": "~5.1.2"
172 | },
173 | "engines": {
174 | "node": ">=0.8"
175 | }
176 | },
177 | "node_modules/bitsyntax/node_modules/debug": {
178 | "version": "2.6.9",
179 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
180 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
181 | "dependencies": {
182 | "ms": "2.0.0"
183 | }
184 | },
185 | "node_modules/bitsyntax/node_modules/ms": {
186 | "version": "2.0.0",
187 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
188 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
189 | },
190 | "node_modules/bitsyntax/node_modules/safe-buffer": {
191 | "version": "5.1.2",
192 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
193 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
194 | },
195 | "node_modules/bl": {
196 | "version": "1.2.3",
197 | "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz",
198 | "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==",
199 | "dependencies": {
200 | "readable-stream": "^2.3.5",
201 | "safe-buffer": "^5.1.1"
202 | }
203 | },
204 | "node_modules/bluebird": {
205 | "version": "3.7.2",
206 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
207 | "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="
208 | },
209 | "node_modules/bson": {
210 | "version": "4.6.1",
211 | "resolved": "https://registry.npmjs.org/bson/-/bson-4.6.1.tgz",
212 | "integrity": "sha512-I1LQ7Hz5zgwR4QquilLNZwbhPw0Apx7i7X9kGMBTsqPdml/03Q9NBtD9nt/19ahjlphktQImrnderxqpzeVDjw==",
213 | "dependencies": {
214 | "buffer": "^5.6.0"
215 | },
216 | "engines": {
217 | "node": ">=6.9.0"
218 | }
219 | },
220 | "node_modules/buffer": {
221 | "version": "5.7.1",
222 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
223 | "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
224 | "funding": [
225 | {
226 | "type": "github",
227 | "url": "https://github.com/sponsors/feross"
228 | },
229 | {
230 | "type": "patreon",
231 | "url": "https://www.patreon.com/feross"
232 | },
233 | {
234 | "type": "consulting",
235 | "url": "https://feross.org/support"
236 | }
237 | ],
238 | "dependencies": {
239 | "base64-js": "^1.3.1",
240 | "ieee754": "^1.1.13"
241 | }
242 | },
243 | "node_modules/buffer-more-ints": {
244 | "version": "1.0.0",
245 | "resolved": "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-1.0.0.tgz",
246 | "integrity": "sha512-EMetuGFz5SLsT0QTnXzINh4Ksr+oo4i+UGTXEshiGCQWnsgSs7ZhJ8fzlwQ+OzEMs0MpDAMr1hxnblp5a4vcHg=="
247 | },
248 | "node_modules/call-bind": {
249 | "version": "1.0.2",
250 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
251 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
252 | "dependencies": {
253 | "function-bind": "^1.1.1",
254 | "get-intrinsic": "^1.0.2"
255 | },
256 | "funding": {
257 | "url": "https://github.com/sponsors/ljharb"
258 | }
259 | },
260 | "node_modules/caseless": {
261 | "version": "0.12.0",
262 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
263 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
264 | },
265 | "node_modules/combined-stream": {
266 | "version": "1.0.8",
267 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
268 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
269 | "dependencies": {
270 | "delayed-stream": "~1.0.0"
271 | },
272 | "engines": {
273 | "node": ">= 0.8"
274 | }
275 | },
276 | "node_modules/core-util-is": {
277 | "version": "1.0.3",
278 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
279 | "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
280 | },
281 | "node_modules/dashdash": {
282 | "version": "1.14.1",
283 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
284 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
285 | "dependencies": {
286 | "assert-plus": "^1.0.0"
287 | },
288 | "engines": {
289 | "node": ">=0.10"
290 | }
291 | },
292 | "node_modules/debug": {
293 | "version": "3.2.7",
294 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
295 | "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
296 | "dependencies": {
297 | "ms": "^2.1.1"
298 | }
299 | },
300 | "node_modules/define-properties": {
301 | "version": "1.1.3",
302 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
303 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
304 | "dependencies": {
305 | "object-keys": "^1.0.12"
306 | },
307 | "engines": {
308 | "node": ">= 0.4"
309 | }
310 | },
311 | "node_modules/delayed-stream": {
312 | "version": "1.0.0",
313 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
314 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
315 | "engines": {
316 | "node": ">=0.4.0"
317 | }
318 | },
319 | "node_modules/denque": {
320 | "version": "2.0.1",
321 | "resolved": "https://registry.npmjs.org/denque/-/denque-2.0.1.tgz",
322 | "integrity": "sha512-tfiWc6BQLXNLpNiR5iGd0Ocu3P3VpxfzFiqubLgMfhfOw9WyvgJBd46CClNn9k3qfbjvT//0cf7AlYRX/OslMQ==",
323 | "engines": {
324 | "node": ">=0.10"
325 | }
326 | },
327 | "node_modules/depd": {
328 | "version": "1.1.2",
329 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
330 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
331 | "engines": {
332 | "node": ">= 0.6"
333 | }
334 | },
335 | "node_modules/dotenv": {
336 | "version": "14.3.2",
337 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-14.3.2.tgz",
338 | "integrity": "sha512-vwEppIphpFdvaMCaHfCEv9IgwcxMljMw2TnAQBB4VWPvzXQLTb82jwmdOKzlEVUL3gNFT4l4TPKO+Bn+sqcrVQ==",
339 | "engines": {
340 | "node": ">=12"
341 | }
342 | },
343 | "node_modules/ecc-jsbn": {
344 | "version": "0.1.2",
345 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
346 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
347 | "dependencies": {
348 | "jsbn": "~0.1.0",
349 | "safer-buffer": "^2.1.0"
350 | }
351 | },
352 | "node_modules/end-of-stream": {
353 | "version": "1.4.4",
354 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
355 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
356 | "dependencies": {
357 | "once": "^1.4.0"
358 | }
359 | },
360 | "node_modules/es-abstract": {
361 | "version": "1.19.1",
362 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz",
363 | "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==",
364 | "dependencies": {
365 | "call-bind": "^1.0.2",
366 | "es-to-primitive": "^1.2.1",
367 | "function-bind": "^1.1.1",
368 | "get-intrinsic": "^1.1.1",
369 | "get-symbol-description": "^1.0.0",
370 | "has": "^1.0.3",
371 | "has-symbols": "^1.0.2",
372 | "internal-slot": "^1.0.3",
373 | "is-callable": "^1.2.4",
374 | "is-negative-zero": "^2.0.1",
375 | "is-regex": "^1.1.4",
376 | "is-shared-array-buffer": "^1.0.1",
377 | "is-string": "^1.0.7",
378 | "is-weakref": "^1.0.1",
379 | "object-inspect": "^1.11.0",
380 | "object-keys": "^1.1.1",
381 | "object.assign": "^4.1.2",
382 | "string.prototype.trimend": "^1.0.4",
383 | "string.prototype.trimstart": "^1.0.4",
384 | "unbox-primitive": "^1.0.1"
385 | },
386 | "engines": {
387 | "node": ">= 0.4"
388 | },
389 | "funding": {
390 | "url": "https://github.com/sponsors/ljharb"
391 | }
392 | },
393 | "node_modules/es-to-primitive": {
394 | "version": "1.2.1",
395 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
396 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
397 | "dependencies": {
398 | "is-callable": "^1.1.4",
399 | "is-date-object": "^1.0.1",
400 | "is-symbol": "^1.0.2"
401 | },
402 | "engines": {
403 | "node": ">= 0.4"
404 | },
405 | "funding": {
406 | "url": "https://github.com/sponsors/ljharb"
407 | }
408 | },
409 | "node_modules/eventemitter3": {
410 | "version": "3.1.2",
411 | "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz",
412 | "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q=="
413 | },
414 | "node_modules/extend": {
415 | "version": "3.0.2",
416 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
417 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
418 | },
419 | "node_modules/extsprintf": {
420 | "version": "1.3.0",
421 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
422 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
423 | "engines": [
424 | "node >=0.6.0"
425 | ]
426 | },
427 | "node_modules/fast-deep-equal": {
428 | "version": "3.1.3",
429 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
430 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
431 | },
432 | "node_modules/fast-json-stable-stringify": {
433 | "version": "2.1.0",
434 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
435 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
436 | },
437 | "node_modules/file-type": {
438 | "version": "3.9.0",
439 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz",
440 | "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=",
441 | "engines": {
442 | "node": ">=0.10.0"
443 | }
444 | },
445 | "node_modules/forever-agent": {
446 | "version": "0.6.1",
447 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
448 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
449 | "engines": {
450 | "node": "*"
451 | }
452 | },
453 | "node_modules/form-data": {
454 | "version": "2.3.3",
455 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
456 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
457 | "dependencies": {
458 | "asynckit": "^0.4.0",
459 | "combined-stream": "^1.0.6",
460 | "mime-types": "^2.1.12"
461 | },
462 | "engines": {
463 | "node": ">= 0.12"
464 | }
465 | },
466 | "node_modules/function-bind": {
467 | "version": "1.1.1",
468 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
469 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
470 | },
471 | "node_modules/get-intrinsic": {
472 | "version": "1.1.1",
473 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
474 | "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
475 | "dependencies": {
476 | "function-bind": "^1.1.1",
477 | "has": "^1.0.3",
478 | "has-symbols": "^1.0.1"
479 | },
480 | "funding": {
481 | "url": "https://github.com/sponsors/ljharb"
482 | }
483 | },
484 | "node_modules/get-symbol-description": {
485 | "version": "1.0.0",
486 | "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
487 | "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
488 | "dependencies": {
489 | "call-bind": "^1.0.2",
490 | "get-intrinsic": "^1.1.1"
491 | },
492 | "engines": {
493 | "node": ">= 0.4"
494 | },
495 | "funding": {
496 | "url": "https://github.com/sponsors/ljharb"
497 | }
498 | },
499 | "node_modules/getpass": {
500 | "version": "0.1.7",
501 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
502 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
503 | "dependencies": {
504 | "assert-plus": "^1.0.0"
505 | }
506 | },
507 | "node_modules/har-schema": {
508 | "version": "2.0.0",
509 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
510 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
511 | "engines": {
512 | "node": ">=4"
513 | }
514 | },
515 | "node_modules/har-validator": {
516 | "version": "5.1.5",
517 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
518 | "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
519 | "deprecated": "this library is no longer supported",
520 | "dependencies": {
521 | "ajv": "^6.12.3",
522 | "har-schema": "^2.0.0"
523 | },
524 | "engines": {
525 | "node": ">=6"
526 | }
527 | },
528 | "node_modules/has": {
529 | "version": "1.0.3",
530 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
531 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
532 | "dependencies": {
533 | "function-bind": "^1.1.1"
534 | },
535 | "engines": {
536 | "node": ">= 0.4.0"
537 | }
538 | },
539 | "node_modules/has-bigints": {
540 | "version": "1.0.1",
541 | "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz",
542 | "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==",
543 | "funding": {
544 | "url": "https://github.com/sponsors/ljharb"
545 | }
546 | },
547 | "node_modules/has-symbols": {
548 | "version": "1.0.2",
549 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
550 | "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==",
551 | "engines": {
552 | "node": ">= 0.4"
553 | },
554 | "funding": {
555 | "url": "https://github.com/sponsors/ljharb"
556 | }
557 | },
558 | "node_modules/has-tostringtag": {
559 | "version": "1.0.0",
560 | "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
561 | "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
562 | "dependencies": {
563 | "has-symbols": "^1.0.2"
564 | },
565 | "engines": {
566 | "node": ">= 0.4"
567 | },
568 | "funding": {
569 | "url": "https://github.com/sponsors/ljharb"
570 | }
571 | },
572 | "node_modules/http-signature": {
573 | "version": "1.2.0",
574 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
575 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
576 | "dependencies": {
577 | "assert-plus": "^1.0.0",
578 | "jsprim": "^1.2.2",
579 | "sshpk": "^1.7.0"
580 | },
581 | "engines": {
582 | "node": ">=0.8",
583 | "npm": ">=1.3.7"
584 | }
585 | },
586 | "node_modules/ieee754": {
587 | "version": "1.2.1",
588 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
589 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
590 | "funding": [
591 | {
592 | "type": "github",
593 | "url": "https://github.com/sponsors/feross"
594 | },
595 | {
596 | "type": "patreon",
597 | "url": "https://www.patreon.com/feross"
598 | },
599 | {
600 | "type": "consulting",
601 | "url": "https://feross.org/support"
602 | }
603 | ]
604 | },
605 | "node_modules/inherits": {
606 | "version": "2.0.4",
607 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
608 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
609 | },
610 | "node_modules/internal-slot": {
611 | "version": "1.0.3",
612 | "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz",
613 | "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==",
614 | "dependencies": {
615 | "get-intrinsic": "^1.1.0",
616 | "has": "^1.0.3",
617 | "side-channel": "^1.0.4"
618 | },
619 | "engines": {
620 | "node": ">= 0.4"
621 | }
622 | },
623 | "node_modules/is-bigint": {
624 | "version": "1.0.4",
625 | "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
626 | "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
627 | "dependencies": {
628 | "has-bigints": "^1.0.1"
629 | },
630 | "funding": {
631 | "url": "https://github.com/sponsors/ljharb"
632 | }
633 | },
634 | "node_modules/is-boolean-object": {
635 | "version": "1.1.2",
636 | "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
637 | "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
638 | "dependencies": {
639 | "call-bind": "^1.0.2",
640 | "has-tostringtag": "^1.0.0"
641 | },
642 | "engines": {
643 | "node": ">= 0.4"
644 | },
645 | "funding": {
646 | "url": "https://github.com/sponsors/ljharb"
647 | }
648 | },
649 | "node_modules/is-callable": {
650 | "version": "1.2.4",
651 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz",
652 | "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==",
653 | "engines": {
654 | "node": ">= 0.4"
655 | },
656 | "funding": {
657 | "url": "https://github.com/sponsors/ljharb"
658 | }
659 | },
660 | "node_modules/is-date-object": {
661 | "version": "1.0.5",
662 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
663 | "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
664 | "dependencies": {
665 | "has-tostringtag": "^1.0.0"
666 | },
667 | "engines": {
668 | "node": ">= 0.4"
669 | },
670 | "funding": {
671 | "url": "https://github.com/sponsors/ljharb"
672 | }
673 | },
674 | "node_modules/is-negative-zero": {
675 | "version": "2.0.2",
676 | "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
677 | "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==",
678 | "engines": {
679 | "node": ">= 0.4"
680 | },
681 | "funding": {
682 | "url": "https://github.com/sponsors/ljharb"
683 | }
684 | },
685 | "node_modules/is-number-object": {
686 | "version": "1.0.6",
687 | "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz",
688 | "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==",
689 | "dependencies": {
690 | "has-tostringtag": "^1.0.0"
691 | },
692 | "engines": {
693 | "node": ">= 0.4"
694 | },
695 | "funding": {
696 | "url": "https://github.com/sponsors/ljharb"
697 | }
698 | },
699 | "node_modules/is-regex": {
700 | "version": "1.1.4",
701 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
702 | "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
703 | "dependencies": {
704 | "call-bind": "^1.0.2",
705 | "has-tostringtag": "^1.0.0"
706 | },
707 | "engines": {
708 | "node": ">= 0.4"
709 | },
710 | "funding": {
711 | "url": "https://github.com/sponsors/ljharb"
712 | }
713 | },
714 | "node_modules/is-shared-array-buffer": {
715 | "version": "1.0.1",
716 | "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz",
717 | "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==",
718 | "funding": {
719 | "url": "https://github.com/sponsors/ljharb"
720 | }
721 | },
722 | "node_modules/is-string": {
723 | "version": "1.0.7",
724 | "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
725 | "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
726 | "dependencies": {
727 | "has-tostringtag": "^1.0.0"
728 | },
729 | "engines": {
730 | "node": ">= 0.4"
731 | },
732 | "funding": {
733 | "url": "https://github.com/sponsors/ljharb"
734 | }
735 | },
736 | "node_modules/is-symbol": {
737 | "version": "1.0.4",
738 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
739 | "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
740 | "dependencies": {
741 | "has-symbols": "^1.0.2"
742 | },
743 | "engines": {
744 | "node": ">= 0.4"
745 | },
746 | "funding": {
747 | "url": "https://github.com/sponsors/ljharb"
748 | }
749 | },
750 | "node_modules/is-typedarray": {
751 | "version": "1.0.0",
752 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
753 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
754 | },
755 | "node_modules/is-weakref": {
756 | "version": "1.0.2",
757 | "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
758 | "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
759 | "dependencies": {
760 | "call-bind": "^1.0.2"
761 | },
762 | "funding": {
763 | "url": "https://github.com/sponsors/ljharb"
764 | }
765 | },
766 | "node_modules/isarray": {
767 | "version": "1.0.0",
768 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
769 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
770 | },
771 | "node_modules/isstream": {
772 | "version": "0.1.2",
773 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
774 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
775 | },
776 | "node_modules/jsbn": {
777 | "version": "0.1.1",
778 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
779 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
780 | },
781 | "node_modules/json-schema": {
782 | "version": "0.4.0",
783 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
784 | "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="
785 | },
786 | "node_modules/json-schema-traverse": {
787 | "version": "0.4.1",
788 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
789 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
790 | },
791 | "node_modules/json-stringify-safe": {
792 | "version": "5.0.1",
793 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
794 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
795 | },
796 | "node_modules/jsprim": {
797 | "version": "1.4.2",
798 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz",
799 | "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
800 | "dependencies": {
801 | "assert-plus": "1.0.0",
802 | "extsprintf": "1.3.0",
803 | "json-schema": "0.4.0",
804 | "verror": "1.10.0"
805 | },
806 | "engines": {
807 | "node": ">=0.6.0"
808 | }
809 | },
810 | "node_modules/kareem": {
811 | "version": "2.3.3",
812 | "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.3.tgz",
813 | "integrity": "sha512-uESCXM2KdtOQ8LOvKyTUXEeg0MkYp4wGglTIpGcYHvjJcS5sn2Wkfrfit8m4xSbaNDAw2KdI9elgkOxZbrFYbg=="
814 | },
815 | "node_modules/lodash": {
816 | "version": "4.17.21",
817 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
818 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
819 | },
820 | "node_modules/memory-pager": {
821 | "version": "1.5.0",
822 | "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz",
823 | "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==",
824 | "optional": true
825 | },
826 | "node_modules/mime": {
827 | "version": "1.6.0",
828 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
829 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
830 | "bin": {
831 | "mime": "cli.js"
832 | },
833 | "engines": {
834 | "node": ">=4"
835 | }
836 | },
837 | "node_modules/mime-db": {
838 | "version": "1.51.0",
839 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz",
840 | "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==",
841 | "engines": {
842 | "node": ">= 0.6"
843 | }
844 | },
845 | "node_modules/mime-types": {
846 | "version": "2.1.34",
847 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz",
848 | "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==",
849 | "dependencies": {
850 | "mime-db": "1.51.0"
851 | },
852 | "engines": {
853 | "node": ">= 0.6"
854 | }
855 | },
856 | "node_modules/moment": {
857 | "version": "2.29.1",
858 | "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz",
859 | "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==",
860 | "engines": {
861 | "node": "*"
862 | }
863 | },
864 | "node_modules/moment-timezone": {
865 | "version": "0.5.34",
866 | "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.34.tgz",
867 | "integrity": "sha512-3zAEHh2hKUs3EXLESx/wsgw6IQdusOT8Bxm3D9UrHPQR7zlMmzwybC8zHEM1tQ4LJwP7fcxrWr8tuBg05fFCbg==",
868 | "dependencies": {
869 | "moment": ">= 2.9.0"
870 | },
871 | "engines": {
872 | "node": "*"
873 | }
874 | },
875 | "node_modules/mongodb": {
876 | "version": "4.2.2",
877 | "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.2.2.tgz",
878 | "integrity": "sha512-zt8rCTnTKyMQppyt63qMnrLM5dbADgUk18ORPF1XbtHLIYCyc9hattaYHi0pqMvNxDpgGgUofSVzS+UQErgTug==",
879 | "dependencies": {
880 | "bson": "^4.6.0",
881 | "denque": "^2.0.1",
882 | "mongodb-connection-string-url": "^2.3.2"
883 | },
884 | "engines": {
885 | "node": ">=12.9.0"
886 | },
887 | "optionalDependencies": {
888 | "saslprep": "^1.0.3"
889 | }
890 | },
891 | "node_modules/mongodb-connection-string-url": {
892 | "version": "2.4.1",
893 | "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.4.1.tgz",
894 | "integrity": "sha512-d5Kd2bVsKcSA7YI/yo57fSTtMwRQdFkvc5IZwod1RRxJtECeWPPSo7zqcUGJELifRA//Igs4spVtYAmvFCatug==",
895 | "dependencies": {
896 | "@types/whatwg-url": "^8.2.1",
897 | "whatwg-url": "^11.0.0"
898 | }
899 | },
900 | "node_modules/mongoose": {
901 | "version": "6.1.8",
902 | "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.1.8.tgz",
903 | "integrity": "sha512-/voqwU2dtet3zAR73r8jdPhqluU1VzIAnk7ecXPJBgyXKREnwQrz40lfW7fLpaqhmMhsAbA+JQ7ICUn2vAVFLw==",
904 | "dependencies": {
905 | "@types/node": "< 17.0.6",
906 | "bson": "^4.2.2",
907 | "kareem": "2.3.3",
908 | "mongodb": "4.2.2",
909 | "mpath": "0.8.4",
910 | "mquery": "4.0.2",
911 | "ms": "2.1.2",
912 | "regexp-clone": "1.0.0",
913 | "sift": "13.5.2"
914 | },
915 | "engines": {
916 | "node": ">=12.0.0"
917 | },
918 | "funding": {
919 | "type": "opencollective",
920 | "url": "https://opencollective.com/mongoose"
921 | }
922 | },
923 | "node_modules/mongoose/node_modules/@types/node": {
924 | "version": "17.0.5",
925 | "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.5.tgz",
926 | "integrity": "sha512-w3mrvNXLeDYV1GKTZorGJQivK6XLCoGwpnyJFbJVK/aTBQUxOCaa/GlFAAN3OTDFcb7h5tiFG+YXCO2By+riZw=="
927 | },
928 | "node_modules/mongoose/node_modules/ms": {
929 | "version": "2.1.2",
930 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
931 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
932 | },
933 | "node_modules/mpath": {
934 | "version": "0.8.4",
935 | "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.8.4.tgz",
936 | "integrity": "sha512-DTxNZomBcTWlrMW76jy1wvV37X/cNNxPW1y2Jzd4DZkAaC5ZGsm8bfGfNOthcDuRJujXLqiuS6o3Tpy0JEoh7g==",
937 | "engines": {
938 | "node": ">=4.0.0"
939 | }
940 | },
941 | "node_modules/mquery": {
942 | "version": "4.0.2",
943 | "resolved": "https://registry.npmjs.org/mquery/-/mquery-4.0.2.tgz",
944 | "integrity": "sha512-oAVF0Nil1mT3rxty6Zln4YiD6x6QsUWYz927jZzjMxOK2aqmhEz5JQ7xmrKK7xRFA2dwV+YaOpKU/S+vfNqKxA==",
945 | "dependencies": {
946 | "debug": "4.x"
947 | },
948 | "engines": {
949 | "node": ">=12.0.0"
950 | }
951 | },
952 | "node_modules/mquery/node_modules/debug": {
953 | "version": "4.3.3",
954 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz",
955 | "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==",
956 | "dependencies": {
957 | "ms": "2.1.2"
958 | },
959 | "engines": {
960 | "node": ">=6.0"
961 | },
962 | "peerDependenciesMeta": {
963 | "supports-color": {
964 | "optional": true
965 | }
966 | }
967 | },
968 | "node_modules/mquery/node_modules/ms": {
969 | "version": "2.1.2",
970 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
971 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
972 | },
973 | "node_modules/ms": {
974 | "version": "2.1.3",
975 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
976 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
977 | },
978 | "node_modules/node-cron": {
979 | "version": "3.0.0",
980 | "resolved": "https://registry.npmjs.org/node-cron/-/node-cron-3.0.0.tgz",
981 | "integrity": "sha512-DDwIvvuCwrNiaU7HEivFDULcaQualDv7KoNlB/UU1wPW0n1tDEmBJKhEIE6DlF2FuoOHcNbLJ8ITL2Iv/3AWmA==",
982 | "dependencies": {
983 | "moment-timezone": "^0.5.31"
984 | },
985 | "engines": {
986 | "node": ">=6.0.0"
987 | }
988 | },
989 | "node_modules/node-fetch": {
990 | "version": "2.6.7",
991 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
992 | "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
993 | "dependencies": {
994 | "whatwg-url": "^5.0.0"
995 | },
996 | "engines": {
997 | "node": "4.x || >=6.0.0"
998 | },
999 | "peerDependencies": {
1000 | "encoding": "^0.1.0"
1001 | },
1002 | "peerDependenciesMeta": {
1003 | "encoding": {
1004 | "optional": true
1005 | }
1006 | }
1007 | },
1008 | "node_modules/node-fetch/node_modules/tr46": {
1009 | "version": "0.0.3",
1010 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
1011 | "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o="
1012 | },
1013 | "node_modules/node-fetch/node_modules/webidl-conversions": {
1014 | "version": "3.0.1",
1015 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
1016 | "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE="
1017 | },
1018 | "node_modules/node-fetch/node_modules/whatwg-url": {
1019 | "version": "5.0.0",
1020 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
1021 | "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=",
1022 | "dependencies": {
1023 | "tr46": "~0.0.3",
1024 | "webidl-conversions": "^3.0.0"
1025 | }
1026 | },
1027 | "node_modules/node-telegram-bot-api": {
1028 | "version": "0.56.0",
1029 | "resolved": "https://registry.npmjs.org/node-telegram-bot-api/-/node-telegram-bot-api-0.56.0.tgz",
1030 | "integrity": "sha512-gKUlH/uUXdSJ++6y1Y16qEThZouecfl4twuPKe6V2BPFDDfom9j2QMlxfslPEjZPH2ZXlA1S/uoRCKtIjzuaLw==",
1031 | "dependencies": {
1032 | "array.prototype.findindex": "^2.0.2",
1033 | "bl": "^1.2.3",
1034 | "bluebird": "^3.5.1",
1035 | "debug": "^3.1.0",
1036 | "depd": "^1.1.1",
1037 | "eventemitter3": "^3.0.0",
1038 | "file-type": "^3.9.0",
1039 | "mime": "^1.6.0",
1040 | "pump": "^2.0.0",
1041 | "request": "^2.83.0",
1042 | "request-promise": "^4.2.2"
1043 | },
1044 | "engines": {
1045 | "node": ">=0.12"
1046 | }
1047 | },
1048 | "node_modules/node-telegram-bot-api/node_modules/pump": {
1049 | "version": "2.0.1",
1050 | "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
1051 | "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
1052 | "dependencies": {
1053 | "end-of-stream": "^1.1.0",
1054 | "once": "^1.3.1"
1055 | }
1056 | },
1057 | "node_modules/oauth-sign": {
1058 | "version": "0.9.0",
1059 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
1060 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
1061 | "engines": {
1062 | "node": "*"
1063 | }
1064 | },
1065 | "node_modules/object-inspect": {
1066 | "version": "1.12.0",
1067 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz",
1068 | "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==",
1069 | "funding": {
1070 | "url": "https://github.com/sponsors/ljharb"
1071 | }
1072 | },
1073 | "node_modules/object-keys": {
1074 | "version": "1.1.1",
1075 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
1076 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
1077 | "engines": {
1078 | "node": ">= 0.4"
1079 | }
1080 | },
1081 | "node_modules/object.assign": {
1082 | "version": "4.1.2",
1083 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
1084 | "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
1085 | "dependencies": {
1086 | "call-bind": "^1.0.0",
1087 | "define-properties": "^1.1.3",
1088 | "has-symbols": "^1.0.1",
1089 | "object-keys": "^1.1.1"
1090 | },
1091 | "engines": {
1092 | "node": ">= 0.4"
1093 | },
1094 | "funding": {
1095 | "url": "https://github.com/sponsors/ljharb"
1096 | }
1097 | },
1098 | "node_modules/once": {
1099 | "version": "1.4.0",
1100 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1101 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
1102 | "dependencies": {
1103 | "wrappy": "1"
1104 | }
1105 | },
1106 | "node_modules/performance-now": {
1107 | "version": "2.1.0",
1108 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
1109 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
1110 | },
1111 | "node_modules/process-nextick-args": {
1112 | "version": "2.0.1",
1113 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
1114 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
1115 | },
1116 | "node_modules/psl": {
1117 | "version": "1.8.0",
1118 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
1119 | "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ=="
1120 | },
1121 | "node_modules/punycode": {
1122 | "version": "2.1.1",
1123 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
1124 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
1125 | "engines": {
1126 | "node": ">=6"
1127 | }
1128 | },
1129 | "node_modules/qs": {
1130 | "version": "6.5.3",
1131 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
1132 | "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==",
1133 | "engines": {
1134 | "node": ">=0.6"
1135 | }
1136 | },
1137 | "node_modules/querystringify": {
1138 | "version": "2.2.0",
1139 | "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
1140 | "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ=="
1141 | },
1142 | "node_modules/readable-stream": {
1143 | "version": "2.3.7",
1144 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
1145 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
1146 | "dependencies": {
1147 | "core-util-is": "~1.0.0",
1148 | "inherits": "~2.0.3",
1149 | "isarray": "~1.0.0",
1150 | "process-nextick-args": "~2.0.0",
1151 | "safe-buffer": "~5.1.1",
1152 | "string_decoder": "~1.1.1",
1153 | "util-deprecate": "~1.0.1"
1154 | }
1155 | },
1156 | "node_modules/readable-stream/node_modules/safe-buffer": {
1157 | "version": "5.1.2",
1158 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
1159 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
1160 | },
1161 | "node_modules/regexp-clone": {
1162 | "version": "1.0.0",
1163 | "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz",
1164 | "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw=="
1165 | },
1166 | "node_modules/request": {
1167 | "version": "2.88.2",
1168 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
1169 | "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
1170 | "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142",
1171 | "dependencies": {
1172 | "aws-sign2": "~0.7.0",
1173 | "aws4": "^1.8.0",
1174 | "caseless": "~0.12.0",
1175 | "combined-stream": "~1.0.6",
1176 | "extend": "~3.0.2",
1177 | "forever-agent": "~0.6.1",
1178 | "form-data": "~2.3.2",
1179 | "har-validator": "~5.1.3",
1180 | "http-signature": "~1.2.0",
1181 | "is-typedarray": "~1.0.0",
1182 | "isstream": "~0.1.2",
1183 | "json-stringify-safe": "~5.0.1",
1184 | "mime-types": "~2.1.19",
1185 | "oauth-sign": "~0.9.0",
1186 | "performance-now": "^2.1.0",
1187 | "qs": "~6.5.2",
1188 | "safe-buffer": "^5.1.2",
1189 | "tough-cookie": "~2.5.0",
1190 | "tunnel-agent": "^0.6.0",
1191 | "uuid": "^3.3.2"
1192 | },
1193 | "engines": {
1194 | "node": ">= 6"
1195 | }
1196 | },
1197 | "node_modules/request-promise": {
1198 | "version": "4.2.6",
1199 | "resolved": "https://registry.npmjs.org/request-promise/-/request-promise-4.2.6.tgz",
1200 | "integrity": "sha512-HCHI3DJJUakkOr8fNoCc73E5nU5bqITjOYFMDrKHYOXWXrgD/SBaC7LjwuPymUprRyuF06UK7hd/lMHkmUXglQ==",
1201 | "deprecated": "request-promise has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142",
1202 | "dependencies": {
1203 | "bluebird": "^3.5.0",
1204 | "request-promise-core": "1.1.4",
1205 | "stealthy-require": "^1.1.1",
1206 | "tough-cookie": "^2.3.3"
1207 | },
1208 | "engines": {
1209 | "node": ">=0.10.0"
1210 | },
1211 | "peerDependencies": {
1212 | "request": "^2.34"
1213 | }
1214 | },
1215 | "node_modules/request-promise-core": {
1216 | "version": "1.1.4",
1217 | "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz",
1218 | "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==",
1219 | "dependencies": {
1220 | "lodash": "^4.17.19"
1221 | },
1222 | "engines": {
1223 | "node": ">=0.10.0"
1224 | },
1225 | "peerDependencies": {
1226 | "request": "^2.34"
1227 | }
1228 | },
1229 | "node_modules/requires-port": {
1230 | "version": "1.0.0",
1231 | "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
1232 | "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8="
1233 | },
1234 | "node_modules/safe-buffer": {
1235 | "version": "5.2.1",
1236 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
1237 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
1238 | "funding": [
1239 | {
1240 | "type": "github",
1241 | "url": "https://github.com/sponsors/feross"
1242 | },
1243 | {
1244 | "type": "patreon",
1245 | "url": "https://www.patreon.com/feross"
1246 | },
1247 | {
1248 | "type": "consulting",
1249 | "url": "https://feross.org/support"
1250 | }
1251 | ]
1252 | },
1253 | "node_modules/safer-buffer": {
1254 | "version": "2.1.2",
1255 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1256 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
1257 | },
1258 | "node_modules/saslprep": {
1259 | "version": "1.0.3",
1260 | "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz",
1261 | "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==",
1262 | "optional": true,
1263 | "dependencies": {
1264 | "sparse-bitfield": "^3.0.3"
1265 | },
1266 | "engines": {
1267 | "node": ">=6"
1268 | }
1269 | },
1270 | "node_modules/side-channel": {
1271 | "version": "1.0.4",
1272 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
1273 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
1274 | "dependencies": {
1275 | "call-bind": "^1.0.0",
1276 | "get-intrinsic": "^1.0.2",
1277 | "object-inspect": "^1.9.0"
1278 | },
1279 | "funding": {
1280 | "url": "https://github.com/sponsors/ljharb"
1281 | }
1282 | },
1283 | "node_modules/sift": {
1284 | "version": "13.5.2",
1285 | "resolved": "https://registry.npmjs.org/sift/-/sift-13.5.2.tgz",
1286 | "integrity": "sha512-+gxdEOMA2J+AI+fVsCqeNn7Tgx3M9ZN9jdi95939l1IJ8cZsqS8sqpJyOkic2SJk+1+98Uwryt/gL6XDaV+UZA=="
1287 | },
1288 | "node_modules/sparse-bitfield": {
1289 | "version": "3.0.3",
1290 | "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
1291 | "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=",
1292 | "optional": true,
1293 | "dependencies": {
1294 | "memory-pager": "^1.0.2"
1295 | }
1296 | },
1297 | "node_modules/sshpk": {
1298 | "version": "1.17.0",
1299 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz",
1300 | "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==",
1301 | "dependencies": {
1302 | "asn1": "~0.2.3",
1303 | "assert-plus": "^1.0.0",
1304 | "bcrypt-pbkdf": "^1.0.0",
1305 | "dashdash": "^1.12.0",
1306 | "ecc-jsbn": "~0.1.1",
1307 | "getpass": "^0.1.1",
1308 | "jsbn": "~0.1.0",
1309 | "safer-buffer": "^2.0.2",
1310 | "tweetnacl": "~0.14.0"
1311 | },
1312 | "bin": {
1313 | "sshpk-conv": "bin/sshpk-conv",
1314 | "sshpk-sign": "bin/sshpk-sign",
1315 | "sshpk-verify": "bin/sshpk-verify"
1316 | },
1317 | "engines": {
1318 | "node": ">=0.10.0"
1319 | }
1320 | },
1321 | "node_modules/stealthy-require": {
1322 | "version": "1.1.1",
1323 | "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz",
1324 | "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=",
1325 | "engines": {
1326 | "node": ">=0.10.0"
1327 | }
1328 | },
1329 | "node_modules/string_decoder": {
1330 | "version": "1.1.1",
1331 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
1332 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
1333 | "dependencies": {
1334 | "safe-buffer": "~5.1.0"
1335 | }
1336 | },
1337 | "node_modules/string_decoder/node_modules/safe-buffer": {
1338 | "version": "5.1.2",
1339 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
1340 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
1341 | },
1342 | "node_modules/string.prototype.trimend": {
1343 | "version": "1.0.4",
1344 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz",
1345 | "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==",
1346 | "dependencies": {
1347 | "call-bind": "^1.0.2",
1348 | "define-properties": "^1.1.3"
1349 | },
1350 | "funding": {
1351 | "url": "https://github.com/sponsors/ljharb"
1352 | }
1353 | },
1354 | "node_modules/string.prototype.trimstart": {
1355 | "version": "1.0.4",
1356 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz",
1357 | "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==",
1358 | "dependencies": {
1359 | "call-bind": "^1.0.2",
1360 | "define-properties": "^1.1.3"
1361 | },
1362 | "funding": {
1363 | "url": "https://github.com/sponsors/ljharb"
1364 | }
1365 | },
1366 | "node_modules/tough-cookie": {
1367 | "version": "2.5.0",
1368 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
1369 | "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
1370 | "dependencies": {
1371 | "psl": "^1.1.28",
1372 | "punycode": "^2.1.1"
1373 | },
1374 | "engines": {
1375 | "node": ">=0.8"
1376 | }
1377 | },
1378 | "node_modules/tr46": {
1379 | "version": "3.0.0",
1380 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz",
1381 | "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==",
1382 | "dependencies": {
1383 | "punycode": "^2.1.1"
1384 | },
1385 | "engines": {
1386 | "node": ">=12"
1387 | }
1388 | },
1389 | "node_modules/tunnel-agent": {
1390 | "version": "0.6.0",
1391 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
1392 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
1393 | "dependencies": {
1394 | "safe-buffer": "^5.0.1"
1395 | },
1396 | "engines": {
1397 | "node": "*"
1398 | }
1399 | },
1400 | "node_modules/tweetnacl": {
1401 | "version": "0.14.5",
1402 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
1403 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
1404 | },
1405 | "node_modules/unbox-primitive": {
1406 | "version": "1.0.1",
1407 | "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz",
1408 | "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==",
1409 | "dependencies": {
1410 | "function-bind": "^1.1.1",
1411 | "has-bigints": "^1.0.1",
1412 | "has-symbols": "^1.0.2",
1413 | "which-boxed-primitive": "^1.0.2"
1414 | },
1415 | "funding": {
1416 | "url": "https://github.com/sponsors/ljharb"
1417 | }
1418 | },
1419 | "node_modules/uri-js": {
1420 | "version": "4.4.1",
1421 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
1422 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
1423 | "dependencies": {
1424 | "punycode": "^2.1.0"
1425 | }
1426 | },
1427 | "node_modules/url-parse": {
1428 | "version": "1.5.4",
1429 | "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.4.tgz",
1430 | "integrity": "sha512-ITeAByWWoqutFClc/lRZnFplgXgEZr3WJ6XngMM/N9DMIm4K8zXPCZ1Jdu0rERwO84w1WC5wkle2ubwTA4NTBg==",
1431 | "dependencies": {
1432 | "querystringify": "^2.1.1",
1433 | "requires-port": "^1.0.0"
1434 | }
1435 | },
1436 | "node_modules/util-deprecate": {
1437 | "version": "1.0.2",
1438 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
1439 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
1440 | },
1441 | "node_modules/uuid": {
1442 | "version": "3.4.0",
1443 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
1444 | "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
1445 | "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.",
1446 | "bin": {
1447 | "uuid": "bin/uuid"
1448 | }
1449 | },
1450 | "node_modules/verror": {
1451 | "version": "1.10.0",
1452 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
1453 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
1454 | "engines": [
1455 | "node >=0.6.0"
1456 | ],
1457 | "dependencies": {
1458 | "assert-plus": "^1.0.0",
1459 | "core-util-is": "1.0.2",
1460 | "extsprintf": "^1.2.0"
1461 | }
1462 | },
1463 | "node_modules/verror/node_modules/core-util-is": {
1464 | "version": "1.0.2",
1465 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
1466 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
1467 | },
1468 | "node_modules/webidl-conversions": {
1469 | "version": "7.0.0",
1470 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
1471 | "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
1472 | "engines": {
1473 | "node": ">=12"
1474 | }
1475 | },
1476 | "node_modules/whatwg-url": {
1477 | "version": "11.0.0",
1478 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz",
1479 | "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==",
1480 | "dependencies": {
1481 | "tr46": "^3.0.0",
1482 | "webidl-conversions": "^7.0.0"
1483 | },
1484 | "engines": {
1485 | "node": ">=12"
1486 | }
1487 | },
1488 | "node_modules/which-boxed-primitive": {
1489 | "version": "1.0.2",
1490 | "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
1491 | "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
1492 | "dependencies": {
1493 | "is-bigint": "^1.0.1",
1494 | "is-boolean-object": "^1.1.0",
1495 | "is-number-object": "^1.0.4",
1496 | "is-string": "^1.0.5",
1497 | "is-symbol": "^1.0.3"
1498 | },
1499 | "funding": {
1500 | "url": "https://github.com/sponsors/ljharb"
1501 | }
1502 | },
1503 | "node_modules/wrappy": {
1504 | "version": "1.0.2",
1505 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
1506 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
1507 | }
1508 | },
1509 | "dependencies": {
1510 | "@types/node": {
1511 | "version": "17.0.13",
1512 | "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.13.tgz",
1513 | "integrity": "sha512-Y86MAxASe25hNzlDbsviXl8jQHb0RDvKt4c40ZJQ1Don0AAL0STLZSs4N+6gLEO55pedy7r2cLwS+ZDxPm/2Bw=="
1514 | },
1515 | "@types/webidl-conversions": {
1516 | "version": "6.1.1",
1517 | "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-6.1.1.tgz",
1518 | "integrity": "sha512-XAahCdThVuCFDQLT7R7Pk/vqeObFNL3YqRyFZg+AqAP/W1/w3xHaIxuW7WszQqTbIBOPRcItYJIou3i/mppu3Q=="
1519 | },
1520 | "@types/whatwg-url": {
1521 | "version": "8.2.1",
1522 | "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.1.tgz",
1523 | "integrity": "sha512-2YubE1sjj5ifxievI5Ge1sckb9k/Er66HyR2c+3+I6VDUUg1TLPdYYTEbQ+DjRkS4nTxMJhgWfSfMRD2sl2EYQ==",
1524 | "requires": {
1525 | "@types/node": "*",
1526 | "@types/webidl-conversions": "*"
1527 | }
1528 | },
1529 | "ajv": {
1530 | "version": "6.12.6",
1531 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
1532 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
1533 | "requires": {
1534 | "fast-deep-equal": "^3.1.1",
1535 | "fast-json-stable-stringify": "^2.0.0",
1536 | "json-schema-traverse": "^0.4.1",
1537 | "uri-js": "^4.2.2"
1538 | }
1539 | },
1540 | "amqplib": {
1541 | "version": "0.8.0",
1542 | "resolved": "https://registry.npmjs.org/amqplib/-/amqplib-0.8.0.tgz",
1543 | "integrity": "sha512-icU+a4kkq4Y1PS4NNi+YPDMwdlbFcZ1EZTQT2nigW3fvOb6AOgUQ9+Mk4ue0Zu5cBg/XpDzB40oH10ysrk2dmA==",
1544 | "requires": {
1545 | "bitsyntax": "~0.1.0",
1546 | "bluebird": "^3.7.2",
1547 | "buffer-more-ints": "~1.0.0",
1548 | "readable-stream": "1.x >=1.1.9",
1549 | "safe-buffer": "~5.2.1",
1550 | "url-parse": "~1.5.1"
1551 | },
1552 | "dependencies": {
1553 | "isarray": {
1554 | "version": "0.0.1",
1555 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
1556 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
1557 | },
1558 | "readable-stream": {
1559 | "version": "1.1.14",
1560 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
1561 | "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
1562 | "requires": {
1563 | "core-util-is": "~1.0.0",
1564 | "inherits": "~2.0.1",
1565 | "isarray": "0.0.1",
1566 | "string_decoder": "~0.10.x"
1567 | }
1568 | },
1569 | "string_decoder": {
1570 | "version": "0.10.31",
1571 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
1572 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
1573 | }
1574 | }
1575 | },
1576 | "array.prototype.findindex": {
1577 | "version": "2.1.0",
1578 | "resolved": "https://registry.npmjs.org/array.prototype.findindex/-/array.prototype.findindex-2.1.0.tgz",
1579 | "integrity": "sha512-25kJHCjXltdtljjwcyKvCTywmbUAeTJVB2ADVe0oP4jcefsd+K9pJJ3IdHPahLICoszcCLoNF+evWpEduzBlng==",
1580 | "requires": {
1581 | "define-properties": "^1.1.3",
1582 | "es-abstract": "^1.17.4"
1583 | }
1584 | },
1585 | "asn1": {
1586 | "version": "0.2.6",
1587 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
1588 | "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
1589 | "requires": {
1590 | "safer-buffer": "~2.1.0"
1591 | }
1592 | },
1593 | "assert-plus": {
1594 | "version": "1.0.0",
1595 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
1596 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
1597 | },
1598 | "asynckit": {
1599 | "version": "0.4.0",
1600 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
1601 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
1602 | },
1603 | "aws-sign2": {
1604 | "version": "0.7.0",
1605 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
1606 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
1607 | },
1608 | "aws4": {
1609 | "version": "1.11.0",
1610 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz",
1611 | "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA=="
1612 | },
1613 | "base64-js": {
1614 | "version": "1.5.1",
1615 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
1616 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
1617 | },
1618 | "bcrypt-pbkdf": {
1619 | "version": "1.0.2",
1620 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
1621 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
1622 | "requires": {
1623 | "tweetnacl": "^0.14.3"
1624 | }
1625 | },
1626 | "bitsyntax": {
1627 | "version": "0.1.0",
1628 | "resolved": "https://registry.npmjs.org/bitsyntax/-/bitsyntax-0.1.0.tgz",
1629 | "integrity": "sha512-ikAdCnrloKmFOugAfxWws89/fPc+nw0OOG1IzIE72uSOg/A3cYptKCjSUhDTuj7fhsJtzkzlv7l3b8PzRHLN0Q==",
1630 | "requires": {
1631 | "buffer-more-ints": "~1.0.0",
1632 | "debug": "~2.6.9",
1633 | "safe-buffer": "~5.1.2"
1634 | },
1635 | "dependencies": {
1636 | "debug": {
1637 | "version": "2.6.9",
1638 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
1639 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
1640 | "requires": {
1641 | "ms": "2.0.0"
1642 | }
1643 | },
1644 | "ms": {
1645 | "version": "2.0.0",
1646 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1647 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
1648 | },
1649 | "safe-buffer": {
1650 | "version": "5.1.2",
1651 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
1652 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
1653 | }
1654 | }
1655 | },
1656 | "bl": {
1657 | "version": "1.2.3",
1658 | "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz",
1659 | "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==",
1660 | "requires": {
1661 | "readable-stream": "^2.3.5",
1662 | "safe-buffer": "^5.1.1"
1663 | }
1664 | },
1665 | "bluebird": {
1666 | "version": "3.7.2",
1667 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
1668 | "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="
1669 | },
1670 | "bson": {
1671 | "version": "4.6.1",
1672 | "resolved": "https://registry.npmjs.org/bson/-/bson-4.6.1.tgz",
1673 | "integrity": "sha512-I1LQ7Hz5zgwR4QquilLNZwbhPw0Apx7i7X9kGMBTsqPdml/03Q9NBtD9nt/19ahjlphktQImrnderxqpzeVDjw==",
1674 | "requires": {
1675 | "buffer": "^5.6.0"
1676 | }
1677 | },
1678 | "buffer": {
1679 | "version": "5.7.1",
1680 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
1681 | "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
1682 | "requires": {
1683 | "base64-js": "^1.3.1",
1684 | "ieee754": "^1.1.13"
1685 | }
1686 | },
1687 | "buffer-more-ints": {
1688 | "version": "1.0.0",
1689 | "resolved": "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-1.0.0.tgz",
1690 | "integrity": "sha512-EMetuGFz5SLsT0QTnXzINh4Ksr+oo4i+UGTXEshiGCQWnsgSs7ZhJ8fzlwQ+OzEMs0MpDAMr1hxnblp5a4vcHg=="
1691 | },
1692 | "call-bind": {
1693 | "version": "1.0.2",
1694 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
1695 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
1696 | "requires": {
1697 | "function-bind": "^1.1.1",
1698 | "get-intrinsic": "^1.0.2"
1699 | }
1700 | },
1701 | "caseless": {
1702 | "version": "0.12.0",
1703 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
1704 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
1705 | },
1706 | "combined-stream": {
1707 | "version": "1.0.8",
1708 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
1709 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
1710 | "requires": {
1711 | "delayed-stream": "~1.0.0"
1712 | }
1713 | },
1714 | "core-util-is": {
1715 | "version": "1.0.3",
1716 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
1717 | "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
1718 | },
1719 | "dashdash": {
1720 | "version": "1.14.1",
1721 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
1722 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
1723 | "requires": {
1724 | "assert-plus": "^1.0.0"
1725 | }
1726 | },
1727 | "debug": {
1728 | "version": "3.2.7",
1729 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
1730 | "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
1731 | "requires": {
1732 | "ms": "^2.1.1"
1733 | }
1734 | },
1735 | "define-properties": {
1736 | "version": "1.1.3",
1737 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
1738 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
1739 | "requires": {
1740 | "object-keys": "^1.0.12"
1741 | }
1742 | },
1743 | "delayed-stream": {
1744 | "version": "1.0.0",
1745 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
1746 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
1747 | },
1748 | "denque": {
1749 | "version": "2.0.1",
1750 | "resolved": "https://registry.npmjs.org/denque/-/denque-2.0.1.tgz",
1751 | "integrity": "sha512-tfiWc6BQLXNLpNiR5iGd0Ocu3P3VpxfzFiqubLgMfhfOw9WyvgJBd46CClNn9k3qfbjvT//0cf7AlYRX/OslMQ=="
1752 | },
1753 | "depd": {
1754 | "version": "1.1.2",
1755 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
1756 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
1757 | },
1758 | "dotenv": {
1759 | "version": "14.3.2",
1760 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-14.3.2.tgz",
1761 | "integrity": "sha512-vwEppIphpFdvaMCaHfCEv9IgwcxMljMw2TnAQBB4VWPvzXQLTb82jwmdOKzlEVUL3gNFT4l4TPKO+Bn+sqcrVQ=="
1762 | },
1763 | "ecc-jsbn": {
1764 | "version": "0.1.2",
1765 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
1766 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
1767 | "requires": {
1768 | "jsbn": "~0.1.0",
1769 | "safer-buffer": "^2.1.0"
1770 | }
1771 | },
1772 | "end-of-stream": {
1773 | "version": "1.4.4",
1774 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
1775 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
1776 | "requires": {
1777 | "once": "^1.4.0"
1778 | }
1779 | },
1780 | "es-abstract": {
1781 | "version": "1.19.1",
1782 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz",
1783 | "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==",
1784 | "requires": {
1785 | "call-bind": "^1.0.2",
1786 | "es-to-primitive": "^1.2.1",
1787 | "function-bind": "^1.1.1",
1788 | "get-intrinsic": "^1.1.1",
1789 | "get-symbol-description": "^1.0.0",
1790 | "has": "^1.0.3",
1791 | "has-symbols": "^1.0.2",
1792 | "internal-slot": "^1.0.3",
1793 | "is-callable": "^1.2.4",
1794 | "is-negative-zero": "^2.0.1",
1795 | "is-regex": "^1.1.4",
1796 | "is-shared-array-buffer": "^1.0.1",
1797 | "is-string": "^1.0.7",
1798 | "is-weakref": "^1.0.1",
1799 | "object-inspect": "^1.11.0",
1800 | "object-keys": "^1.1.1",
1801 | "object.assign": "^4.1.2",
1802 | "string.prototype.trimend": "^1.0.4",
1803 | "string.prototype.trimstart": "^1.0.4",
1804 | "unbox-primitive": "^1.0.1"
1805 | }
1806 | },
1807 | "es-to-primitive": {
1808 | "version": "1.2.1",
1809 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
1810 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
1811 | "requires": {
1812 | "is-callable": "^1.1.4",
1813 | "is-date-object": "^1.0.1",
1814 | "is-symbol": "^1.0.2"
1815 | }
1816 | },
1817 | "eventemitter3": {
1818 | "version": "3.1.2",
1819 | "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz",
1820 | "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q=="
1821 | },
1822 | "extend": {
1823 | "version": "3.0.2",
1824 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
1825 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
1826 | },
1827 | "extsprintf": {
1828 | "version": "1.3.0",
1829 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
1830 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
1831 | },
1832 | "fast-deep-equal": {
1833 | "version": "3.1.3",
1834 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
1835 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
1836 | },
1837 | "fast-json-stable-stringify": {
1838 | "version": "2.1.0",
1839 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
1840 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
1841 | },
1842 | "file-type": {
1843 | "version": "3.9.0",
1844 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz",
1845 | "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek="
1846 | },
1847 | "forever-agent": {
1848 | "version": "0.6.1",
1849 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
1850 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
1851 | },
1852 | "form-data": {
1853 | "version": "2.3.3",
1854 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
1855 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
1856 | "requires": {
1857 | "asynckit": "^0.4.0",
1858 | "combined-stream": "^1.0.6",
1859 | "mime-types": "^2.1.12"
1860 | }
1861 | },
1862 | "function-bind": {
1863 | "version": "1.1.1",
1864 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
1865 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
1866 | },
1867 | "get-intrinsic": {
1868 | "version": "1.1.1",
1869 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
1870 | "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
1871 | "requires": {
1872 | "function-bind": "^1.1.1",
1873 | "has": "^1.0.3",
1874 | "has-symbols": "^1.0.1"
1875 | }
1876 | },
1877 | "get-symbol-description": {
1878 | "version": "1.0.0",
1879 | "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
1880 | "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
1881 | "requires": {
1882 | "call-bind": "^1.0.2",
1883 | "get-intrinsic": "^1.1.1"
1884 | }
1885 | },
1886 | "getpass": {
1887 | "version": "0.1.7",
1888 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
1889 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
1890 | "requires": {
1891 | "assert-plus": "^1.0.0"
1892 | }
1893 | },
1894 | "har-schema": {
1895 | "version": "2.0.0",
1896 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
1897 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
1898 | },
1899 | "har-validator": {
1900 | "version": "5.1.5",
1901 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
1902 | "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
1903 | "requires": {
1904 | "ajv": "^6.12.3",
1905 | "har-schema": "^2.0.0"
1906 | }
1907 | },
1908 | "has": {
1909 | "version": "1.0.3",
1910 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
1911 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
1912 | "requires": {
1913 | "function-bind": "^1.1.1"
1914 | }
1915 | },
1916 | "has-bigints": {
1917 | "version": "1.0.1",
1918 | "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz",
1919 | "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA=="
1920 | },
1921 | "has-symbols": {
1922 | "version": "1.0.2",
1923 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
1924 | "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw=="
1925 | },
1926 | "has-tostringtag": {
1927 | "version": "1.0.0",
1928 | "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
1929 | "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
1930 | "requires": {
1931 | "has-symbols": "^1.0.2"
1932 | }
1933 | },
1934 | "http-signature": {
1935 | "version": "1.2.0",
1936 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
1937 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
1938 | "requires": {
1939 | "assert-plus": "^1.0.0",
1940 | "jsprim": "^1.2.2",
1941 | "sshpk": "^1.7.0"
1942 | }
1943 | },
1944 | "ieee754": {
1945 | "version": "1.2.1",
1946 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
1947 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
1948 | },
1949 | "inherits": {
1950 | "version": "2.0.4",
1951 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
1952 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
1953 | },
1954 | "internal-slot": {
1955 | "version": "1.0.3",
1956 | "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz",
1957 | "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==",
1958 | "requires": {
1959 | "get-intrinsic": "^1.1.0",
1960 | "has": "^1.0.3",
1961 | "side-channel": "^1.0.4"
1962 | }
1963 | },
1964 | "is-bigint": {
1965 | "version": "1.0.4",
1966 | "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
1967 | "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
1968 | "requires": {
1969 | "has-bigints": "^1.0.1"
1970 | }
1971 | },
1972 | "is-boolean-object": {
1973 | "version": "1.1.2",
1974 | "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
1975 | "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
1976 | "requires": {
1977 | "call-bind": "^1.0.2",
1978 | "has-tostringtag": "^1.0.0"
1979 | }
1980 | },
1981 | "is-callable": {
1982 | "version": "1.2.4",
1983 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz",
1984 | "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w=="
1985 | },
1986 | "is-date-object": {
1987 | "version": "1.0.5",
1988 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
1989 | "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
1990 | "requires": {
1991 | "has-tostringtag": "^1.0.0"
1992 | }
1993 | },
1994 | "is-negative-zero": {
1995 | "version": "2.0.2",
1996 | "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
1997 | "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA=="
1998 | },
1999 | "is-number-object": {
2000 | "version": "1.0.6",
2001 | "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz",
2002 | "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==",
2003 | "requires": {
2004 | "has-tostringtag": "^1.0.0"
2005 | }
2006 | },
2007 | "is-regex": {
2008 | "version": "1.1.4",
2009 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
2010 | "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
2011 | "requires": {
2012 | "call-bind": "^1.0.2",
2013 | "has-tostringtag": "^1.0.0"
2014 | }
2015 | },
2016 | "is-shared-array-buffer": {
2017 | "version": "1.0.1",
2018 | "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz",
2019 | "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA=="
2020 | },
2021 | "is-string": {
2022 | "version": "1.0.7",
2023 | "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
2024 | "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
2025 | "requires": {
2026 | "has-tostringtag": "^1.0.0"
2027 | }
2028 | },
2029 | "is-symbol": {
2030 | "version": "1.0.4",
2031 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
2032 | "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
2033 | "requires": {
2034 | "has-symbols": "^1.0.2"
2035 | }
2036 | },
2037 | "is-typedarray": {
2038 | "version": "1.0.0",
2039 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
2040 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
2041 | },
2042 | "is-weakref": {
2043 | "version": "1.0.2",
2044 | "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
2045 | "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
2046 | "requires": {
2047 | "call-bind": "^1.0.2"
2048 | }
2049 | },
2050 | "isarray": {
2051 | "version": "1.0.0",
2052 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
2053 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
2054 | },
2055 | "isstream": {
2056 | "version": "0.1.2",
2057 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
2058 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
2059 | },
2060 | "jsbn": {
2061 | "version": "0.1.1",
2062 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
2063 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
2064 | },
2065 | "json-schema": {
2066 | "version": "0.4.0",
2067 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
2068 | "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="
2069 | },
2070 | "json-schema-traverse": {
2071 | "version": "0.4.1",
2072 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
2073 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
2074 | },
2075 | "json-stringify-safe": {
2076 | "version": "5.0.1",
2077 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
2078 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
2079 | },
2080 | "jsprim": {
2081 | "version": "1.4.2",
2082 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz",
2083 | "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
2084 | "requires": {
2085 | "assert-plus": "1.0.0",
2086 | "extsprintf": "1.3.0",
2087 | "json-schema": "0.4.0",
2088 | "verror": "1.10.0"
2089 | }
2090 | },
2091 | "kareem": {
2092 | "version": "2.3.3",
2093 | "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.3.tgz",
2094 | "integrity": "sha512-uESCXM2KdtOQ8LOvKyTUXEeg0MkYp4wGglTIpGcYHvjJcS5sn2Wkfrfit8m4xSbaNDAw2KdI9elgkOxZbrFYbg=="
2095 | },
2096 | "lodash": {
2097 | "version": "4.17.21",
2098 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
2099 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
2100 | },
2101 | "memory-pager": {
2102 | "version": "1.5.0",
2103 | "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz",
2104 | "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==",
2105 | "optional": true
2106 | },
2107 | "mime": {
2108 | "version": "1.6.0",
2109 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
2110 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
2111 | },
2112 | "mime-db": {
2113 | "version": "1.51.0",
2114 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz",
2115 | "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g=="
2116 | },
2117 | "mime-types": {
2118 | "version": "2.1.34",
2119 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz",
2120 | "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==",
2121 | "requires": {
2122 | "mime-db": "1.51.0"
2123 | }
2124 | },
2125 | "moment": {
2126 | "version": "2.29.1",
2127 | "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz",
2128 | "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ=="
2129 | },
2130 | "moment-timezone": {
2131 | "version": "0.5.34",
2132 | "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.34.tgz",
2133 | "integrity": "sha512-3zAEHh2hKUs3EXLESx/wsgw6IQdusOT8Bxm3D9UrHPQR7zlMmzwybC8zHEM1tQ4LJwP7fcxrWr8tuBg05fFCbg==",
2134 | "requires": {
2135 | "moment": ">= 2.9.0"
2136 | }
2137 | },
2138 | "mongodb": {
2139 | "version": "4.2.2",
2140 | "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.2.2.tgz",
2141 | "integrity": "sha512-zt8rCTnTKyMQppyt63qMnrLM5dbADgUk18ORPF1XbtHLIYCyc9hattaYHi0pqMvNxDpgGgUofSVzS+UQErgTug==",
2142 | "requires": {
2143 | "bson": "^4.6.0",
2144 | "denque": "^2.0.1",
2145 | "mongodb-connection-string-url": "^2.3.2",
2146 | "saslprep": "^1.0.3"
2147 | }
2148 | },
2149 | "mongodb-connection-string-url": {
2150 | "version": "2.4.1",
2151 | "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.4.1.tgz",
2152 | "integrity": "sha512-d5Kd2bVsKcSA7YI/yo57fSTtMwRQdFkvc5IZwod1RRxJtECeWPPSo7zqcUGJELifRA//Igs4spVtYAmvFCatug==",
2153 | "requires": {
2154 | "@types/whatwg-url": "^8.2.1",
2155 | "whatwg-url": "^11.0.0"
2156 | }
2157 | },
2158 | "mongoose": {
2159 | "version": "6.1.8",
2160 | "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.1.8.tgz",
2161 | "integrity": "sha512-/voqwU2dtet3zAR73r8jdPhqluU1VzIAnk7ecXPJBgyXKREnwQrz40lfW7fLpaqhmMhsAbA+JQ7ICUn2vAVFLw==",
2162 | "requires": {
2163 | "@types/node": "< 17.0.6",
2164 | "bson": "^4.2.2",
2165 | "kareem": "2.3.3",
2166 | "mongodb": "4.2.2",
2167 | "mpath": "0.8.4",
2168 | "mquery": "4.0.2",
2169 | "ms": "2.1.2",
2170 | "regexp-clone": "1.0.0",
2171 | "sift": "13.5.2"
2172 | },
2173 | "dependencies": {
2174 | "@types/node": {
2175 | "version": "17.0.5",
2176 | "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.5.tgz",
2177 | "integrity": "sha512-w3mrvNXLeDYV1GKTZorGJQivK6XLCoGwpnyJFbJVK/aTBQUxOCaa/GlFAAN3OTDFcb7h5tiFG+YXCO2By+riZw=="
2178 | },
2179 | "ms": {
2180 | "version": "2.1.2",
2181 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
2182 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
2183 | }
2184 | }
2185 | },
2186 | "mpath": {
2187 | "version": "0.8.4",
2188 | "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.8.4.tgz",
2189 | "integrity": "sha512-DTxNZomBcTWlrMW76jy1wvV37X/cNNxPW1y2Jzd4DZkAaC5ZGsm8bfGfNOthcDuRJujXLqiuS6o3Tpy0JEoh7g=="
2190 | },
2191 | "mquery": {
2192 | "version": "4.0.2",
2193 | "resolved": "https://registry.npmjs.org/mquery/-/mquery-4.0.2.tgz",
2194 | "integrity": "sha512-oAVF0Nil1mT3rxty6Zln4YiD6x6QsUWYz927jZzjMxOK2aqmhEz5JQ7xmrKK7xRFA2dwV+YaOpKU/S+vfNqKxA==",
2195 | "requires": {
2196 | "debug": "4.x"
2197 | },
2198 | "dependencies": {
2199 | "debug": {
2200 | "version": "4.3.3",
2201 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz",
2202 | "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==",
2203 | "requires": {
2204 | "ms": "2.1.2"
2205 | }
2206 | },
2207 | "ms": {
2208 | "version": "2.1.2",
2209 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
2210 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
2211 | }
2212 | }
2213 | },
2214 | "ms": {
2215 | "version": "2.1.3",
2216 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
2217 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
2218 | },
2219 | "node-cron": {
2220 | "version": "3.0.0",
2221 | "resolved": "https://registry.npmjs.org/node-cron/-/node-cron-3.0.0.tgz",
2222 | "integrity": "sha512-DDwIvvuCwrNiaU7HEivFDULcaQualDv7KoNlB/UU1wPW0n1tDEmBJKhEIE6DlF2FuoOHcNbLJ8ITL2Iv/3AWmA==",
2223 | "requires": {
2224 | "moment-timezone": "^0.5.31"
2225 | }
2226 | },
2227 | "node-fetch": {
2228 | "version": "2.6.7",
2229 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
2230 | "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
2231 | "requires": {
2232 | "whatwg-url": "^5.0.0"
2233 | },
2234 | "dependencies": {
2235 | "tr46": {
2236 | "version": "0.0.3",
2237 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
2238 | "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o="
2239 | },
2240 | "webidl-conversions": {
2241 | "version": "3.0.1",
2242 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
2243 | "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE="
2244 | },
2245 | "whatwg-url": {
2246 | "version": "5.0.0",
2247 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
2248 | "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=",
2249 | "requires": {
2250 | "tr46": "~0.0.3",
2251 | "webidl-conversions": "^3.0.0"
2252 | }
2253 | }
2254 | }
2255 | },
2256 | "node-telegram-bot-api": {
2257 | "version": "0.56.0",
2258 | "resolved": "https://registry.npmjs.org/node-telegram-bot-api/-/node-telegram-bot-api-0.56.0.tgz",
2259 | "integrity": "sha512-gKUlH/uUXdSJ++6y1Y16qEThZouecfl4twuPKe6V2BPFDDfom9j2QMlxfslPEjZPH2ZXlA1S/uoRCKtIjzuaLw==",
2260 | "requires": {
2261 | "array.prototype.findindex": "^2.0.2",
2262 | "bl": "^1.2.3",
2263 | "bluebird": "^3.5.1",
2264 | "debug": "^3.1.0",
2265 | "depd": "^1.1.1",
2266 | "eventemitter3": "^3.0.0",
2267 | "file-type": "^3.9.0",
2268 | "mime": "^1.6.0",
2269 | "pump": "^2.0.0",
2270 | "request": "^2.83.0",
2271 | "request-promise": "^4.2.2"
2272 | },
2273 | "dependencies": {
2274 | "pump": {
2275 | "version": "2.0.1",
2276 | "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
2277 | "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
2278 | "requires": {
2279 | "end-of-stream": "^1.1.0",
2280 | "once": "^1.3.1"
2281 | }
2282 | }
2283 | }
2284 | },
2285 | "oauth-sign": {
2286 | "version": "0.9.0",
2287 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
2288 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
2289 | },
2290 | "object-inspect": {
2291 | "version": "1.12.0",
2292 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz",
2293 | "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g=="
2294 | },
2295 | "object-keys": {
2296 | "version": "1.1.1",
2297 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
2298 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
2299 | },
2300 | "object.assign": {
2301 | "version": "4.1.2",
2302 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
2303 | "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
2304 | "requires": {
2305 | "call-bind": "^1.0.0",
2306 | "define-properties": "^1.1.3",
2307 | "has-symbols": "^1.0.1",
2308 | "object-keys": "^1.1.1"
2309 | }
2310 | },
2311 | "once": {
2312 | "version": "1.4.0",
2313 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
2314 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
2315 | "requires": {
2316 | "wrappy": "1"
2317 | }
2318 | },
2319 | "performance-now": {
2320 | "version": "2.1.0",
2321 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
2322 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
2323 | },
2324 | "process-nextick-args": {
2325 | "version": "2.0.1",
2326 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
2327 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
2328 | },
2329 | "psl": {
2330 | "version": "1.8.0",
2331 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
2332 | "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ=="
2333 | },
2334 | "punycode": {
2335 | "version": "2.1.1",
2336 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
2337 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
2338 | },
2339 | "qs": {
2340 | "version": "6.5.3",
2341 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
2342 | "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA=="
2343 | },
2344 | "querystringify": {
2345 | "version": "2.2.0",
2346 | "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
2347 | "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ=="
2348 | },
2349 | "readable-stream": {
2350 | "version": "2.3.7",
2351 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
2352 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
2353 | "requires": {
2354 | "core-util-is": "~1.0.0",
2355 | "inherits": "~2.0.3",
2356 | "isarray": "~1.0.0",
2357 | "process-nextick-args": "~2.0.0",
2358 | "safe-buffer": "~5.1.1",
2359 | "string_decoder": "~1.1.1",
2360 | "util-deprecate": "~1.0.1"
2361 | },
2362 | "dependencies": {
2363 | "safe-buffer": {
2364 | "version": "5.1.2",
2365 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
2366 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
2367 | }
2368 | }
2369 | },
2370 | "regexp-clone": {
2371 | "version": "1.0.0",
2372 | "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz",
2373 | "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw=="
2374 | },
2375 | "request": {
2376 | "version": "2.88.2",
2377 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
2378 | "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
2379 | "requires": {
2380 | "aws-sign2": "~0.7.0",
2381 | "aws4": "^1.8.0",
2382 | "caseless": "~0.12.0",
2383 | "combined-stream": "~1.0.6",
2384 | "extend": "~3.0.2",
2385 | "forever-agent": "~0.6.1",
2386 | "form-data": "~2.3.2",
2387 | "har-validator": "~5.1.3",
2388 | "http-signature": "~1.2.0",
2389 | "is-typedarray": "~1.0.0",
2390 | "isstream": "~0.1.2",
2391 | "json-stringify-safe": "~5.0.1",
2392 | "mime-types": "~2.1.19",
2393 | "oauth-sign": "~0.9.0",
2394 | "performance-now": "^2.1.0",
2395 | "qs": "~6.5.2",
2396 | "safe-buffer": "^5.1.2",
2397 | "tough-cookie": "~2.5.0",
2398 | "tunnel-agent": "^0.6.0",
2399 | "uuid": "^3.3.2"
2400 | }
2401 | },
2402 | "request-promise": {
2403 | "version": "4.2.6",
2404 | "resolved": "https://registry.npmjs.org/request-promise/-/request-promise-4.2.6.tgz",
2405 | "integrity": "sha512-HCHI3DJJUakkOr8fNoCc73E5nU5bqITjOYFMDrKHYOXWXrgD/SBaC7LjwuPymUprRyuF06UK7hd/lMHkmUXglQ==",
2406 | "requires": {
2407 | "bluebird": "^3.5.0",
2408 | "request-promise-core": "1.1.4",
2409 | "stealthy-require": "^1.1.1",
2410 | "tough-cookie": "^2.3.3"
2411 | }
2412 | },
2413 | "request-promise-core": {
2414 | "version": "1.1.4",
2415 | "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz",
2416 | "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==",
2417 | "requires": {
2418 | "lodash": "^4.17.19"
2419 | }
2420 | },
2421 | "requires-port": {
2422 | "version": "1.0.0",
2423 | "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
2424 | "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8="
2425 | },
2426 | "safe-buffer": {
2427 | "version": "5.2.1",
2428 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
2429 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
2430 | },
2431 | "safer-buffer": {
2432 | "version": "2.1.2",
2433 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
2434 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
2435 | },
2436 | "saslprep": {
2437 | "version": "1.0.3",
2438 | "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz",
2439 | "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==",
2440 | "optional": true,
2441 | "requires": {
2442 | "sparse-bitfield": "^3.0.3"
2443 | }
2444 | },
2445 | "side-channel": {
2446 | "version": "1.0.4",
2447 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
2448 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
2449 | "requires": {
2450 | "call-bind": "^1.0.0",
2451 | "get-intrinsic": "^1.0.2",
2452 | "object-inspect": "^1.9.0"
2453 | }
2454 | },
2455 | "sift": {
2456 | "version": "13.5.2",
2457 | "resolved": "https://registry.npmjs.org/sift/-/sift-13.5.2.tgz",
2458 | "integrity": "sha512-+gxdEOMA2J+AI+fVsCqeNn7Tgx3M9ZN9jdi95939l1IJ8cZsqS8sqpJyOkic2SJk+1+98Uwryt/gL6XDaV+UZA=="
2459 | },
2460 | "sparse-bitfield": {
2461 | "version": "3.0.3",
2462 | "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
2463 | "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=",
2464 | "optional": true,
2465 | "requires": {
2466 | "memory-pager": "^1.0.2"
2467 | }
2468 | },
2469 | "sshpk": {
2470 | "version": "1.17.0",
2471 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz",
2472 | "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==",
2473 | "requires": {
2474 | "asn1": "~0.2.3",
2475 | "assert-plus": "^1.0.0",
2476 | "bcrypt-pbkdf": "^1.0.0",
2477 | "dashdash": "^1.12.0",
2478 | "ecc-jsbn": "~0.1.1",
2479 | "getpass": "^0.1.1",
2480 | "jsbn": "~0.1.0",
2481 | "safer-buffer": "^2.0.2",
2482 | "tweetnacl": "~0.14.0"
2483 | }
2484 | },
2485 | "stealthy-require": {
2486 | "version": "1.1.1",
2487 | "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz",
2488 | "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks="
2489 | },
2490 | "string_decoder": {
2491 | "version": "1.1.1",
2492 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
2493 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
2494 | "requires": {
2495 | "safe-buffer": "~5.1.0"
2496 | },
2497 | "dependencies": {
2498 | "safe-buffer": {
2499 | "version": "5.1.2",
2500 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
2501 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
2502 | }
2503 | }
2504 | },
2505 | "string.prototype.trimend": {
2506 | "version": "1.0.4",
2507 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz",
2508 | "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==",
2509 | "requires": {
2510 | "call-bind": "^1.0.2",
2511 | "define-properties": "^1.1.3"
2512 | }
2513 | },
2514 | "string.prototype.trimstart": {
2515 | "version": "1.0.4",
2516 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz",
2517 | "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==",
2518 | "requires": {
2519 | "call-bind": "^1.0.2",
2520 | "define-properties": "^1.1.3"
2521 | }
2522 | },
2523 | "tough-cookie": {
2524 | "version": "2.5.0",
2525 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
2526 | "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
2527 | "requires": {
2528 | "psl": "^1.1.28",
2529 | "punycode": "^2.1.1"
2530 | }
2531 | },
2532 | "tr46": {
2533 | "version": "3.0.0",
2534 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz",
2535 | "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==",
2536 | "requires": {
2537 | "punycode": "^2.1.1"
2538 | }
2539 | },
2540 | "tunnel-agent": {
2541 | "version": "0.6.0",
2542 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
2543 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
2544 | "requires": {
2545 | "safe-buffer": "^5.0.1"
2546 | }
2547 | },
2548 | "tweetnacl": {
2549 | "version": "0.14.5",
2550 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
2551 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
2552 | },
2553 | "unbox-primitive": {
2554 | "version": "1.0.1",
2555 | "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz",
2556 | "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==",
2557 | "requires": {
2558 | "function-bind": "^1.1.1",
2559 | "has-bigints": "^1.0.1",
2560 | "has-symbols": "^1.0.2",
2561 | "which-boxed-primitive": "^1.0.2"
2562 | }
2563 | },
2564 | "uri-js": {
2565 | "version": "4.4.1",
2566 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
2567 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
2568 | "requires": {
2569 | "punycode": "^2.1.0"
2570 | }
2571 | },
2572 | "url-parse": {
2573 | "version": "1.5.4",
2574 | "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.4.tgz",
2575 | "integrity": "sha512-ITeAByWWoqutFClc/lRZnFplgXgEZr3WJ6XngMM/N9DMIm4K8zXPCZ1Jdu0rERwO84w1WC5wkle2ubwTA4NTBg==",
2576 | "requires": {
2577 | "querystringify": "^2.1.1",
2578 | "requires-port": "^1.0.0"
2579 | }
2580 | },
2581 | "util-deprecate": {
2582 | "version": "1.0.2",
2583 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
2584 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
2585 | },
2586 | "uuid": {
2587 | "version": "3.4.0",
2588 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
2589 | "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
2590 | },
2591 | "verror": {
2592 | "version": "1.10.0",
2593 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
2594 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
2595 | "requires": {
2596 | "assert-plus": "^1.0.0",
2597 | "core-util-is": "1.0.2",
2598 | "extsprintf": "^1.2.0"
2599 | },
2600 | "dependencies": {
2601 | "core-util-is": {
2602 | "version": "1.0.2",
2603 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
2604 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
2605 | }
2606 | }
2607 | },
2608 | "webidl-conversions": {
2609 | "version": "7.0.0",
2610 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
2611 | "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g=="
2612 | },
2613 | "whatwg-url": {
2614 | "version": "11.0.0",
2615 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz",
2616 | "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==",
2617 | "requires": {
2618 | "tr46": "^3.0.0",
2619 | "webidl-conversions": "^7.0.0"
2620 | }
2621 | },
2622 | "which-boxed-primitive": {
2623 | "version": "1.0.2",
2624 | "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
2625 | "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
2626 | "requires": {
2627 | "is-bigint": "^1.0.1",
2628 | "is-boolean-object": "^1.1.0",
2629 | "is-number-object": "^1.0.4",
2630 | "is-string": "^1.0.5",
2631 | "is-symbol": "^1.0.3"
2632 | }
2633 | },
2634 | "wrappy": {
2635 | "version": "1.0.2",
2636 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
2637 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
2638 | }
2639 | }
2640 | }
2641 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "telegramdovizbot",
3 | "version": "1.0.0",
4 | "main": ".src/index.js",
5 | "author": {
6 | "name": "İbrahim Can Mercan",
7 | "email": "imrcn77@gmail.com",
8 | "linkedin": "www.linkedin.com/in/mrcn/"
9 | },
10 | "repository": {
11 | "type": "git",
12 | "url": "https://github.com/mercan/TelegramCryptoCurrencyBot.git"
13 | },
14 | "scripts": {
15 | "start": "node ./src/index.js",
16 | "start:dev": "nodemon ./src/index.js"
17 | },
18 | "license": "ISC",
19 | "dependencies": {
20 | "amqplib": "^0.8.0",
21 | "dotenv": "^14.3.2",
22 | "mongoose": "^6.1.8",
23 | "node-cron": "^3.0.0",
24 | "node-fetch": "^2.6.7",
25 | "node-telegram-bot-api": "^0.56.0"
26 | },
27 | "engines": {
28 | "node": ">=16.3.0"
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/src/callbackQuery/cancel.js:
--------------------------------------------------------------------------------
1 | // Services
2 | const TelegramService = require("../services/TelegramService");
3 | const NotificationService = require("../services/NotificationService");
4 |
5 | TelegramService.on("callback_query", (callbackQuery) => {
6 | const messageId = callbackQuery.message.message_id;
7 | const userId = callbackQuery.from.id;
8 | const { data } = callbackQuery;
9 | const [command, currency] = data.split("_");
10 |
11 | if (command === "CANCEL") {
12 | const [type, symbol] = currency.split("/");
13 | const message = `${symbol} Aboneliğiniz iptal edildi!`;
14 |
15 | NotificationService.cancelSubscriber(userId, type, symbol);
16 | TelegramService.editMessageText(userId, messageId, message, {
17 | parse_mode: "HTML",
18 | });
19 | }
20 | });
21 |
--------------------------------------------------------------------------------
/src/callbackQuery/follow.js:
--------------------------------------------------------------------------------
1 | // Services
2 | const TelegramService = require("../services/TelegramService");
3 |
4 | // Follow And Follow Manual
5 | TelegramService.on("callback_query", async (callbackQuery) => {
6 | const messageId = callbackQuery.message.message_id;
7 | const userId = callbackQuery.from.id;
8 | const [command, currency] = callbackQuery.data.split("_");
9 |
10 | if (command === "FOLLOWMANUAL") {
11 | const message = "Lütfen takip etmek istediğiniz para birimini giriniz.";
12 | const placeholder = "Para birimi girin";
13 |
14 | // Delete previous message
15 | await TelegramService.deleteMessage(userId, messageId);
16 |
17 | return TelegramService.sendMessage(userId, message, {
18 | reply_markup: {
19 | input_field_placeholder: placeholder,
20 | force_reply: true,
21 | },
22 | });
23 | }
24 |
25 | if (command === "FOLLOW") {
26 | const symbol = currency.split("/")[1];
27 | const message = `${symbol}'den ne sıklıkla bildirim almak istiyorsunuz?`;
28 |
29 | await TelegramService.editMessageText(userId, messageId, message, {
30 | reply_markup: {
31 | inline_keyboard: [
32 | [
33 | {
34 | text: "10 Dakika",
35 | callback_data: `TIME_${currency}_10`,
36 | },
37 | {
38 | text: "30 Dakika",
39 | callback_data: `TIME_${currency}_30`,
40 | },
41 | ],
42 | [
43 | {
44 | text: "1 Saat",
45 | callback_data: `TIME_${currency}_60`,
46 | },
47 | {
48 | text: "6 saat",
49 | callback_data: `TIME_${currency}_360`,
50 | },
51 | {
52 | text: "12 Saat",
53 | callback_data: `TIME_${currency}_720`,
54 | },
55 | ],
56 | [
57 | {
58 | text: "1 Gün",
59 | callback_data: `TIME_${currency}_1440`,
60 | },
61 | ],
62 | ],
63 | },
64 | parse_mode: "HTML",
65 | });
66 | }
67 | });
68 |
--------------------------------------------------------------------------------
/src/callbackQuery/followReplyMessage.js:
--------------------------------------------------------------------------------
1 | // Services
2 | const TelegramService = require("../services/TelegramService");
3 |
4 | // Utils
5 | const cryptoCurrency = require("../utils/CryptoCurrency.json");
6 | const forexCurrency = require("../utils/forex.json");
7 | const sortCryptoArray = require("../utils/sortCryptoArray");
8 |
9 | TelegramService.on("message", async (msg) => {
10 | const replyMessage = msg.reply_to_message;
11 | const userId = msg.from.id;
12 |
13 | if (
14 | replyMessage &&
15 | replyMessage.text ===
16 | "Lütfen takip etmek istediğiniz para birimini giriniz."
17 | ) {
18 | const messageId = replyMessage.message_id;
19 | const selectedCurrency = msg.text.toUpperCase();
20 |
21 | // Forex Currency
22 | const filterForex = forexCurrency.flatMap((forex) => {
23 | if (
24 | selectedCurrency + "BTC" === forex ||
25 | selectedCurrency + "ETH" === forex ||
26 | selectedCurrency + "USD" === forex ||
27 | selectedCurrency + "EUR" === forex ||
28 | selectedCurrency + "TRY" === forex ||
29 | selectedCurrency + "GBP" === forex ||
30 | selectedCurrency + "RUB" === forex ||
31 | selectedCurrency + "AUD" === forex ||
32 | selectedCurrency + "JPY" === forex ||
33 | selectedCurrency + "CNY" === forex
34 | ) {
35 | return {
36 | text:
37 | forex.slice(0, selectedCurrency.length) +
38 | " • " +
39 | forex.slice(selectedCurrency.length, forex.length),
40 | callback_data: `FOLLOW_FOREX/${forex}`,
41 | };
42 | }
43 |
44 | return [];
45 | });
46 |
47 | if (filterForex.length) {
48 | // Delete Reply Message
49 | await TelegramService.deleteMessage(userId, messageId);
50 |
51 | return TelegramService.sendMessage(
52 | userId,
53 | "Lütfen takip etmek istediğiniz para birimini seçiniz.",
54 | {
55 | reply_markup: {
56 | inline_keyboard: [...filterForex.map((forex) => [forex])],
57 | },
58 | }
59 | );
60 | }
61 |
62 | // Crypto Currency
63 | const filterCrypto = cryptoCurrency.flatMap((crypto) => {
64 | if (
65 | selectedCurrency + "BTC" === crypto ||
66 | selectedCurrency + "ETH" === crypto ||
67 | selectedCurrency + "BNB" === crypto ||
68 | selectedCurrency + "USD" === crypto ||
69 | selectedCurrency + "BUSD" === crypto ||
70 | selectedCurrency + "EUR" === crypto ||
71 | selectedCurrency + "TRY" === crypto
72 | ) {
73 | return {
74 | text:
75 | selectedCurrency +
76 | " • " +
77 | crypto.slice(selectedCurrency.length, crypto.length),
78 | callback_data: `PRICE_CRYPTO/${crypto}`,
79 | };
80 | }
81 |
82 | return [];
83 | });
84 |
85 | if (filterCrypto.length) {
86 | const sortedCryptoList = sortCryptoArray(filterCrypto, selectedCurrency);
87 |
88 | // Delete Reply Message
89 | await TelegramService.deleteMessage(userId, messageId);
90 |
91 | return TelegramService.sendMessage(
92 | userId,
93 | "Lütfen takip etmek istediğiniz para birimini seçiniz.",
94 | {
95 | reply_markup: {
96 | inline_keyboard: [...sortedCryptoList.map((crypto) => [crypto])],
97 | },
98 | }
99 | );
100 | }
101 |
102 | // Delete Reply Message
103 | await TelegramService.deleteMessage(userId, messageId);
104 | return TelegramService.sendMessage(userId, "Bu para birimi mevcut değil.");
105 | }
106 | });
107 |
--------------------------------------------------------------------------------
/src/callbackQuery/followTime.js:
--------------------------------------------------------------------------------
1 | // Services
2 | const TelegramService = require("../services/TelegramService");
3 | const CurrencyService = require("../services/CurrencyService");
4 | const NotificationService = require("../services/NotificationService");
5 |
6 | // Utils
7 | const formatCurrencyMessage = require("../utils/formatCurrencyMessage");
8 |
9 | // Follow And Follow Manual
10 | TelegramService.on("callback_query", async (callbackQuery) => {
11 | const messageId = callbackQuery.message.message_id;
12 | const userId = callbackQuery.from.id;
13 | const [command, currency, timeInMinutes] = callbackQuery.data.split("_");
14 |
15 | if (command === "TIME") {
16 | const [type, symbol] = currency.split("/");
17 | let message;
18 |
19 | if (timeInMinutes <= 30) {
20 | message = `Her ${timeInMinutes} dakikada bir bildirim alacaksınız.\n\n`;
21 | } else if (timeInMinutes >= 60 && timeInMinutes <= 720) {
22 | message = `Her ${
23 | timeInMinutes / 60
24 | } saatte bir bildirim alacaksınız.\n\n`;
25 | } else {
26 | message = "Günde bir kez bildirim alacaksınız.\n\n";
27 | }
28 |
29 | const response = await CurrencyService.getCurrencyPrice(type, symbol);
30 | message += formatCurrencyMessage(response);
31 |
32 | await TelegramService.editMessageText(userId, messageId, message, {
33 | parse_mode: "HTML",
34 | });
35 |
36 | const newNotification = {
37 | userId,
38 | username: callbackQuery.from.username,
39 | currencies: [
40 | {
41 | type,
42 | symbol,
43 | timeInMinutes: Number(timeInMinutes),
44 | },
45 | ],
46 | };
47 |
48 | await NotificationService.createOrUpdateNotification(newNotification);
49 | }
50 | });
51 |
--------------------------------------------------------------------------------
/src/callbackQuery/index.js:
--------------------------------------------------------------------------------
1 | // Follow
2 | require("./follow");
3 | require("./followTime");
4 | require("./followReplyMessage");
5 | // Cancel
6 | require("./cancel");
7 | // Price
8 | require("./price");
9 | require("./priceReplyMessage");
10 |
--------------------------------------------------------------------------------
/src/callbackQuery/price.js:
--------------------------------------------------------------------------------
1 | // Services
2 | const TelegramService = require("../services/TelegramService");
3 | const CurrencyService = require("../services/CurrencyService");
4 |
5 | // Utils
6 | const formatCurrencyMessage = require("../utils/formatCurrencyMessage");
7 |
8 | TelegramService.on("callback_query", async (callbackQuery) => {
9 | const messageId = callbackQuery.message.message_id;
10 | const userId = callbackQuery.from.id;
11 | const [command, currency] = callbackQuery.data.split("_");
12 |
13 | if (command === "PRICE") {
14 | const [type, symbol] = currency.split("/");
15 | const response = await CurrencyService.getCurrencyPrice(type, symbol);
16 | const message = formatCurrencyMessage(response);
17 |
18 | return TelegramService.editMessageText(userId, messageId, message, {
19 | parse_mode: "HTML",
20 | });
21 | }
22 |
23 | if (command === "PRICEMANUAL") {
24 | await TelegramService.deleteMessage(userId, messageId);
25 |
26 | return TelegramService.sendMessage(
27 | userId,
28 | "Fiyatını görmek istediğiniz para birimini giriniz.",
29 | {
30 | reply_markup: {
31 | input_field_placeholder: "Lütfen para birimini giriniz.",
32 | force_reply: true,
33 | },
34 | }
35 | );
36 | }
37 | });
38 |
--------------------------------------------------------------------------------
/src/callbackQuery/priceReplyMessage.js:
--------------------------------------------------------------------------------
1 | // Services
2 | const TelegramService = require("../services/TelegramService");
3 |
4 | // Utils
5 | const cryptoCurrency = require("../utils/CryptoCurrency.json");
6 | const forexCurrency = require("../utils/forex.json");
7 | const sortCryptoArray = require("../utils/sortCryptoArray");
8 |
9 | TelegramService.on("message", async (msg) => {
10 | const replyMessage = msg.reply_to_message;
11 | const userId = msg.from.id;
12 |
13 | if (
14 | replyMessage &&
15 | replyMessage.text === "Fiyatını görmek istediğiniz para birimini giriniz."
16 | ) {
17 | const selectedCurrency = msg.text.toUpperCase();
18 | // Delete Reply Message
19 | await TelegramService.deleteMessage(userId, replyMessage.message_id);
20 |
21 | // Forex Currency
22 | const filterForex = forexCurrency.flatMap((forex) => {
23 | if (
24 | selectedCurrency + "USD" === forex ||
25 | selectedCurrency + "EUR" === forex ||
26 | selectedCurrency + "TRY" === forex ||
27 | selectedCurrency + "GBP" === forex ||
28 | selectedCurrency + "RUB" === forex ||
29 | selectedCurrency + "AUD" === forex ||
30 | selectedCurrency + "JPY" === forex ||
31 | selectedCurrency + "CNY" === forex
32 | ) {
33 | return {
34 | text:
35 | forex.slice(0, selectedCurrency.length) +
36 | " • " +
37 | forex.slice(selectedCurrency.length, forex.length),
38 | callback_data: `PRICE_FOREX/${forex}`,
39 | };
40 | }
41 |
42 | return [];
43 | });
44 |
45 | if (filterForex.length) {
46 | return TelegramService.sendMessage(
47 | userId,
48 | "Fiyatını görmek istediğiniz para birimini seçiniz.",
49 | {
50 | reply_markup: {
51 | inline_keyboard: [...filterForex.map((forex) => [forex])],
52 | },
53 | }
54 | );
55 | }
56 |
57 | // Crypto Currency
58 | const filterCrypto = cryptoCurrency.flatMap((crypto) => {
59 | if (
60 | selectedCurrency + "BTC" === crypto ||
61 | selectedCurrency + "ETH" === crypto ||
62 | selectedCurrency + "BNB" === crypto ||
63 | selectedCurrency + "USD" === crypto ||
64 | selectedCurrency + "BUSD" === crypto ||
65 | selectedCurrency + "EUR" === crypto ||
66 | selectedCurrency + "TRY" === crypto
67 | ) {
68 | return {
69 | text:
70 | selectedCurrency +
71 | " • " +
72 | crypto.slice(selectedCurrency.length, crypto.length),
73 | callback_data: `PRICE_CRYPTO/${crypto}`,
74 | };
75 | }
76 |
77 | return [];
78 | });
79 |
80 | if (filterCrypto.length) {
81 | const sortedCryptoList = sortCryptoArray(filterCrypto, selectedCurrency);
82 |
83 | return TelegramService.sendMessage(
84 | userId,
85 | "Fiyatını görmek istediğiniz para birimini seçiniz.",
86 | {
87 | reply_markup: {
88 | inline_keyboard: [...sortedCryptoList.map((crypto) => [crypto])],
89 | },
90 | }
91 | );
92 | }
93 |
94 | return TelegramService.sendMessage(userId, "Bu para birimi mevcut değil.");
95 | }
96 | });
97 |
--------------------------------------------------------------------------------
/src/commands/cancel.js:
--------------------------------------------------------------------------------
1 | // Services
2 | const TelegramService = require("../services/TelegramService");
3 | const NotificationService = require("../services/NotificationService");
4 |
5 | TelegramService.onText(/^\/iptal$/g, async (msg) => {
6 | const userId = msg.from.id;
7 | const subscribedCurrencies =
8 | await NotificationService.getSubscriberedCurrencies(userId);
9 | const message =
10 | "Aboneliğinizi iptal etmek istediğiniz para birimini seçiniz.";
11 |
12 | if (!subscribedCurrencies.length) {
13 | return TelegramService.sendMessage(
14 | userId,
15 | "Aboneliğiniz bulunmamaktadır!\n\n/takip komutunu kullanarak aboneliğinizi oluşturabilirsiniz."
16 | );
17 | }
18 |
19 | const currencies = subscribedCurrencies.map(({ type, symbol }) => {
20 | return [
21 | {
22 | text: symbol,
23 | callback_data: `CANCEL_${type}/${symbol}`,
24 | },
25 | ];
26 | });
27 |
28 | TelegramService.sendMessage(userId, message, {
29 | reply_markup: {
30 | inline_keyboard: [...currencies],
31 | },
32 | parse_mode: "HTML",
33 | });
34 | });
35 |
--------------------------------------------------------------------------------
/src/commands/cancelAll.js:
--------------------------------------------------------------------------------
1 | // Services
2 | const TelegramService = require("../services/TelegramService");
3 | const NotificationService = require("../services/NotificationService");
4 |
5 | TelegramService.onText(/^\/tumiptal$/g, async (msg) => {
6 | const userId = msg.from.id;
7 | const subscribedCurrencies =
8 | await NotificationService.getSubscriberedCurrencies(userId);
9 |
10 | if (!subscribedCurrencies.length) {
11 | const message =
12 | "Aboneliğiniz bulunmamaktadır!\n\n/takip komutunu kullanarak aboneliğinizi oluşturabilirsiniz.";
13 | return TelegramService.sendMessage(userId, message);
14 | }
15 |
16 | subscribedCurrencies.forEach(({ type, symbol }) => {
17 | // Cancel Subscriber
18 | NotificationService.cancelSubscriber(userId, type, symbol);
19 | });
20 |
21 | // Send Message
22 | TelegramService.sendMessage(userId, "Tüm abonelikleriniz iptal edildi!");
23 | });
24 |
--------------------------------------------------------------------------------
/src/commands/follow.js:
--------------------------------------------------------------------------------
1 | // Services
2 | const TelegramService = require("../services/TelegramService");
3 |
4 | TelegramService.onText(/^\/takip$/g, async (msg) => {
5 | const userId = msg.from.id;
6 | const message = "Lütfen takip etmek istediğiniz para birimini seçiniz.";
7 |
8 | await TelegramService.sendMessage(userId, message, {
9 | reply_markup: {
10 | inline_keyboard: [
11 | [
12 | {
13 | text: "USD • TRY",
14 | callback_data: "FOLLOW_FOREX/USDTRY",
15 | },
16 | {
17 | text: "EUR • USD",
18 | callback_data: "FOLLOW_FOREX/EURUSD",
19 | },
20 | ],
21 | [
22 | {
23 | text: "Bitcoin USD (BTC • USD)",
24 | callback_data: "FOLLOW_CRYPTO/BTCUSD",
25 | },
26 | ],
27 | [
28 | {
29 | text: "Bitcoin TRY (BTC • TRY)",
30 | callback_data: "FOLLOW_CRYPTO/BTCTRY",
31 | },
32 | ],
33 | [
34 | {
35 | text: "Ethereum USD (ETH • USD)",
36 | callback_data: "FOLLOW_CRYPTO/ETHUSD",
37 | },
38 | ],
39 | [
40 | {
41 | text: "BNB USD (BNB • USD)",
42 | callback_data: "FOLLOW_CRYPTO/BNBUSD",
43 | },
44 | ],
45 | [
46 | {
47 | text: "Ons Altın USD (XAU • USD)",
48 | callback_data: "FOLLOW_FOREX/XAUUSD",
49 | },
50 | ],
51 | [
52 | {
53 | text: "Ons Altın TRY (XAU • TRY)",
54 | callback_data: "FOLLOW_FOREX/XAUTRY",
55 | },
56 | ],
57 | [
58 | {
59 | text: "Para birimini manuel olarak girin",
60 | callback_data: "FOLLOWMANUAL",
61 | },
62 | ],
63 | ],
64 | },
65 | });
66 | });
67 |
--------------------------------------------------------------------------------
/src/commands/help.js:
--------------------------------------------------------------------------------
1 | // Services
2 | const TelegramService = require("../services/TelegramService");
3 |
4 | TelegramService.onText(/^\/bilgi$/g, (msg) => {
5 | const userId = msg.from.id;
6 | const message = `
7 | Merhaba
8 |
9 | Seçtiğiniz para biriminden size istediğiniz sıklıkta mesaj gönderebilir ve piyasadan sürekli haberdar olmanızı sağlayabilirim.
10 | Aboneliklerinizi istediğiniz zaman sonlandırabilir veya haber alma sıklığında değişiklik yapabilirsiniz.
11 |
12 | Hızlı Kullanım:
13 | /takip Komutu ile yeni bir abonelik başlatabilir veya mevcut aboneliğinizin bildirim gönderme sıklığını değiştirebilirsiniz.
14 | /sondurum Komutu ile abone olduğunuz tüm döviz birimlerinin son durumlarını öğrenebilirsiniz.
15 | /fiyat Komutu ile istediğiniz para biriminin son fiyatını öğrenebilirsiniz.
16 | /aboneliklerim Komutu ile tüm aboneliklerinizi listeleyebilir ve abone olduğunuz para biriminde hangi kanalda olduğunuzu görebilirsiniz.
17 | /iptal Komutu ile istediğiniz para birimindeki aboneliğinizi sonlandırabilirsiniz. Abonelik daha sonra yeniden başlatılabilir.
18 | /tumiptal Komutu ile tüm aboneliklerinizi sonlandırabilirsiniz.
19 | /bilgi Komutu ile dilediğiniz zaman bu bilgilere tekrar ulaşabilirsiniz.
20 | `;
21 |
22 | TelegramService.sendMessage(userId, message, {
23 | parse_mode: "HTML",
24 | });
25 | });
26 |
--------------------------------------------------------------------------------
/src/commands/index.js:
--------------------------------------------------------------------------------
1 | require("./start");
2 | require("./follow");
3 | require("./price");
4 | require("./cancel");
5 | require("./cancelAll");
6 | require("./latestStatus");
7 | require("./subscribers");
8 | require("./help");
9 | require("../callbackQuery/index");
10 |
--------------------------------------------------------------------------------
/src/commands/latestStatus.js:
--------------------------------------------------------------------------------
1 | // Services
2 | const TelegramService = require("../services/TelegramService");
3 | const CurrencyService = require("../services/CurrencyService");
4 | const NotificationService = require("../services/NotificationService");
5 |
6 | // Utils
7 | const formatCurrencyMessage = require("../utils/formatCurrencyMessage");
8 |
9 | TelegramService.onText(/^\/sondurum$/g, async (msg) => {
10 | const userId = msg.from.id;
11 | const subscribedCurrencies =
12 | await NotificationService.getSubscriberedCurrencies(userId);
13 | const messages = [];
14 |
15 | if (!subscribedCurrencies.length) {
16 | const message =
17 | "Aboneliğiniz bulunmamaktadır!\n\n/takip komutunu kullanarak aboneliğinizi oluşturabilirsiniz.";
18 | return TelegramService.sendMessage(userId, message);
19 | }
20 |
21 | for (const { type, symbol } of subscribedCurrencies) {
22 | const response = await CurrencyService.getCurrencyPrice(type, symbol);
23 | messages.push(formatCurrencyMessage(response));
24 | }
25 |
26 | TelegramService.sendMessage(userId, messages.join("\n\n"), {
27 | parse_mode: "HTML",
28 | });
29 | });
30 |
--------------------------------------------------------------------------------
/src/commands/price.js:
--------------------------------------------------------------------------------
1 | // Services
2 | const TelegramService = require("../services/TelegramService");
3 | const NotificationService = require("../services/NotificationService");
4 |
5 | TelegramService.onText(/^\/fiyat$/g, async (msg) => {
6 | const userId = msg.from.id;
7 | const message = "Fiyatını görmek istediğiniz para birimini seçiniz.";
8 | const selectedCurrency = msg.text.split(" ")[1];
9 |
10 | if (!selectedCurrency) {
11 | const subscribedCurrencies =
12 | await NotificationService.getSubscriberedCurrencies(userId);
13 |
14 | const inline_keyboard = [
15 | ...subscribedCurrencies.map(({ type, symbol }) => {
16 | return [
17 | {
18 | text: symbol,
19 | callback_data: `PRICE_${type}/${symbol}`,
20 | },
21 | ];
22 | }),
23 | ];
24 |
25 | inline_keyboard.push([
26 | {
27 | text: "Para birimini manuel olarak seçiniz",
28 | callback_data: "PRICEMANUAL",
29 | },
30 | ]);
31 |
32 | await TelegramService.sendMessage(userId, message, {
33 | reply_markup: {
34 | inline_keyboard,
35 | },
36 | });
37 | }
38 | });
39 |
--------------------------------------------------------------------------------
/src/commands/start.js:
--------------------------------------------------------------------------------
1 | // Services
2 | const TelegramService = require("../services/TelegramService");
3 |
4 | TelegramService.onText(/^\/start$/g, (msg) => {
5 | const userId = msg.from.id;
6 | const message = `
7 | Merhaba
8 |
9 | Seçtiğiniz para biriminden size istediğiniz sıklıkta mesaj gönderebilir ve piyasadan sürekli haberdar olmanızı sağlayabilirim.
10 | Aboneliklerinizi istediğiniz zaman sonlandırabilir veya haber alma sıklığında değişiklik yapabilirsiniz.
11 |
12 | Hızlı Kullanım:
13 | /takip Komutu ile yeni bir abonelik başlatabilir veya mevcut aboneliğinizin bildirim gönderme sıklığını değiştirebilirsiniz.
14 | /sondurum Komutu ile abone olduğunuz tüm döviz birimlerinin son durumlarını öğrenebilirsiniz.
15 | /fiyat Komutu ile istediğiniz para biriminin son fiyatını öğrenebilirsiniz.
16 | /aboneliklerim Komutu ile tüm aboneliklerinizi listeleyebilir ve abone olduğunuz para biriminde hangi kanalda olduğunuzu görebilirsiniz.
17 | /iptal Komutu ile istediğiniz para birimindeki aboneliğinizi sonlandırabilirsiniz. Abonelik daha sonra yeniden başlatılabilir.
18 | /tumiptal Komutu ile tüm aboneliklerinizi sonlandırabilirsiniz.
19 | /bilgi Komutu ile dilediğiniz zaman bu bilgilere tekrar ulaşabilirsiniz.
20 | `;
21 |
22 | TelegramService.sendMessage(userId, message, {
23 | parse_mode: "HTML",
24 | });
25 | });
26 |
--------------------------------------------------------------------------------
/src/commands/subscribers.js:
--------------------------------------------------------------------------------
1 | // Services
2 | const TelegramService = require("../services/TelegramService");
3 | const NotificationService = require("../services/NotificationService");
4 |
5 | TelegramService.onText(/^\/aboneliklerim$/g, async (msg) => {
6 | const userId = msg.from.id;
7 | const subscribedCurrencies =
8 | await NotificationService.getSubscriberedCurrencies(userId);
9 |
10 | if (!subscribedCurrencies.length) {
11 | return TelegramService.sendMessage(
12 | userId,
13 | "Aboneliğiniz bulunmamaktadır!\n\n/takip komutunu kullanarak aboneliğinizi oluşturabilirsiniz."
14 | );
15 | }
16 |
17 | const message = subscribedCurrencies.reduce(
18 | (acc, { symbol, timeInMinutes }, currentIndex) => {
19 | let timeType, timeUnit;
20 |
21 | // !currentIndex
22 | if (currentIndex === 0) {
23 | acc = "📌 Aboneliklerim 📌\n\n";
24 | }
25 |
26 | if (timeInMinutes <= 30) {
27 | timeType = "Dakika";
28 | timeUnit = timeInMinutes;
29 | } else if (timeInMinutes >= 60 && timeInMinutes <= 720) {
30 | timeType = "Saat";
31 | timeUnit = timeInMinutes / 60;
32 | } else {
33 | timeType = "Gün";
34 | timeUnit = timeInMinutes / 1440;
35 | }
36 |
37 | acc += `${symbol}: ${timeUnit} ${timeType}\n`;
38 |
39 | return acc;
40 | },
41 | ""
42 | );
43 |
44 | await TelegramService.sendMessage(userId, message, { parse_mode: "HTML" });
45 | });
46 |
--------------------------------------------------------------------------------
/src/config/index.js:
--------------------------------------------------------------------------------
1 | require("dotenv").config();
2 |
3 | module.exports = {
4 | FINAGE: {
5 | API_KEY: process.env.FINAGE_API_KEY,
6 | },
7 | TELEGRAM: {
8 | BOT_TOKEN: process.env.TELEGRAM_BOT_TOKEN,
9 | BOT_USERNAME: process.env.TELEGRAM_BOT_USERNAME,
10 | },
11 | MONGODB: {
12 | URI: process.env.MONGODB_URI,
13 | },
14 | RABBITMQ: {
15 | HOST: process.env.RABBITMQ_HOST,
16 | USERNAME: process.env.RABBITMQ_USERNAME,
17 | PASSWORD: process.env.RABBITMQ_PASSWORD,
18 | VHOST: process.env.RABBITMQ_VHOST,
19 | URI: process.env.RABBITMQ_URI,
20 | },
21 | };
22 |
--------------------------------------------------------------------------------
/src/cron.js:
--------------------------------------------------------------------------------
1 | const cron = require("node-cron");
2 |
3 | // Services
4 | const NotificationService = require("./services/NotificationService");
5 | const RabbitMQService = require("./services/RabbitMQService");
6 |
7 | // Utils
8 | const getNotificationMessage = require("./utils/getNotificationMessage");
9 |
10 | cron.schedule("0,10,20,30,40,50 * * * *", async () => {
11 | const notifications = await NotificationService.getNotifications(10);
12 | const messages = await Promise.all(await getNotificationMessage(notifications));
13 |
14 | messages.forEach(({ userId, message }) => {
15 | RabbitMQService.sendToQueue({
16 | userId,
17 | text: message,
18 | });
19 | });
20 | });
21 |
22 | cron.schedule("0,30 * * * *", async () => {
23 | const notifications = await NotificationService.getNotifications(30);
24 | const messages = await Promise.all(await getNotificationMessage(notifications));
25 |
26 | messages.forEach(({ userId, message }) => {
27 | RabbitMQService.sendToQueue({
28 | userId,
29 | text: message,
30 | });
31 | });
32 | });
33 |
34 | cron.schedule("0 * * * *", async () => {
35 | const notifications = await NotificationService.getNotifications(60);
36 | const messages = await Promise.all(await getNotificationMessage(notifications));
37 |
38 | messages.forEach(({ userId, message }) => {
39 | RabbitMQService.sendToQueue({
40 | userId,
41 | text: message,
42 | });
43 | });
44 | });
45 |
46 | cron.schedule("0 0,6,12,18 * * *", async () => {
47 | const notifications = await NotificationService.getNotifications(360);
48 | const messages = await Promise.all(await getNotificationMessage(notifications));
49 |
50 | messages.forEach(({ userId, message }) => {
51 | RabbitMQService.sendToQueue({
52 | userId,
53 | text: message,
54 | });
55 | });
56 | });
57 |
58 | cron.schedule("0 0,12 * * *", async () => {
59 | const notifications = await NotificationService.getNotifications(720);
60 | const messages = await Promise.all(await getNotificationMessage(notifications));
61 |
62 | messages.forEach(({ userId, message }) => {
63 | RabbitMQService.sendToQueue({
64 | userId,
65 | text: message,
66 | });
67 | });
68 | });
69 |
70 | cron.schedule("0 0 * * *", async () => {
71 | const notifications = await NotificationService.getNotifications(1440);
72 | const messages = await Promise.all(await getNotificationMessage(notifications));
73 |
74 | messages.forEach(({ userId, message }) => {
75 | RabbitMQService.sendToQueue({
76 | userId,
77 | text: message,
78 | });
79 | });
80 | });
81 |
--------------------------------------------------------------------------------
/src/helpers/database.js:
--------------------------------------------------------------------------------
1 | const { MONGODB } = require("../config/index");
2 | const mongoose = require("mongoose");
3 |
4 | module.exports = (() => {
5 | mongoose.connect(MONGODB.URI, {
6 | useNewUrlParser: true,
7 | useUnifiedTopology: true,
8 | });
9 |
10 | mongoose.connection.on("open", () =>
11 | console.log("Connection to MongoDB", { service: "MongoDB" })
12 | );
13 |
14 | mongoose.connection.on("error", (error) =>
15 | console.error(`Connection failed: ${error}`, { service: "MongoDB" })
16 | );
17 | })();
18 |
--------------------------------------------------------------------------------
/src/index.js:
--------------------------------------------------------------------------------
1 | require("./helpers/database");
2 | require("./commands/index");
3 | require("./cron");
4 |
--------------------------------------------------------------------------------
/src/models/Notification.js:
--------------------------------------------------------------------------------
1 | const { Schema, model } = require("mongoose");
2 |
3 | // Create the model class
4 | const Notification = new Schema(
5 | {
6 | userId: {
7 | type: Number,
8 | required: true,
9 | unique: true,
10 | },
11 |
12 | username: {
13 | type: String,
14 | },
15 |
16 | currencies: [
17 | {
18 | _id: false,
19 |
20 | symbol: {
21 | type: String,
22 | required: true,
23 | },
24 |
25 | type: {
26 | type: String,
27 | required: true,
28 | enum: ["FOREX", "CRYPTO"],
29 | },
30 |
31 | timeInMinutes: {
32 | type: Number,
33 | required: true,
34 | },
35 | },
36 | ],
37 | },
38 | {
39 | timestamps: true,
40 | versionKey: false,
41 | }
42 | );
43 |
44 | // Export the model
45 | module.exports = model("Notification", Notification);
46 |
--------------------------------------------------------------------------------
/src/services/CurrencyService.js:
--------------------------------------------------------------------------------
1 | const fetch = require("node-fetch");
2 | // Config
3 | const { FINAGE } = require("../config/index");
4 |
5 | class CurrencyService {
6 | getCurrencyPrice(type, symbol) {
7 | if (type === "FOREX") {
8 | return this.getForexCurrency(symbol);
9 | }
10 |
11 | if (type === "CRYPTO") {
12 | return this.getCryptoCurrency(symbol);
13 | }
14 | }
15 |
16 | async getCryptoCurrency(symbol) {
17 | try {
18 | const response = await fetch(
19 | `https://api.finage.co.uk/last/crypto/changes/${symbol}?apikey=${FINAGE.API_KEY}`,
20 | {
21 | method: "GET",
22 | headers: {
23 | "Content-Type": "application/json",
24 | },
25 | }
26 | );
27 |
28 | const data = await response.json();
29 | data.price = data.lp;
30 | data.symbol = data.s;
31 |
32 | return data;
33 | } catch {
34 | const response = await fetch(
35 | `https://api.finage.co.uk/last/crypto/${symbol}?apikey=${FINAGE.API_KEY}`,
36 | {
37 | method: "GET",
38 | headers: {
39 | "Content-Type": "application/json",
40 | },
41 | }
42 | );
43 |
44 | const data = await response.json();
45 | data.symbol = data.s;
46 |
47 | return data;
48 | }
49 | }
50 |
51 | async getForexCurrency(symbol) {
52 | const response = await fetch(
53 | `https://api.finage.co.uk/last/forex/${symbol}?apikey=${FINAGE.API_KEY}`,
54 | {
55 | method: "GET",
56 | headers: {
57 | "Content-Type": "application/json",
58 | },
59 | }
60 | );
61 |
62 | const data = await response.json();
63 |
64 | if (data.error) {
65 | return null;
66 | }
67 |
68 | data.price = data.ask;
69 | return data;
70 | }
71 | }
72 |
73 | module.exports = new CurrencyService();
74 |
--------------------------------------------------------------------------------
/src/services/NotificationService.js:
--------------------------------------------------------------------------------
1 | // Model
2 | const notificationModel = require("../models/Notification");
3 |
4 | class NotificationService {
5 | constructor() {
6 | this.notificationModel = notificationModel;
7 | }
8 |
9 | async createOrUpdateNotification(notification) {
10 | const { userId, username, currencies } = notification;
11 | const notificationRecord = await this.notificationModel.findOne({ userId });
12 |
13 | if (notificationRecord) {
14 | const checkCurrency = notificationRecord.currencies.filter(
15 | ({ type, symbol, timeInMinutes }) => {
16 | if (currencies[0].type === type && currencies[0].symbol === symbol) {
17 | return {
18 | type,
19 | symbol,
20 | timeInMinutes,
21 | };
22 | }
23 | }
24 | );
25 |
26 | if (checkCurrency.length) {
27 | return this.notificationModel.updateOne(
28 | {
29 | userId,
30 | currencies: {
31 | $elemMatch: {
32 | type: checkCurrency[0].type,
33 | symbol: checkCurrency[0].symbol,
34 | },
35 | },
36 | },
37 | {
38 | "currencies.$.timeInMinutes": currencies[0].timeInMinutes,
39 | }
40 | );
41 | }
42 |
43 | return this.notificationModel.updateOne(
44 | {
45 | userId,
46 | },
47 | {
48 | $push: {
49 | currencies,
50 | },
51 | }
52 | );
53 | }
54 |
55 | const newNotification = {
56 | userId,
57 | username,
58 | currencies,
59 | };
60 |
61 | return this.notificationModel.create(newNotification);
62 | }
63 |
64 | async getNotifications(timeInMinutes) {
65 | return this.notificationModel.aggregate([
66 | {
67 | $match: {
68 | currencies: {
69 | $elemMatch: {
70 | timeInMinutes,
71 | },
72 | },
73 | },
74 | },
75 | {
76 | $project: {
77 | _id: 0,
78 | userId: 1,
79 | currencies: {
80 | $filter: {
81 | input: "$currencies",
82 | as: "currency",
83 | cond: {
84 | $eq: ["$$currency.timeInMinutes", timeInMinutes],
85 | },
86 | },
87 | },
88 | },
89 | },
90 | ]);
91 | }
92 |
93 | async getSubscriberedCurrencies(userId) {
94 | const notificationRecord = await this.notificationModel.findOne(
95 | {
96 | userId,
97 | },
98 | "currencies"
99 | );
100 |
101 | return notificationRecord ? notificationRecord.currencies : [];
102 | }
103 |
104 | async cancelSubscriber(userId, type, symbol) {
105 | return this.notificationModel.updateOne(
106 | {
107 | userId,
108 | },
109 | {
110 | $pull: {
111 | currencies: {
112 | type,
113 | symbol,
114 | },
115 | },
116 | }
117 | );
118 | }
119 |
120 | async deleteUser(userId) {
121 | await this.notificationModel.deleteOne({ userId });
122 | }
123 | }
124 |
125 | module.exports = new NotificationService();
126 |
--------------------------------------------------------------------------------
/src/services/RabbitMQService.js:
--------------------------------------------------------------------------------
1 | const { RABBITMQ } = require("../config/index");
2 | const amqplib = require("amqplib");
3 | const amqpUrl = RABBITMQ.URI;
4 |
5 | // Services
6 | const TelegramService = require("./TelegramService");
7 | const NotificationService = require("./NotificationService");
8 |
9 | class RabbitMQService {
10 | constructor() {
11 | this.connection = null;
12 | this.channel = null;
13 | this.queueName = "notification";
14 |
15 | this.connect();
16 | }
17 |
18 | async connect() {
19 | this.connection = await amqplib.connect(amqpUrl);
20 | this.channel = await this.connection.createChannel();
21 | await this.channel.assertQueue(this.queueName);
22 |
23 | this.channel.consume(this.queueName, async (msg) => {
24 | const message = JSON.parse(msg.content.toString());
25 | const userId = message.userId;
26 | const messageText = message.text;
27 |
28 | try {
29 | await TelegramService.sendMessage(userId, messageText, {
30 | parse_mode: "HTML",
31 | });
32 |
33 | console.log(
34 | `LOG: Message sent to ${userId} successfully with text: ${messageText
35 | .trim()
36 | .replace(/\n/g, "")} - ${Date.now()}`
37 | );
38 | this.channel.ack(msg);
39 | } catch (error) {
40 | console.error(
41 | "Send Message Error:",
42 | {
43 | error_code: error.response.body.error_code,
44 | description: error.response.body.description,
45 | timestamp: Date.now(),
46 | },
47 | "Message:",
48 | message
49 | );
50 |
51 | if (error.response.body.error_code === 403) {
52 | await NotificationService.deleteUser(userId);
53 | this.channel.ack(msg);
54 | } else if (error.response.body.error_code === 429) {
55 | this.channel.nack(msg);
56 | }
57 | }
58 | });
59 | }
60 |
61 | sendToQueue(message) {
62 | this.channel.sendToQueue(
63 | this.queueName,
64 | Buffer.from(JSON.stringify(message))
65 | );
66 | }
67 | }
68 |
69 | module.exports = new RabbitMQService();
70 |
--------------------------------------------------------------------------------
/src/services/TelegramService.js:
--------------------------------------------------------------------------------
1 | const Telegram = require("node-telegram-bot-api");
2 | const { TELEGRAM } = require("../config/index");
3 |
4 | class TelegramService {
5 | constructor({ BOT_TOKEN, setCommands }) {
6 | const config = { polling: true };
7 | this.config = config;
8 | this.token = BOT_TOKEN;
9 |
10 | this.bot = new Telegram(this.token, this.config);
11 | this.on("polling_error", console.error);
12 |
13 | this.bot.setMyCommands(setCommands);
14 | }
15 |
16 | async sendMessage(userId, message, options = {}) {
17 | return await this.bot.sendMessage(userId, message, options);
18 | }
19 |
20 | async editMessageText(userId, messageId, message, options = {}) {
21 | return await this.bot.editMessageText(message, {
22 | chat_id: userId,
23 | message_id: messageId,
24 | ...options,
25 | });
26 | }
27 |
28 | async deleteMessage(userId, messageId) {
29 | return await this.bot.deleteMessage(userId, messageId);
30 | }
31 |
32 | async answerCallbackQuery(callbackQueryId, text) {
33 | return await this.bot.answerCallbackQuery(callbackQueryId, text);
34 | }
35 |
36 | onText(regexp, callback) {
37 | this.bot.onText(regexp, callback);
38 | }
39 |
40 | on(event, callback) {
41 | this.bot.on(event, callback);
42 | }
43 | }
44 |
45 | const setCommands = [
46 | {
47 | command: "start",
48 | description: "Detaylı bilgi verir.",
49 | },
50 | {
51 | command: "takip",
52 | description:
53 | "Komutu ile yeni bir abonelik başlatabilir veya mevcut aboneliğinizin bildirim gönderme sıklığını değiştirebilirsiniz.",
54 | },
55 | {
56 | command: "sondurum",
57 | description:
58 | "Komutu ile abone olduğunuz tüm döviz birimlerinin son durumlarını öğrenebilirsiniz.",
59 | },
60 | {
61 | command: "fiyat",
62 | description:
63 | "Komutu ile istediğiniz para biriminin son fiyatını öğrenebilirsiniz..",
64 | },
65 | {
66 | command: "aboneliklerim",
67 | description:
68 | "Komutu ile tüm aboneliklerinizi listeleyebilir ve bildirim sıklığını görebilirsiniz.",
69 | },
70 | {
71 | command: "iptal",
72 | description:
73 | "Komutu ile istediğiniz para birimine aboneliğinizi sonlandırabilirsiniz. Abonelik daha sonra yeniden başlatılabilir.",
74 | },
75 | {
76 | command: "tumiptal",
77 | description: "Komutu ile tüm aboneliklerinizi sonlandırabilirsiniz.",
78 | },
79 | {
80 | command: "bilgi",
81 | description: "Detaylı bilgi verir.",
82 | },
83 | ];
84 |
85 | const Dependencies = {
86 | BOT_TOKEN: TELEGRAM.BOT_TOKEN,
87 | setCommands,
88 | };
89 |
90 | module.exports = new TelegramService(Dependencies);
91 |
--------------------------------------------------------------------------------
/src/utils/CryptoCurrency.json:
--------------------------------------------------------------------------------
1 | [
2 | "1INCHBTC",
3 | "1INCHBUSD",
4 | "1INCHUSD",
5 | "AAVEBKRW",
6 | "AAVEBNB",
7 | "AAVEBTC",
8 | "AAVEBUSD",
9 | "AAVEDOWNUSD",
10 | "AAVEETH",
11 | "AAVEUPUSD",
12 | "AAVEUSD",
13 | "ACMBTC",
14 | "ACMBUSD",
15 | "ACMUSD",
16 | "ADAAUD",
17 | "ADABKRW",
18 | "ADABNB",
19 | "ADABRL",
20 | "ADABTC",
21 | "ADABUSD",
22 | "ADADOWNUSD",
23 | "ADAETH",
24 | "ADAEUR",
25 | "ADAGBP",
26 | "ADAPAX",
27 | "ADARUB",
28 | "ADATRY",
29 | "ADATUSD",
30 | "ADAUPUSD",
31 | "ADAUSD",
32 | "ADXBNB",
33 | "ADXBTC",
34 | "ADXETH",
35 | "AEBNB",
36 | "AEBTC",
37 | "AEETH",
38 | "AERGOBTC",
39 | "AERGOBUSD",
40 | "AGIBNB",
41 | "AGIBTC",
42 | "AGIETH",
43 | "AIONBNB",
44 | "AIONBTC",
45 | "AIONBUSD",
46 | "AIONETH",
47 | "AIONUSD",
48 | "AKROBTC",
49 | "AKROUSD",
50 | "ALGOBNB",
51 | "ALGOBTC",
52 | "ALGOBUSD",
53 | "ALGOPAX",
54 | "ALGOTUSD",
55 | "ALGOUSD",
56 | "ALICEBTC",
57 | "ALICEBUSD",
58 | "ALICEUSD",
59 | "ALPHABNB",
60 | "ALPHABTC",
61 | "ALPHABUSD",
62 | "ALPHAUSD",
63 | "AMBBNB",
64 | "AMBBTC",
65 | "AMBETH",
66 | "ANKRBNB",
67 | "ANKRBTC",
68 | "ANKRPAX",
69 | "ANKRUSD",
70 | "ANTBNB",
71 | "ANTBTC",
72 | "ANTBUSD",
73 | "ANTUSD",
74 | "APPCBNB",
75 | "APPCBTC",
76 | "APPCETH",
77 | "ARDRBNB",
78 | "ARDRBTC",
79 | "ARDRETH",
80 | "ARDRUSD",
81 | "ARKBTC",
82 | "ARKETH",
83 | "ARNBTC",
84 | "ARNETH",
85 | "ARPABNB",
86 | "ARPABTC",
87 | "ARPAUSD",
88 | "ASRBTC",
89 | "ASRUSD",
90 | "ASTBTC",
91 | "ASTETH",
92 | "ATMBTC",
93 | "ATMUSD",
94 | "ATOMBNB",
95 | "ATOMBTC",
96 | "ATOMBUSD",
97 | "ATOMPAX",
98 | "ATOMTUSD",
99 | "ATOMUSD",
100 | "AUCTIONBTC",
101 | "AUCTIONBUSD",
102 | "AUDBUSD",
103 | "AUDIOBTC",
104 | "AUDIOBUSD",
105 | "AUDIOUSD",
106 | "AUDUSD",
107 | "AUTOBTC",
108 | "AUTOBUSD",
109 | "AUTOUSD",
110 | "AVABNB",
111 | "AVABTC",
112 | "AVABUSD",
113 | "AVAUSD",
114 | "AVAXBNB",
115 | "AVAXBTC",
116 | "AVAXBUSD",
117 | "AVAXEUR",
118 | "AVAXTRY",
119 | "AVAXUSD",
120 | "AXSBNB",
121 | "AXSBTC",
122 | "AXSBUSD",
123 | "AXSUSD",
124 | "BADGERBTC",
125 | "BADGERBUSD",
126 | "BADGERUSD",
127 | "BAKEBNB",
128 | "BAKEBUSD",
129 | "BALBNB",
130 | "BALBTC",
131 | "BALBUSD",
132 | "BALUSD",
133 | "BANDBNB",
134 | "BANDBTC",
135 | "BANDBUSD",
136 | "BANDUSD",
137 | "BATBNB",
138 | "BATBTC",
139 | "BATBUSD",
140 | "BATETH",
141 | "BATPAX",
142 | "BATTUSD",
143 | "BATUSD",
144 | "BCCBNB",
145 | "BCCBTC",
146 | "BCCETH",
147 | "BCDBTC",
148 | "BCDETH",
149 | "BCHABCBTC",
150 | "BCHABCPAX",
151 | "BCHABUSD",
152 | "BCHBNB",
153 | "BCHBTC",
154 | "BCHBUSD",
155 | "BCHDOWNUSD",
156 | "BCHEUR",
157 | "BCHPAX",
158 | "BCHSVBTC",
159 | "BCHSVPAX",
160 | "BCHTUSD",
161 | "BCHUPUSD",
162 | "BCHUSD",
163 | "BCNBNB",
164 | "BCNBTC",
165 | "BCNETH",
166 | "BCPTBNB",
167 | "BCPTBTC",
168 | "BCPTETH",
169 | "BCPTPAX",
170 | "BEAMBNB",
171 | "BEAMBTC",
172 | "BEAMUSD",
173 | "BEARBUSD",
174 | "BEARUSD",
175 | "BELBNB",
176 | "BELBTC",
177 | "BELBUSD",
178 | "BELUSD",
179 | "BETHETH",
180 | "BIFIBNB",
181 | "BIFIBUSD",
182 | "BKRWBUSD",
183 | "BKRWUSD",
184 | "BLZBNB",
185 | "BLZBTC",
186 | "BLZBUSD",
187 | "BLZETH",
188 | "BLZUSD",
189 | "BNBAUD",
190 | "BNBBEARBUSD",
191 | "BNBBEARUSD",
192 | "BNBBIDR",
193 | "BNBBKRW",
194 | "BNBBRL",
195 | "BNBBTC",
196 | "BNBBULLBUSD",
197 | "BNBBULLUSD",
198 | "BNBBUSD",
199 | "BNBDAI",
200 | "BNBDOWNUSD",
201 | "BNBETH",
202 | "BNBEUR",
203 | "BNBGBP",
204 | "BNBIDRT",
205 | "BNBNGN",
206 | "BNBPAX",
207 | "BNBRUB",
208 | "BNBTRY",
209 | "BNBTUSD",
210 | "BNBUPUSD",
211 | "BNBUSD",
212 | "BNBZAR",
213 | "BNTBTC",
214 | "BNTBUSD",
215 | "BNTETH",
216 | "BNTUSD",
217 | "BOTBTC",
218 | "BOTBUSD",
219 | "BQXBTC",
220 | "BQXETH",
221 | "BRDBNB",
222 | "BRDBTC",
223 | "BRDETH",
224 | "BTCAUD",
225 | "BTCBBTC",
226 | "BTCBIDR",
227 | "BTCBKRW",
228 | "BTCBRL",
229 | "BTCBUSD",
230 | "BTCDAI",
231 | "BTCDOWNUSD",
232 | "BTCEUR",
233 | "BTCGBP",
234 | "BTCIDRT",
235 | "BTCNGN",
236 | "BTCPAX",
237 | "BTCRUB",
238 | "BTCSTBTC",
239 | "BTCSTBUSD",
240 | "BTCTRY",
241 | "BTCTUSD",
242 | "BTCUAH",
243 | "BTCUPUSD",
244 | "BTCUSD",
245 | "BTCVAI",
246 | "BTCZAR",
247 | "BTGBTC",
248 | "BTGETH",
249 | "BTSBNB",
250 | "BTSBTC",
251 | "BTSBUSD",
252 | "BTSETH",
253 | "BTSUSD",
254 | "BTTBNB",
255 | "BTTBTC",
256 | "BTTBUSD",
257 | "BTTPAX",
258 | "BTTTRX",
259 | "BTTTRY",
260 | "BTTTUSD",
261 | "BTTUSD",
262 | "BULLBUSD",
263 | "BULLUSD",
264 | "BURGERBNB",
265 | "BUSDBIDR",
266 | "BUSDBKRW",
267 | "BUSDBRL",
268 | "BUSDBVND",
269 | "BUSDDAI",
270 | "BUSDIDRT",
271 | "BUSDNGN",
272 | "BUSDRUB",
273 | "BUSDRY",
274 | "BUSDUSD",
275 | "BUSDVAI",
276 | "BUSDZAR",
277 | "BZRXBNB",
278 | "BZRXBTC",
279 | "BZRXBUSD",
280 | "BZRXUSD",
281 | "CAKEBNB",
282 | "CAKEBTC",
283 | "CAKEBUSD",
284 | "CAKEUSD",
285 | "CDTBTC",
286 | "CDTETH",
287 | "CELOBTC",
288 | "CELOUSD",
289 | "CELRBNB",
290 | "CELRBTC",
291 | "CELRUSD",
292 | "CFXBTC",
293 | "CFXBUSD",
294 | "CFXUSD",
295 | "CHATBTC",
296 | "CHATETH",
297 | "CHRBNB",
298 | "CHRBTC",
299 | "CHRUSD",
300 | "CHZBNB",
301 | "CHZBRL",
302 | "CHZBTC",
303 | "CHZBUSD",
304 | "CHZEUR",
305 | "CHZGBP",
306 | "CHZTRY",
307 | "CHZUSD",
308 | "CKBBTC",
309 | "CKBBUSD",
310 | "CKBUSD",
311 | "CLOAKBTC",
312 | "CLOAKETH",
313 | "CMTBNB",
314 | "CMTBTC",
315 | "CMTETH",
316 | "CNDBNB",
317 | "CNDBTC",
318 | "CNDETH",
319 | "COCOSBNB",
320 | "COCOSBTC",
321 | "COCOSUSD",
322 | "COMPBNB",
323 | "COMPBTC",
324 | "COMPBUSD",
325 | "COMPUSD",
326 | "COSBNB",
327 | "COSBTC",
328 | "COSUSD",
329 | "COTIBNB",
330 | "COTIBTC",
331 | "COTIUSD",
332 | "COVERBUSD",
333 | "COVERETH",
334 | "CREAMBNB",
335 | "CREAMBUSD",
336 | "CRVBNB",
337 | "CRVBTC",
338 | "CRVBUSD",
339 | "CRVUSD",
340 | "CTKBNB",
341 | "CTKBTC",
342 | "CTKBUSD",
343 | "CTKUSD",
344 | "CTSIBNB",
345 | "CTSIBTC",
346 | "CTSIBUSD",
347 | "CTSIUSD",
348 | "CTXCBNB",
349 | "CTXCBTC",
350 | "CTXCUSD",
351 | "CVCBNB",
352 | "CVCBTC",
353 | "CVCETH",
354 | "CVCUSD",
355 | "CVPBUSD",
356 | "CVPETH",
357 | "DAIBNB",
358 | "DAIBTC",
359 | "DAIBUSD",
360 | "DAIUSD",
361 | "DASHBNB",
362 | "DASHBTC",
363 | "DASHBUSD",
364 | "DASHETH",
365 | "DASHUSD",
366 | "DATABTC",
367 | "DATABUSD",
368 | "DATAETH",
369 | "DATAUSD",
370 | "DCRBNB",
371 | "DCRBTC",
372 | "DCRBUSD",
373 | "DCRUSD",
374 | "DEGOBTC",
375 | "DEGOBUSD",
376 | "DEGOUSD",
377 | "DENTBTC",
378 | "DENTETH",
379 | "DEXEBUSD",
380 | "DEXEETH",
381 | "DFETH",
382 | "DGBBNB",
383 | "DGBBTC",
384 | "DGBBUSD",
385 | "DGBUSD",
386 | "DGDBTC",
387 | "DGDETH",
388 | "DIABNB",
389 | "DIABTC",
390 | "DIABUSD",
391 | "DIAUSD",
392 | "DLTBNB",
393 | "DLTBTC",
394 | "DLTETH",
395 | "DNTBTC",
396 | "DNTBUSD",
397 | "DNTETH",
398 | "DNTUSD",
399 | "DOCKBTC",
400 | "DOCKETH",
401 | "DOCKUSD",
402 | "DODOBTC",
403 | "DODOBUSD",
404 | "DODOUSD",
405 | "DOGEAUD",
406 | "DOGEBNB",
407 | "DOGEBRL",
408 | "DOGEBTC",
409 | "DOGEBUSD",
410 | "DOGEEUR",
411 | "DOGEGBP",
412 | "DOGEPAX",
413 | "DOGETRY",
414 | "DOGEUSD",
415 | "DOTBIDR",
416 | "DOTBKRW",
417 | "DOTBNB",
418 | "DOTBRL",
419 | "DOTBTC",
420 | "DOTBUSD",
421 | "DOTDOWNUSD",
422 | "DOTEUR",
423 | "DOTGBP",
424 | "DOTNGN",
425 | "DOTTRY",
426 | "DOTUPUSD",
427 | "DOTUSD",
428 | "DREPBNB",
429 | "DREPBTC",
430 | "DREPUSD",
431 | "DUSKBNB",
432 | "DUSKBTC",
433 | "DUSKPAX",
434 | "DUSKUSD",
435 | "EASYBTC",
436 | "EASYETH",
437 | "EDOBTC",
438 | "EDOETH",
439 | "EGLDBNB",
440 | "EGLDBTC",
441 | "EGLDBUSD",
442 | "EGLDEUR",
443 | "EGLDUSD",
444 | "ELFBTC",
445 | "ELFETH",
446 | "ENGBTC",
447 | "ENGETH",
448 | "ENJBNB",
449 | "ENJBRL",
450 | "ENJBTC",
451 | "ENJBUSD",
452 | "ENJETH",
453 | "ENJEUR",
454 | "ENJGBP",
455 | "ENJUSD",
456 | "EOSBEARBUSD",
457 | "EOSBEARUSD",
458 | "EOSBNB",
459 | "EOSBTC",
460 | "EOSBULLBUSD",
461 | "EOSBULLUSD",
462 | "EOSBUSD",
463 | "EOSDOWNUSD",
464 | "EOSETH",
465 | "EOSEUR",
466 | "EOSPAX",
467 | "EOSTRY",
468 | "EOSTUSD",
469 | "EOSUPUSD",
470 | "EOSUSD",
471 | "EPSBTC",
472 | "EPSBUSD",
473 | "EPSUSD",
474 | "ERDBNB",
475 | "ERDBTC",
476 | "ERDBUSD",
477 | "ERDPAX",
478 | "ERDUSD",
479 | "ETCBNB",
480 | "ETCBTC",
481 | "ETCBUSD",
482 | "ETCETH",
483 | "ETCPAX",
484 | "ETCUSD",
485 | "ETHAUD",
486 | "ETHBEARBUSD",
487 | "ETHBEARUSD",
488 | "ETHBIDR",
489 | "ETHBKRW",
490 | "ETHBRL",
491 | "ETHBTC",
492 | "ETHBULLBUSD",
493 | "ETHBULLUSD",
494 | "ETHBUSD",
495 | "ETHDAI",
496 | "ETHDOWNUSD",
497 | "ETHEUR",
498 | "ETHGBP",
499 | "ETHNGN",
500 | "ETHPAX",
501 | "ETHRUB",
502 | "ETHTRY",
503 | "ETHTUSD",
504 | "ETHUPUSD",
505 | "ETHUSD",
506 | "ETHZAR",
507 | "EURBUSD",
508 | "EURUSD",
509 | "EVXBTC",
510 | "EVXETH",
511 | "FETBNB",
512 | "FETBTC",
513 | "FETUSD",
514 | "FILBNB",
515 | "FILBTC",
516 | "FILBUSD",
517 | "FILDOWNUSD",
518 | "FILUPUSD",
519 | "FILUSD",
520 | "FIOBNB",
521 | "FIOBTC",
522 | "FIOBUSD",
523 | "FIOUSD",
524 | "FIROBTC",
525 | "FIROETH",
526 | "FIROUSD",
527 | "FISBTC",
528 | "FISBUSD",
529 | "FISUSD",
530 | "FLMBNB",
531 | "FLMBTC",
532 | "FLMBUSD",
533 | "FLMUSD",
534 | "FORBTC",
535 | "FORBUSD",
536 | "FRONTBTC",
537 | "FRONTBUSD",
538 | "FRONTETH",
539 | "FTMBNB",
540 | "FTMBTC",
541 | "FTMPAX",
542 | "FTMUSD",
543 | "FTTBNB",
544 | "FTTBTC",
545 | "FTTUSD",
546 | "FUELBTC",
547 | "FUELETH",
548 | "FUNBTC",
549 | "FUNETH",
550 | "FUNUSD",
551 | "FXSBTC",
552 | "FXSBUSD",
553 | "GASBTC",
554 | "GBPBUSD",
555 | "GBPUSD",
556 | "GHSTBUSD",
557 | "GHSTETH",
558 | "GLMBTC",
559 | "GLMETH",
560 | "GNTBNB",
561 | "GNTBTC",
562 | "GNTETH",
563 | "GOBNB",
564 | "GOBTC",
565 | "GRSBTC",
566 | "GRSETH",
567 | "GRTBTC",
568 | "GRTBUSD",
569 | "GRTETH",
570 | "GRTEUR",
571 | "GRTUSD",
572 | "GTOBNB",
573 | "GTOBTC",
574 | "GTOETH",
575 | "GTOPAX",
576 | "GTOUSD",
577 | "GVTBTC",
578 | "GVTETH",
579 | "GXSBTC",
580 | "GXSETH",
581 | "GXSUSD",
582 | "HARDBNB",
583 | "HARDBTC",
584 | "HARDBUSD",
585 | "HARDUSD",
586 | "HBARBNB",
587 | "HBARBTC",
588 | "HBARBUSD",
589 | "HBARUSD",
590 | "HCBTC",
591 | "HCETH",
592 | "HCUSD",
593 | "HEGICBUSD",
594 | "HEGICETH",
595 | "HIVEBNB",
596 | "HIVEBTC",
597 | "HIVEUSD",
598 | "HNTBTC",
599 | "HNTUSD",
600 | "HOTBNB",
601 | "HOTBTC",
602 | "HOTETH",
603 | "HOTTRY",
604 | "HOTUSD",
605 | "HSRBTC",
606 | "HSRETH",
607 | "ICNBTC",
608 | "ICNETH",
609 | "ICXBNB",
610 | "ICXBTC",
611 | "ICXBUSD",
612 | "ICXETH",
613 | "ICXUSD",
614 | "IDEXBTC",
615 | "IDEXBUSD",
616 | "INJBNB",
617 | "INJBTC",
618 | "INJBUSD",
619 | "INJUSD",
620 | "INSBTC",
621 | "INSETH",
622 | "IOSTBNB",
623 | "IOSTBTC",
624 | "IOSTBUSD",
625 | "IOSTETH",
626 | "IOTABNB",
627 | "IOTABTC",
628 | "IOTABUSD",
629 | "IOTAETH",
630 | "IOTAUSD",
631 | "IOTXBTC",
632 | "IOTXETH",
633 | "IOTXUSD",
634 | "IQBNB",
635 | "IRISBNB",
636 | "IRISBTC",
637 | "IRISBUSD",
638 | "IRISUSD",
639 | "JSTBNB",
640 | "JSTBTC",
641 | "JSTBUSD",
642 | "JSTUSD",
643 | "JUVBTC",
644 | "JUVBUSD",
645 | "JUVUSD",
646 | "KAVABNB",
647 | "KAVABTC",
648 | "KAVAUSD",
649 | "KEYBTC",
650 | "KEYETH",
651 | "KEYUSD",
652 | "KMDBTC",
653 | "KMDBUSD",
654 | "KMDETH",
655 | "KMDUSD",
656 | "KNCBTC",
657 | "KNCBUSD",
658 | "KNCETH",
659 | "KNCUSD",
660 | "KP3RBNB",
661 | "KP3RBUSD",
662 | "KSMBNB",
663 | "KSMBTC",
664 | "KSMBUSD",
665 | "KSMUSD",
666 | "LENDBKRW",
667 | "LENDBTC",
668 | "LENDBUSD",
669 | "LENDETH",
670 | "LENDUSD",
671 | "LINABTC",
672 | "LINABUSD",
673 | "LINAUSD",
674 | "LINKAUD",
675 | "LINKBKRW",
676 | "LINKBRL",
677 | "LINKBTC",
678 | "LINKBUSD",
679 | "LINKDOWNUSD",
680 | "LINKETH",
681 | "LINKEUR",
682 | "LINKGBP",
683 | "LINKNGN",
684 | "LINKPAX",
685 | "LINKTRY",
686 | "LINKTUSD",
687 | "LINKUPUSD",
688 | "LINKUSD",
689 | "LITBTC",
690 | "LITBUSD",
691 | "LITUSD",
692 | "LOOMBNB",
693 | "LOOMBTC",
694 | "LOOMETH",
695 | "LRCBTC",
696 | "LRCBUSD",
697 | "LRCETH",
698 | "LRCUSD",
699 | "LSKBNB",
700 | "LSKBTC",
701 | "LSKETH",
702 | "LSKUSD",
703 | "LTCBNB",
704 | "LTCBRL",
705 | "LTCBTC",
706 | "LTCBUSD",
707 | "LTCDOWNUSD",
708 | "LTCETH",
709 | "LTCEUR",
710 | "LTCGBP",
711 | "LTCNGN",
712 | "LTCPAX",
713 | "LTCRUB",
714 | "LTCTUSD",
715 | "LTCUPUSD",
716 | "LTCUSD",
717 | "LTOBNB",
718 | "LTOBTC",
719 | "LTOUSD",
720 | "LUNABNB",
721 | "LUNABTC",
722 | "LUNABUSD",
723 | "LUNAEUR",
724 | "LUNAUSD",
725 | "LUNBTC",
726 | "LUNETH",
727 | "MANABTC",
728 | "MANABUSD",
729 | "MANAETH",
730 | "MANAUSD",
731 | "MATICBNB",
732 | "MATICBTC",
733 | "MATICBUSD",
734 | "MATICEUR",
735 | "MATICUSD",
736 | "MBLBNB",
737 | "MBLBTC",
738 | "MBLUSD",
739 | "MCOBNB",
740 | "MCOBTC",
741 | "MCOETH",
742 | "MCOUSD",
743 | "MDABTC",
744 | "MDAETH",
745 | "MDTBNB",
746 | "MDTBTC",
747 | "MDTUSD",
748 | "MFTBNB",
749 | "MFTBTC",
750 | "MFTETH",
751 | "MFTUSD",
752 | "MITHBNB",
753 | "MITHBTC",
754 | "MITHUSD",
755 | "MKRBNB",
756 | "MKRBTC",
757 | "MKRBUSD",
758 | "MKRUSD",
759 | "MODBTC",
760 | "MODETH",
761 | "MTHBTC",
762 | "MTHETH",
763 | "MTLBTC",
764 | "MTLETH",
765 | "MTLUSD",
766 | "NANOBNB",
767 | "NANOBTC",
768 | "NANOBUSD",
769 | "NANOETH",
770 | "NANOUSD",
771 | "NASBNB",
772 | "NASBTC",
773 | "NASETH",
774 | "NAVBNB",
775 | "NAVBTC",
776 | "NAVETH",
777 | "NBSBTC",
778 | "NBSUSD",
779 | "NCASHBNB",
780 | "NCASHBTC",
781 | "NCASHETH",
782 | "NEARBNB",
783 | "NEARBTC",
784 | "NEARBUSD",
785 | "NEARUSD",
786 | "NEBLBNB",
787 | "NEBLBTC",
788 | "NEBLETH",
789 | "NEOBNB",
790 | "NEOBTC",
791 | "NEOBUSD",
792 | "NEOETH",
793 | "NEOPAX",
794 | "NEOTRY",
795 | "NEOTUSD",
796 | "NEOUSD",
797 | "NKNBNB",
798 | "NKNBTC",
799 | "NKNUSD",
800 | "NMRBNB",
801 | "NMRBTC",
802 | "NMRBUSD",
803 | "NMRUSD",
804 | "NPXSBTC",
805 | "NPXSETH",
806 | "NPXSUSD",
807 | "NULSBNB",
808 | "NULSBTC",
809 | "NULSETH",
810 | "NULSUSD",
811 | "NXSBNB",
812 | "NXSBTC",
813 | "NXSETH",
814 | "OAXBTC",
815 | "OAXETH",
816 | "OCEANBNB",
817 | "OCEANBTC",
818 | "OCEANBUSD",
819 | "OCEANUSD",
820 | "OGBTC",
821 | "OGNBNB",
822 | "OGNBTC",
823 | "OGNUSD",
824 | "OGUSD",
825 | "OMBTC",
826 | "OMGBNB",
827 | "OMGBTC",
828 | "OMGBUSD",
829 | "OMGETH",
830 | "OMGUSD",
831 | "OMUSD",
832 | "ONEBIDR",
833 | "ONEBNB",
834 | "ONEBTC",
835 | "ONEBUSD",
836 | "ONEPAX",
837 | "ONEUSD",
838 | "ONGBNB",
839 | "ONGBTC",
840 | "ONGUSD",
841 | "ONTBNB",
842 | "ONTBTC",
843 | "ONTBUSD",
844 | "ONTETH",
845 | "ONTPAX",
846 | "ONTUSD",
847 | "ORNBTC",
848 | "ORNUSD",
849 | "OSTBNB",
850 | "OSTBTC",
851 | "OSTETH",
852 | "OXTBTC",
853 | "OXTUSD",
854 | "PAXBNB",
855 | "PAXBTC",
856 | "PAXBUSD",
857 | "PAXETH",
858 | "PAXGBNB",
859 | "PAXGBTC",
860 | "PAXGBUSD",
861 | "PAXGUSD",
862 | "PAXTUSD",
863 | "PAXUSD",
864 | "PERLBNB",
865 | "PERLBTC",
866 | "PERLUSD",
867 | "PERPBTC",
868 | "PERPBUSD",
869 | "PERPUSD",
870 | "PHABTC",
871 | "PHABUSD",
872 | "PHBBNB",
873 | "PHBBTC",
874 | "PHBPAX",
875 | "PHBTUSD",
876 | "PHXBNB",
877 | "PHXBTC",
878 | "PHXETH",
879 | "PIVXBNB",
880 | "PIVXBTC",
881 | "PIVXETH",
882 | "PNTBTC",
883 | "PNTUSD",
884 | "POABNB",
885 | "POABTC",
886 | "POAETH",
887 | "POEBTC",
888 | "POEETH",
889 | "POLYBNB",
890 | "POLYBTC",
891 | "PONDBTC",
892 | "PONDBUSD",
893 | "PONDUSD",
894 | "POWRBNB",
895 | "POWRBTC",
896 | "POWRETH",
897 | "PPTBTC",
898 | "PPTETH",
899 | "PROMBNB",
900 | "PROMBUSD",
901 | "PROSETH",
902 | "PSGBTC",
903 | "PSGBUSD",
904 | "PSGUSD",
905 | "QKCBTC",
906 | "QKCETH",
907 | "QLCBNB",
908 | "QLCBTC",
909 | "QLCETH",
910 | "QSPBNB",
911 | "QSPBTC",
912 | "QSPETH",
913 | "QTUMBNB",
914 | "QTUMBTC",
915 | "QTUMBUSD",
916 | "QTUMETH",
917 | "QTUMUSD",
918 | "RAMPBTC",
919 | "RAMPBUSD",
920 | "RAMPUSD",
921 | "RCNBNB",
922 | "RCNBTC",
923 | "RCNETH",
924 | "RDNBNB",
925 | "RDNBTC",
926 | "RDNETH",
927 | "REEFBTC",
928 | "REEFBUSD",
929 | "REEFUSD",
930 | "RENBNB",
931 | "RENBTC",
932 | "RENBTCBTC",
933 | "RENBTCETH",
934 | "RENUSD",
935 | "REPBNB",
936 | "REPBTC",
937 | "REPBUSD",
938 | "REPETH",
939 | "REPUSD",
940 | "REQBTC",
941 | "REQETH",
942 | "RIFBTC",
943 | "RIFUSD",
944 | "RLCBNB",
945 | "RLCBTC",
946 | "RLCETH",
947 | "RLCUSD",
948 | "ROSEBTC",
949 | "ROSEBUSD",
950 | "ROSEUSD",
951 | "RPXBNB",
952 | "RPXBTC",
953 | "RPXETH",
954 | "RSRBNB",
955 | "RSRBTC",
956 | "RSRBUSD",
957 | "RSRUSD",
958 | "RUNEBNB",
959 | "RUNEBTC",
960 | "RUNEBUSD",
961 | "RUNEUSD",
962 | "RVNBNB",
963 | "RVNBTC",
964 | "RVNBUSD",
965 | "RVNTRY",
966 | "RVNUSD",
967 | "SALTBTC",
968 | "SALTETH",
969 | "SANDBNB",
970 | "SANDBTC",
971 | "SANDBUSD",
972 | "SANDUSD",
973 | "SCBNB",
974 | "SCBTC",
975 | "SCETH",
976 | "SCRTBTC",
977 | "SCRTETH",
978 | "SCUSD",
979 | "SFPBTC",
980 | "SFPBUSD",
981 | "SFPUSD",
982 | "SKLBTC",
983 | "SKLBUSD",
984 | "SKLUSD",
985 | "SKYBNB",
986 | "SKYBTC",
987 | "SKYETH",
988 | "SLPETH",
989 | "SNGLSBTC",
990 | "SNGLSETH",
991 | "SNMBTC",
992 | "SNMETH",
993 | "SNTBTC",
994 | "SNTETH",
995 | "SNXBNB",
996 | "SNXBTC",
997 | "SNXBUSD",
998 | "SNXUSD",
999 | "SOLBNB",
1000 | "SOLBTC",
1001 | "SOLBUSD",
1002 | "SOLUSD",
1003 | "SPARTABNB",
1004 | "SRMBIDR",
1005 | "SRMBNB",
1006 | "SRMBTC",
1007 | "SRMBUSD",
1008 | "SRMUSD",
1009 | "STEEMBNB",
1010 | "STEEMBTC",
1011 | "STEEMETH",
1012 | "STMXBNB",
1013 | "STMXBTC",
1014 | "STMXETH",
1015 | "STMXUSD",
1016 | "STORJBTC",
1017 | "STORJBUSD",
1018 | "STORJETH",
1019 | "STORJUSD",
1020 | "STORMBNB",
1021 | "STORMBTC",
1022 | "STORMETH",
1023 | "STORMUSD",
1024 | "STPTBNB",
1025 | "STPTBTC",
1026 | "STRATBNB",
1027 | "STRATBTC",
1028 | "STRATBUSD",
1029 | "STRATETH",
1030 | "STRAXBTC",
1031 | "STRAXBUSD",
1032 | "STRAXETH",
1033 | "STRAXUSD",
1034 | "STXBNB",
1035 | "STXBTC",
1036 | "STXUSD",
1037 | "SUBBTC",
1038 | "SUBETH",
1039 | "SUNBTC",
1040 | "SUNUSD",
1041 | "SUPERBTC",
1042 | "SUPERBUSD",
1043 | "SUPERUSD",
1044 | "SUSDBTC",
1045 | "SUSDETH",
1046 | "SUSDUSD",
1047 | "SUSHIBNB",
1048 | "SUSHIBTC",
1049 | "SUSHIBUSD",
1050 | "SUSHIDOWNUSD",
1051 | "SUSHIUPUSD",
1052 | "SUSHIUSD",
1053 | "SWRVBNB",
1054 | "SWRVBUSD",
1055 | "SXPAUD",
1056 | "SXPBIDR",
1057 | "SXPBNB",
1058 | "SXPBTC",
1059 | "SXPBUSD",
1060 | "SXPDOWNUSD",
1061 | "SXPEUR",
1062 | "SXPGBP",
1063 | "SXPTRY",
1064 | "SXPUPUSD",
1065 | "SXPUSD",
1066 | "SYSBNB",
1067 | "SYSBTC",
1068 | "SYSBUSD",
1069 | "SYSETH",
1070 | "TCTBNB",
1071 | "TCTBTC",
1072 | "TCTUSD",
1073 | "TFUELBNB",
1074 | "TFUELBTC",
1075 | "TFUELPAX",
1076 | "TFUELUSD",
1077 | "THETABNB",
1078 | "THETABTC",
1079 | "THETAETH",
1080 | "THETAEUR",
1081 | "THETAUSD",
1082 | "TKOBIDR",
1083 | "TKOBTC",
1084 | "TKOBUSD",
1085 | "TKOUSD",
1086 | "TNBBTC",
1087 | "TNBETH",
1088 | "TNTBTC",
1089 | "TNTETH",
1090 | "TOMOBNB",
1091 | "TOMOBTC",
1092 | "TOMOBUSD",
1093 | "TOMOUSD",
1094 | "TRBBNB",
1095 | "TRBBTC",
1096 | "TRBBUSD",
1097 | "TRBUSD",
1098 | "TRIGBNB",
1099 | "TRIGBTC",
1100 | "TRIGETH",
1101 | "TROYBNB",
1102 | "TROYBTC",
1103 | "TROYUSD",
1104 | "TRUBTC",
1105 | "TRUBUSD",
1106 | "TRUUSD",
1107 | "TRXBNB",
1108 | "TRXBTC",
1109 | "TRXBUSD",
1110 | "TRXDOWNUSD",
1111 | "TRXETH",
1112 | "TRXNGN",
1113 | "TRXPAX",
1114 | "TRXTRY",
1115 | "TRXTUSD",
1116 | "TRXUPUSD",
1117 | "TRXUSD",
1118 | "TRXXRP",
1119 | "TUSDBNB",
1120 | "TUSDBTC",
1121 | "TUSDBTUSD",
1122 | "TUSDBUSD",
1123 | "TUSDETH",
1124 | "TUSDUSD",
1125 | "TVKBTC",
1126 | "TVKBUSD",
1127 | "TWTBTC",
1128 | "TWTBUSD",
1129 | "TWTUSD",
1130 | "UFTBUSD",
1131 | "UFTETH",
1132 | "UMABTC",
1133 | "UMAUSD",
1134 | "UNFIBNB",
1135 | "UNFIBTC",
1136 | "UNFIBUSD",
1137 | "UNFIUSD",
1138 | "UNIBNB",
1139 | "UNIBTC",
1140 | "UNIBUSD",
1141 | "UNIDOWNUSD",
1142 | "UNIEUR",
1143 | "UNIUPUSD",
1144 | "UNIUSD",
1145 | "USDBIDR",
1146 | "USDBKRW",
1147 | "USDBRL",
1148 | "USDBVND",
1149 | "USDDAI",
1150 | "USDIDRT",
1151 | "USDNGN",
1152 | "USDTRY",
1153 | "USDUAH",
1154 | "USDZAR",
1155 | "UTKBTC",
1156 | "UTKUSD",
1157 | "VENBNB",
1158 | "VENBTC",
1159 | "VENETH",
1160 | "VETBNB",
1161 | "VETBTC",
1162 | "VETBUSD",
1163 | "VETETH",
1164 | "VETUSD",
1165 | "VIABNB",
1166 | "VIABTC",
1167 | "VIAETH",
1168 | "VIBBTC",
1169 | "VIBEBTC",
1170 | "VIBEETH",
1171 | "VIBETH",
1172 | "VIDTBTC",
1173 | "VIDTBUSD",
1174 | "VITEBNB",
1175 | "VITEBTC",
1176 | "VITEUSD",
1177 | "VTHOBNB",
1178 | "VTHOBUSD",
1179 | "VTHOUSD",
1180 | "WABIBNB",
1181 | "WABIBTC",
1182 | "WABIETH",
1183 | "WANBNB",
1184 | "WANBTC",
1185 | "WANETH",
1186 | "WANUSD",
1187 | "WAVESBNB",
1188 | "WAVESBTC",
1189 | "WAVESBUSD",
1190 | "WAVESETH",
1191 | "WAVESPAX",
1192 | "WAVESTUSD",
1193 | "WAVESUSD",
1194 | "WBTCBTC",
1195 | "WBTCETH",
1196 | "WINBNB",
1197 | "WINBTC",
1198 | "WINGBNB",
1199 | "WINGBTC",
1200 | "WINGBUSD",
1201 | "WINGSBTC",
1202 | "WINGSETH",
1203 | "WINGUSD",
1204 | "WINTRX",
1205 | "WINUSD",
1206 | "WNXMBNB",
1207 | "WNXMBTC",
1208 | "WNXMBUSD",
1209 | "WNXMUSD",
1210 | "WPRBTC",
1211 | "WPRETH",
1212 | "WRXBNB",
1213 | "WRXBTC",
1214 | "WRXBUSD",
1215 | "WRXUSD",
1216 | "WTCBNB",
1217 | "WTCBTC",
1218 | "WTCETH",
1219 | "WTCUSD",
1220 | "XEMBNB",
1221 | "XEMBTC",
1222 | "XEMETH",
1223 | "XEMUSD",
1224 | "XLMBNB",
1225 | "XLMBTC",
1226 | "XLMBUSD",
1227 | "XLMDOWNUSD",
1228 | "XLMETH",
1229 | "XLMEUR",
1230 | "XLMPAX",
1231 | "XLMTRY",
1232 | "XLMTUSD",
1233 | "XLMUPUSD",
1234 | "XLMUSD",
1235 | "XMRBNB",
1236 | "XMRBTC",
1237 | "XMRBUSD",
1238 | "XMRETH",
1239 | "XMRUSD",
1240 | "XRPAUD",
1241 | "XRPBEARBUSD",
1242 | "XRPBEARUSD",
1243 | "XRPBKRW",
1244 | "XRPBNB",
1245 | "XRPBRL",
1246 | "XRPBTC",
1247 | "XRPBULLBUSD",
1248 | "XRPBULLUSD",
1249 | "XRPBUSD",
1250 | "XRPDOWNUSD",
1251 | "XRPETH",
1252 | "XRPEUR",
1253 | "XRPGBP",
1254 | "XRPNGN",
1255 | "XRPPAX",
1256 | "XRPRUB",
1257 | "XRPTRY",
1258 | "XRPTUSD",
1259 | "XRPUPUSD",
1260 | "XRPUSD",
1261 | "XTZBNB",
1262 | "XTZBTC",
1263 | "XTZBUSD",
1264 | "XTZDOWNUSD",
1265 | "XTZUPUSD",
1266 | "XTZUSD",
1267 | "XVGBTC",
1268 | "XVGBUSD",
1269 | "XVGETH",
1270 | "XVSBNB",
1271 | "XVSBTC",
1272 | "XVSBUSD",
1273 | "XVSUSD",
1274 | "XZCBNB",
1275 | "XZCBTC",
1276 | "XZCETH",
1277 | "XZCUSD",
1278 | "XZCXRP",
1279 | "YFIBNB",
1280 | "YFIBTC",
1281 | "YFIBUSD",
1282 | "YFIDOWNUSD",
1283 | "YFIEUR",
1284 | "YFIIBNB",
1285 | "YFIIBTC",
1286 | "YFIIBUSD",
1287 | "YFIIUSD",
1288 | "YFIUPUSD",
1289 | "YFIUSD",
1290 | "YOYOBNB",
1291 | "YOYOBTC",
1292 | "YOYOETH",
1293 | "ZECBNB",
1294 | "ZECBTC",
1295 | "ZECBUSD",
1296 | "ZECETH",
1297 | "ZECPAX",
1298 | "ZECTUSD",
1299 | "ZECUSD",
1300 | "ZENBNB",
1301 | "ZENBTC",
1302 | "ZENETH",
1303 | "ZENUSD",
1304 | "ZILBIDR",
1305 | "ZILBNB",
1306 | "ZILBTC",
1307 | "ZILBUSD",
1308 | "ZILETH",
1309 | "ZILUSD",
1310 | "ZRXBNB",
1311 | "ZRXBTC",
1312 | "ZRXBUSD",
1313 | "ZRXETH",
1314 | "ZRXUSD",
1315 | "SHIBUSD",
1316 | "SHIBTRY",
1317 | "SHIBEUR",
1318 | "SHIBBUSD"
1319 | ]
1320 |
--------------------------------------------------------------------------------
/src/utils/forex.json:
--------------------------------------------------------------------------------
1 | [
2 | "AEDAUD",
3 | "AEDBHD",
4 | "AEDCAD",
5 | "AEDCHF",
6 | "AEDDKK",
7 | "AEDEUR",
8 | "AEDGBP",
9 | "AEDINR",
10 | "AEDJPY",
11 | "AEDNOK",
12 | "AEDNZD",
13 | "AEDPKR",
14 | "AEDSAR",
15 | "AEDSEK",
16 | "AEDUSD",
17 | "AEDZAR",
18 | "AFNGBP",
19 | "ALLEUR",
20 | "ALLGBP",
21 | "ALLUSD",
22 | "AMDGBP",
23 | "ARECHF",
24 | "AREUSD",
25 | "ARSAUD",
26 | "ARSBRL",
27 | "ARSCAD",
28 | "ARSCHF",
29 | "ARSCLP",
30 | "ARSCOP",
31 | "ARSEUR",
32 | "ARSGBP",
33 | "ARSHKD",
34 | "ARSHUF",
35 | "ARSJPY",
36 | "ARSMXN",
37 | "ARSPEN",
38 | "ARSSGD",
39 | "ARSUSD",
40 | "ARSZAR",
41 | "AUDAED",
42 | "AUDARS",
43 | "AUDBGN",
44 | "AUDBRL",
45 | "AUDCAD",
46 | "AUDCHF",
47 | "AUDCLP",
48 | "AUDCNH",
49 | "AUDCNY",
50 | "AUDCZK",
51 | "AUDDKK",
52 | "AUDEUR",
53 | "AUDFJD",
54 | "AUDGBP",
55 | "AUDHKD",
56 | "AUDHRK",
57 | "AUDHUF",
58 | "AUDIDR",
59 | "AUDILS",
60 | "AUDINR",
61 | "AUDJPY",
62 | "AUDKRW",
63 | "AUDLTL",
64 | "AUDMAD",
65 | "AUDMXN",
66 | "AUDMYR",
67 | "AUDNOK",
68 | "AUDNZD",
69 | "AUDPGK",
70 | "AUDPHP",
71 | "AUDPKR",
72 | "AUDPLN",
73 | "AUDRUB",
74 | "AUDSEK",
75 | "AUDSGD",
76 | "AUDTHB",
77 | "AUDTRY",
78 | "AUDTWD",
79 | "AUDUSD",
80 | "AUDZAR",
81 | "AUNCHF",
82 | "AUNUSD",
83 | "AWGGBP",
84 | "AWGUSD",
85 | "BAMGBP",
86 | "BAMUSD",
87 | "BBDEUR",
88 | "BBDGBP",
89 | "BBDUSD",
90 | "BDTGBP",
91 | "BDTJPY",
92 | "BDTUSD",
93 | "BGNAUD",
94 | "BGNCAD",
95 | "BGNCNY",
96 | "BGNDKK",
97 | "BGNPLN",
98 | "BGNUSD",
99 | "BHDEUR",
100 | "BHDPKR",
101 | "BHDUSD",
102 | "BIFUSD",
103 | "BMDBBD",
104 | "BMDCAD",
105 | "BMDEUR",
106 | "BMDGBP",
107 | "BMDKYD",
108 | "BNDGBP",
109 | "BNDUSD",
110 | "BOBGBP",
111 | "BOBUSD",
112 | "BRICHF",
113 | "BRIUSD",
114 | "BRLARS",
115 | "BRLAUD",
116 | "BRLCAD",
117 | "BRLCHF",
118 | "BRLCLP",
119 | "BRLCOP",
120 | "BRLEUR",
121 | "BRLHKD",
122 | "BRLJPY",
123 | "BRLKRW",
124 | "BRLMXN",
125 | "BRLPEN",
126 | "BRLRSD",
127 | "BRLRUB",
128 | "BRLSEK",
129 | "BRLSGD",
130 | "BRLUSD",
131 | "BRLZAR",
132 | "BSDGBP",
133 | "BSDUSD",
134 | "BTNGBP",
135 | "BWPCHF",
136 | "BWPEUR",
137 | "BWPGBP",
138 | "BWPJPY",
139 | "BWPUSD",
140 | "BWPZAR",
141 | "BZDUSD",
142 | "CADAED",
143 | "CADARS",
144 | "CADAUD",
145 | "CADBGN",
146 | "CADBMD",
147 | "CADBRL",
148 | "CADCHF",
149 | "CADCNY",
150 | "CADCOP",
151 | "CADCZK",
152 | "CADDKK",
153 | "CADEUR",
154 | "CADGBP",
155 | "CADHKD",
156 | "CADHRK",
157 | "CADHUF",
158 | "CADIDR",
159 | "CADILS",
160 | "CADINR",
161 | "CADISK",
162 | "CADJPY",
163 | "CADKRW",
164 | "CADKWD",
165 | "CADKYD",
166 | "CADMXN",
167 | "CADMYR",
168 | "CADNOK",
169 | "CADNZD",
170 | "CADPEN",
171 | "CADPKR",
172 | "CADPLN",
173 | "CADRUB",
174 | "CADSAR",
175 | "CADSEK",
176 | "CADSGD",
177 | "CADTHB",
178 | "CADTRY",
179 | "CADTWD",
180 | "CADUSD",
181 | "CADVND",
182 | "CADZAR",
183 | "CDFGBP",
184 | "CDFUSD",
185 | "CHFAED",
186 | "CHFARS",
187 | "CHFAUD",
188 | "CHFBGN",
189 | "CHFBRL",
190 | "CHFBWP",
191 | "CHFCAD",
192 | "CHFCLP",
193 | "CHFCNY",
194 | "CHFCZK",
195 | "CHFDKK",
196 | "CHFEUR",
197 | "CHFGBP",
198 | "CHFHKD",
199 | "CHFHUF",
200 | "CHFIDR",
201 | "CHFILS",
202 | "CHFINR",
203 | "CHFISK",
204 | "CHFJPY",
205 | "CHFKRW",
206 | "CHFMXN",
207 | "CHFMYR",
208 | "CHFNOK",
209 | "CHFNZD",
210 | "CHFPKR",
211 | "CHFPLN",
212 | "CHFRON",
213 | "CHFRSD",
214 | "CHFRUB",
215 | "CHFSEK",
216 | "CHFSGD",
217 | "CHFSZL",
218 | "CHFTHB",
219 | "CHFTRY",
220 | "CHFTWD",
221 | "CHFUSD",
222 | "CHFUZS",
223 | "CHFZAR",
224 | "CLPARS",
225 | "CLPAUD",
226 | "CLPBRL",
227 | "CLPCHF",
228 | "CLPCNY",
229 | "CLPCOP",
230 | "CLPEUR",
231 | "CLPGBP",
232 | "CLPMXN",
233 | "CLPPEN",
234 | "CLPUSD",
235 | "CNHHKD",
236 | "CNHJPY",
237 | "CNHUSD",
238 | "CNYAUD",
239 | "CNYBGN",
240 | "CNYCAD",
241 | "CNYCHF",
242 | "CNYCLP",
243 | "CNYDKK",
244 | "CNYEUR",
245 | "CNYGBP",
246 | "CNYHKD",
247 | "CNYINR",
248 | "CNYJPY",
249 | "CNYKRW",
250 | "CNYNZD",
251 | "CNYPLN",
252 | "CNYSGD",
253 | "CNYUSD",
254 | "CNYZAR",
255 | "COPARS",
256 | "COPBRL",
257 | "COPCAD",
258 | "COPCLP",
259 | "COPDKK",
260 | "COPMXN",
261 | "COPPLN",
262 | "COPUSD",
263 | "COPZAR",
264 | "CRCGBP",
265 | "CRCUSD",
266 | "CUPUSD",
267 | "CYPZAR",
268 | "CZKCAD",
269 | "CZKCHF",
270 | "CZKDKK",
271 | "CZKEUR",
272 | "CZKJPY",
273 | "CZKMXN",
274 | "CZKNOK",
275 | "CZKPLN",
276 | "CZKSEK",
277 | "CZKUSD",
278 | "CZKZAR",
279 | "DJFGBP",
280 | "DKKAED",
281 | "DKKAUD",
282 | "DKKBGN",
283 | "DKKCAD",
284 | "DKKCHF",
285 | "DKKCNY",
286 | "DKKCOP",
287 | "DKKCZK",
288 | "DKKEUR",
289 | "DKKGBP",
290 | "DKKHKD",
291 | "DKKHUF",
292 | "DKKINR",
293 | "DKKISK",
294 | "DKKJPY",
295 | "DKKMXN",
296 | "DKKMYR",
297 | "DKKNOK",
298 | "DKKNZD",
299 | "DKKPHP",
300 | "DKKPKR",
301 | "DKKPLN",
302 | "DKKRUB",
303 | "DKKSEK",
304 | "DKKSGD",
305 | "DKKTHB",
306 | "DKKTRY",
307 | "DKKTWD",
308 | "DKKUAH",
309 | "DKKUSD",
310 | "DKKZAR",
311 | "DOECHF",
312 | "DOEUSD",
313 | "DOPGBP",
314 | "DOPUSD",
315 | "DZDEUR",
316 | "DZDUSD",
317 | "EGPEUR",
318 | "EGPJPY",
319 | "EGPPKR",
320 | "EGPUSD",
321 | "EGPZAR",
322 | "ETBGBP",
323 | "ETBUSD",
324 | "EURAED",
325 | "EURAFN",
326 | "EURALL",
327 | "EURAMD",
328 | "EURARS",
329 | "EURAUD",
330 | "EURBBD",
331 | "EURBDT",
332 | "EURBGN",
333 | "EURBHD",
334 | "EURBIF",
335 | "EURBMD",
336 | "EURBND",
337 | "EURBOB",
338 | "EURBRL",
339 | "EURBSD",
340 | "EURBTN",
341 | "EURBWP",
342 | "EURBYR",
343 | "EURBZD",
344 | "EURCAD",
345 | "EURCDF",
346 | "EURCHF",
347 | "EURCLP",
348 | "EURCNH",
349 | "EURCNY",
350 | "EURCOP",
351 | "EURCRC",
352 | "EURCUP",
353 | "EURCZK",
354 | "EURDJF",
355 | "EURDKK",
356 | "EURDOP",
357 | "EURDZD",
358 | "EUREGP",
359 | "EURETB",
360 | "EURFJD",
361 | "EURGBP",
362 | "EURGHS",
363 | "EURGNF",
364 | "EURGTQ",
365 | "EURGYD",
366 | "EURHKD",
367 | "EURHNL",
368 | "EURHRK",
369 | "EURHTG",
370 | "EURHUF",
371 | "EURIDR",
372 | "EURILS",
373 | "EURINR",
374 | "EURIQD",
375 | "EURISK",
376 | "EURJMD",
377 | "EURJOD",
378 | "EURJPY",
379 | "EURKES",
380 | "EURKHR",
381 | "EURKRW",
382 | "EURKWD",
383 | "EURKYD",
384 | "EURKZT",
385 | "EURLAK",
386 | "EURLBP",
387 | "EURLKR",
388 | "EURLRD",
389 | "EURLSL",
390 | "EURLYD",
391 | "EURMAD",
392 | "EURMDL",
393 | "EURMGA",
394 | "EURMKD",
395 | "EURMMK",
396 | "EURMOP",
397 | "EURMRO",
398 | "EURMUR",
399 | "EURMVR",
400 | "EURMWK",
401 | "EURMXN",
402 | "EURMYR",
403 | "EURMZN",
404 | "EURNAD",
405 | "EURNGN",
406 | "EURNIO",
407 | "EURNOK",
408 | "EURNPR",
409 | "EURNZD",
410 | "EUROMR",
411 | "EURPAB",
412 | "EURPEN",
413 | "EURPGK",
414 | "EURPHP",
415 | "EURPKR",
416 | "EURPLN",
417 | "EURPYG",
418 | "EURQAR",
419 | "EURRON",
420 | "EURRSD",
421 | "EURRUB",
422 | "EURRWF",
423 | "EURSAR",
424 | "EURSCR",
425 | "EURSDD",
426 | "EURSDG",
427 | "EURSEK",
428 | "EURSGD",
429 | "EURSLL",
430 | "EURSOS",
431 | "EURSVC",
432 | "EURSZL",
433 | "EURTHB",
434 | "EURTJS",
435 | "EURTND",
436 | "EURTRY",
437 | "EURTTD",
438 | "EURTWD",
439 | "EURTZS",
440 | "EURUAH",
441 | "EURUGX",
442 | "EURUSD",
443 | "EURUYU",
444 | "EURUZS",
445 | "EURVEF",
446 | "EURVND",
447 | "EURYER",
448 | "EURZAR",
449 | "EURZMW",
450 | "FJDGBP",
451 | "FJDUSD",
452 | "FRNCHF",
453 | "GBPAED",
454 | "GBPAFN",
455 | "GBPALL",
456 | "GBPAMD",
457 | "GBPARS",
458 | "GBPAUD",
459 | "GBPAWG",
460 | "GBPBAM",
461 | "GBPBBD",
462 | "GBPBDT",
463 | "GBPBGN",
464 | "GBPBHD",
465 | "GBPBIF",
466 | "GBPBMD",
467 | "GBPBND",
468 | "GBPBOB",
469 | "GBPBRL",
470 | "GBPBSD",
471 | "GBPBTN",
472 | "GBPBWP",
473 | "GBPBYR",
474 | "GBPBZD",
475 | "GBPCAD",
476 | "GBPCDF",
477 | "GBPCHF",
478 | "GBPCLP",
479 | "GBPCNH",
480 | "GBPCNY",
481 | "GBPCOP",
482 | "GBPCRC",
483 | "GBPCUP",
484 | "GBPCZK",
485 | "GBPDJF",
486 | "GBPDKK",
487 | "GBPDOP",
488 | "GBPDZD",
489 | "GBPEGP",
490 | "GBPETB",
491 | "GBPEUR",
492 | "GBPFJD",
493 | "GBPGHS",
494 | "GBPGNF",
495 | "GBPGTQ",
496 | "GBPGYD",
497 | "GBPHKD",
498 | "GBPHNL",
499 | "GBPHRK",
500 | "GBPHTG",
501 | "GBPHUF",
502 | "GBPIDR",
503 | "GBPILS",
504 | "GBPINR",
505 | "GBPIQD",
506 | "GBPISK",
507 | "GBPJMD",
508 | "GBPJOD",
509 | "GBPJPY",
510 | "GBPKES",
511 | "GBPKHR",
512 | "GBPKMF",
513 | "GBPKRW",
514 | "GBPKWD",
515 | "GBPKYD",
516 | "GBPKZT",
517 | "GBPLAK",
518 | "GBPLBP",
519 | "GBPLKR",
520 | "GBPLRD",
521 | "GBPLSL",
522 | "GBPLYD",
523 | "GBPMAD",
524 | "GBPMDL",
525 | "GBPMGA",
526 | "GBPMKD",
527 | "GBPMMK",
528 | "GBPMOP",
529 | "GBPMRO",
530 | "GBPMUR",
531 | "GBPMVR",
532 | "GBPMWK",
533 | "GBPMXN",
534 | "GBPMYR",
535 | "GBPMZN",
536 | "GBPNAD",
537 | "GBPNGN",
538 | "GBPNIO",
539 | "GBPNOK",
540 | "GBPNPR",
541 | "GBPNZD",
542 | "GBPOMR",
543 | "GBPPAB",
544 | "GBPPEN",
545 | "GBPPGK",
546 | "GBPPHP",
547 | "GBPPKR",
548 | "GBPPLN",
549 | "GBPPYG",
550 | "GBPQAR",
551 | "GBPRON",
552 | "GBPRSD",
553 | "GBPRUB",
554 | "GBPRWF",
555 | "GBPSAR",
556 | "GBPSCR",
557 | "GBPSDD",
558 | "GBPSDG",
559 | "GBPSEK",
560 | "GBPSGD",
561 | "GBPSHP",
562 | "GBPSLL",
563 | "GBPSOS",
564 | "GBPSVC",
565 | "GBPSZL",
566 | "GBPTHB",
567 | "GBPTND",
568 | "GBPTRY",
569 | "GBPTTD",
570 | "GBPTWD",
571 | "GBPTZS",
572 | "GBPUAH",
573 | "GBPUGX",
574 | "GBPUSD",
575 | "GBPUYU",
576 | "GBPUZS",
577 | "GBPVEF",
578 | "GBPVND",
579 | "GBPXCD",
580 | "GBPXPF",
581 | "GBPYER",
582 | "GBPZAR",
583 | "GBPZMW",
584 | "GHSEUR",
585 | "GHSGBP",
586 | "GHSUSD",
587 | "GHSZAR",
588 | "GNFGBP",
589 | "GNFUSD",
590 | "GTQGBP",
591 | "GTQUSD",
592 | "GYDGBP",
593 | "GYDUSD",
594 | "HKDARS",
595 | "HKDAUD",
596 | "HKDBRL",
597 | "HKDCAD",
598 | "HKDCHF",
599 | "HKDCNY",
600 | "HKDDKK",
601 | "HKDEUR",
602 | "HKDGBP",
603 | "HKDIDR",
604 | "HKDINR",
605 | "HKDJPY",
606 | "HKDKRW",
607 | "HKDMXN",
608 | "HKDMYR",
609 | "HKDNZD",
610 | "HKDPKR",
611 | "HKDPLN",
612 | "HKDSEK",
613 | "HKDSGD",
614 | "HKDTHB",
615 | "HKDTWD",
616 | "HKDUSD",
617 | "HKDZAR",
618 | "HNLGBP",
619 | "HNLUSD",
620 | "HRKAUD",
621 | "HRKCAD",
622 | "HRKEUR",
623 | "HRKPLN",
624 | "HRKUSD",
625 | "HTGGBP",
626 | "HTGUSD",
627 | "HUFARS",
628 | "HUFCAD",
629 | "HUFCHF",
630 | "HUFDKK",
631 | "HUFEUR",
632 | "HUFJPY",
633 | "HUFPLN",
634 | "HUFUSD",
635 | "HUFZAR",
636 | "IDRAUD",
637 | "IDRCAD",
638 | "IDRCHF",
639 | "IDRCNY",
640 | "IDREUR",
641 | "IDRGBP",
642 | "IDRHKD",
643 | "IDRINR",
644 | "IDRJPY",
645 | "IDRKRW",
646 | "IDRMYR",
647 | "IDRNZD",
648 | "IDRSGD",
649 | "IDRTHB",
650 | "IDRTWD",
651 | "IDRUSD",
652 | "IDRZAR",
653 | "ILSAED",
654 | "ILSAUD",
655 | "ILSCAD",
656 | "ILSCHF",
657 | "ILSEUR",
658 | "ILSJOD",
659 | "ILSJPY",
660 | "ILSNOK",
661 | "ILSPLN",
662 | "ILSSEK",
663 | "ILSUSD",
664 | "ILSZAR",
665 | "INRAUD",
666 | "INRCAD",
667 | "INRCHF",
668 | "INRCNY",
669 | "INREUR",
670 | "INRGBP",
671 | "INRHKD",
672 | "INRJPY",
673 | "INRKRW",
674 | "INRMYR",
675 | "INRNZD",
676 | "INRPKR",
677 | "INRSEK",
678 | "INRSGD",
679 | "INRTHB",
680 | "INRTWD",
681 | "INRUSD",
682 | "INRZAR",
683 | "IQDGBP",
684 | "IQDUSD",
685 | "ISKCHF",
686 | "ISKUSD",
687 | "JMDGBP",
688 | "JMDUSD",
689 | "JODAED",
690 | "JODILS",
691 | "JODUSD",
692 | "JPYAED",
693 | "JPYARS",
694 | "JPYAUD",
695 | "JPYBRL",
696 | "JPYBWP",
697 | "JPYCAD",
698 | "JPYCHF",
699 | "JPYCLP",
700 | "JPYCNY",
701 | "JPYCZK",
702 | "JPYDKK",
703 | "JPYEUR",
704 | "JPYGBP",
705 | "JPYHKD",
706 | "JPYIDR",
707 | "JPYILS",
708 | "JPYINR",
709 | "JPYISK",
710 | "JPYKRW",
711 | "JPYMXN",
712 | "JPYMYR",
713 | "JPYNOK",
714 | "JPYNZD",
715 | "JPYPKR",
716 | "JPYPLN",
717 | "JPYRSD",
718 | "JPYRUB",
719 | "JPYSAR",
720 | "JPYSEK",
721 | "JPYTHB",
722 | "JPYTWD",
723 | "JPYUSD",
724 | "JPYZAR",
725 | "KESEUR",
726 | "KESUSD",
727 | "KESZAR",
728 | "KHRGBP",
729 | "KMFGBP",
730 | "KMFUSD",
731 | "KRUCHF",
732 | "KRUUSD",
733 | "KRWAUD",
734 | "KRWBRL",
735 | "KRWCAD",
736 | "KRWCHF",
737 | "KRWCNY",
738 | "KRWEUR",
739 | "KRWGBP",
740 | "KRWHKD",
741 | "KRWIDR",
742 | "KRWINR",
743 | "KRWJPY",
744 | "KRWMYR",
745 | "KRWNZD",
746 | "KRWRUB",
747 | "KRWSEK",
748 | "KRWSGD",
749 | "KRWTHB",
750 | "KRWTWD",
751 | "KRWUSD",
752 | "KRWZAR",
753 | "KWDAED",
754 | "KWDEUR",
755 | "KWDGBP",
756 | "KWDPKR",
757 | "KWDUSD",
758 | "KYDBMD",
759 | "KYDCAD",
760 | "KYDEUR",
761 | "KYDGBP",
762 | "KYDUSD",
763 | "KZTGBP",
764 | "KZTUSD",
765 | "LBPUSD",
766 | "LKRGBP",
767 | "LKRUSD",
768 | "LKRZAR",
769 | "LRDGBP",
770 | "LRDUSD",
771 | "LSLGBP",
772 | "LSLUSD",
773 | "LTLAUD",
774 | "LTLPLN",
775 | "LYDGBP",
776 | "LYDUSD",
777 | "M5PCHF",
778 | "M5PUSD",
779 | "MADAUD",
780 | "MADGBP",
781 | "MADUSD",
782 | "MADZAR",
783 | "MALCHF",
784 | "MALUSD",
785 | "MDLEUR",
786 | "MDLGBP",
787 | "MDLUSD",
788 | "MGAGBP",
789 | "MGAUSD",
790 | "MKDGBP",
791 | "MKDUSD",
792 | "MMKGBP",
793 | "MMKUSD",
794 | "MOPUSD",
795 | "MROUSD",
796 | "MUREUR",
797 | "MURGBP",
798 | "MURUSD",
799 | "MVRUSD",
800 | "MWKGBP",
801 | "MWKUSD",
802 | "MWKZAR",
803 | "MXNARS",
804 | "MXNAUD",
805 | "MXNBRL",
806 | "MXNCAD",
807 | "MXNCHF",
808 | "MXNCLP",
809 | "MXNCOP",
810 | "MXNCZK",
811 | "MXNDKK",
812 | "MXNEUR",
813 | "MXNGBP",
814 | "MXNHKD",
815 | "MXNJPY",
816 | "MXNPEN",
817 | "MXNPLN",
818 | "MXNRUB",
819 | "MXNSGD",
820 | "MXNUSD",
821 | "MXNZAR",
822 | "MYRAUD",
823 | "MYRCAD",
824 | "MYRCHF",
825 | "MYRCNY",
826 | "MYRDKK",
827 | "MYREUR",
828 | "MYRGBP",
829 | "MYRHKD",
830 | "MYRIDR",
831 | "MYRINR",
832 | "MYRJPY",
833 | "MYRKRW",
834 | "MYRNZD",
835 | "MYRPKR",
836 | "MYRSGD",
837 | "MYRTHB",
838 | "MYRTWD",
839 | "MYRUSD",
840 | "MYRZAR",
841 | "MZNGBP",
842 | "MZNUSD",
843 | "NADUSD",
844 | "NADZAR",
845 | "NBLCHF",
846 | "NBLUSD",
847 | "NGNGBP",
848 | "NGNJPY",
849 | "NGNUSD",
850 | "NGNZAR",
851 | "NIOGBP",
852 | "NIOUSD",
853 | "NOKAED",
854 | "NOKCHF",
855 | "NOKDKK",
856 | "NOKEUR",
857 | "NOKGBP",
858 | "NOKILS",
859 | "NOKINR",
860 | "NOKISK",
861 | "NOKJPY",
862 | "NOKPLN",
863 | "NOKRUB",
864 | "NOKSEK",
865 | "NOKUSD",
866 | "NOKZAR",
867 | "NPRGBP",
868 | "NPRUSD",
869 | "NSOCHF",
870 | "NSOUSD",
871 | "NZDAED",
872 | "NZDAUD",
873 | "NZDCAD",
874 | "NZDCHF",
875 | "NZDCNY",
876 | "NZDCZK",
877 | "NZDDKK",
878 | "NZDEUR",
879 | "NZDGBP",
880 | "NZDHKD",
881 | "NZDHUF",
882 | "NZDIDR",
883 | "NZDINR",
884 | "NZDJPY",
885 | "NZDKRW",
886 | "NZDMXN",
887 | "NZDMYR",
888 | "NZDNOK",
889 | "NZDPHP",
890 | "NZDPKR",
891 | "NZDPLN",
892 | "NZDSEK",
893 | "NZDSGD",
894 | "NZDTHB",
895 | "NZDTRY",
896 | "NZDTWD",
897 | "NZDUSD",
898 | "NZDZAR",
899 | "OMRAED",
900 | "OMRGBP",
901 | "OMRPKR",
902 | "OMRUSD",
903 | "OMRZAR",
904 | "OSOCHF",
905 | "OSOUSD",
906 | "PABUSD",
907 | "PENARS",
908 | "PENBRL",
909 | "PENCAD",
910 | "PENCLP",
911 | "PENCOP",
912 | "PENEUR",
913 | "PENGBP",
914 | "PENMXN",
915 | "PENUSD",
916 | "PGKAUD",
917 | "PGKGBP",
918 | "PGKUSD",
919 | "PHPAUD",
920 | "PHPDKK",
921 | "PHPGBP",
922 | "PHPJPY",
923 | "PHPNZD",
924 | "PHPUSD",
925 | "PKREUR",
926 | "PKRGBP",
927 | "PKRJPY",
928 | "PKRUSD",
929 | "PKRZAR",
930 | "PLNCHF",
931 | "PLNCOP",
932 | "PLNCZK",
933 | "PLNDKK",
934 | "PLNEUR",
935 | "PLNGBP",
936 | "PLNHUF",
937 | "PLNILS",
938 | "PLNJPY",
939 | "PLNMXN",
940 | "PLNNOK",
941 | "PLNRUB",
942 | "PLNSEK",
943 | "PLNUSD",
944 | "PYGUSD",
945 | "PYGZAR",
946 | "QARAED",
947 | "QARGBP",
948 | "QARPKR",
949 | "QARUSD",
950 | "QARZAR",
951 | "RONCHF",
952 | "RONGBP",
953 | "RONPLN",
954 | "RONUSD",
955 | "RONZAR",
956 | "RSDGBP",
957 | "RSDUSD",
958 | "RUBAUD",
959 | "RUBCAD",
960 | "RUBCHF",
961 | "RUBDKK",
962 | "RUBEUR",
963 | "RUBGBP",
964 | "RUBJPY",
965 | "RUBKRW",
966 | "RUBMXN",
967 | "RUBNOK",
968 | "RUBPLN",
969 | "RUBSEK",
970 | "RUBUSD",
971 | "RUBZAR",
972 | "RWFGBP",
973 | "RWFUSD",
974 | "RWFZAR",
975 | "SAREUR",
976 | "SARJPY",
977 | "SARKWD",
978 | "SARPKR",
979 | "SARUSD",
980 | "SCRGBP",
981 | "SCRUSD",
982 | "SDDGBP",
983 | "SDDUSD",
984 | "SDGGBP",
985 | "SDGUSD",
986 | "SEKAUD",
987 | "SEKCAD",
988 | "SEKCHF",
989 | "SEKCZK",
990 | "SEKDKK",
991 | "SEKEUR",
992 | "SEKGBP",
993 | "SEKILS",
994 | "SEKINR",
995 | "SEKISK",
996 | "SEKJPY",
997 | "SEKNOK",
998 | "SEKPLN",
999 | "SEKRUB",
1000 | "SEKUSD",
1001 | "SEKZAR",
1002 | "SGDAED",
1003 | "SGDARS",
1004 | "SGDAUD",
1005 | "SGDBRL",
1006 | "SGDCAD",
1007 | "SGDCHF",
1008 | "SGDCNY",
1009 | "SGDDKK",
1010 | "SGDEUR",
1011 | "SGDGBP",
1012 | "SGDHKD",
1013 | "SGDIDR",
1014 | "SGDINR",
1015 | "SGDJPY",
1016 | "SGDKRW",
1017 | "SGDMXN",
1018 | "SGDMYR",
1019 | "SGDNOK",
1020 | "SGDNZD",
1021 | "SGDPKR",
1022 | "SGDPLN",
1023 | "SGDSEK",
1024 | "SGDTHB",
1025 | "SGDTRY",
1026 | "SGDTWD",
1027 | "SGDUSD",
1028 | "SGDZAR",
1029 | "SHPGBP",
1030 | "SHPUSD",
1031 | "SLLGBP",
1032 | "SLLUSD",
1033 | "SOSGBP",
1034 | "SOSUSD",
1035 | "SVCGBP",
1036 | "SVCUSD",
1037 | "SZLCHF",
1038 | "SZLEUR",
1039 | "SZLGBP",
1040 | "SZLUSD",
1041 | "SZLZAR",
1042 | "THBAUD",
1043 | "THBCAD",
1044 | "THBCHF",
1045 | "THBCNY",
1046 | "THBEUR",
1047 | "THBGBP",
1048 | "THBHKD",
1049 | "THBIDR",
1050 | "THBINR",
1051 | "THBJPY",
1052 | "THBKRW",
1053 | "THBMYR",
1054 | "THBNZD",
1055 | "THBPKR",
1056 | "THBSGD",
1057 | "THBTWD",
1058 | "THBUSD",
1059 | "THBZAR",
1060 | "TJSUSD",
1061 | "TMTUSD",
1062 | "TNDGBP",
1063 | "TNDUSD",
1064 | "TNDZAR",
1065 | "TRYCHF",
1066 | "TRYDKK",
1067 | "TRYJPY",
1068 | "TRYPLN",
1069 | "TRYSGD",
1070 | "TRYUSD",
1071 | "TRYZAR",
1072 | "TTDGBP",
1073 | "TTDUSD",
1074 | "TWDAUD",
1075 | "TWDCAD",
1076 | "TWDCHF",
1077 | "TWDCNY",
1078 | "TWDDKK",
1079 | "TWDEUR",
1080 | "TWDGBP",
1081 | "TWDHKD",
1082 | "TWDIDR",
1083 | "TWDINR",
1084 | "TWDJPY",
1085 | "TWDKRW",
1086 | "TWDMYR",
1087 | "TWDNZD",
1088 | "TWDPKR",
1089 | "TWDSEK",
1090 | "TWDSGD",
1091 | "TWDTHB",
1092 | "TWDUSD",
1093 | "TWDZAR",
1094 | "TZSGBP",
1095 | "TZSUSD",
1096 | "TZSZAR",
1097 | "UAHDKK",
1098 | "UAHPLN",
1099 | "UAHUSD",
1100 | "UGXZAR",
1101 | "USDAED",
1102 | "USDALL",
1103 | "USDARS",
1104 | "USDAUD",
1105 | "USDAWG",
1106 | "USDBAM",
1107 | "USDBBD",
1108 | "USDBDT",
1109 | "USDBGN",
1110 | "USDBHD",
1111 | "USDBIF",
1112 | "USDBND",
1113 | "USDBOB",
1114 | "USDBRL",
1115 | "USDBSD",
1116 | "USDBWP",
1117 | "USDBYR",
1118 | "USDBZD",
1119 | "USDCAD",
1120 | "USDCDF",
1121 | "USDCHF",
1122 | "USDCLP",
1123 | "USDCNH",
1124 | "USDCNY",
1125 | "USDCOP",
1126 | "USDCRC",
1127 | "USDCUP",
1128 | "USDCVE",
1129 | "USDCZK",
1130 | "USDDJF",
1131 | "USDDKK",
1132 | "USDDOP",
1133 | "USDDZD",
1134 | "USDEGP",
1135 | "USDETB",
1136 | "USDEUR",
1137 | "USDFJD",
1138 | "USDGBP",
1139 | "USDGHS",
1140 | "USDGMD",
1141 | "USDGNF",
1142 | "USDGTQ",
1143 | "USDGYD",
1144 | "USDHKD",
1145 | "USDHNL",
1146 | "USDHRK",
1147 | "USDHTG",
1148 | "USDHUF",
1149 | "USDIDR",
1150 | "USDILS",
1151 | "USDINR",
1152 | "USDIQD",
1153 | "USDISK",
1154 | "USDJMD",
1155 | "USDJOD",
1156 | "USDJPY",
1157 | "USDKES",
1158 | "USDKHR",
1159 | "USDKMF",
1160 | "USDKRW",
1161 | "USDKWD",
1162 | "USDKYD",
1163 | "USDKZT",
1164 | "USDLAK",
1165 | "USDLBP",
1166 | "USDLKR",
1167 | "USDLRD",
1168 | "USDLSL",
1169 | "USDLYD",
1170 | "USDMAD",
1171 | "USDMDL",
1172 | "USDMGA",
1173 | "USDMKD",
1174 | "USDMMK",
1175 | "USDMOP",
1176 | "USDMRO",
1177 | "USDMUR",
1178 | "USDMVR",
1179 | "USDMWK",
1180 | "USDMXN",
1181 | "USDMYR",
1182 | "USDMZN",
1183 | "USDNAD",
1184 | "USDNGN",
1185 | "USDNIO",
1186 | "USDNOK",
1187 | "USDNPR",
1188 | "USDNZD",
1189 | "USDOMR",
1190 | "USDPAB",
1191 | "USDPEN",
1192 | "USDPGK",
1193 | "USDPHP",
1194 | "USDPKR",
1195 | "USDPLN",
1196 | "USDPYG",
1197 | "USDQAR",
1198 | "USDRON",
1199 | "USDRSD",
1200 | "USDRUB",
1201 | "USDRWF",
1202 | "USDSAR",
1203 | "USDSCR",
1204 | "USDSDD",
1205 | "USDSDG",
1206 | "USDSEK",
1207 | "USDSGD",
1208 | "USDSHP",
1209 | "USDSKK",
1210 | "USDSLL",
1211 | "USDSOS",
1212 | "USDSTD",
1213 | "USDSVC",
1214 | "USDSZL",
1215 | "USDTHB",
1216 | "USDTJS",
1217 | "USDTMT",
1218 | "USDTND",
1219 | "USDTRY",
1220 | "USDTTD",
1221 | "USDTWD",
1222 | "USDTZS",
1223 | "USDUAH",
1224 | "USDUGX",
1225 | "USDUYU",
1226 | "USDUZS",
1227 | "USDVEF",
1228 | "USDVND",
1229 | "USDXPF",
1230 | "USDYER",
1231 | "USDZAR",
1232 | "USDZMW",
1233 | "UYUEUR",
1234 | "UYUGBP",
1235 | "UYUUSD",
1236 | "UZSCHF",
1237 | "UZSUSD",
1238 | "VEFEUR",
1239 | "VEFGBP",
1240 | "VEFUSD",
1241 | "VNDCAD",
1242 | "VNDEUR",
1243 | "VNDJPY",
1244 | "VNDUSD",
1245 | "VRLCHF",
1246 | "VRNCHF",
1247 | "XAGARS",
1248 | "XAGAUD",
1249 | "XAGBRL",
1250 | "XAGCAD",
1251 | "XAGCNY",
1252 | "XAGEUR",
1253 | "XAGGBP",
1254 | "XAGHKD",
1255 | "XAGIDR",
1256 | "XAGINR",
1257 | "XAGJPY",
1258 | "XAGKCHF",
1259 | "XAGKRW",
1260 | "XAGMXN",
1261 | "XAGRUB",
1262 | "XAGSAR",
1263 | "XAGTRY",
1264 | "XAGUSD",
1265 | "XAGZAR",
1266 | "XAUARS",
1267 | "XAUAUD",
1268 | "XAUBRL",
1269 | "XAUCAD",
1270 | "XAUCNY",
1271 | "XAUEUR",
1272 | "XAUGBP",
1273 | "XAUHKD",
1274 | "XAUIDR",
1275 | "XAUINR",
1276 | "XAUJPY",
1277 | "XAUKCHF",
1278 | "XAUKRW",
1279 | "XAUMXN",
1280 | "XAUPLN",
1281 | "XAURUB",
1282 | "XAUSAR",
1283 | "XAUTHB",
1284 | "XAUTRY",
1285 | "XAUUSD",
1286 | "XAUZAR",
1287 | "XCDGBP",
1288 | "XDRISK",
1289 | "XPDEUR",
1290 | "XPDGBP",
1291 | "XPDUSD",
1292 | "XPFGBP",
1293 | "XPFUSD",
1294 | "XPTEUR",
1295 | "XPTGBP",
1296 | "XPTKCHF",
1297 | "XPTUSD",
1298 | "YERGBP",
1299 | "YERUSD",
1300 | "ZARAED",
1301 | "ZARARS",
1302 | "ZARAUD",
1303 | "ZARBRL",
1304 | "ZARBWP",
1305 | "ZARCAD",
1306 | "ZARCHF",
1307 | "ZARCNY",
1308 | "ZARCOP",
1309 | "ZARCYP",
1310 | "ZARCZK",
1311 | "ZARDKK",
1312 | "ZAREGP",
1313 | "ZAREUR",
1314 | "ZARGBP",
1315 | "ZARGHS",
1316 | "ZARHKD",
1317 | "ZARHUF",
1318 | "ZARIDR",
1319 | "ZARILS",
1320 | "ZARINR",
1321 | "ZARJPY",
1322 | "ZARKES",
1323 | "ZARKRW",
1324 | "ZARMAD",
1325 | "ZARMWK",
1326 | "ZARMXN",
1327 | "ZARMYR",
1328 | "ZARMZN",
1329 | "ZARNAD",
1330 | "ZARNGN",
1331 | "ZARNOK",
1332 | "ZARNZD",
1333 | "ZARPHP",
1334 | "ZARPKR",
1335 | "ZARPLN",
1336 | "ZARPYG",
1337 | "ZARRON",
1338 | "ZARRUB",
1339 | "ZARRWF",
1340 | "ZARSEK",
1341 | "ZARSGD",
1342 | "ZARSZL",
1343 | "ZARTHB",
1344 | "ZARTND",
1345 | "ZARTRY",
1346 | "ZARTWD",
1347 | "ZARUGX",
1348 | "ZARUSD",
1349 | "ZMKZAR",
1350 | "ZMWUSD",
1351 | "ZMWZAR"
1352 | ]
1353 |
--------------------------------------------------------------------------------
/src/utils/formatCurrencyMessage.js:
--------------------------------------------------------------------------------
1 | module.exports = ({ symbol, price, cpd, cpw, cpm }) => {
2 | let message = `💵 ${symbol}: ${price}\n\n`;
3 |
4 | if (cpd) {
5 | if (cpd >= 0) {
6 | message += `Günlük Değişim: ⬆️ +${cpd}%\n`;
7 | } else {
8 | message += `Günlük Değişim: ⬇️ ${cpd}%\n`;
9 | }
10 |
11 | if (cpw >= 0) {
12 | message += `Haftalık Değişim: ⬆️ +${cpw}%\n`;
13 | } else {
14 | message += `Haftalık Değişim: ⬇️ ${cpw}%\n`;
15 | }
16 |
17 | if (cpm >= 0) {
18 | message += `Aylık Değişim: ⬆️ +${cpm}%\n\n`;
19 | } else {
20 | message += `Aylık Değişim: ⬇️ ${cpm}%\n\n`;
21 | }
22 | }
23 |
24 | return message;
25 | };
26 |
--------------------------------------------------------------------------------
/src/utils/getNotificationMessage.js:
--------------------------------------------------------------------------------
1 | const CurrencyService = require("../services/CurrencyService");
2 | const formatCurrencyMessage = require("./formatCurrencyMessage");
3 |
4 | module.exports = async (notifications) => {
5 | return notifications.map(async ({ userId, currencies }) => {
6 | const currenciesObject = {};
7 | const messages = [];
8 |
9 | for (const {type, symbol} of currencies) {
10 | if (!currenciesObject[symbol]) {
11 | currenciesObject[symbol] = await CurrencyService.getCurrencyPrice(type, symbol);
12 | }
13 |
14 | const response = currenciesObject[symbol];
15 | messages.push(formatCurrencyMessage(response));
16 | }
17 |
18 | return {
19 | userId,
20 | message: messages.reduce((acc, message) => (acc + message), ""),
21 | };
22 | });
23 | }
--------------------------------------------------------------------------------
/src/utils/sortCryptoArray.js:
--------------------------------------------------------------------------------
1 | module.exports = (cryptoArray, cryptoCurrency) => {
2 | const sortedCryptoList = [];
3 |
4 | for (const { text, callback_data } of cryptoArray) {
5 | if (cryptoCurrency + " • " + "BTC" === text) {
6 | sortedCryptoList.push({ text, callback_data });
7 | break;
8 | }
9 | }
10 |
11 | for (const { text, callback_data } of cryptoArray) {
12 | if (cryptoCurrency + " • " + "ETH" === text) {
13 | sortedCryptoList.push({ text, callback_data });
14 | break;
15 | }
16 | }
17 |
18 | for (const { text, callback_data } of cryptoArray) {
19 | if (cryptoCurrency + " • " + "BNB" === text) {
20 | sortedCryptoList.push({ text, callback_data });
21 | break;
22 | }
23 | }
24 |
25 | for (const { text, callback_data } of cryptoArray) {
26 | if (cryptoCurrency + " • " + "USD" === text) {
27 | sortedCryptoList.push({ text, callback_data });
28 | break;
29 | }
30 | }
31 |
32 | for (const { text, callback_data } of cryptoArray) {
33 | if (cryptoCurrency + " • " + "BUSD" === text) {
34 | sortedCryptoList.push({ text, callback_data });
35 | break;
36 | }
37 | }
38 |
39 | for (const { text, callback_data } of cryptoArray) {
40 | if (cryptoCurrency + " • " + "EUR" === text) {
41 | sortedCryptoList.push({ text, callback_data });
42 | break;
43 | }
44 | }
45 |
46 | for (const { text, callback_data } of cryptoArray) {
47 | if (cryptoCurrency + " • " + "TRY" === text) {
48 | sortedCryptoList.push({ text, callback_data });
49 | break;
50 | }
51 | }
52 |
53 | return sortedCryptoList;
54 | };
55 |
--------------------------------------------------------------------------------