├── .gitignore ├── README.md ├── assets ├── ss.png └── tgwebApp.png ├── index.js ├── package-lock.json ├── package.json └── src ├── api └── api.js ├── blum └── blum.js ├── config ├── config_tmp.js └── proxy_list_tmp.js ├── core └── telegram.js └── utils ├── helper.js ├── logger.js └── twist.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | account.js 3 | log/app.log 4 | test.js 5 | test2.js 6 | src/config/config.js 7 | accounts/* 8 | .DS_Store 9 | src/config/proxy_list.js -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # BLUM BOT 2 | 3 | Blum ? Blum is telegram web app mining on telegram, and blum bot is blum auto mining and complete missions bot 4 | 5 | ## Prerequisite 6 | 7 | - Node JS (v22.1.0) 8 | - Git 9 | - Blum Account t.me/BlumCryptoBot/app?startapp=ref_dvQqzUMseK 10 | - TELEGRAM_APP_ID & TELEGRAM_APP_HASH Get it from [Here](https://my.telegram.org/auth?to=apps) 11 | 12 | ## BOT Feature 13 | 14 | - Auto Check In (Experimental) 15 | - Auto start and claim mining 16 | - Auto complete missions 17 | - Auto claim misisons reward 18 | - Auto play game 19 | 20 | ## Register Blum Account 21 | 22 | - Register blum on telegram https://t.me/BlumCryptoBot/app?startapp=ref_dvQqzUMseK 23 | - Start bot `/start` 24 | - Launch Blum 25 | 26 | ## Set Up And Run 27 | 28 | - clone the project `git clone https://github.com/Widiskel/blum-bot.git` 29 | - run `cd blum-bot`. 30 | - run `npm install && mkdir -p accounts`. 31 | - run `cp src/config/config_tmp.js src/config/config.js && cp src/config/proxy_list_tmp.js src/config/proxy_list.js` 32 | - To configure the app, run `nano src/config/config.js` and add your telegram app id and hash there (if you use telegram sessions) 33 | - To Configure Proxy, run `nano src/config/proxy_list.js` and fill up your proxy using provided format (it currently support only HTTPS proxy), if you don't use proxy then just let it blank []. 34 | ``` 35 | export const proxyList = []; 36 | ``` 37 | - run `npm run start` 38 | 39 | ## Setup Accounts 40 | 41 | 1. Run bot `npm run start` 42 | 2. Choose option `1` to create account 43 | 3. Choose account type `Query` or `Sessions` 44 | 4. `Session` Type 45 | 1. Enter Account Name 46 | 2. Enter your phone number starting with countrycode ex : `+628xxxxxxxx` 47 | 3. You will be asked for verification code and password (if any) 48 | 4. Start The bot Again after account creation complete 49 | 5. `Query` Type 50 | 1. Enter Account Name 51 | 2. Enter Telegram Query (you can get query by opening bot app on browser > inspect element > storage / application > session storage > telegram init params > copy tg web app data value) 52 | 3. Start The bot Again after account creation complete 53 | 6. after bot started choose option 3 start bot 54 | 7. if something wrong with your Account, reset Account (option 2) first or just delete problematic a, to cancel running bot press `ctrl+c` twice, and start again [from No 1.](#setup-accounts). 55 | 56 | 57 | ## Session Troubleshoot 58 | If you asked to enter phone number again after sessions creation, it mean session not initialized correctly, try to delete the created sessions. 59 | 60 | Example Case 61 | - example you already have 1 session (sessionA) and all good when you run bot. After that you create another session, but when you run bot, the bot asked to enter phone number again, so the problem is on (sessionB), to fix it just remove the `accounts/sessionB` folder and re create it or just delete all folder inside `accounts` directory with prefix `sessions-`. 62 | 63 | ## Query Troubleshoot 64 | if your bot get eror, with some error code `401` it mean your query expired, go get new query and run bot again and choose option `4` for query modification. 65 | 66 | ## How To Update 67 | 68 | - run `git pull` or `git stash && git pull` 69 | - run `npm update` 70 | - read Setup and run again if any new step added 71 | - run the bot again `npm run start` 72 | 73 | ## Note 74 | 75 | 76 | Don't use bot with `session` type if you using telegram account that bought from someone because it can make your telegram account deleted. instead of using `session` type, use `query` type. 77 | 78 | This bot can use Telegram Query and Telegram Sessions. if you want to use sessions, and ever use one of my bot that use telegram sessions, you can just copy the sessions folder to this bot. Also for the telegram APP ID and Hash you can use it on another bot. If you want to use Telegram Query, get your query manually. 79 | 80 | if you got error `Invalid ConstructorId` try to run this ```npm i telegram@2.22.2``` -------------------------------------------------------------------------------- /assets/ss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Widiskel/blum-bot/15a06129a1382fd3e93c4197df23c9b5e8ecc5bf/assets/ss.png -------------------------------------------------------------------------------- /assets/tgwebApp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Widiskel/blum-bot/15a06129a1382fd3e93c4197df23c9b5e8ecc5bf/assets/tgwebApp.png -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | import { Blum } from "./src/blum/blum.js"; 2 | import { Config } from "./src/config/config.js"; 3 | import { proxyList } from "./src/config/proxy_list.js"; 4 | import { Telegram } from "./src/core/telegram.js"; 5 | import { Helper } from "./src/utils/helper.js"; 6 | import logger from "./src/utils/logger.js"; 7 | 8 | async function operation(acc, query, queryObj, proxy) { 9 | logger.clear(); 10 | try { 11 | const blum = new Blum(acc, query, queryObj, proxy); 12 | 13 | await blum.login(); 14 | // await blum.getUser(true); 15 | await blum.getBalance(true); 16 | await blum.checkIn(); 17 | if (blum.balance.farming) { 18 | if (Helper.isFutureTime(blum.balance.farming.endTime)) { 19 | await blum.claim(); 20 | } 21 | } 22 | await blum.mining(); 23 | await blum.getTaskAnswer(); 24 | await blum.getTasks(true); 25 | 26 | const uncompletableTaskIds = [ 27 | "a90d8b81-0974-47f1-bb00-807463433bde", 28 | "03e4a46f-7588-4950-8289-f42787e3eca2", 29 | ]; 30 | 31 | const uncompletedTasks = blum.tasks.filter( 32 | (task) => 33 | task.status !== "FINISHED" && 34 | task.type !== "WALLET_CONNECTION" && 35 | task.type !== "PROGRESS_TARGET" && 36 | !uncompletableTaskIds.includes(task.id) 37 | ); 38 | for (const task of uncompletedTasks) { 39 | if (task.status === "NOT_STARTED") { 40 | await blum.startAndCompleteTask(task.id); 41 | } else if (task.status === "READY_FOR_VERIFY") { 42 | const answer = blum.TASKANSWER.find((item) => item.id == task.id); 43 | if (answer != -1 && answer != undefined) { 44 | await blum.validateAndCompleteTask(task.id, answer.answer); 45 | } 46 | } else { 47 | await blum.completeTask(task.id); 48 | } 49 | } 50 | let err = 0; 51 | // if (Config.PLAYGAME ?? true) 52 | // while (blum.balance.playPasses > 0) { 53 | // await blum.play().catch(() => { 54 | // err += 1; 55 | // }); 56 | // if (err > 5) { 57 | // await Helper.delay( 58 | // 3000, 59 | // acc, 60 | // "Failed to play game something wen't wrong", 61 | // blum 62 | // ); 63 | // logger.error(err); 64 | // break; 65 | // } 66 | // } 67 | await Helper.delay( 68 | 60000 * 10, 69 | acc, 70 | "Account Processing Complete, Delaying for 1 hour", 71 | blum 72 | ); 73 | await operation(acc, query, queryObj, proxy); 74 | } catch (error) { 75 | await Helper.delay( 76 | 10000, 77 | acc, 78 | `Error : ${error}, Retrying after 10 Second` 79 | ); 80 | await operation(acc, query, queryObj, proxy); 81 | } 82 | } 83 | 84 | let init = false; 85 | async function startBot() { 86 | return new Promise(async (resolve, reject) => { 87 | try { 88 | logger.info(`BOT STARTED`); 89 | 90 | const tele = await new Telegram(); 91 | if (init == false) { 92 | await tele.init(); 93 | init = true; 94 | } 95 | 96 | const accountList = Helper.getSession("accounts"); 97 | const paramList = []; 98 | 99 | if (proxyList.length > 0) { 100 | if (accountList.length != proxyList.length) { 101 | reject( 102 | `You have ${accountList.length} Session but you provide ${proxyList.length} Proxy` 103 | ); 104 | } 105 | } 106 | 107 | for (const acc of accountList) { 108 | const accIdx = accountList.indexOf(acc); 109 | const proxy = proxyList.length > 0 ? proxyList[accIdx] : undefined; 110 | if (!acc.includes("query")) { 111 | await tele.useSession("accounts/" + acc, proxy); 112 | tele.session = acc; 113 | const user = await tele.client.getMe(); 114 | const query = await tele 115 | .resolvePeer() 116 | .then(async () => { 117 | return await tele.initWebView(); 118 | }) 119 | .catch((err) => { 120 | throw err; 121 | }); 122 | 123 | const queryObj = Helper.queryToJSON(query); 124 | await tele.disconnect(); 125 | paramList.push([user, query, queryObj, proxy]); 126 | } else { 127 | const query = Helper.readQueryFile("accounts/" + acc + "/query.txt"); 128 | const queryObj = Helper.queryToJSON(query); 129 | const user = queryObj.user; 130 | user.firstName = user.first_name; 131 | user.lastName = user.last_name; 132 | paramList.push([user, query, queryObj, proxy]); 133 | } 134 | } 135 | 136 | const promiseList = paramList.map(async (data) => { 137 | await operation(data[0], data[1], data[2], data[3]); 138 | }); 139 | 140 | await Promise.all(promiseList); 141 | resolve(); 142 | } catch (error) { 143 | logger.info(`BOT STOPPED`); 144 | logger.error(JSON.stringify(error)); 145 | reject(error); 146 | } 147 | }); 148 | } 149 | 150 | (async () => { 151 | try { 152 | logger.info(""); 153 | logger.clear(); 154 | logger.info("Application Started"); 155 | await startBot(); 156 | } catch (error) { 157 | console.error("Error in main process:", error); 158 | logger.info(`Application Error : ${error}`); 159 | throw error; 160 | } 161 | })(); 162 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "blum-bot", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "blum-bot", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "https-proxy-agent": "^7.0.5", 13 | "input": "^1.0.1", 14 | "moment": "^2.30.1", 15 | "moment-timezone": "^0.5.45", 16 | "node-fetch": "^3.3.2", 17 | "telegram": "^2.22.2", 18 | "twisters": "^1.1.0", 19 | "winston": "^3.13.0" 20 | } 21 | }, 22 | "node_modules/@colors/colors": { 23 | "version": "1.6.0", 24 | "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", 25 | "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", 26 | "engines": { 27 | "node": ">=0.1.90" 28 | } 29 | }, 30 | "node_modules/@cryptography/aes": { 31 | "version": "0.1.1", 32 | "resolved": "https://registry.npmjs.org/@cryptography/aes/-/aes-0.1.1.tgz", 33 | "integrity": "sha512-PcYz4FDGblO6tM2kSC+VzhhK62vml6k6/YAkiWtyPvrgJVfnDRoHGDtKn5UiaRRUrvUTTocBpvc2rRgTCqxjsg==" 34 | }, 35 | "node_modules/@dabh/diagnostics": { 36 | "version": "2.0.3", 37 | "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", 38 | "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", 39 | "dependencies": { 40 | "colorspace": "1.1.x", 41 | "enabled": "2.0.x", 42 | "kuler": "^2.0.0" 43 | } 44 | }, 45 | "node_modules/@types/triple-beam": { 46 | "version": "1.3.5", 47 | "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", 48 | "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==" 49 | }, 50 | "node_modules/agent-base": { 51 | "version": "7.1.1", 52 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", 53 | "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", 54 | "dependencies": { 55 | "debug": "^4.3.4" 56 | }, 57 | "engines": { 58 | "node": ">= 14" 59 | } 60 | }, 61 | "node_modules/agent-base/node_modules/debug": { 62 | "version": "4.3.6", 63 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", 64 | "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", 65 | "dependencies": { 66 | "ms": "2.1.2" 67 | }, 68 | "engines": { 69 | "node": ">=6.0" 70 | }, 71 | "peerDependenciesMeta": { 72 | "supports-color": { 73 | "optional": true 74 | } 75 | } 76 | }, 77 | "node_modules/agent-base/node_modules/ms": { 78 | "version": "2.1.2", 79 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 80 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 81 | }, 82 | "node_modules/ansi-escapes": { 83 | "version": "1.4.0", 84 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", 85 | "integrity": "sha512-wiXutNjDUlNEDWHcYH3jtZUhd3c4/VojassD8zHdHCY13xbZy2XbW+NKQwA0tWGBVzDA9qEzYwfoSsWmviidhw==", 86 | "engines": { 87 | "node": ">=0.10.0" 88 | } 89 | }, 90 | "node_modules/ansi-regex": { 91 | "version": "5.0.1", 92 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 93 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 94 | "engines": { 95 | "node": ">=8" 96 | } 97 | }, 98 | "node_modules/ansi-styles": { 99 | "version": "4.3.0", 100 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 101 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 102 | "dependencies": { 103 | "color-convert": "^2.0.1" 104 | }, 105 | "engines": { 106 | "node": ">=8" 107 | }, 108 | "funding": { 109 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 110 | } 111 | }, 112 | "node_modules/ansi-styles/node_modules/color-convert": { 113 | "version": "2.0.1", 114 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 115 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 116 | "dependencies": { 117 | "color-name": "~1.1.4" 118 | }, 119 | "engines": { 120 | "node": ">=7.0.0" 121 | } 122 | }, 123 | "node_modules/ansi-styles/node_modules/color-name": { 124 | "version": "1.1.4", 125 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 126 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 127 | }, 128 | "node_modules/async": { 129 | "version": "3.2.5", 130 | "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", 131 | "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" 132 | }, 133 | "node_modules/async-mutex": { 134 | "version": "0.3.2", 135 | "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.3.2.tgz", 136 | "integrity": "sha512-HuTK7E7MT7jZEh1P9GtRW9+aTWiDWWi9InbZ5hjxrnRa39KS4BW04+xLBhYNS2aXhHUIKZSw3gj4Pn1pj+qGAA==", 137 | "dependencies": { 138 | "tslib": "^2.3.1" 139 | } 140 | }, 141 | "node_modules/babel-runtime": { 142 | "version": "6.26.0", 143 | "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", 144 | "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", 145 | "dependencies": { 146 | "core-js": "^2.4.0", 147 | "regenerator-runtime": "^0.11.0" 148 | } 149 | }, 150 | "node_modules/base64-js": { 151 | "version": "1.5.1", 152 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 153 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 154 | "funding": [ 155 | { 156 | "type": "github", 157 | "url": "https://github.com/sponsors/feross" 158 | }, 159 | { 160 | "type": "patreon", 161 | "url": "https://www.patreon.com/feross" 162 | }, 163 | { 164 | "type": "consulting", 165 | "url": "https://feross.org/support" 166 | } 167 | ] 168 | }, 169 | "node_modules/big-integer": { 170 | "version": "1.6.52", 171 | "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", 172 | "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", 173 | "engines": { 174 | "node": ">=0.6" 175 | } 176 | }, 177 | "node_modules/buffer": { 178 | "version": "6.0.3", 179 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", 180 | "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", 181 | "funding": [ 182 | { 183 | "type": "github", 184 | "url": "https://github.com/sponsors/feross" 185 | }, 186 | { 187 | "type": "patreon", 188 | "url": "https://www.patreon.com/feross" 189 | }, 190 | { 191 | "type": "consulting", 192 | "url": "https://feross.org/support" 193 | } 194 | ], 195 | "dependencies": { 196 | "base64-js": "^1.3.1", 197 | "ieee754": "^1.2.1" 198 | } 199 | }, 200 | "node_modules/bufferutil": { 201 | "version": "4.0.8", 202 | "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.8.tgz", 203 | "integrity": "sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==", 204 | "hasInstallScript": true, 205 | "dependencies": { 206 | "node-gyp-build": "^4.3.0" 207 | }, 208 | "engines": { 209 | "node": ">=6.14.2" 210 | } 211 | }, 212 | "node_modules/chalk": { 213 | "version": "1.1.3", 214 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 215 | "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", 216 | "dependencies": { 217 | "ansi-styles": "^2.2.1", 218 | "escape-string-regexp": "^1.0.2", 219 | "has-ansi": "^2.0.0", 220 | "strip-ansi": "^3.0.0", 221 | "supports-color": "^2.0.0" 222 | }, 223 | "engines": { 224 | "node": ">=0.10.0" 225 | } 226 | }, 227 | "node_modules/chalk/node_modules/ansi-regex": { 228 | "version": "2.1.1", 229 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 230 | "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", 231 | "engines": { 232 | "node": ">=0.10.0" 233 | } 234 | }, 235 | "node_modules/chalk/node_modules/ansi-styles": { 236 | "version": "2.2.1", 237 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 238 | "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", 239 | "engines": { 240 | "node": ">=0.10.0" 241 | } 242 | }, 243 | "node_modules/chalk/node_modules/strip-ansi": { 244 | "version": "3.0.1", 245 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 246 | "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", 247 | "dependencies": { 248 | "ansi-regex": "^2.0.0" 249 | }, 250 | "engines": { 251 | "node": ">=0.10.0" 252 | } 253 | }, 254 | "node_modules/cli-cursor": { 255 | "version": "3.1.0", 256 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", 257 | "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", 258 | "dependencies": { 259 | "restore-cursor": "^3.1.0" 260 | }, 261 | "engines": { 262 | "node": ">=8" 263 | } 264 | }, 265 | "node_modules/cli-width": { 266 | "version": "2.2.1", 267 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", 268 | "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==" 269 | }, 270 | "node_modules/code-point-at": { 271 | "version": "1.1.0", 272 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 273 | "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", 274 | "engines": { 275 | "node": ">=0.10.0" 276 | } 277 | }, 278 | "node_modules/color": { 279 | "version": "3.2.1", 280 | "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", 281 | "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", 282 | "dependencies": { 283 | "color-convert": "^1.9.3", 284 | "color-string": "^1.6.0" 285 | } 286 | }, 287 | "node_modules/color-convert": { 288 | "version": "1.9.3", 289 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 290 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 291 | "dependencies": { 292 | "color-name": "1.1.3" 293 | } 294 | }, 295 | "node_modules/color-name": { 296 | "version": "1.1.3", 297 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 298 | "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" 299 | }, 300 | "node_modules/color-string": { 301 | "version": "1.9.1", 302 | "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", 303 | "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", 304 | "dependencies": { 305 | "color-name": "^1.0.0", 306 | "simple-swizzle": "^0.2.2" 307 | } 308 | }, 309 | "node_modules/colorspace": { 310 | "version": "1.1.4", 311 | "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", 312 | "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", 313 | "dependencies": { 314 | "color": "^3.1.3", 315 | "text-hex": "1.0.x" 316 | } 317 | }, 318 | "node_modules/core-js": { 319 | "version": "2.6.12", 320 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", 321 | "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", 322 | "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", 323 | "hasInstallScript": true 324 | }, 325 | "node_modules/d": { 326 | "version": "1.0.2", 327 | "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", 328 | "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", 329 | "dependencies": { 330 | "es5-ext": "^0.10.64", 331 | "type": "^2.7.2" 332 | }, 333 | "engines": { 334 | "node": ">=0.12" 335 | } 336 | }, 337 | "node_modules/data-uri-to-buffer": { 338 | "version": "4.0.1", 339 | "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", 340 | "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", 341 | "engines": { 342 | "node": ">= 12" 343 | } 344 | }, 345 | "node_modules/debug": { 346 | "version": "2.6.9", 347 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 348 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 349 | "dependencies": { 350 | "ms": "2.0.0" 351 | } 352 | }, 353 | "node_modules/debug/node_modules/ms": { 354 | "version": "2.0.0", 355 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 356 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 357 | }, 358 | "node_modules/dom-serializer": { 359 | "version": "1.4.1", 360 | "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", 361 | "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", 362 | "dependencies": { 363 | "domelementtype": "^2.0.1", 364 | "domhandler": "^4.2.0", 365 | "entities": "^2.0.0" 366 | }, 367 | "funding": { 368 | "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" 369 | } 370 | }, 371 | "node_modules/domelementtype": { 372 | "version": "2.3.0", 373 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", 374 | "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", 375 | "funding": [ 376 | { 377 | "type": "github", 378 | "url": "https://github.com/sponsors/fb55" 379 | } 380 | ] 381 | }, 382 | "node_modules/domhandler": { 383 | "version": "4.3.1", 384 | "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", 385 | "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", 386 | "dependencies": { 387 | "domelementtype": "^2.2.0" 388 | }, 389 | "engines": { 390 | "node": ">= 4" 391 | }, 392 | "funding": { 393 | "url": "https://github.com/fb55/domhandler?sponsor=1" 394 | } 395 | }, 396 | "node_modules/domutils": { 397 | "version": "2.8.0", 398 | "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", 399 | "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", 400 | "dependencies": { 401 | "dom-serializer": "^1.0.1", 402 | "domelementtype": "^2.2.0", 403 | "domhandler": "^4.2.0" 404 | }, 405 | "funding": { 406 | "url": "https://github.com/fb55/domutils?sponsor=1" 407 | } 408 | }, 409 | "node_modules/emoji-regex": { 410 | "version": "8.0.0", 411 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 412 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 413 | }, 414 | "node_modules/enabled": { 415 | "version": "2.0.0", 416 | "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", 417 | "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" 418 | }, 419 | "node_modules/entities": { 420 | "version": "2.2.0", 421 | "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", 422 | "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", 423 | "funding": { 424 | "url": "https://github.com/fb55/entities?sponsor=1" 425 | } 426 | }, 427 | "node_modules/es5-ext": { 428 | "version": "0.10.64", 429 | "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", 430 | "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", 431 | "hasInstallScript": true, 432 | "dependencies": { 433 | "es6-iterator": "^2.0.3", 434 | "es6-symbol": "^3.1.3", 435 | "esniff": "^2.0.1", 436 | "next-tick": "^1.1.0" 437 | }, 438 | "engines": { 439 | "node": ">=0.10" 440 | } 441 | }, 442 | "node_modules/es6-iterator": { 443 | "version": "2.0.3", 444 | "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", 445 | "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", 446 | "dependencies": { 447 | "d": "1", 448 | "es5-ext": "^0.10.35", 449 | "es6-symbol": "^3.1.1" 450 | } 451 | }, 452 | "node_modules/es6-symbol": { 453 | "version": "3.1.4", 454 | "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz", 455 | "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==", 456 | "dependencies": { 457 | "d": "^1.0.2", 458 | "ext": "^1.7.0" 459 | }, 460 | "engines": { 461 | "node": ">=0.12" 462 | } 463 | }, 464 | "node_modules/escape-string-regexp": { 465 | "version": "1.0.5", 466 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 467 | "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", 468 | "engines": { 469 | "node": ">=0.8.0" 470 | } 471 | }, 472 | "node_modules/esniff": { 473 | "version": "2.0.1", 474 | "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", 475 | "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", 476 | "dependencies": { 477 | "d": "^1.0.1", 478 | "es5-ext": "^0.10.62", 479 | "event-emitter": "^0.3.5", 480 | "type": "^2.7.2" 481 | }, 482 | "engines": { 483 | "node": ">=0.10" 484 | } 485 | }, 486 | "node_modules/event-emitter": { 487 | "version": "0.3.5", 488 | "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", 489 | "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", 490 | "dependencies": { 491 | "d": "1", 492 | "es5-ext": "~0.10.14" 493 | } 494 | }, 495 | "node_modules/exit-hook": { 496 | "version": "1.1.1", 497 | "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", 498 | "integrity": "sha512-MsG3prOVw1WtLXAZbM3KiYtooKR1LvxHh3VHsVtIy0uiUu8usxgB/94DP2HxtD/661lLdB6yzQ09lGJSQr6nkg==", 499 | "engines": { 500 | "node": ">=0.10.0" 501 | } 502 | }, 503 | "node_modules/ext": { 504 | "version": "1.7.0", 505 | "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", 506 | "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", 507 | "dependencies": { 508 | "type": "^2.7.2" 509 | } 510 | }, 511 | "node_modules/fecha": { 512 | "version": "4.2.3", 513 | "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", 514 | "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" 515 | }, 516 | "node_modules/fetch-blob": { 517 | "version": "3.2.0", 518 | "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", 519 | "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", 520 | "funding": [ 521 | { 522 | "type": "github", 523 | "url": "https://github.com/sponsors/jimmywarting" 524 | }, 525 | { 526 | "type": "paypal", 527 | "url": "https://paypal.me/jimmywarting" 528 | } 529 | ], 530 | "dependencies": { 531 | "node-domexception": "^1.0.0", 532 | "web-streams-polyfill": "^3.0.3" 533 | }, 534 | "engines": { 535 | "node": "^12.20 || >= 14.13" 536 | } 537 | }, 538 | "node_modules/figures": { 539 | "version": "1.7.0", 540 | "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", 541 | "integrity": "sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==", 542 | "dependencies": { 543 | "escape-string-regexp": "^1.0.5", 544 | "object-assign": "^4.1.0" 545 | }, 546 | "engines": { 547 | "node": ">=0.10.0" 548 | } 549 | }, 550 | "node_modules/fn.name": { 551 | "version": "1.1.0", 552 | "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", 553 | "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" 554 | }, 555 | "node_modules/formdata-polyfill": { 556 | "version": "4.0.10", 557 | "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", 558 | "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", 559 | "dependencies": { 560 | "fetch-blob": "^3.1.2" 561 | }, 562 | "engines": { 563 | "node": ">=12.20.0" 564 | } 565 | }, 566 | "node_modules/graceful-fs": { 567 | "version": "4.2.11", 568 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 569 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" 570 | }, 571 | "node_modules/has-ansi": { 572 | "version": "2.0.0", 573 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 574 | "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", 575 | "dependencies": { 576 | "ansi-regex": "^2.0.0" 577 | }, 578 | "engines": { 579 | "node": ">=0.10.0" 580 | } 581 | }, 582 | "node_modules/has-ansi/node_modules/ansi-regex": { 583 | "version": "2.1.1", 584 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 585 | "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", 586 | "engines": { 587 | "node": ">=0.10.0" 588 | } 589 | }, 590 | "node_modules/htmlparser2": { 591 | "version": "6.1.0", 592 | "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", 593 | "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", 594 | "funding": [ 595 | "https://github.com/fb55/htmlparser2?sponsor=1", 596 | { 597 | "type": "github", 598 | "url": "https://github.com/sponsors/fb55" 599 | } 600 | ], 601 | "dependencies": { 602 | "domelementtype": "^2.0.1", 603 | "domhandler": "^4.0.0", 604 | "domutils": "^2.5.2", 605 | "entities": "^2.0.0" 606 | } 607 | }, 608 | "node_modules/https-proxy-agent": { 609 | "version": "7.0.5", 610 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", 611 | "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", 612 | "dependencies": { 613 | "agent-base": "^7.0.2", 614 | "debug": "4" 615 | }, 616 | "engines": { 617 | "node": ">= 14" 618 | } 619 | }, 620 | "node_modules/https-proxy-agent/node_modules/debug": { 621 | "version": "4.3.6", 622 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", 623 | "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", 624 | "dependencies": { 625 | "ms": "2.1.2" 626 | }, 627 | "engines": { 628 | "node": ">=6.0" 629 | }, 630 | "peerDependenciesMeta": { 631 | "supports-color": { 632 | "optional": true 633 | } 634 | } 635 | }, 636 | "node_modules/https-proxy-agent/node_modules/ms": { 637 | "version": "2.1.2", 638 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 639 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 640 | }, 641 | "node_modules/ieee754": { 642 | "version": "1.2.1", 643 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 644 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 645 | "funding": [ 646 | { 647 | "type": "github", 648 | "url": "https://github.com/sponsors/feross" 649 | }, 650 | { 651 | "type": "patreon", 652 | "url": "https://www.patreon.com/feross" 653 | }, 654 | { 655 | "type": "consulting", 656 | "url": "https://feross.org/support" 657 | } 658 | ] 659 | }, 660 | "node_modules/imurmurhash": { 661 | "version": "0.1.4", 662 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 663 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 664 | "engines": { 665 | "node": ">=0.8.19" 666 | } 667 | }, 668 | "node_modules/inherits": { 669 | "version": "2.0.4", 670 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 671 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 672 | }, 673 | "node_modules/input": { 674 | "version": "1.0.1", 675 | "resolved": "https://registry.npmjs.org/input/-/input-1.0.1.tgz", 676 | "integrity": "sha512-5DKQKQ7Nm/CaPGYKF74uUvk5ftC3S04fLYWcDrNG2rOVhhRgB4E2J8JNb7AAh+RlQ/954ukas4bEbrRQ3/kPGA==", 677 | "dependencies": { 678 | "babel-runtime": "^6.6.1", 679 | "chalk": "^1.1.1", 680 | "inquirer": "^0.12.0", 681 | "lodash": "^4.6.1" 682 | }, 683 | "engines": { 684 | "node": ">=0.12" 685 | } 686 | }, 687 | "node_modules/inquirer": { 688 | "version": "0.12.0", 689 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", 690 | "integrity": "sha512-bOetEz5+/WpgaW4D1NYOk1aD+JCqRjqu/FwRFgnIfiP7FC/zinsrfyO1vlS3nyH/R7S0IH3BIHBu4DBIDSqiGQ==", 691 | "dependencies": { 692 | "ansi-escapes": "^1.1.0", 693 | "ansi-regex": "^2.0.0", 694 | "chalk": "^1.0.0", 695 | "cli-cursor": "^1.0.1", 696 | "cli-width": "^2.0.0", 697 | "figures": "^1.3.5", 698 | "lodash": "^4.3.0", 699 | "readline2": "^1.0.1", 700 | "run-async": "^0.1.0", 701 | "rx-lite": "^3.1.2", 702 | "string-width": "^1.0.1", 703 | "strip-ansi": "^3.0.0", 704 | "through": "^2.3.6" 705 | } 706 | }, 707 | "node_modules/inquirer/node_modules/ansi-regex": { 708 | "version": "2.1.1", 709 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 710 | "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", 711 | "engines": { 712 | "node": ">=0.10.0" 713 | } 714 | }, 715 | "node_modules/inquirer/node_modules/cli-cursor": { 716 | "version": "1.0.2", 717 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", 718 | "integrity": "sha512-25tABq090YNKkF6JH7lcwO0zFJTRke4Jcq9iX2nr/Sz0Cjjv4gckmwlW6Ty/aoyFd6z3ysR2hMGC2GFugmBo6A==", 719 | "dependencies": { 720 | "restore-cursor": "^1.0.1" 721 | }, 722 | "engines": { 723 | "node": ">=0.10.0" 724 | } 725 | }, 726 | "node_modules/inquirer/node_modules/is-fullwidth-code-point": { 727 | "version": "1.0.0", 728 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 729 | "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", 730 | "dependencies": { 731 | "number-is-nan": "^1.0.0" 732 | }, 733 | "engines": { 734 | "node": ">=0.10.0" 735 | } 736 | }, 737 | "node_modules/inquirer/node_modules/onetime": { 738 | "version": "1.1.0", 739 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", 740 | "integrity": "sha512-GZ+g4jayMqzCRMgB2sol7GiCLjKfS1PINkjmx8spcKce1LiVqcbQreXwqs2YAFXC6R03VIG28ZS31t8M866v6A==", 741 | "engines": { 742 | "node": ">=0.10.0" 743 | } 744 | }, 745 | "node_modules/inquirer/node_modules/restore-cursor": { 746 | "version": "1.0.1", 747 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", 748 | "integrity": "sha512-reSjH4HuiFlxlaBaFCiS6O76ZGG2ygKoSlCsipKdaZuKSPx/+bt9mULkn4l0asVzbEfQQmXRg6Wp6gv6m0wElw==", 749 | "dependencies": { 750 | "exit-hook": "^1.0.0", 751 | "onetime": "^1.0.0" 752 | }, 753 | "engines": { 754 | "node": ">=0.10.0" 755 | } 756 | }, 757 | "node_modules/inquirer/node_modules/string-width": { 758 | "version": "1.0.2", 759 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 760 | "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", 761 | "dependencies": { 762 | "code-point-at": "^1.0.0", 763 | "is-fullwidth-code-point": "^1.0.0", 764 | "strip-ansi": "^3.0.0" 765 | }, 766 | "engines": { 767 | "node": ">=0.10.0" 768 | } 769 | }, 770 | "node_modules/inquirer/node_modules/strip-ansi": { 771 | "version": "3.0.1", 772 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 773 | "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", 774 | "dependencies": { 775 | "ansi-regex": "^2.0.0" 776 | }, 777 | "engines": { 778 | "node": ">=0.10.0" 779 | } 780 | }, 781 | "node_modules/ip-address": { 782 | "version": "9.0.5", 783 | "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", 784 | "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", 785 | "dependencies": { 786 | "jsbn": "1.1.0", 787 | "sprintf-js": "^1.1.3" 788 | }, 789 | "engines": { 790 | "node": ">= 12" 791 | } 792 | }, 793 | "node_modules/is-arrayish": { 794 | "version": "0.3.2", 795 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", 796 | "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" 797 | }, 798 | "node_modules/is-fullwidth-code-point": { 799 | "version": "3.0.0", 800 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 801 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 802 | "engines": { 803 | "node": ">=8" 804 | } 805 | }, 806 | "node_modules/is-stream": { 807 | "version": "2.0.1", 808 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", 809 | "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", 810 | "engines": { 811 | "node": ">=8" 812 | }, 813 | "funding": { 814 | "url": "https://github.com/sponsors/sindresorhus" 815 | } 816 | }, 817 | "node_modules/is-typedarray": { 818 | "version": "1.0.0", 819 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 820 | "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" 821 | }, 822 | "node_modules/jsbn": { 823 | "version": "1.1.0", 824 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", 825 | "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==" 826 | }, 827 | "node_modules/kuler": { 828 | "version": "2.0.0", 829 | "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", 830 | "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" 831 | }, 832 | "node_modules/lodash": { 833 | "version": "4.17.21", 834 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 835 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" 836 | }, 837 | "node_modules/logform": { 838 | "version": "2.6.0", 839 | "resolved": "https://registry.npmjs.org/logform/-/logform-2.6.0.tgz", 840 | "integrity": "sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ==", 841 | "dependencies": { 842 | "@colors/colors": "1.6.0", 843 | "@types/triple-beam": "^1.3.2", 844 | "fecha": "^4.2.0", 845 | "ms": "^2.1.1", 846 | "safe-stable-stringify": "^2.3.1", 847 | "triple-beam": "^1.3.0" 848 | }, 849 | "engines": { 850 | "node": ">= 12.0.0" 851 | } 852 | }, 853 | "node_modules/mime": { 854 | "version": "3.0.0", 855 | "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", 856 | "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", 857 | "bin": { 858 | "mime": "cli.js" 859 | }, 860 | "engines": { 861 | "node": ">=10.0.0" 862 | } 863 | }, 864 | "node_modules/mimic-fn": { 865 | "version": "2.1.0", 866 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 867 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", 868 | "engines": { 869 | "node": ">=6" 870 | } 871 | }, 872 | "node_modules/moment": { 873 | "version": "2.30.1", 874 | "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", 875 | "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", 876 | "engines": { 877 | "node": "*" 878 | } 879 | }, 880 | "node_modules/moment-timezone": { 881 | "version": "0.5.45", 882 | "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.45.tgz", 883 | "integrity": "sha512-HIWmqA86KcmCAhnMAN0wuDOARV/525R2+lOLotuGFzn4HO+FH+/645z2wx0Dt3iDv6/p61SIvKnDstISainhLQ==", 884 | "dependencies": { 885 | "moment": "^2.29.4" 886 | }, 887 | "engines": { 888 | "node": "*" 889 | } 890 | }, 891 | "node_modules/ms": { 892 | "version": "2.1.3", 893 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 894 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 895 | }, 896 | "node_modules/mute-stream": { 897 | "version": "0.0.8", 898 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", 899 | "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" 900 | }, 901 | "node_modules/next-tick": { 902 | "version": "1.1.0", 903 | "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", 904 | "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" 905 | }, 906 | "node_modules/node-domexception": { 907 | "version": "1.0.0", 908 | "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", 909 | "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", 910 | "funding": [ 911 | { 912 | "type": "github", 913 | "url": "https://github.com/sponsors/jimmywarting" 914 | }, 915 | { 916 | "type": "github", 917 | "url": "https://paypal.me/jimmywarting" 918 | } 919 | ], 920 | "engines": { 921 | "node": ">=10.5.0" 922 | } 923 | }, 924 | "node_modules/node-fetch": { 925 | "version": "3.3.2", 926 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", 927 | "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", 928 | "dependencies": { 929 | "data-uri-to-buffer": "^4.0.0", 930 | "fetch-blob": "^3.1.4", 931 | "formdata-polyfill": "^4.0.10" 932 | }, 933 | "engines": { 934 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 935 | }, 936 | "funding": { 937 | "type": "opencollective", 938 | "url": "https://opencollective.com/node-fetch" 939 | } 940 | }, 941 | "node_modules/node-gyp-build": { 942 | "version": "4.8.1", 943 | "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.1.tgz", 944 | "integrity": "sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==", 945 | "bin": { 946 | "node-gyp-build": "bin.js", 947 | "node-gyp-build-optional": "optional.js", 948 | "node-gyp-build-test": "build-test.js" 949 | } 950 | }, 951 | "node_modules/node-localstorage": { 952 | "version": "2.2.1", 953 | "resolved": "https://registry.npmjs.org/node-localstorage/-/node-localstorage-2.2.1.tgz", 954 | "integrity": "sha512-vv8fJuOUCCvSPjDjBLlMqYMHob4aGjkmrkaE42/mZr0VT+ZAU10jRF8oTnX9+pgU9/vYJ8P7YT3Vd6ajkmzSCw==", 955 | "dependencies": { 956 | "write-file-atomic": "^1.1.4" 957 | }, 958 | "engines": { 959 | "node": ">=0.12" 960 | } 961 | }, 962 | "node_modules/number-is-nan": { 963 | "version": "1.0.1", 964 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 965 | "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", 966 | "engines": { 967 | "node": ">=0.10.0" 968 | } 969 | }, 970 | "node_modules/object-assign": { 971 | "version": "4.1.1", 972 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 973 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 974 | "engines": { 975 | "node": ">=0.10.0" 976 | } 977 | }, 978 | "node_modules/once": { 979 | "version": "1.4.0", 980 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 981 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 982 | "dependencies": { 983 | "wrappy": "1" 984 | } 985 | }, 986 | "node_modules/one-time": { 987 | "version": "1.0.0", 988 | "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", 989 | "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", 990 | "dependencies": { 991 | "fn.name": "1.x.x" 992 | } 993 | }, 994 | "node_modules/onetime": { 995 | "version": "5.1.2", 996 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", 997 | "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", 998 | "dependencies": { 999 | "mimic-fn": "^2.1.0" 1000 | }, 1001 | "engines": { 1002 | "node": ">=6" 1003 | }, 1004 | "funding": { 1005 | "url": "https://github.com/sponsors/sindresorhus" 1006 | } 1007 | }, 1008 | "node_modules/pako": { 1009 | "version": "2.1.0", 1010 | "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", 1011 | "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" 1012 | }, 1013 | "node_modules/path-browserify": { 1014 | "version": "1.0.1", 1015 | "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", 1016 | "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" 1017 | }, 1018 | "node_modules/readable-stream": { 1019 | "version": "3.6.2", 1020 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", 1021 | "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", 1022 | "dependencies": { 1023 | "inherits": "^2.0.3", 1024 | "string_decoder": "^1.1.1", 1025 | "util-deprecate": "^1.0.1" 1026 | }, 1027 | "engines": { 1028 | "node": ">= 6" 1029 | } 1030 | }, 1031 | "node_modules/readline2": { 1032 | "version": "1.0.1", 1033 | "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", 1034 | "integrity": "sha512-8/td4MmwUB6PkZUbV25uKz7dfrmjYWxsW8DVfibWdlHRk/l/DfHKn4pU+dfcoGLFgWOdyGCzINRQD7jn+Bv+/g==", 1035 | "dependencies": { 1036 | "code-point-at": "^1.0.0", 1037 | "is-fullwidth-code-point": "^1.0.0", 1038 | "mute-stream": "0.0.5" 1039 | } 1040 | }, 1041 | "node_modules/readline2/node_modules/is-fullwidth-code-point": { 1042 | "version": "1.0.0", 1043 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 1044 | "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", 1045 | "dependencies": { 1046 | "number-is-nan": "^1.0.0" 1047 | }, 1048 | "engines": { 1049 | "node": ">=0.10.0" 1050 | } 1051 | }, 1052 | "node_modules/readline2/node_modules/mute-stream": { 1053 | "version": "0.0.5", 1054 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", 1055 | "integrity": "sha512-EbrziT4s8cWPmzr47eYVW3wimS4HsvlnV5ri1xw1aR6JQo/OrJX5rkl32K/QQHdxeabJETtfeaROGhd8W7uBgg==" 1056 | }, 1057 | "node_modules/real-cancellable-promise": { 1058 | "version": "1.2.0", 1059 | "resolved": "https://registry.npmjs.org/real-cancellable-promise/-/real-cancellable-promise-1.2.0.tgz", 1060 | "integrity": "sha512-FYhmx1FVSgoPRjneoTjh+EKZcNb8ijl/dyatTzase5eujYhVrLNDOiIY6AgQq7GU1kOoLgEd9jLVbhFg8k8dOQ==" 1061 | }, 1062 | "node_modules/regenerator-runtime": { 1063 | "version": "0.11.1", 1064 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", 1065 | "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" 1066 | }, 1067 | "node_modules/restore-cursor": { 1068 | "version": "3.1.0", 1069 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", 1070 | "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", 1071 | "dependencies": { 1072 | "onetime": "^5.1.0", 1073 | "signal-exit": "^3.0.2" 1074 | }, 1075 | "engines": { 1076 | "node": ">=8" 1077 | } 1078 | }, 1079 | "node_modules/run-async": { 1080 | "version": "0.1.0", 1081 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", 1082 | "integrity": "sha512-qOX+w+IxFgpUpJfkv2oGN0+ExPs68F4sZHfaRRx4dDexAQkG83atugKVEylyT5ARees3HBbfmuvnjbrd8j9Wjw==", 1083 | "dependencies": { 1084 | "once": "^1.3.0" 1085 | } 1086 | }, 1087 | "node_modules/rx-lite": { 1088 | "version": "3.1.2", 1089 | "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", 1090 | "integrity": "sha512-1I1+G2gteLB8Tkt8YI1sJvSIfa0lWuRtC8GjvtyPBcLSF5jBCCJJqKrpER5JU5r6Bhe+i9/pK3VMuUcXu0kdwQ==" 1091 | }, 1092 | "node_modules/safe-buffer": { 1093 | "version": "5.2.1", 1094 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1095 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1096 | "funding": [ 1097 | { 1098 | "type": "github", 1099 | "url": "https://github.com/sponsors/feross" 1100 | }, 1101 | { 1102 | "type": "patreon", 1103 | "url": "https://www.patreon.com/feross" 1104 | }, 1105 | { 1106 | "type": "consulting", 1107 | "url": "https://feross.org/support" 1108 | } 1109 | ] 1110 | }, 1111 | "node_modules/safe-stable-stringify": { 1112 | "version": "2.4.3", 1113 | "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", 1114 | "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", 1115 | "engines": { 1116 | "node": ">=10" 1117 | } 1118 | }, 1119 | "node_modules/signal-exit": { 1120 | "version": "3.0.7", 1121 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", 1122 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" 1123 | }, 1124 | "node_modules/simple-swizzle": { 1125 | "version": "0.2.2", 1126 | "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", 1127 | "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", 1128 | "dependencies": { 1129 | "is-arrayish": "^0.3.1" 1130 | } 1131 | }, 1132 | "node_modules/slide": { 1133 | "version": "1.1.6", 1134 | "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", 1135 | "integrity": "sha512-NwrtjCg+lZoqhFU8fOwl4ay2ei8PaqCBOUV3/ektPY9trO1yQ1oXEfmHAhKArUVUr/hOHvy5f6AdP17dCM0zMw==", 1136 | "engines": { 1137 | "node": "*" 1138 | } 1139 | }, 1140 | "node_modules/smart-buffer": { 1141 | "version": "4.2.0", 1142 | "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", 1143 | "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", 1144 | "engines": { 1145 | "node": ">= 6.0.0", 1146 | "npm": ">= 3.0.0" 1147 | } 1148 | }, 1149 | "node_modules/socks": { 1150 | "version": "2.8.3", 1151 | "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", 1152 | "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", 1153 | "dependencies": { 1154 | "ip-address": "^9.0.5", 1155 | "smart-buffer": "^4.2.0" 1156 | }, 1157 | "engines": { 1158 | "node": ">= 10.0.0", 1159 | "npm": ">= 3.0.0" 1160 | } 1161 | }, 1162 | "node_modules/sprintf-js": { 1163 | "version": "1.1.3", 1164 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", 1165 | "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==" 1166 | }, 1167 | "node_modules/stack-trace": { 1168 | "version": "0.0.10", 1169 | "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", 1170 | "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", 1171 | "engines": { 1172 | "node": "*" 1173 | } 1174 | }, 1175 | "node_modules/store2": { 1176 | "version": "2.14.3", 1177 | "resolved": "https://registry.npmjs.org/store2/-/store2-2.14.3.tgz", 1178 | "integrity": "sha512-4QcZ+yx7nzEFiV4BMLnr/pRa5HYzNITX2ri0Zh6sT9EyQHbBHacC6YigllUPU9X3D0f/22QCgfokpKs52YRrUg==" 1179 | }, 1180 | "node_modules/string_decoder": { 1181 | "version": "1.3.0", 1182 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 1183 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 1184 | "dependencies": { 1185 | "safe-buffer": "~5.2.0" 1186 | } 1187 | }, 1188 | "node_modules/string-width": { 1189 | "version": "4.2.3", 1190 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1191 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1192 | "dependencies": { 1193 | "emoji-regex": "^8.0.0", 1194 | "is-fullwidth-code-point": "^3.0.0", 1195 | "strip-ansi": "^6.0.1" 1196 | }, 1197 | "engines": { 1198 | "node": ">=8" 1199 | } 1200 | }, 1201 | "node_modules/strip-ansi": { 1202 | "version": "6.0.1", 1203 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1204 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1205 | "dependencies": { 1206 | "ansi-regex": "^5.0.1" 1207 | }, 1208 | "engines": { 1209 | "node": ">=8" 1210 | } 1211 | }, 1212 | "node_modules/supports-color": { 1213 | "version": "2.0.0", 1214 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 1215 | "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", 1216 | "engines": { 1217 | "node": ">=0.8.0" 1218 | } 1219 | }, 1220 | "node_modules/telegram": { 1221 | "version": "2.22.2", 1222 | "resolved": "https://registry.npmjs.org/telegram/-/telegram-2.22.2.tgz", 1223 | "integrity": "sha512-9payizc801Aqqu4eTGPc0huxKnIwFe0hn18mrpbgAKKiMLurX/UIQW/fjPhI5ONzockDFsaXDFqTreXBoG1u3A==", 1224 | "dependencies": { 1225 | "@cryptography/aes": "^0.1.1", 1226 | "async-mutex": "^0.3.0", 1227 | "big-integer": "^1.6.48", 1228 | "buffer": "^6.0.3", 1229 | "htmlparser2": "^6.1.0", 1230 | "mime": "^3.0.0", 1231 | "node-localstorage": "^2.2.1", 1232 | "pako": "^2.0.3", 1233 | "path-browserify": "^1.0.1", 1234 | "real-cancellable-promise": "^1.1.1", 1235 | "socks": "^2.6.2", 1236 | "store2": "^2.13.0", 1237 | "ts-custom-error": "^3.2.0", 1238 | "websocket": "^1.0.34" 1239 | }, 1240 | "optionalDependencies": { 1241 | "bufferutil": "^4.0.3", 1242 | "utf-8-validate": "^5.0.5" 1243 | } 1244 | }, 1245 | "node_modules/text-hex": { 1246 | "version": "1.0.0", 1247 | "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", 1248 | "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" 1249 | }, 1250 | "node_modules/through": { 1251 | "version": "2.3.8", 1252 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1253 | "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" 1254 | }, 1255 | "node_modules/triple-beam": { 1256 | "version": "1.4.1", 1257 | "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", 1258 | "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", 1259 | "engines": { 1260 | "node": ">= 14.0.0" 1261 | } 1262 | }, 1263 | "node_modules/ts-custom-error": { 1264 | "version": "3.3.1", 1265 | "resolved": "https://registry.npmjs.org/ts-custom-error/-/ts-custom-error-3.3.1.tgz", 1266 | "integrity": "sha512-5OX1tzOjxWEgsr/YEUWSuPrQ00deKLh6D7OTWcvNHm12/7QPyRh8SYpyWvA4IZv8H/+GQWQEh/kwo95Q9OVW1A==", 1267 | "engines": { 1268 | "node": ">=14.0.0" 1269 | } 1270 | }, 1271 | "node_modules/tslib": { 1272 | "version": "2.6.3", 1273 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", 1274 | "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" 1275 | }, 1276 | "node_modules/twisters": { 1277 | "version": "1.1.0", 1278 | "resolved": "https://registry.npmjs.org/twisters/-/twisters-1.1.0.tgz", 1279 | "integrity": "sha512-sl1XvWbIF7H8tuGXkjcUMrxKeyhco0fhzckXHZFJ9+IIDQPy/tLkKkRSWC85D883nJaMdJxxkNAO00hN/TD/Dg==", 1280 | "dependencies": { 1281 | "cli-cursor": "^3.1.0", 1282 | "mute-stream": "^0.0.8", 1283 | "string-width": "^4.2.0", 1284 | "wrap-ansi": "^7.0.0" 1285 | } 1286 | }, 1287 | "node_modules/type": { 1288 | "version": "2.7.3", 1289 | "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", 1290 | "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==" 1291 | }, 1292 | "node_modules/typedarray-to-buffer": { 1293 | "version": "3.1.5", 1294 | "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", 1295 | "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", 1296 | "dependencies": { 1297 | "is-typedarray": "^1.0.0" 1298 | } 1299 | }, 1300 | "node_modules/utf-8-validate": { 1301 | "version": "5.0.10", 1302 | "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", 1303 | "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", 1304 | "hasInstallScript": true, 1305 | "dependencies": { 1306 | "node-gyp-build": "^4.3.0" 1307 | }, 1308 | "engines": { 1309 | "node": ">=6.14.2" 1310 | } 1311 | }, 1312 | "node_modules/util-deprecate": { 1313 | "version": "1.0.2", 1314 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1315 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" 1316 | }, 1317 | "node_modules/web-streams-polyfill": { 1318 | "version": "3.3.3", 1319 | "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", 1320 | "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", 1321 | "engines": { 1322 | "node": ">= 8" 1323 | } 1324 | }, 1325 | "node_modules/websocket": { 1326 | "version": "1.0.35", 1327 | "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.35.tgz", 1328 | "integrity": "sha512-/REy6amwPZl44DDzvRCkaI1q1bIiQB0mEFQLUrhz3z2EK91cp3n72rAjUlrTP0zV22HJIUOVHQGPxhFRjxjt+Q==", 1329 | "dependencies": { 1330 | "bufferutil": "^4.0.1", 1331 | "debug": "^2.2.0", 1332 | "es5-ext": "^0.10.63", 1333 | "typedarray-to-buffer": "^3.1.5", 1334 | "utf-8-validate": "^5.0.2", 1335 | "yaeti": "^0.0.6" 1336 | }, 1337 | "engines": { 1338 | "node": ">=4.0.0" 1339 | } 1340 | }, 1341 | "node_modules/winston": { 1342 | "version": "3.13.0", 1343 | "resolved": "https://registry.npmjs.org/winston/-/winston-3.13.0.tgz", 1344 | "integrity": "sha512-rwidmA1w3SE4j0E5MuIufFhyJPBDG7Nu71RkZor1p2+qHvJSZ9GYDA81AyleQcZbh/+V6HjeBdfnTZJm9rSeQQ==", 1345 | "dependencies": { 1346 | "@colors/colors": "^1.6.0", 1347 | "@dabh/diagnostics": "^2.0.2", 1348 | "async": "^3.2.3", 1349 | "is-stream": "^2.0.0", 1350 | "logform": "^2.4.0", 1351 | "one-time": "^1.0.0", 1352 | "readable-stream": "^3.4.0", 1353 | "safe-stable-stringify": "^2.3.1", 1354 | "stack-trace": "0.0.x", 1355 | "triple-beam": "^1.3.0", 1356 | "winston-transport": "^4.7.0" 1357 | }, 1358 | "engines": { 1359 | "node": ">= 12.0.0" 1360 | } 1361 | }, 1362 | "node_modules/winston-transport": { 1363 | "version": "4.7.0", 1364 | "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.7.0.tgz", 1365 | "integrity": "sha512-ajBj65K5I7denzer2IYW6+2bNIVqLGDHqDw3Ow8Ohh+vdW+rv4MZ6eiDvHoKhfJFZ2auyN8byXieDDJ96ViONg==", 1366 | "dependencies": { 1367 | "logform": "^2.3.2", 1368 | "readable-stream": "^3.6.0", 1369 | "triple-beam": "^1.3.0" 1370 | }, 1371 | "engines": { 1372 | "node": ">= 12.0.0" 1373 | } 1374 | }, 1375 | "node_modules/wrap-ansi": { 1376 | "version": "7.0.0", 1377 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 1378 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 1379 | "dependencies": { 1380 | "ansi-styles": "^4.0.0", 1381 | "string-width": "^4.1.0", 1382 | "strip-ansi": "^6.0.0" 1383 | }, 1384 | "engines": { 1385 | "node": ">=10" 1386 | }, 1387 | "funding": { 1388 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 1389 | } 1390 | }, 1391 | "node_modules/wrappy": { 1392 | "version": "1.0.2", 1393 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1394 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" 1395 | }, 1396 | "node_modules/write-file-atomic": { 1397 | "version": "1.3.4", 1398 | "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", 1399 | "integrity": "sha512-SdrHoC/yVBPpV0Xq/mUZQIpW2sWXAShb/V4pomcJXh92RuaO+f3UTWItiR3Px+pLnV2PvC2/bfn5cwr5X6Vfxw==", 1400 | "dependencies": { 1401 | "graceful-fs": "^4.1.11", 1402 | "imurmurhash": "^0.1.4", 1403 | "slide": "^1.1.5" 1404 | } 1405 | }, 1406 | "node_modules/yaeti": { 1407 | "version": "0.0.6", 1408 | "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", 1409 | "integrity": "sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==", 1410 | "engines": { 1411 | "node": ">=0.10.32" 1412 | } 1413 | } 1414 | } 1415 | } 1416 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "blum-bot", 3 | "version": "1.0.0", 4 | "type": "module", 5 | "description": "BOT", 6 | "main": "index.js", 7 | "scripts": { 8 | "start": "node index.js", 9 | "test": "node test.js" 10 | }, 11 | "keywords": [ 12 | "bot", 13 | "blum", 14 | "blum-mining" 15 | ], 16 | "author": "Widiskel", 17 | "license": "ISC", 18 | "dependencies": { 19 | "https-proxy-agent": "^7.0.5", 20 | "input": "^1.0.1", 21 | "moment": "^2.30.1", 22 | "moment-timezone": "^0.5.45", 23 | "node-fetch": "^3.3.2", 24 | "telegram": "^2.22.2", 25 | "twisters": "^1.1.0", 26 | "winston": "^3.13.0" 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/api/api.js: -------------------------------------------------------------------------------- 1 | import fetch from "node-fetch"; 2 | import { Helper } from "../utils/helper.js"; 3 | import logger from "../utils/logger.js"; 4 | import { HttpsProxyAgent } from "https-proxy-agent"; 5 | 6 | export class API { 7 | constructor(proxy) { 8 | this.proxy = proxy; 9 | } 10 | 11 | generateHeaders(token) { 12 | const headers = { 13 | accept: "application/json, text/plain, */*", 14 | "user-agent": Helper.randomUserAgent(), 15 | "content-type": "application/json", 16 | origin: "https://telegram.blum.codes", 17 | "x-requested-with": "org.telegram.messenger", 18 | "sec-fetch-site": "same-site", 19 | "sec-fetch-mode": "cors", 20 | "sec-fetch-dest": "empty", 21 | referer: "https://telegram.blum.codes/", 22 | "accept-encoding": "gzip, deflate", 23 | "accept-language": "en,en-US;q=0.9", 24 | }; 25 | if (token) { 26 | headers.Authorization = `Bearer ${token}`; 27 | } 28 | // console.log(headers); 29 | return headers; 30 | } 31 | 32 | async fetch(endpoint, method, token, body = {}) { 33 | try { 34 | const url = `${endpoint}`; 35 | const headers = this.generateHeaders(token); 36 | const options = { 37 | cache: "default", 38 | credentials: "include", 39 | headers, 40 | method, 41 | mode: "cors", 42 | redirect: "follow", 43 | referrerPolicy: "no-referrer", 44 | }; 45 | let ip; 46 | if (this.proxy) { 47 | options.agent = new HttpsProxyAgent(this.proxy); 48 | ip = await this.checkIP(); 49 | } 50 | logger.info( 51 | `${method} : ${url} ${ 52 | this.proxy 53 | ? `(Requester : Original IP : ${ip[0]} : Proxy IP ${ip[1]})` 54 | : `` 55 | }` 56 | ); 57 | 58 | if (method !== "GET") { 59 | if (body != {}) { 60 | options.body = `${JSON.stringify(body)}`; 61 | headers["Content-Length"] = Buffer.byteLength(options.body, "utf-8"); 62 | } 63 | } 64 | logger.info(`Request Header : ${JSON.stringify(headers)}`); 65 | logger.info(`Request Body : ${JSON.stringify(options.body)}`); 66 | 67 | const res = await fetch(url, options); 68 | 69 | logger.info(`Response : ${res.status} ${res.statusText}`); 70 | if (res.ok || res.status == 412) { 71 | const contentType = res.headers.get("content-type"); 72 | let data; 73 | 74 | if (contentType && contentType.includes("application/json")) { 75 | data = await res.json(); 76 | } else { 77 | data = await res.text(); 78 | } 79 | 80 | logger.info(`Response Data : ${JSON.stringify(data)}`); 81 | return data; 82 | } else { 83 | if (this.proxy) { 84 | if (res.status == 520) { 85 | throw Error(`520 Bad Gateway (Posible Proxy Problem)`); 86 | } 87 | } 88 | if (res.status == 520) { 89 | throw Error(`520 Bad Gateway (Posible Game Server Problem)`); 90 | } 91 | 92 | throw new Error( 93 | `${res.status} ${res.statusText ?? "Something wen't wrong"}` 94 | ); 95 | } 96 | } catch (err) { 97 | logger.error(`Error : ${err.message}`); 98 | throw err; 99 | } 100 | } 101 | 102 | async checkIP() { 103 | const options = {}; 104 | 105 | if (this.proxy) { 106 | let originalIp; 107 | let proxyIp; 108 | try { 109 | const res = await fetch("https://api.ipify.org?format=json", options); 110 | const data = await res.json(); 111 | originalIp = data.ip; 112 | } catch (error) { 113 | throw Error(`Failed to fetch IP: ${error.message}`); 114 | } 115 | 116 | options.agent = new HttpsProxyAgent(this.proxy); 117 | 118 | try { 119 | const res = await fetch("https://api.ipify.org?format=json", options); 120 | const data = await res.json(); 121 | proxyIp = data.ip; 122 | } catch (error) { 123 | throw Error(`Failed to fetch IP: ${error.message}`); 124 | } 125 | 126 | return [originalIp, proxyIp]; 127 | } 128 | } 129 | } 130 | -------------------------------------------------------------------------------- /src/blum/blum.js: -------------------------------------------------------------------------------- 1 | import { API } from "../api/api.js"; 2 | import { Helper } from "../utils/helper.js"; 3 | 4 | export class Blum extends API { 5 | constructor(acc, query, queryObj, proxy) { 6 | super(proxy); 7 | this.account = acc; 8 | this.query = query; 9 | this.elig = false; 10 | } 11 | 12 | async login() { 13 | return new Promise(async (resolve, reject) => { 14 | await Helper.delay(500, this.account, `Try to Login...`, this); 15 | await this.fetch( 16 | "https://user-domain.blum.codes/api/v1/auth/provider/PROVIDER_TELEGRAM_MINI_APP", 17 | "POST", 18 | undefined, 19 | { 20 | query: this.query, 21 | } 22 | ) 23 | .then(async (data) => { 24 | this.token = data.token.access; 25 | this.refresh = data.token.refresh; 26 | await Helper.delay(500, this.account, `Succesfully Login...`, this); 27 | resolve(); 28 | }) 29 | .catch((err) => { 30 | reject(err); 31 | }); 32 | }); 33 | } 34 | async getUser(msg = false) { 35 | return new Promise(async (resolve, reject) => { 36 | if (msg) 37 | await Helper.delay(500, this.account, `Getting User Info...`, this); 38 | await this.fetch( 39 | "https://gateway.blum.codes/v1/user/me", 40 | "GET", 41 | this.token 42 | ) 43 | .then(async (data) => { 44 | this.user = data; 45 | if (msg) 46 | await Helper.delay(500, this.account, `Succesfully Login...`, this); 47 | resolve(); 48 | }) 49 | .catch((err) => { 50 | reject(err); 51 | }); 52 | }); 53 | } 54 | async getBalance(msg = false) { 55 | return new Promise(async (resolve, reject) => { 56 | if (msg) 57 | await Helper.delay(500, this.account, `Getting User Balance...`, this); 58 | await this.fetch( 59 | "https://game-domain.blum.codes/api/v1/user/balance", 60 | "GET", 61 | this.token 62 | ) 63 | .then(async (data) => { 64 | if (msg) 65 | await Helper.delay( 66 | 500, 67 | this.account, 68 | `Succesfully Get User Balance...`, 69 | this 70 | ); 71 | this.balance = data; 72 | resolve(); 73 | }) 74 | .catch((err) => { 75 | reject(err); 76 | }); 77 | }); 78 | } 79 | async claim() { 80 | return new Promise(async (resolve, reject) => { 81 | await Helper.delay( 82 | 500, 83 | this.account, 84 | `Try To Claim Farming Reward...`, 85 | this 86 | ); 87 | await this.fetch( 88 | "https://game-domain.blum.codes/api/v1/farming/claim", 89 | "POST", 90 | this.token 91 | ) 92 | .then(async (data) => { 93 | this.balance.availableBalance = data.availableBalance; 94 | this.balance.playPasses = data.playPasses; 95 | await Helper.delay(1000, this.account, `Farmin Reward Claimed`, this); 96 | resolve(); 97 | }) 98 | .catch((err) => { 99 | reject(err); 100 | }); 101 | }); 102 | } 103 | async mining() { 104 | return new Promise(async (resolve, reject) => { 105 | await Helper.delay(500, this.account, `Try to Start Farm...`, this); 106 | await this.fetch( 107 | "https://game-domain.blum.codes/api/v1/farming/start", 108 | "POST", 109 | this.token 110 | ) 111 | .then(async (data) => { 112 | this.balance.farming = { 113 | startTime: 0, 114 | endTime: 0, 115 | earningsRate: 0, 116 | balance: 0, 117 | }; 118 | this.balance.farming.startTime = data.startTime; 119 | this.balance.farming.endTime = data.endTime; 120 | this.balance.farming.earningsRate = data.earningsRate; 121 | this.balance.farming.balance = data.balance; 122 | 123 | await Helper.delay(500, this.account, `Farming Started...`, this); 124 | resolve(); 125 | }) 126 | .catch((err) => { 127 | reject(err); 128 | }); 129 | }); 130 | } 131 | async getTasks(msg = false) { 132 | return new Promise(async (resolve, reject) => { 133 | if (msg) 134 | await Helper.delay( 135 | 500, 136 | this.account, 137 | `Getting Available Task...`, 138 | this 139 | ); 140 | await this.fetch( 141 | "https://earn-domain.blum.codes/api/v1/tasks", 142 | "GET", 143 | this.token 144 | ) 145 | .then(async (data) => { 146 | this.tasks = []; 147 | for (const tasks of data) { 148 | if (tasks.tasks) { 149 | for (const item of tasks.tasks) { 150 | if (item.subTasks) { 151 | this.tasks.push(...item.subTasks); 152 | } else { 153 | this.tasks.push(item); 154 | } 155 | } 156 | } 157 | if (tasks.subSections) { 158 | for (const subsection of tasks.subSections) { 159 | this.tasks.push(...subsection.tasks); 160 | } 161 | } 162 | } 163 | if (msg) 164 | await Helper.delay( 165 | 3000, 166 | this.account, 167 | `Successfully Get Tasks`, 168 | this 169 | ); 170 | resolve(); 171 | }) 172 | .catch((err) => { 173 | reject(err); 174 | }); 175 | }); 176 | } 177 | 178 | async startAndCompleteTask(taskId) { 179 | return new Promise(async (resolve, reject) => { 180 | await Helper.delay( 181 | 1000, 182 | this.account, 183 | `Try To Complete Mission with id ${taskId}...`, 184 | this 185 | ); 186 | await this.fetch( 187 | `https://earn-domain.blum.codes/api/v1/tasks/${taskId}/start`, 188 | "POST", 189 | this.token 190 | ) 191 | .then(async (data) => { 192 | if (data.status == "STARTED" || data.status == "READY_FOR_CLAIM") { 193 | await this.completeTask(taskId) 194 | .then(resolve) 195 | .catch((err) => reject(err)); 196 | } else { 197 | resolve(); 198 | } 199 | }) 200 | .catch((err) => { 201 | reject(err); 202 | }); 203 | }); 204 | } 205 | async validateAndCompleteTask(taskId, answer) { 206 | return new Promise(async (resolve, reject) => { 207 | await Helper.delay( 208 | 1000, 209 | this.account, 210 | `Try To Validating Mission with id ${taskId}...`, 211 | this 212 | ); 213 | const body = { keyword: answer }; 214 | await this.fetch( 215 | `https://earn-domain.blum.codes/api/v1/tasks/${taskId}/validate`, 216 | "POST", 217 | this.token, 218 | body 219 | ) 220 | .then(async (data) => { 221 | if (data.status == "STARTED" || data.status == "READY_FOR_CLAIM") { 222 | await this.completeTask(taskId) 223 | .then(resolve) 224 | .catch((err) => reject(err)); 225 | } else { 226 | resolve(); 227 | } 228 | }) 229 | .catch((err) => { 230 | reject(err); 231 | }); 232 | }); 233 | } 234 | async completeTask(taskId) { 235 | return new Promise(async (resolve, reject) => { 236 | await Helper.delay( 237 | 2000, 238 | this.account, 239 | `Mission Completion for Task ${taskId} Started`, 240 | this 241 | ); 242 | await this.fetch( 243 | "https://earn-domain.blum.codes/api/v1/tasks/" + taskId + "/claim", 244 | "POST", 245 | this.token 246 | ) 247 | .then(async (data) => { 248 | if (data.status == "FINISHED") { 249 | await Helper.delay( 250 | 3000, 251 | this.account, 252 | `Mission Completion for Task ${taskId} ${data.title} ${data.status}`, 253 | this 254 | ); 255 | await this.getTasks(); 256 | resolve(); 257 | } else { 258 | resolve(); 259 | } 260 | }) 261 | .catch((err) => { 262 | reject(err); 263 | }); 264 | }); 265 | } 266 | 267 | async play() { 268 | return new Promise(async (resolve, reject) => { 269 | await Helper.delay( 270 | 500, 271 | this.account, 272 | `Trying to play a game using play pass...`, 273 | this 274 | ); 275 | await this.fetch( 276 | "https://game-domain.blum.codes/api/v2/game/play", 277 | "POST", 278 | this.token 279 | ) 280 | .then(async (data) => { 281 | await this.getBalance(); 282 | const max = 250; 283 | const min = 200; 284 | await Helper.delay( 285 | 500, 286 | this.account, 287 | `Got Game ID ${data.gameId}, Start playing`, 288 | this 289 | ); 290 | await Helper.delay( 291 | 30000, 292 | this.account, 293 | `Game ID ${data.gameId}, Playing for 30 Second`, 294 | this 295 | ); 296 | await this.claimGame( 297 | data.gameId, 298 | Math.floor(Math.random() * (max - min + 1)) + min 299 | ); 300 | 301 | resolve(); 302 | }) 303 | .catch((err) => { 304 | reject(err); 305 | }); 306 | }); 307 | } 308 | 309 | async gamePayloadGenerator(gameBody) { 310 | try { 311 | const zuydd = await this.fetch( 312 | "https://raw.githubusercontent.com/zuydd/database/main/blum.json", 313 | "GET" 314 | ); 315 | 316 | const payloadServer = JSON.parse(zuydd).payloadServer.find( 317 | (item) => item.status === 1 318 | ); 319 | 320 | if (!payloadServer) { 321 | throw new Error("No payload server found with status 1"); 322 | } 323 | 324 | const requestBody = { 325 | game_id: gameBody.gameId, 326 | points: gameBody.points, 327 | }; 328 | 329 | const res = await this.fetch( 330 | `https://${payloadServer.id}.vercel.app/api/`, 331 | "POST", 332 | undefined, 333 | requestBody 334 | ); 335 | 336 | return res; 337 | } catch (err) { 338 | throw err; 339 | } 340 | } 341 | async getTaskAnswer() { 342 | try { 343 | const zuydd = await this.fetch( 344 | "https://raw.githubusercontent.com/zuydd/database/main/blum.json", 345 | "GET" 346 | ); 347 | 348 | this.TASKANSWER = JSON.parse(zuydd).tasks; 349 | 350 | if (!this.TASKANSWER) { 351 | throw new Error("No Task ANswer FOund"); 352 | } 353 | } catch (err) { 354 | throw err; 355 | } 356 | } 357 | 358 | async checkDogsElig() { 359 | await Helper.delay( 360 | 500, 361 | this.account, 362 | `Checking if user eligible for dogs`, 363 | this 364 | ); 365 | 366 | try { 367 | const res = await this.fetch( 368 | "https://game-domain.blum.codes/api/v2/game/eligibility/dogs_drop", 369 | "GET", 370 | this.token 371 | ); 372 | this.elig = res.eligible; 373 | await Helper.delay( 374 | 500, 375 | this.account, 376 | `You are ${ 377 | res.eligible == true ? "Eligible" : "Not Eligible" 378 | } for dogs airdrop`, 379 | this 380 | ); 381 | } catch (err) {} 382 | } 383 | 384 | async claimGame(gameId, score) { 385 | await Helper.delay( 386 | 500, 387 | this.account, 388 | `Claiming game ${gameId} With Score ${score}`, 389 | this 390 | ); 391 | 392 | const maxRetries = 3; 393 | let retryCount = 0; 394 | 395 | while (retryCount <= maxRetries) { 396 | try { 397 | await this.fetch( 398 | "https://game-domain.blum.codes/api/v2/game/claim", 399 | "POST", 400 | this.token, 401 | await this.gamePayloadGenerator({ 402 | gameId: gameId, 403 | points: score, 404 | }) 405 | ); 406 | await Helper.delay( 407 | 10000, 408 | this.account, 409 | `Game ${gameId} Claimed with Score ${score}. Delaying For 10 Second`, 410 | this 411 | ); 412 | return; // Resolve the promise 413 | } catch (err) { 414 | retryCount += 1; 415 | if (retryCount > maxRetries) { 416 | return Promise.reject(err); // Reject if max retries reached 417 | } 418 | await Helper.delay( 419 | 3000, 420 | this.account, 421 | `Claim game failed, retrying after 3 seconds`, 422 | this 423 | ); 424 | } 425 | } 426 | } 427 | 428 | async checkIn() { 429 | return new Promise(async (resolve, reject) => { 430 | await Helper.delay(500, this.account, `Try to Check In...`, this); 431 | await this.fetch( 432 | "https://game-domain.blum.codes/api/v1/daily-reward?offset=-420", 433 | "GET", 434 | this.token 435 | ) 436 | .then(async () => { 437 | await this.fetch( 438 | "https://game-domain.blum.codes/api/v1/daily-reward?offset=-420", 439 | "POST", 440 | this.token 441 | ) 442 | .then(async () => { 443 | await Helper.delay( 444 | 1000, 445 | this.account, 446 | `Successfully Check In`, 447 | this 448 | ); 449 | resolve(); 450 | }) 451 | .catch((err) => { 452 | reject(err); 453 | }); 454 | }) 455 | .catch(async (err) => { 456 | if (err.message.includes("Not Found")) { 457 | await Helper.delay( 458 | 1000, 459 | this.account, 460 | `User Already Checked In`, 461 | this 462 | ); 463 | resolve(); 464 | } else { 465 | reject(err); 466 | } 467 | }); 468 | }); 469 | } 470 | } 471 | -------------------------------------------------------------------------------- /src/config/config_tmp.js: -------------------------------------------------------------------------------- 1 | export class Config { 2 | static TELEGRAM_APP_ID = undefined; // YOUR APP ID 3 | static TELEGRAM_APP_HASH = undefined; // YOUR APP HASH 4 | } 5 | -------------------------------------------------------------------------------- /src/config/proxy_list_tmp.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Example 3 | * export const proxyList = [ 4 | "http://proxyUser:proxyPass@proxyHost:proxyPort", 5 | "http://proxyUser:proxyPass@proxyHost:proxyPort", 6 | "http://proxyUser:proxyPass@proxyHost:proxyPort", 7 | ]; 8 | */ 9 | export const proxyList = []; 10 | -------------------------------------------------------------------------------- /src/core/telegram.js: -------------------------------------------------------------------------------- 1 | import input from "input"; 2 | import { Helper } from "../utils/helper.js"; 3 | import { Api, TelegramClient } from "telegram"; 4 | import { StoreSession } from "telegram/sessions/StoreSession.js"; 5 | import logger from "../utils/logger.js"; 6 | import { FloodWaitError } from "telegram/errors/RPCErrorList.js"; 7 | import { HttpsProxyAgent } from "https-proxy-agent"; 8 | import { Config } from "../config/config.js"; 9 | 10 | export class Telegram { 11 | storeSession; 12 | 13 | constructor() { 14 | this.accountName = "accounts"; 15 | this.url = "https://game-domain.blum.codes"; 16 | this.bot = "BlumCryptoBot"; 17 | } 18 | 19 | async init() { 20 | try { 21 | await this.onBoarding(); 22 | } catch (error) { 23 | console.log(error); 24 | logger.error(`${JSON.stringify(error)}`); 25 | throw error; 26 | } 27 | } 28 | async onBoarding() { 29 | try { 30 | let ctx = 31 | "Welcome to BLUM Bot \nBy : Widiskel \n \nLets getting started.\n\nYour Session List:\n"; 32 | const accountList = Helper.getSession("accounts"); 33 | 34 | if (accountList.length == 0) { 35 | ctx += ""; 36 | } else { 37 | for (const sess of accountList) { 38 | ctx += `- ${sess}\n`; 39 | } 40 | } 41 | ctx += "\n \nPlease Choose a menu: \n"; 42 | ctx += 43 | "\n \n1. Create Account \n2. Reset Account \n3. Start Bot\n4. Query modification\n \nInput your choice :"; 44 | const choice = await input.text(ctx); 45 | if (choice == 1) { 46 | await this.accountType(); 47 | } else if (choice == 2) { 48 | Helper.resetAccounts(); 49 | await Helper.delay(3000); 50 | await this.onBoarding(); 51 | } else if (choice == 3) { 52 | if (Helper.getSession(this.accountName)?.length == 0) { 53 | console.info("You don't have any Accounts, please create first"); 54 | await this.onBoarding(); 55 | } 56 | } else if (choice == 4) { 57 | await this.queryModificaiton(); 58 | } else { 59 | console.error("Invalid input, Please try again"); 60 | await this.onBoarding(); 61 | } 62 | } catch (error) { 63 | throw error; 64 | } 65 | } 66 | 67 | async queryModificaiton() { 68 | try { 69 | const accountList = Helper.getSession("accounts"); 70 | const queryAccountList = accountList.filter((item) => 71 | item.includes("query") 72 | ); 73 | let ctx = "Your Query Account List :\n \n"; 74 | 75 | for (const acc of queryAccountList) { 76 | ctx += `${accountList.indexOf(acc) + 1}. ${acc}\n`; 77 | } 78 | if (queryAccountList.length == 0) { 79 | console.log("You dont have any Query Account."); 80 | await this.onBoarding(); 81 | } else { 82 | ctx += "\n \nPlease Select Query Account for modification:"; 83 | } 84 | 85 | const choice = await input.text(ctx); 86 | 87 | if (queryAccountList[choice - 1] != undefined) { 88 | const account = queryAccountList[choice - 1]; 89 | this.accountName = `accounts/${account}`; 90 | const ctx2 = `Old Query : ${Helper.readQueryFile( 91 | `${this.accountName}/query.txt` 92 | )}\n \nPlease Enter New Query `; 93 | const newQuery = await input.text(ctx2); 94 | await Helper.saveQueryFile(this.accountName, newQuery); 95 | await Helper.delay(3000); 96 | await this.onBoarding(); 97 | } else { 98 | console.error("Invalid input, Please try again"); 99 | await this.queryModificaiton(); 100 | } 101 | } catch (error) { 102 | throw error; 103 | } 104 | } 105 | 106 | async sessionCreation() { 107 | try { 108 | if ( 109 | Config.TELEGRAM_APP_ID == undefined || 110 | Config.TELEGRAM_APP_HASH == undefined 111 | ) { 112 | throw new Error( 113 | "Please configure your TELEGRAM_APP_ID and TELEGRAM_APP_HASH first" 114 | ); 115 | } 116 | const accountList = Helper.getSession("accounts"); 117 | let ctx = "Your Account List :\n \n"; 118 | 119 | for (const sess of accountList) { 120 | ctx += `${accountList.indexOf(sess) + 1}. ${sess}\n`; 121 | } 122 | if (accountList.length == 0) { 123 | ctx += " \n \nPlease enter Session Name :"; 124 | } else { 125 | ctx += 126 | "\n \nYou already have sessions, cancel(CTRL+C) or create new Session :"; 127 | } 128 | 129 | const newSession = await input.text(ctx); 130 | this.accountName = Helper.createDir("sessions-" + newSession); 131 | await this.useSession(this.accountName); 132 | await this.disconnect(); 133 | logger.info(`Session ${this.accountName} - Created`); 134 | console.log( 135 | `Session ${newSession} - Created, Please Restart The Bot Again` 136 | ); 137 | this.storeSession.save(); 138 | await Helper.delay(3000); 139 | process.exit(); 140 | } catch (error) { 141 | throw error; 142 | } 143 | } 144 | 145 | async queryCreation() { 146 | try { 147 | const accountList = Helper.getSession("accounts"); 148 | let ctx = "Your Account List :\n \n"; 149 | 150 | for (const acc of accountList) { 151 | ctx += `${accountList.indexOf(acc) + 1}. ${acc}\n`; 152 | } 153 | if (accountList.length == 0) { 154 | ctx += " \n \nPlease enter Account Name :"; 155 | } else { 156 | ctx += 157 | "\n \nYou already have Account, cancel(CTRL+C) or create new Account :"; 158 | } 159 | 160 | const newAccount = await input.text(ctx); 161 | this.accountName = Helper.createDir("query-" + newAccount); 162 | 163 | let ctx2 = "Please Enter Telegram Query : "; 164 | const query = await input.text(ctx2); 165 | await Helper.saveQueryFile(this.accountName, query); 166 | 167 | logger.info(`Query ${this.accountName} - Created`); 168 | console.log( 169 | `Query ${newAccount} - Created, Please Restart The Bot Again` 170 | ); 171 | await Helper.delay(3000); 172 | process.exit(); 173 | } catch (error) { 174 | throw error; 175 | } 176 | } 177 | 178 | async accountType() { 179 | try { 180 | const accountList = Helper.getSession("accounts"); 181 | let ctx = "Your Account List :\n \n"; 182 | 183 | if (accountList.length > 0) { 184 | for (const sess of accountList) { 185 | ctx += `${accountList.indexOf(sess) + 1}. ${sess}\n`; 186 | } 187 | } else { 188 | ctx += `\n`; 189 | } 190 | ctx += 191 | "\n \nAvailable Account Type: \n1. Session \n2. Query\n \nPlease Entery Your Choice : "; 192 | 193 | const type = await input.text(ctx); 194 | 195 | if (type == 1) { 196 | await this.sessionCreation(); 197 | } else if (type == 2) { 198 | await this.queryCreation(); 199 | } else { 200 | console.log("Invalid Input"); 201 | await this.accountType(); 202 | } 203 | } catch (error) { 204 | throw error; 205 | } 206 | } 207 | 208 | async useSession(accountName, proxy) { 209 | try { 210 | this.proxy = proxy; 211 | const clientOptions = { 212 | connectionRetries: 5, 213 | }; 214 | if (this.proxy) { 215 | clientOptions.agent = new HttpsProxyAgent(this.proxy); 216 | } 217 | 218 | this.storeSession = new StoreSession(accountName); 219 | this.client = new TelegramClient( 220 | this.storeSession, 221 | Config.TELEGRAM_APP_ID, 222 | Config.TELEGRAM_APP_HASH, 223 | clientOptions 224 | ); 225 | this.storeSession.save(); 226 | 227 | await this.client.start({ 228 | phoneNumber: async () => 229 | await input.text("Enter your Telegram Phone Number ?"), 230 | password: async () => await input.text("Enter your Telegram Password?"), 231 | phoneCode: async () => 232 | await input.text("Enter your Telegram Verification Code ?"), 233 | onError: (err) => { 234 | console.log(err.message); 235 | }, 236 | }); 237 | console.log(); 238 | } catch (error) { 239 | throw error; 240 | } 241 | } 242 | 243 | async resolvePeer() { 244 | try { 245 | logger.info(`Session ${this.session} - Resolving Peer`); 246 | while (this.peer == undefined) { 247 | try { 248 | this.peer = await this.client.getEntity(this.bot); 249 | break; 250 | } catch (error) { 251 | if (error instanceof FloodWaitError) { 252 | const fls = error.seconds; 253 | 254 | logger.warn( 255 | `${this.client.session.serverAddress} | FloodWait ${error}` 256 | ); 257 | logger.info(`${this.client.session.serverAddress} | Sleep ${fls}s`); 258 | 259 | await Helper.delay((fls + 3) * 1000); 260 | } else { 261 | throw error; 262 | } 263 | } 264 | } 265 | } catch (error) { 266 | throw error; 267 | } 268 | } 269 | 270 | async disconnect() { 271 | await this.client.disconnect(); 272 | await this.client.destroy(); 273 | this.peer = undefined; 274 | this.accountName = undefined; 275 | } 276 | 277 | async initWebView() { 278 | try { 279 | const webView = await this.client.invoke( 280 | new Api.messages.RequestWebView({ 281 | peer: this.peer, 282 | bot: this.peer, 283 | fromBotMenu: true, 284 | url: this.url, 285 | platform: "android", 286 | }) 287 | ); 288 | logger.info(`Session ${this.session} - Webview Connected`); 289 | const authUrl = webView.url; 290 | // console.log(authUrl); 291 | return Helper.getTelegramQuery(authUrl, 3); 292 | } catch (error) { 293 | throw error; 294 | } 295 | } 296 | } 297 | -------------------------------------------------------------------------------- /src/utils/helper.js: -------------------------------------------------------------------------------- 1 | import { URL } from "url"; 2 | import moment from "moment"; 3 | import momentTz from "moment-timezone"; 4 | import fs from "fs"; 5 | import path from "path"; 6 | import { parse, stringify } from "querystring"; 7 | import twist from "./twist.js"; 8 | 9 | export class Helper { 10 | /** 11 | * Give random user agent 12 | * 13 | * @returns {string} random user agent 14 | */ 15 | static randomUserAgent() { 16 | const list_useragent = [ 17 | "Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/125.0.6422.80 Mobile/15E148 Safari/604.1", 18 | "Mozilla/5.0 (iPhone; CPU iPhone OS 17_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 EdgiOS/125.2535.60 Mobile/15E148 Safari/605.1.15", 19 | "Mozilla/5.0 (Linux; Android 10; SM-G973F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.6422.113 Mobile Safari/537.36 EdgA/124.0.2478.104", 20 | "Mozilla/5.0 (Linux; Android 10; Pixel 3 XL) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.6422.113 Mobile Safari/537.36 EdgA/124.0.2478.104", 21 | "Mozilla/5.0 (Linux; Android 10; VOG-L29) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.6422.113 Mobile Safari/537.36 OPR/76.2.4027.73374", 22 | "Mozilla/5.0 (Linux; Android 10; SM-N975F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.6422.113 Mobile Safari/537.36 OPR/76.2.4027.73374", 23 | ]; 24 | return list_useragent[Math.floor(Math.random() * list_useragent.length)]; 25 | } 26 | 27 | /** 28 | * Checks given timestamp. 29 | * 30 | * @param {number} milliseconds - The timestamp in milliseconds. 31 | */ 32 | static readTime(milliseconds) { 33 | const date = moment(milliseconds); 34 | return date.format("YYYY-MM-DD HH:mm:ss"); 35 | } 36 | 37 | static getCurrentTimestamp() { 38 | const timestamp = momentTz().tz("Asia/Jakarta").unix(); 39 | return timestamp.toString(); 40 | } 41 | 42 | /** 43 | * Checks if the given timestamp in milliseconds is before than the current time. 44 | * 45 | * @param {number} milliseconds - The timestamp in milliseconds. 46 | * @returns {boolean} True if the timestamp is before than the current time, false otherwise. 47 | */ 48 | static isFutureTime(milliseconds) { 49 | const now = moment.tz(moment(), "Asia/Jakarta"); 50 | const givenTime = moment.tz(milliseconds, "Asia/Jakarta"); 51 | 52 | return givenTime.isBefore(now); 53 | } 54 | 55 | /** 56 | * Extracts the domain from a given URL. 57 | * 58 | * @param {string} urlString - The URL from which to extract the domain. 59 | * @returns {string} The domain of the URL. 60 | */ 61 | static getDomain(urlString) { 62 | try { 63 | const url = new URL(urlString); 64 | return url.hostname; 65 | } catch (error) { 66 | console.error("Invalid URL:", error); 67 | return null; 68 | } 69 | } 70 | 71 | static delay = (ms, acc, msg, obj) => { 72 | return new Promise((resolve) => { 73 | let remainingMilliseconds = ms; 74 | 75 | if (acc != undefined) { 76 | twist.log(msg, acc, obj, `Delaying for ${this.msToTime(ms)}`); 77 | } else { 78 | twist.info(`Delaying for ${this.msToTime(ms)}`); 79 | } 80 | 81 | const interval = setInterval(() => { 82 | remainingMilliseconds -= 1000; 83 | if (acc != undefined) { 84 | twist.log( 85 | msg, 86 | acc, 87 | obj, 88 | `Delaying for ${this.msToTime(remainingMilliseconds)}` 89 | ); 90 | } else { 91 | twist.info(`Delaying for ${this.msToTime(remainingMilliseconds)}`); 92 | } 93 | 94 | if (remainingMilliseconds <= 0) { 95 | clearInterval(interval); 96 | resolve(); 97 | } 98 | }, 1000); 99 | 100 | setTimeout(async () => { 101 | clearInterval(interval); 102 | await twist.clearInfo(); 103 | if (acc) { 104 | twist.log(msg, acc, obj); 105 | } 106 | resolve(); 107 | }, ms); 108 | }); 109 | }; 110 | 111 | static getSession(sessionName) { 112 | try { 113 | const sessionsPath = "accounts"; 114 | if (!fs.existsSync(sessionsPath)) { 115 | fs.mkdirSync(sessionsPath); 116 | } 117 | const files = fs.readdirSync(path.resolve(sessionName)); 118 | const session = []; 119 | files.forEach((file) => { 120 | session.push(file); 121 | }); 122 | return session; 123 | } catch (error) { 124 | throw Error(`Error reading sessions directory: ${error},`); 125 | } 126 | } 127 | 128 | static resetAccounts(accountsName) { 129 | try { 130 | const files = fs.readdirSync(path.resolve(accountsName)); 131 | console.log("Deleting All Accounts..."); 132 | files.forEach((file) => { 133 | fs.rm( 134 | `${path.join(path.resolve("accounts"), file)}`, 135 | { recursive: true }, 136 | (err) => { 137 | if (err) throw err; 138 | } 139 | ); 140 | }); 141 | console.info("Accounts reset successfully"); 142 | } catch (error) { 143 | throw Error(`Error deleting accounts files: ${error},`); 144 | } 145 | } 146 | 147 | static getTelegramQuery(url, type) { 148 | const hashIndex = url.indexOf("#"); 149 | if (hashIndex === -1) { 150 | throw new Error("No query string found in the URL."); 151 | } 152 | 153 | const queryString = url.substring(hashIndex + 1); 154 | const decodedQueryString = queryString.split("&"); 155 | const param = decodedQueryString[0] 156 | .split("&")[0] 157 | .replace("tgWebAppData=", ""); 158 | 159 | if (!param) { 160 | throw new Error("Param not found in the query string."); 161 | } 162 | 163 | if (type == "1") { 164 | return param; 165 | } else if (type == "2") { 166 | return this.decodeQueryString(param); 167 | } else { 168 | const newParam = this.decodeQueryString(param); 169 | return this.jsonToInitParam(newParam); 170 | } 171 | } 172 | 173 | static jsonToInitParam(dataString) { 174 | const newData = parse(dataString); 175 | 176 | if (newData.user) { 177 | const userObject = JSON.parse(newData.user); 178 | newData.user = encodeURIComponent(JSON.stringify(userObject)); 179 | } 180 | 181 | const resultArray = []; 182 | for (const [key, value] of Object.entries(newData)) { 183 | resultArray.push(`${key}=${value}`); 184 | } 185 | const result = resultArray.join("&"); 186 | 187 | return result; 188 | } 189 | 190 | static decodeQueryString(encodedString) { 191 | const decodedString = decodeURIComponent(encodedString); 192 | const paramsArray = decodedString.split("&"); 193 | const paramsObject = {}; 194 | 195 | paramsArray.forEach((param) => { 196 | const [key, value] = param.split("="); 197 | if (key === "user") { 198 | paramsObject[key] = JSON.parse(decodeURIComponent(value)); 199 | } else { 200 | paramsObject[key] = value; 201 | } 202 | }); 203 | 204 | const resultArray = []; 205 | for (const [key, value] of Object.entries(paramsObject)) { 206 | if (key === "user") { 207 | resultArray.push(`${key}=${JSON.stringify(value)}`); 208 | } else { 209 | resultArray.push(`${key}=${value}`); 210 | } 211 | } 212 | 213 | return resultArray.join("&"); 214 | } 215 | 216 | static createDir(dirName) { 217 | try { 218 | const accountPaths = "accounts"; 219 | const dirPath = path.join(accountPaths, dirName); 220 | 221 | if (!fs.existsSync(accountPaths)) { 222 | fs.mkdirSync(accountPaths); 223 | } 224 | 225 | fs.mkdirSync(dirPath, { recursive: true }); 226 | 227 | console.log(dirPath); 228 | return dirPath; 229 | } catch (error) { 230 | throw new Error(`Error creating directory: ${error}`); 231 | } 232 | } 233 | static saveQueryFile(queryFilePath, query) { 234 | const filePath = path.resolve(queryFilePath, "query.txt"); 235 | 236 | fs.writeFile(filePath, query, "utf8", (err) => { 237 | if (err) { 238 | console.error("Error writing file:", err); 239 | } else { 240 | console.log("Query File Created/Modified Successfully."); 241 | } 242 | }); 243 | } 244 | 245 | static random(min, max) { 246 | const rand = Math.floor(Math.random() * (max - min + 1)) + min; 247 | return rand; 248 | } 249 | 250 | static msToTime(milliseconds) { 251 | const hours = Math.floor(milliseconds / (1000 * 60 * 60)); 252 | const remainingMillisecondsAfterHours = milliseconds % (1000 * 60 * 60); 253 | const minutes = Math.floor(remainingMillisecondsAfterHours / (1000 * 60)); 254 | const remainingMillisecondsAfterMinutes = 255 | remainingMillisecondsAfterHours % (1000 * 60); 256 | const seconds = Math.round(remainingMillisecondsAfterMinutes / 1000); 257 | 258 | return `${hours} Hours ${minutes} Minutes ${seconds} Seconds`; 259 | } 260 | 261 | static queryToJSON(query) { 262 | try { 263 | const queryObject = {}; 264 | const pairs = query.split("&"); 265 | 266 | pairs.forEach((pair) => { 267 | const [key, value] = pair.split("="); 268 | if (key === "user") { 269 | queryObject[key] = JSON.parse(decodeURIComponent(value)); 270 | } else { 271 | queryObject[key] = decodeURIComponent(value); 272 | } 273 | }); 274 | 275 | return queryObject; 276 | } catch (error) { 277 | throw Error("Invalid Query"); 278 | } 279 | } 280 | 281 | static generateRandomString(length) { 282 | const characters = 283 | "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; 284 | let result = ""; 285 | const charactersLength = characters.length; 286 | for (let i = 0; i < length; i++) { 287 | result += characters.charAt(Math.floor(Math.random() * charactersLength)); 288 | } 289 | return result; 290 | } 291 | 292 | static readQueryFile(queryPath) { 293 | try { 294 | const fullPath = path.resolve(queryPath); 295 | const query = fs.readFileSync(fullPath, "utf8"); 296 | return query; 297 | } catch (error) { 298 | console.log("No query.txt Files Found"); 299 | } 300 | } 301 | } 302 | -------------------------------------------------------------------------------- /src/utils/logger.js: -------------------------------------------------------------------------------- 1 | import { createLogger, format, transports } from "winston"; 2 | import fs from "fs"; 3 | const { combine, timestamp, printf, colorize } = format; 4 | 5 | const customFormat = printf(({ level, message, timestamp }) => { 6 | return `${timestamp} [${level}]: ${message}`; 7 | }); 8 | 9 | class Logger { 10 | constructor() { 11 | this.logger = createLogger({ 12 | level: "debug", 13 | format: combine( 14 | timestamp({ 15 | format: "YYYY-MM-DD HH:mm:ss", 16 | }), 17 | colorize(), 18 | customFormat 19 | ), 20 | transports: [new transports.File({ filename: "log/app.log" })], 21 | exceptionHandlers: [new transports.File({ filename: "log/app.log" })], 22 | rejectionHandlers: [new transports.File({ filename: "log/app.log" })], 23 | }); 24 | } 25 | 26 | info(message) { 27 | this.logger.info(message); 28 | } 29 | 30 | warn(message) { 31 | this.logger.warn(message); 32 | } 33 | 34 | error(message) { 35 | this.logger.error(message); 36 | } 37 | 38 | debug(message) { 39 | this.logger.debug(message); 40 | } 41 | 42 | setLevel(level) { 43 | this.logger.level = level; 44 | } 45 | 46 | clear() { 47 | fs.truncate("log/app.log", 0, (err) => { 48 | if (err) { 49 | this.logger.error("Failed to clear the log file: " + err.message); 50 | } else { 51 | this.logger.info("Log file cleared"); 52 | } 53 | }); 54 | } 55 | } 56 | 57 | export default new Logger(); 58 | -------------------------------------------------------------------------------- /src/utils/twist.js: -------------------------------------------------------------------------------- 1 | import { Twisters } from "twisters"; 2 | import logger from "./logger.js"; 3 | import { Blum } from "../blum/blum.js"; 4 | import { Helper } from "./helper.js"; 5 | 6 | class Twist { 7 | constructor() { 8 | /** @type {Twisters}*/ 9 | this.twisters = new Twisters(); 10 | } 11 | 12 | /** 13 | * @param {string} acc 14 | * @param {Blum} blum 15 | * @param {string} msg 16 | * @param {string} delay 17 | */ 18 | log(msg = "", acc = "", blum = new Blum(), delay) { 19 | // console.log(acc); 20 | if (delay == undefined) { 21 | logger.info(`${acc.id} - ${msg}`); 22 | delay = "-"; 23 | } 24 | 25 | const balance = blum.balance ?? {}; 26 | const blumBalance = balance.availableBalance ?? "-"; 27 | const playPasses = balance.playPasses ?? "-"; 28 | const farm = balance.farming 29 | ? `${Helper.readTime(balance.farming.startTime)} - ${Helper.readTime( 30 | balance.farming.endTime 31 | )} Rate: ${balance.farming.earningsRate} Balance : ${ 32 | balance.farming.balance 33 | } ${ 34 | Helper.isFutureTime(balance.farming.endTime) 35 | ? "(Claimable)" 36 | : "(Unclaimable)" 37 | }` 38 | : "-"; 39 | 40 | const task = blum.tasks ?? []; 41 | const completedTask = 42 | task.length != 0 43 | ? task.filter((item) => { 44 | return item.status === "FINISHED"; 45 | }).length 46 | : "-"; 47 | const uncompletableTaskIds = [ 48 | "a90d8b81-0974-47f1-bb00-807463433bde", 49 | "03e4a46f-7588-4950-8289-f42787e3eca2", 50 | ]; 51 | const uncompletedTask = 52 | task.length > 0 53 | ? task.filter( 54 | (item) => 55 | item.status !== "FINISHED" && 56 | item.type !== "WALLET_CONNECTION" && 57 | item.type !== "PROGRESS_TARGET" && 58 | !uncompletableTaskIds.includes(item.id) 59 | ).length 60 | : "-"; 61 | 62 | this.twisters.put(acc.id, { 63 | text: ` 64 | ================= Account ${acc.id} ============= 65 | Name : ${acc.firstName} ${acc.lastName} 66 | Balance : ${blumBalance} 67 | Play Pass : ${playPasses} 68 | Farm : ${farm} 69 | Task : ${completedTask} Completed | ${uncompletedTask} Uncompleted 70 | 71 | Status : ${msg} 72 | Delay : ${delay} 73 | ==============================================`, 74 | }); 75 | } 76 | /** 77 | * @param {string} msg 78 | */ 79 | info(msg = "") { 80 | this.twisters.put(2, { 81 | text: ` 82 | ============================================== 83 | Info : ${msg} 84 | ==============================================`, 85 | }); 86 | return; 87 | } 88 | 89 | clearInfo() { 90 | this.twisters.remove(2); 91 | } 92 | 93 | clear(acc) { 94 | this.twisters.remove(acc); 95 | } 96 | } 97 | 98 | export default new Twist(); 99 | --------------------------------------------------------------------------------