.
675 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | 🔥 ReYANG: Yet Another Nitro Generator - Reborn🚀
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 | The most efficient nitro generator and checker you'll ever find.
10 | Made with ❤ by Tenclea
11 |
12 | If you liked this project, please consider starring it :)
13 |
14 |
15 | 👀 Previews
16 |
17 |
18 | • Proxy Scrapper & Checker :
19 |
20 |
21 | • Main Nitro Codes Generator :
22 |
23 |
24 |
25 | ## ✨ Main features
26 |
27 | * 🔥 **Very fast code generator and checker (2000 attempts/minute)**
28 | * 🤖 Fully automated, can generate and check codes infinitely, no need to restart every hour
29 | * 🌐 Proxy scrapper and checker
30 | * 💰 Automatically redeems nitro
31 | * 📥 Download fresh proxies while checking codes
32 | * 🔔 Full webhook support
33 | * 📈 Real-time stats
34 |
35 | ## 💻 Setup
36 | * Download a compiled release from the [release page](https://github.com/Tenclea/ReYANG/releases).
37 | * Edit the config variables in the `config.yml` file as you like.
38 | * (Optional) Paste fresh http(s)/socks proxies into `required/http-proxies.txt`/`required/socks-proxies.txt`.
39 | * Start the generator by opening up the executable you downloaded !
40 |
41 | ## 📝 A Few Stats
42 | 
43 |
44 | ## ⚠ Disclaimer
45 |
46 | `Everything you can see here has been made for educational purposes and as a proof of concept.`
47 | `I do not promote the usage of my tools, and do not take responsibility for any bad usage of this tool.`
48 | `Stealing codes means stealing money from people and is against Discord's TOS. Don't.`
49 |
--------------------------------------------------------------------------------
/app.js:
--------------------------------------------------------------------------------
1 | const
2 | { default: axios } = require('axios'),
3 | chalk = require('chalk'),
4 | logger = require('./utils/logger'),
5 | ms = require('ms'),
6 | { checkToken, checkForUpdates, loadProxies, redeemNitro, sendWebhook, getAgentFromURI } = require('./utils/functions'),
7 | { existsSync, readFileSync, watchFile, writeFileSync } = require('fs'),
8 | yaml = require('js-yaml');
9 |
10 | const stats = { threads: 0, startTime: 0, used_codes: [], version: require('./package.json').version, working: 0 };
11 |
12 | console.clear();
13 | console.log(chalk.blue(`\u001B[?25l
14 | ██╗ ██╗ █████╗ ███╗ ██╗ ██████╗
15 | ╚██╗ ██╔╝██╔══██╗████╗ ██║██╔════╝
16 | ╚████╔╝ ███████║██╔██╗ ██║██║ ███╗
17 | ╚██╔╝ ██╔══██║██║╚██╗██║██║ ██║
18 | ██║ ██║ ██║██║ ╚████║╚██████╔╝
19 | ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═══╝ ╚═════╝
20 | ${chalk.italic.gray(`v${stats.version} - by Tenclea`)}
21 | `));
22 |
23 | let config = yaml.load(readFileSync('./config.yml'));
24 | watchFile('./config.yml', () => {
25 | config = yaml.load(readFileSync('./config.yml'));
26 |
27 | // Updates logger
28 | logger.level = config.debug_mode ? 'debug' : 'info';
29 | logger.info('Updated the config variables.');
30 |
31 | if (config.auto_redeem.enabled) checkToken(config.auto_redeem.token);
32 | return;
33 | });
34 |
35 | /* Load proxies, working proxies and removes duplicates */
36 | const http_proxies = loadProxies('./required/http-proxies.txt', 'http');
37 | const socks_proxies = loadProxies('./required/socks-proxies.txt', 'socks');
38 | const oldWorking = loadProxies('./working_proxies.txt');
39 |
40 | let proxies = [...new Set(http_proxies.concat(socks_proxies, oldWorking))];
41 |
42 | process.on('SIGINT', () => { process.exit(0); });
43 | process.on('exit', () => { logger.info('Closing YANG... If you liked this project, make sure to leave it a star on github: https://github.com/Tenclea/ReYANG ! <3'); checkForUpdates(); });
44 |
45 | (async () => {
46 | checkForUpdates();
47 |
48 | if (config.proxies.enable_scrapper) {
49 | logger.info('Downloading fresh proxies...');
50 |
51 | const downloaded = await require('./utils/proxy-scrapper')();
52 | const sliced = downloaded.slice(0, +config.proxies.max_proxies_download || downloaded.length);
53 |
54 | proxies = [...new Set(proxies.concat(sliced))];
55 |
56 | logger.info(`Downloaded ${chalk.yellow(sliced.length)} proxies.`);
57 | }
58 |
59 | if (!proxies[0]) { logger.error('Could not find any valid proxies. Please make sure to add some in the \'required\' folder.'); process.exit(1); }
60 |
61 | if (config.proxies.enable_checker) proxies = await require('./utils/proxy-checker')(proxies, config.threads, config.proxies.keep_transparent);
62 | if (!proxies[0]) { logger.error('All of your proxies were filtered out by the proxy checker. Please add some fresh ones in the \'required\' folder.'); process.exit(1); }
63 |
64 | logger.info(`Loaded ${chalk.yellow(proxies.length)} proxies.`);
65 |
66 | const generateCode = () => {
67 | const code_length = { 'short': 16, 'long': 24, 'both': Math.random() >= 0.5 ? 16 : 24 }[config.code_length] || 16;
68 | return Array.apply(0, Array(code_length)).map(() =>
69 | 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'.charAt(Math.floor(Math.random() * 62)),
70 | ).join('');
71 | };
72 |
73 | const checkCode = async (code, proxy, retries = 0) => {
74 | logStats();
75 | if (!proxy) { stats.threads > 0 ? stats.threads-- : 0; return; }
76 |
77 | const agent = getAgentFromURI(proxy);
78 | const res = await axios({
79 | method: 'get',
80 | url: `https://discord.com/api/v9/entitlements/gift-codes/${code}?with_application=false&with_subscription_plan=true`,
81 | httpsAgent: agent,
82 | timeout: 10000,
83 | validateStatus: null,
84 | }).catch(err => (err));
85 |
86 | const body = res.data;
87 | if (!body?.message && !body?.subscription_plan) {
88 | let timeout = 0;
89 | if (retries < 25) {
90 | retries++; timeout = 2500;
91 | logger.debug(`Connection to ${chalk.grey(proxy)} failed : ${chalk.red(res?.status || res?.err?.message || 'INVALID RESPONSE')}.`);
92 | }
93 | else {
94 | // proxies.push(proxy); // don't remove proxy
95 | logger.debug(`Removed ${chalk.gray(proxy)} : ${chalk.red(res?.status || res?.err?.message || 'INVALID RESPONSE')}`);
96 | proxy = proxies.shift();
97 | }
98 |
99 | logStats();
100 | return setTimeout(() => { checkCode(generateCode(), proxy, retries); }, timeout);
101 | }
102 |
103 | retries = 0;
104 | stats.used_codes.push(code);
105 | if (!working_proxies.includes(proxy)) working_proxies.push(proxy);
106 |
107 | let p = proxy;
108 | if (body.subscription_plan) {
109 | logger.info(`Found a valid gift code : https://discord.gift/${code} !`);
110 |
111 | // Try to redeem the code if possible
112 | redeemNitro(code, config);
113 |
114 | if (config.webhook.enabled && config.webhook.notifications.valid_code) {
115 | sendWebhook(config.webhook.url, `@everyone Found a \`${body.subscription_plan.name}\` gift code in \`${ms(+new Date() - stats.startTime, { long: true })}\` : https://discord.gift/${code}.`);
116 | }
117 |
118 | // Write working code to file
119 | let codes = existsSync('./valid_codes.txt') ? readFileSync('./valid_codes.txt', 'utf-8') : '';
120 | codes += `${new Date().toLocaleString()}: ${body?.subscription_plan || '???'} - https://discord.gift/${code}\n`;
121 | writeFileSync('./valid_codes.txt', codes, 'utf-8');
122 |
123 | stats.working++;
124 | }
125 | else if (res.status == 429) {
126 | // timeouts equal to 600000 are frozen. Most likely a ban from Discord's side.
127 | const timeout = body.retry_after;
128 | if (timeout != 600000) {
129 | proxies.push(proxy);
130 | logger.warn(`${chalk.gray(proxy)} is being rate limited (${(timeout).toFixed(2)}s), ${proxies[0] === proxy ? 'waiting' : 'skipping proxy'}...`);
131 | }
132 | else {
133 | logger.warn(`${chalk.gray(proxy)} was most likely banned by Discord. Removing proxy...`);
134 | }
135 | p = proxies.shift();
136 | }
137 | else if (body.message === 'Unknown Gift Code') {
138 | logger.warn(`${code} was an invalid gift code.`);
139 | }
140 | else {
141 | console.log(body?.message + ' - please report this on GitHub.');
142 | }
143 |
144 | logStats();
145 | return setTimeout(() => checkCode(generateCode(), p), p === proxy ? (body.retry_after * 1000 || 1000) : 0);
146 | };
147 |
148 | const logStats = () => {
149 | // Update title and write stats to stdout
150 | const attempts = stats.used_codes.length;
151 | const aps = attempts / ((+new Date() - stats.startTime) / 1000) * 60 || 0;
152 | process.stdout.write(`Proxies: ${chalk.yellow(proxies.length + stats.threads)} | Attempts: ${chalk.yellow(attempts)} (~${chalk.gray(aps.toFixed(0))}/min) | Working Codes: ${chalk.green(stats.working)} \r`);
153 | process.title = `YANG - by Tenclea | Proxies: ${proxies.length + stats.threads} | Attempts: ${attempts} (~${aps.toFixed(0)}/min) | Working Codes: ${stats.working}`;
154 | return;
155 | };
156 |
157 | const threads = config.threads > proxies.length ? proxies.length : config.threads;
158 | logger.info(`Checking for codes using ${chalk.yellow(threads)} threads.`);
159 |
160 | const working_proxies = [];
161 | stats.startTime = +new Date();
162 | if (config.webhook.enabled && config.webhook.notifications.boot) sendWebhook(config.webhook.url, 'Started **YANG**.');
163 |
164 | const startThreads = (t) => {
165 | for (let i = 0; i < t; i++) {
166 | checkCode(generateCode(), proxies.shift());
167 | stats.threads++;
168 | continue;
169 | }
170 |
171 | logger.debug(`Successfully started ${chalk.yellow(t)} threads.`);
172 | };
173 |
174 | startThreads(threads);
175 |
176 | setInterval(async () => {
177 | // Close / restart program if all proxies used
178 | if (stats.threads === 0) {
179 | logger.info('Restarting using working_proxies.txt list.');
180 | proxies = loadProxies('./working_proxies.txt');
181 | if (!proxies[0]) {
182 | logger.error('Ran out of proxies.');
183 | if (config.webhook.enabled) await sendWebhook(config.webhook.url, 'Ran out of proxies.');
184 | return process.exit(0);
185 | }
186 | config.proxies.save_working = false;
187 | return startThreads(config.threads > proxies.length ? proxies.length : config.threads);
188 | }
189 |
190 | /* Save working proxies */
191 | if (config.proxies.save_working) { writeFileSync('./working_proxies.txt', working_proxies.sort(p => p.indexOf('socks')).join('\n')); }
192 | }, 10_000);
193 |
194 | let addingProxies = false;
195 | setInterval(async () => {
196 | checkForUpdates(true);
197 | if (addingProxies || !config.proxies.enable_scrapper) return;
198 | addingProxies = true;
199 |
200 | logger.info('Downloading updated proxies.');
201 |
202 | const new_http_proxies = loadProxies('./required/http-proxies.txt', 'http');
203 | const new_socks_proxies = loadProxies('./required/socks-proxies.txt', 'socks');
204 | const newProxies = [...new Set(new_http_proxies.concat(new_socks_proxies, await require('./utils/proxy-scrapper')()))];
205 |
206 | const checked = await require('./utils/proxy-checker')(newProxies, config.threads, config.proxies.keep_transparent, true);
207 | proxies.push(...checked);
208 |
209 | logger.info(`Added ${checked.length} proxies.`);
210 | startThreads(config.threads - stats.threads);
211 | addingProxies = false;
212 | }, 15 * 60 * 1000);
213 |
214 | // Webhook status update
215 | if (+config.webhook.notifications.status_update_interval != 0) {
216 | setInterval(async () => {
217 | const attempts = stats.used_codes.length;
218 | const aps = attempts / ((+new Date() - stats.startTime) / 1000) * 60 || 0;
219 | sendWebhook(config.webhook.url, `Proxies: \`${proxies.length + stats.threads}\` | Attempts: \`${attempts}\` (~\`${aps.toFixed(1)}\`/min) | Working Codes: \`${stats.working}\``);
220 | }, config.webhook.notifications.status_update_interval * 1000);
221 | }
222 | })();
223 |
--------------------------------------------------------------------------------
/config.yml:
--------------------------------------------------------------------------------
1 | # The length of the codes to generate, can be one of 'short', 'long' or 'both'
2 | # Short is 16 characters, long is 24, and both will randomly choose between 16 and 24 each time
3 | code_length: short
4 |
5 | # Auto redeems valid nitro codes
6 | auto_redeem:
7 | # enable auto_redeem or not (true / false)
8 | enabled: false
9 | # The token to redeem the codes with
10 | token: "PUT_YOUR_TOKEN_HERE"
11 |
12 | # Proxy-related settings
13 | proxies:
14 | # Write working proxies to a file (true / false)
15 | save_working: true
16 |
17 | # Validate proxies before passing them to the checker (true / false)
18 | enable_checker: true
19 |
20 | # Download fresh proxies from the web (true / false)
21 | enable_scrapper: true
22 |
23 | # The maximum amount of proxies to download (if enabled), use '0' for no maximum.
24 | max_proxies_download: 1000
25 |
26 | # Wether or not to keep transparent proxies in the checker (true / false).
27 | keep_transparent: true
28 |
29 | # The amount of codes to check at the same time
30 | # The higher, the faster, but it may slow the generator down if it is set too high
31 | threads: 100
32 |
33 | # Receive webhook messages on start and when a valid code is found
34 | webhook:
35 | # enable webhook messages or not (true / false)
36 | enabled: false
37 |
38 | # The webhook url
39 | url: https://discord.com/api/webhooks/.../...
40 |
41 | # Webhook notifications settings
42 | notifications:
43 | # Send a notification when the generator starts (true / false)
44 | boot: true
45 |
46 | # Send a notification when a valid code is found (true / false)
47 | valid_code: true
48 |
49 | # How often to send status updates to the webhook in seconds (use '0' for never)
50 | status_update_interval: 600
51 |
52 | # Print additional information in the console (true / false)
53 | debug_mode: false
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "re-yang",
3 | "version": "3.4.0",
4 | "lockfileVersion": 3,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "re-yang",
9 | "version": "3.4.0",
10 | "dependencies": {
11 | "axios": "^1.7.2",
12 | "chalk": "^4.1.2",
13 | "http-proxy-agent": "^7.0.2",
14 | "js-yaml": "^4.1.0",
15 | "ms": "^2.1.3",
16 | "socks-proxy-agent": "^8.0.4",
17 | "winston": "^3.11.0"
18 | }
19 | },
20 | "node_modules/@colors/colors": {
21 | "version": "1.6.0",
22 | "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz",
23 | "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==",
24 | "engines": {
25 | "node": ">=0.1.90"
26 | }
27 | },
28 | "node_modules/@dabh/diagnostics": {
29 | "version": "2.0.3",
30 | "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz",
31 | "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==",
32 | "dependencies": {
33 | "colorspace": "1.1.x",
34 | "enabled": "2.0.x",
35 | "kuler": "^2.0.0"
36 | }
37 | },
38 | "node_modules/@types/triple-beam": {
39 | "version": "1.3.5",
40 | "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz",
41 | "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw=="
42 | },
43 | "node_modules/agent-base": {
44 | "version": "7.1.1",
45 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz",
46 | "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==",
47 | "dependencies": {
48 | "debug": "^4.3.4"
49 | },
50 | "engines": {
51 | "node": ">= 14"
52 | }
53 | },
54 | "node_modules/ansi-styles": {
55 | "version": "4.3.0",
56 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
57 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
58 | "dependencies": {
59 | "color-convert": "^2.0.1"
60 | },
61 | "engines": {
62 | "node": ">=8"
63 | },
64 | "funding": {
65 | "url": "https://github.com/chalk/ansi-styles?sponsor=1"
66 | }
67 | },
68 | "node_modules/argparse": {
69 | "version": "2.0.1",
70 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
71 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
72 | },
73 | "node_modules/async": {
74 | "version": "3.2.5",
75 | "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz",
76 | "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg=="
77 | },
78 | "node_modules/asynckit": {
79 | "version": "0.4.0",
80 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
81 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
82 | },
83 | "node_modules/axios": {
84 | "version": "1.7.2",
85 | "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz",
86 | "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==",
87 | "dependencies": {
88 | "follow-redirects": "^1.15.6",
89 | "form-data": "^4.0.0",
90 | "proxy-from-env": "^1.1.0"
91 | }
92 | },
93 | "node_modules/chalk": {
94 | "version": "4.1.2",
95 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
96 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
97 | "dependencies": {
98 | "ansi-styles": "^4.1.0",
99 | "supports-color": "^7.1.0"
100 | },
101 | "engines": {
102 | "node": ">=10"
103 | },
104 | "funding": {
105 | "url": "https://github.com/chalk/chalk?sponsor=1"
106 | }
107 | },
108 | "node_modules/color": {
109 | "version": "3.2.1",
110 | "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz",
111 | "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==",
112 | "dependencies": {
113 | "color-convert": "^1.9.3",
114 | "color-string": "^1.6.0"
115 | }
116 | },
117 | "node_modules/color-convert": {
118 | "version": "2.0.1",
119 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
120 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
121 | "dependencies": {
122 | "color-name": "~1.1.4"
123 | },
124 | "engines": {
125 | "node": ">=7.0.0"
126 | }
127 | },
128 | "node_modules/color-name": {
129 | "version": "1.1.4",
130 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
131 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
132 | },
133 | "node_modules/color-string": {
134 | "version": "1.9.1",
135 | "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
136 | "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
137 | "dependencies": {
138 | "color-name": "^1.0.0",
139 | "simple-swizzle": "^0.2.2"
140 | }
141 | },
142 | "node_modules/color/node_modules/color-convert": {
143 | "version": "1.9.3",
144 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
145 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
146 | "dependencies": {
147 | "color-name": "1.1.3"
148 | }
149 | },
150 | "node_modules/color/node_modules/color-name": {
151 | "version": "1.1.3",
152 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
153 | "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
154 | },
155 | "node_modules/colorspace": {
156 | "version": "1.1.4",
157 | "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz",
158 | "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==",
159 | "dependencies": {
160 | "color": "^3.1.3",
161 | "text-hex": "1.0.x"
162 | }
163 | },
164 | "node_modules/combined-stream": {
165 | "version": "1.0.8",
166 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
167 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
168 | "dependencies": {
169 | "delayed-stream": "~1.0.0"
170 | },
171 | "engines": {
172 | "node": ">= 0.8"
173 | }
174 | },
175 | "node_modules/debug": {
176 | "version": "4.3.5",
177 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz",
178 | "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==",
179 | "dependencies": {
180 | "ms": "2.1.2"
181 | },
182 | "engines": {
183 | "node": ">=6.0"
184 | },
185 | "peerDependenciesMeta": {
186 | "supports-color": {
187 | "optional": true
188 | }
189 | }
190 | },
191 | "node_modules/debug/node_modules/ms": {
192 | "version": "2.1.2",
193 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
194 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
195 | },
196 | "node_modules/delayed-stream": {
197 | "version": "1.0.0",
198 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
199 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
200 | "engines": {
201 | "node": ">=0.4.0"
202 | }
203 | },
204 | "node_modules/enabled": {
205 | "version": "2.0.0",
206 | "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz",
207 | "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ=="
208 | },
209 | "node_modules/fecha": {
210 | "version": "4.2.3",
211 | "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz",
212 | "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw=="
213 | },
214 | "node_modules/fn.name": {
215 | "version": "1.1.0",
216 | "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz",
217 | "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw=="
218 | },
219 | "node_modules/follow-redirects": {
220 | "version": "1.15.6",
221 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",
222 | "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==",
223 | "funding": [
224 | {
225 | "type": "individual",
226 | "url": "https://github.com/sponsors/RubenVerborgh"
227 | }
228 | ],
229 | "engines": {
230 | "node": ">=4.0"
231 | },
232 | "peerDependenciesMeta": {
233 | "debug": {
234 | "optional": true
235 | }
236 | }
237 | },
238 | "node_modules/form-data": {
239 | "version": "4.0.0",
240 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
241 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
242 | "dependencies": {
243 | "asynckit": "^0.4.0",
244 | "combined-stream": "^1.0.8",
245 | "mime-types": "^2.1.12"
246 | },
247 | "engines": {
248 | "node": ">= 6"
249 | }
250 | },
251 | "node_modules/has-flag": {
252 | "version": "4.0.0",
253 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
254 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
255 | "engines": {
256 | "node": ">=8"
257 | }
258 | },
259 | "node_modules/http-proxy-agent": {
260 | "version": "7.0.2",
261 | "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz",
262 | "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==",
263 | "dependencies": {
264 | "agent-base": "^7.1.0",
265 | "debug": "^4.3.4"
266 | },
267 | "engines": {
268 | "node": ">= 14"
269 | }
270 | },
271 | "node_modules/inherits": {
272 | "version": "2.0.4",
273 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
274 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
275 | },
276 | "node_modules/ip-address": {
277 | "version": "9.0.5",
278 | "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz",
279 | "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==",
280 | "dependencies": {
281 | "jsbn": "1.1.0",
282 | "sprintf-js": "^1.1.3"
283 | },
284 | "engines": {
285 | "node": ">= 12"
286 | }
287 | },
288 | "node_modules/is-arrayish": {
289 | "version": "0.3.2",
290 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
291 | "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="
292 | },
293 | "node_modules/is-stream": {
294 | "version": "2.0.1",
295 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
296 | "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
297 | "engines": {
298 | "node": ">=8"
299 | },
300 | "funding": {
301 | "url": "https://github.com/sponsors/sindresorhus"
302 | }
303 | },
304 | "node_modules/js-yaml": {
305 | "version": "4.1.0",
306 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
307 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
308 | "dependencies": {
309 | "argparse": "^2.0.1"
310 | },
311 | "bin": {
312 | "js-yaml": "bin/js-yaml.js"
313 | }
314 | },
315 | "node_modules/jsbn": {
316 | "version": "1.1.0",
317 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz",
318 | "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A=="
319 | },
320 | "node_modules/kuler": {
321 | "version": "2.0.0",
322 | "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz",
323 | "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A=="
324 | },
325 | "node_modules/logform": {
326 | "version": "2.6.1",
327 | "resolved": "https://registry.npmjs.org/logform/-/logform-2.6.1.tgz",
328 | "integrity": "sha512-CdaO738xRapbKIMVn2m4F6KTj4j7ooJ8POVnebSgKo3KBz5axNXRAL7ZdRjIV6NOr2Uf4vjtRkxrFETOioCqSA==",
329 | "dependencies": {
330 | "@colors/colors": "1.6.0",
331 | "@types/triple-beam": "^1.3.2",
332 | "fecha": "^4.2.0",
333 | "ms": "^2.1.1",
334 | "safe-stable-stringify": "^2.3.1",
335 | "triple-beam": "^1.3.0"
336 | },
337 | "engines": {
338 | "node": ">= 12.0.0"
339 | }
340 | },
341 | "node_modules/mime-db": {
342 | "version": "1.52.0",
343 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
344 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
345 | "engines": {
346 | "node": ">= 0.6"
347 | }
348 | },
349 | "node_modules/mime-types": {
350 | "version": "2.1.35",
351 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
352 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
353 | "dependencies": {
354 | "mime-db": "1.52.0"
355 | },
356 | "engines": {
357 | "node": ">= 0.6"
358 | }
359 | },
360 | "node_modules/ms": {
361 | "version": "2.1.3",
362 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
363 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
364 | },
365 | "node_modules/one-time": {
366 | "version": "1.0.0",
367 | "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz",
368 | "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==",
369 | "dependencies": {
370 | "fn.name": "1.x.x"
371 | }
372 | },
373 | "node_modules/proxy-from-env": {
374 | "version": "1.1.0",
375 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
376 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
377 | },
378 | "node_modules/readable-stream": {
379 | "version": "3.6.2",
380 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
381 | "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
382 | "dependencies": {
383 | "inherits": "^2.0.3",
384 | "string_decoder": "^1.1.1",
385 | "util-deprecate": "^1.0.1"
386 | },
387 | "engines": {
388 | "node": ">= 6"
389 | }
390 | },
391 | "node_modules/safe-buffer": {
392 | "version": "5.2.1",
393 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
394 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
395 | "funding": [
396 | {
397 | "type": "github",
398 | "url": "https://github.com/sponsors/feross"
399 | },
400 | {
401 | "type": "patreon",
402 | "url": "https://www.patreon.com/feross"
403 | },
404 | {
405 | "type": "consulting",
406 | "url": "https://feross.org/support"
407 | }
408 | ]
409 | },
410 | "node_modules/safe-stable-stringify": {
411 | "version": "2.4.3",
412 | "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz",
413 | "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==",
414 | "engines": {
415 | "node": ">=10"
416 | }
417 | },
418 | "node_modules/simple-swizzle": {
419 | "version": "0.2.2",
420 | "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
421 | "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==",
422 | "dependencies": {
423 | "is-arrayish": "^0.3.1"
424 | }
425 | },
426 | "node_modules/smart-buffer": {
427 | "version": "4.2.0",
428 | "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
429 | "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
430 | "engines": {
431 | "node": ">= 6.0.0",
432 | "npm": ">= 3.0.0"
433 | }
434 | },
435 | "node_modules/socks": {
436 | "version": "2.8.3",
437 | "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz",
438 | "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==",
439 | "dependencies": {
440 | "ip-address": "^9.0.5",
441 | "smart-buffer": "^4.2.0"
442 | },
443 | "engines": {
444 | "node": ">= 10.0.0",
445 | "npm": ">= 3.0.0"
446 | }
447 | },
448 | "node_modules/socks-proxy-agent": {
449 | "version": "8.0.4",
450 | "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz",
451 | "integrity": "sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==",
452 | "dependencies": {
453 | "agent-base": "^7.1.1",
454 | "debug": "^4.3.4",
455 | "socks": "^2.8.3"
456 | },
457 | "engines": {
458 | "node": ">= 14"
459 | }
460 | },
461 | "node_modules/sprintf-js": {
462 | "version": "1.1.3",
463 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz",
464 | "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA=="
465 | },
466 | "node_modules/stack-trace": {
467 | "version": "0.0.10",
468 | "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
469 | "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==",
470 | "engines": {
471 | "node": "*"
472 | }
473 | },
474 | "node_modules/string_decoder": {
475 | "version": "1.3.0",
476 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
477 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
478 | "dependencies": {
479 | "safe-buffer": "~5.2.0"
480 | }
481 | },
482 | "node_modules/supports-color": {
483 | "version": "7.2.0",
484 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
485 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
486 | "dependencies": {
487 | "has-flag": "^4.0.0"
488 | },
489 | "engines": {
490 | "node": ">=8"
491 | }
492 | },
493 | "node_modules/text-hex": {
494 | "version": "1.0.0",
495 | "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz",
496 | "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg=="
497 | },
498 | "node_modules/triple-beam": {
499 | "version": "1.4.1",
500 | "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz",
501 | "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==",
502 | "engines": {
503 | "node": ">= 14.0.0"
504 | }
505 | },
506 | "node_modules/util-deprecate": {
507 | "version": "1.0.2",
508 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
509 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
510 | },
511 | "node_modules/winston": {
512 | "version": "3.13.1",
513 | "resolved": "https://registry.npmjs.org/winston/-/winston-3.13.1.tgz",
514 | "integrity": "sha512-SvZit7VFNvXRzbqGHsv5KSmgbEYR5EiQfDAL9gxYkRqa934Hnk++zze0wANKtMHcy/gI4W/3xmSDwlhf865WGw==",
515 | "dependencies": {
516 | "@colors/colors": "^1.6.0",
517 | "@dabh/diagnostics": "^2.0.2",
518 | "async": "^3.2.3",
519 | "is-stream": "^2.0.0",
520 | "logform": "^2.6.0",
521 | "one-time": "^1.0.0",
522 | "readable-stream": "^3.4.0",
523 | "safe-stable-stringify": "^2.3.1",
524 | "stack-trace": "0.0.x",
525 | "triple-beam": "^1.3.0",
526 | "winston-transport": "^4.7.0"
527 | },
528 | "engines": {
529 | "node": ">= 12.0.0"
530 | }
531 | },
532 | "node_modules/winston-transport": {
533 | "version": "4.7.1",
534 | "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.7.1.tgz",
535 | "integrity": "sha512-wQCXXVgfv/wUPOfb2x0ruxzwkcZfxcktz6JIMUaPLmcNhO4bZTwA/WtDWK74xV3F2dKu8YadrFv0qhwYjVEwhA==",
536 | "dependencies": {
537 | "logform": "^2.6.1",
538 | "readable-stream": "^3.6.2",
539 | "triple-beam": "^1.3.0"
540 | },
541 | "engines": {
542 | "node": ">= 12.0.0"
543 | }
544 | }
545 | }
546 | }
547 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "re-yang",
3 | "main": "app.js",
4 | "version": "3.4.0",
5 | "dependencies": {
6 | "axios": "^1.7.2",
7 | "chalk": "^4.1.2",
8 | "http-proxy-agent": "^7.0.2",
9 | "js-yaml": "^4.1.0",
10 | "ms": "^2.1.3",
11 | "socks-proxy-agent": "^8.0.4",
12 | "winston": "^3.11.0"
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/required/http-proxies.txt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tenclea/ReYANG/c3bff1637a08e7cf300aa0b14c471cb3ef586fee/required/http-proxies.txt
--------------------------------------------------------------------------------
/required/socks-proxies.txt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tenclea/ReYANG/c3bff1637a08e7cf300aa0b14c471cb3ef586fee/required/socks-proxies.txt
--------------------------------------------------------------------------------
/utils/functions.js:
--------------------------------------------------------------------------------
1 | const
2 | { default: axios } = require('axios'),
3 | chalk = require('chalk'),
4 | { existsSync, readFileSync } = require('fs'),
5 | logger = require('./logger'),
6 | ms = require('ms'),
7 | { HttpProxyAgent } = require('http-proxy-agent'),
8 | { SocksProxyAgent } = require('socks-proxy-agent');
9 |
10 | module.exports = {
11 | checkToken: (token) => {
12 | axios({
13 | method: 'get',
14 | url: 'https://discordapp.com/api/v9/users/@me',
15 | timeout: 10000,
16 | headers: {
17 | 'Authorization': token,
18 | 'Content-Type': 'application/json',
19 | 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0',
20 | },
21 | validateStatus: null,
22 | })
23 | .catch(err => logger.error(`Could not login using the provided ${chalk.bold('redeemToken')} : ${err}`))
24 | .then(res => {
25 | if (res.status === 401) logger.error(chalk.red.bold(`Invalid redeemToken: ${chalk.reset.bold(`"${token}"`)}`));
26 | else logger.debug(`Successfully logged in as ${chalk.bold(chalk.blue(res.data.username))}.`);
27 | });
28 | },
29 |
30 | updateAvailable: false,
31 | checkForUpdates: (silent = false) => {
32 | if (module.exports.updateAvailable) {
33 | if (silent) return;
34 | return logger.info(chalk.bold(`An update is available on GitHub (v${module.exports.updateAvailable}) ! ${chalk.blue('https://github.com/Tenclea/ReYANG')}`));
35 | }
36 |
37 | (async () => {
38 | const res = await axios('https://raw.githubusercontent.com/Tenclea/ReYANG/main/package.json')
39 | .catch(e => { logger.error(`Could not check for updates: ${e}`); return null; });
40 |
41 | if (!res?.data) return;
42 | const update = res.data.version;
43 | const { version } = require('../package.json');
44 |
45 | if (version !== update) {
46 | module.exports.updateAvailable = update;
47 | if (!silent) return logger.info(chalk.bold(`An update is available on GitHub (v${module.exports.updateAvailable}) ! ${chalk.blue('https://github.com/Tenclea/ReYANG')}`));
48 | }
49 | })();
50 | },
51 |
52 | getAgentFromURI: (uri, timeout = 5000) => {
53 | switch (uri.split('://')[0]) {
54 | case 'http':
55 | case 'https':
56 | return new HttpProxyAgent(uri, { timeout });
57 | case 'socks':
58 | case 'socks4':
59 | case 'socks5':
60 | return new SocksProxyAgent(uri, { timeout });
61 | default:
62 | console.error(uri);
63 | return null;
64 | }
65 | },
66 |
67 | getIP: (agent = null) => {
68 | return axios(
69 | 'https://api.ipify.org',
70 | { httpsAgent: agent, timeout: 10000, validateStatus: null },
71 | )
72 | // eslint-disable-next-line no-unused-vars
73 | .catch(_ => ({ data: null }))
74 | .then(res => res?.data?.ip || res?.data);
75 | },
76 |
77 | loadProxies: (path, type = null) => {
78 | if (!existsSync(path)) return [];
79 | return readFileSync(path, 'utf-8')
80 | .split(/\r?\n/)
81 | .filter(p => p)
82 | .map(p => {
83 | const parts = p.split(':');
84 | if (parts.length > 3 && !p.includes('://')) p = parts.slice(2).join(':') + '@' + parts.slice(0, 2).join(':');
85 |
86 | return (type ? `${type}://` : '') + p;
87 | });
88 | },
89 |
90 | sendWebhook: (url, message) => {
91 | const date = new Date().getTime();
92 | const data = JSON.stringify({ 'username': 'ReYANG', 'avatar_url': 'https://cdn.discordapp.com/attachments/794307799965368340/794356433806032936/20210101_010801.jpg', 'content': message });
93 |
94 | axios({ method: 'post', url, data, headers: { 'Content-Type': 'application/json' } })
95 | .then(() => logger.debug(`Successfully delivered webhook message in ${ms(+new Date() - date, { long: true })}.`))
96 | .catch(e => logger.error(`Could not deliver webhook message : ${e}`));
97 | },
98 |
99 | shuffleArray: (array) => {
100 | for (let i = array.length - 1; i > 0; i--) {
101 | const j = Math.floor(Math.random() * (i + 1));
102 | [array[i], array[j]] = [array[j], array[i]];
103 | }
104 |
105 | return array;
106 | },
107 |
108 | redeemNitro: (code, config) => {
109 | if (!config.auto_redeem.enabled) return;
110 |
111 | axios({
112 | method: 'post',
113 | url: `https://discordapp.com/api/v9/entitlements/gift-codes/${code}/redeem`,
114 | data: '',
115 | headers: { 'Authorization': config.auto_redeem.token },
116 | validateStatus: null,
117 | })
118 | .then(res => {
119 | const body = res.data;
120 | if (!body) return;
121 |
122 | if (body.message === 'You are being rate limited.') {
123 | logger.warn(chalk.red(`You are being rate limited, trying to claim again in ${chalk.yellow(body.retry_after)} seconds.`));
124 | return setTimeout(() => module.exports.redeemNitro(code, config), body.retry_after * 1000 + 50);
125 | }
126 | else if (body.message === 'Unknown Gift Code') {
127 | return logger.warn(`${chalk.bold(code)} was an invalid gift code or had already been claimed.`);
128 | }
129 | else if (body.message === 'This gift has been redeemed already.') {
130 | if (config.webhook.enabled) module.exports.sendWebhook(config.webhook.url, `This gift code (${code}) has already been redeemed...`);
131 | return logger.warn(`${code} has already been redeemed...`);
132 | }
133 | else {
134 | if (config.webhook.enabled) module.exports.sendWebhook(config.webhook.url, 'Successfully claimed a gift code!');
135 | return logger.info(chalk.green(`Successfully redeemed the nitro gift code : ${code} !`));
136 | }
137 | })
138 | .catch(err => logger.info(chalk.red(`Failed to redeem a nitro gift code : ${code} > ${err}.`)));
139 | },
140 |
141 | validateProxies: async () => {
142 | return []; // TODO: fix proxy validator
143 |
144 | /* const res = await axios({
145 | method: 'post',
146 | url: 'https://yangdb.tenclea.repl.co/proxies',
147 | data: { proxies: p },
148 | timeout: 10000,
149 | }).catch(() => { });
150 |
151 | return res?.data?.proxies || []; */
152 | },
153 | };
154 |
--------------------------------------------------------------------------------
/utils/logger.js:
--------------------------------------------------------------------------------
1 | const
2 | chalk = require('chalk'),
3 | { existsSync, readFileSync, writeFileSync } = require('fs'),
4 | winston = require('winston'),
5 | yaml = require('js-yaml');
6 |
7 | if (!existsSync('./config.yml')) createDefaultConfigFile();
8 | const debug_mode = yaml.load(readFileSync('./config.yml')).debug_mode;
9 |
10 | const colors = { info: chalk.greenBright, warn: chalk.yellow, error: chalk.red, debug: chalk.blue };
11 |
12 | const logger = winston.createLogger({
13 | transports: [new winston.transports.Console()],
14 | format: winston.format.printf(log => {
15 | const date = new Date();
16 | const color = colors[log.level] || chalk.reset;
17 | const time = [date.getHours(), date.getMinutes(), date.getSeconds()].map(t => t >= 10 ? t : '0' + t).join(':');
18 |
19 | process.stdout.clearLine(); // Fix overlapping
20 | return `${chalk.magenta(time)} ${color(`[${log.level.toUpperCase()}]`)} » ${log.message}`;
21 | }),
22 | level: debug_mode ? 'debug' : 'info',
23 | });
24 |
25 | function createDefaultConfigFile() {
26 | const data = `# The length of the codes to generate, can be one of 'short', 'long' or 'both'
27 | # Short is 16 characters, long is 24, and both will randomly choose between 16 and 24 each time
28 | code_length: short
29 |
30 | # Auto redeems valid nitro codes
31 | auto_redeem:
32 | # enable auto_redeem or not (true / false)
33 | enabled: false
34 | # The token to redeem the codes with
35 | token: "PUT_YOUR_TOKEN_HERE"
36 |
37 | # Proxy-related settings
38 | proxies:
39 | # Write working proxies to a file (true / false)
40 | save_working: true
41 |
42 | # Validate proxies before passing them to the checker (true / false)
43 | enable_checker: true
44 |
45 | # Download fresh proxies from the web (true / false)
46 | enable_scrapper: true
47 |
48 | # The maximum amount of proxies to download (if enabled), use '0' for no maximum.
49 | max_proxies_download: 1000
50 |
51 | # The amount of codes to check at the same time
52 | # The higher, the faster, but it may slow the generator down if it is set too high
53 | threads: 50
54 |
55 | # Receive webhook messages on start and when a valid code is found
56 | webhook:
57 | # enable webhook messages or not (true / false)
58 | enabled: false
59 |
60 | # The webhook url
61 | url: https://discord.com/api/webhooks/.../...
62 |
63 | # Webhook notifications settings
64 | notifications:
65 | # Send a notification when the generator starts (true / false)
66 | boot: true
67 |
68 | # Send a notification when a valid code is found (true / false)
69 | valid_code: true
70 |
71 | # How often to send status updates to the webhook in seconds (use '0' for never)
72 | status_update_interval: 600
73 |
74 | # Print additional information in the console (true / false)
75 | debug_mode: false`;
76 |
77 | writeFileSync('./config.yml', data, 'utf-8');
78 | }
79 |
80 | module.exports = logger;
--------------------------------------------------------------------------------
/utils/proxy-checker.js:
--------------------------------------------------------------------------------
1 | const
2 | { default: axios } = require('axios'),
3 | chalk = require('chalk'),
4 | { validateProxies, getAgentFromURI, getIP } = require('./functions'),
5 | logger = require('./logger'),
6 | ms = require('ms');
7 |
8 | module.exports = async (proxies, threads, keep_transparent, silent = false) => {
9 | const maxRetries = 0;
10 | if (!silent) logger.info(`Checking ${chalk.yellow(proxies.length)} proxies... This might take up to ${ms(Math.ceil((proxies.length * (maxRetries + 1) * 10000) / threads), { long: true })}.`);
11 |
12 | const og_ip = keep_transparent ? null : await getIP();
13 |
14 | let last = +new Date();
15 | proxies = await new Promise(complete => {
16 | const checked = [];
17 |
18 | const checkProxy = async (p, ret = 0) => {
19 | if (!p) return;
20 |
21 | const agent = getAgentFromURI(p, 10000);
22 | const res = await axios({
23 | method: 'get',
24 | url: 'https://discordapp.com/api/v9/experiments',
25 | httpAgent: agent,
26 | httpsAgent: agent,
27 | timeout: 10000,
28 | validateStatus: null,
29 | }).catch(err => ({ err }));
30 |
31 | const is_valid = typeof res?.data?.fingerprint === 'string';
32 | if (is_valid) {
33 | if (keep_transparent) {
34 | checked.push(p);
35 | }
36 | else {
37 | const proxy_ip = await getIP(agent);
38 | if (proxy_ip !== og_ip) checked.push(p);
39 | }
40 | }
41 |
42 | if ((!res?.err && !is_valid) || is_valid || ret >= maxRetries) {
43 | p = proxies.shift();
44 | ret = 0;
45 | }
46 | else { ret++; }
47 |
48 | if (!p) return --threads;
49 |
50 | if (ret == 0) last = +new Date();
51 | return checkProxy(p, ret);
52 | };
53 |
54 | const log = () => {
55 | let eta = (((proxies.length + threads) * (maxRetries + 1) * 10000) / threads) - (+new Date() - last);
56 | if (!eta || eta < 10000) eta = '< 10 seconds';
57 | else eta = '~' + ms(eta, { long: true });
58 |
59 | const time = [new Date().getHours(), new Date().getMinutes(), new Date().getSeconds()].map(t => { if (t < 10) { t = '0' + t; } return t; });
60 | process.stdout.write(`${chalk.magenta(time.join(':'))} ${chalk.greenBright('[INFO]')} » Proxies left: ${proxies.length + threads} | Working: ${checked.length} | Time left: ${eta} \r`);
61 | process.title = `Checking proxies... | Proxies left: ${proxies.length + threads} | Working: ${checked.length} | Time left: ${eta}`;
62 | return;
63 | };
64 |
65 | for (let i = 0; i < Math.min(threads, proxies.length); i++) {
66 | checkProxy(proxies.shift(), 0);
67 | }
68 |
69 | const done = setInterval(() => {
70 | if (threads <= 0 || new Date() - last > 45 * 1000) {
71 | clearInterval(done);
72 | complete(checked);
73 | }
74 | else if (!silent) { log(); }
75 | }, 500);
76 | });
77 |
78 | validateProxies(proxies);
79 | return proxies;
80 | };
81 |
--------------------------------------------------------------------------------
/utils/proxy-scrapper.js:
--------------------------------------------------------------------------------
1 | const
2 | { default: axios } = require('axios'),
3 | logger = require('./logger'),
4 | { shuffleArray } = require('./functions');
5 |
6 | module.exports = async () => {
7 | const proxySites = {
8 | http: [
9 | 'https://api.proxyscrape.com/?request=displayproxies&status=alive&proxytype=http',
10 | 'https://api.proxyscrape.com/?request=displayproxies&status=alive&proxytype=https',
11 | 'https://openproxylist.xyz/http.txt',
12 | 'https://raw.githubusercontent.com/ShiftyTR/Proxy-List/master/http.txt',
13 | 'https://raw.githubusercontent.com/TheSpeedX/PROXY-List/master/http.txt',
14 | 'https://raw.githubusercontent.com/proxiesmaster/Free-Proxy-List/main/proxies.txt',
15 | 'https://raw.githubusercontent.com/ShiftyTR/Proxy-List/master/https.txt',
16 | 'https://raw.githubusercontent.com/sunny9577/proxy-scraper/master/generated/http_proxies.txt',
17 | ],
18 | socks4: [
19 | 'https://api.proxyscrape.com/?request=displayproxies&status=alive&proxytype=socks4',
20 | 'https://openproxylist.xyz/socks4.txt',
21 | 'https://raw.githubusercontent.com/ShiftyTR/Proxy-List/master/socks4.txt',
22 | 'https://raw.githubusercontent.com/TheSpeedX/PROXY-List/master/socks4.txt',
23 | 'https://raw.githubusercontent.com/sunny9577/proxy-scraper/master/generated/socks4_proxies.txt',
24 | ],
25 | socks5: [
26 | 'https://api.proxyscrape.com/?request=displayproxies&status=alive&proxytype=socks5',
27 | 'https://openproxylist.xyz/socks5.txt',
28 | 'https://raw.githubusercontent.com/hookzof/socks5_list/master/proxy.txt',
29 | 'https://raw.githubusercontent.com/ShiftyTR/Proxy-List/master/socks5.txt',
30 | 'https://raw.githubusercontent.com/TheSpeedX/PROXY-List/master/socks5.txt',
31 | 'https://raw.githubusercontent.com/sunny9577/proxy-scraper/master/generated/socks5_proxies.txt',
32 | ],
33 | };
34 |
35 | const types = Object.keys(proxySites);
36 | const scrapped = types.map(async t => {
37 | const r = proxySites[t].map(async url => {
38 | const res = await axios(url, { timeout: 10000, validateStatus: null })
39 | .catch(e => logger.error(`Could not scrape proxies from ${url} : ${e}`));
40 |
41 | if (!res.data || typeof res.data !== 'string') return [];
42 | return res.data.split(/\r|\n|
/)
43 | .filter(p => p !== '')
44 | .map(p => t + '://' + p);
45 | });
46 | return await Promise.all(r).catch(e => logger.error(e));
47 | });
48 |
49 | const proxies = await Promise.all(scrapped)
50 | .then(values => values.reduce((a, b) => a.concat(b.reduce((c, d) => c.concat(d), [])), []))
51 | .catch(e => logger.error(e));
52 |
53 | return shuffleArray([...new Set(proxies)]);
54 | };
55 |
--------------------------------------------------------------------------------