├── .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 | [![CodeFactor](https://www.codefactor.io/repository/github/mercan/telegramcryptocurrencybot/badge)](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 | --------------------------------------------------------------------------------