UNPKG

token-discord-checker

Version:

A comprehensive Discord token validation and verification tool

306 lines • 12.6 kB
#!/usr/bin/env node "use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.TokenCheckerCLI = void 0; const commander_1 = require("commander"); const chalk_1 = __importDefault(require("chalk")); const token_checker_1 = require("./token-checker"); const token_types_1 = require("./types/token.types"); const program = new commander_1.Command(); /** * CLI for Discord Token Checker */ class TokenCheckerCLI { constructor() { this.setupCommands(); } setupCommands() { program .name('discord-token-checker') .description('Discord token validation and verification tool') .version('1.0.0'); // Verify environment token command program .command('verify-env') .description('Verify Discord token from .env file') .option('-p, --path <path>', 'Path to .env file', '.env') .option('-v, --var <variable>', 'Environment variable name', 'DISCORD_TOKEN') .option('--no-api', 'Skip API validation') .option('--timeout <ms>', 'API request timeout in milliseconds', '10000') .action(async (options) => { await this.verifyEnvToken(options); }); // Check API command program .command('check-api') .description('Check token with Discord API from input.txt') .option('-f, --file <path>', 'Token file path', 'input.txt') .option('--cleanup', 'Delete token file after checking') .option('--timeout <ms>', 'API request timeout in milliseconds', '10000') .option('--no-user-info', 'Skip user information retrieval') .action(async (options) => { await this.checkApiToken(options); }); // Direct test command program .command('test-direct') .description('Test token directly (bypasses Discord.js validation)') .argument('<token>', 'Discord token to test') .option('--format-only', 'Only validate format, skip API') .option('--api-only', 'Only validate API, skip format') .option('--timeout <ms>', 'API request timeout in milliseconds', '5000') .action(async (token, options) => { await this.testDirectToken(token, options); }); // Quick check command program .command('quick') .description('Quick token format check') .argument('<token>', 'Discord token to check') .action(async (token) => { await this.quickCheck(token); }); // Extract info command program .command('extract') .description('Extract information from token') .argument('<token>', 'Discord token to analyze') .action(async (token) => { await this.extractTokenInfo(token); }); } async verifyEnvToken(options) { console.log(chalk_1.default.blue('šŸ” Discord Token Environment Checker\n')); try { const checker = new token_checker_1.DiscordTokenChecker({ checkApi: options.api !== false, timeout: parseInt(options.timeout, 10), includeUserInfo: true, }); const result = await checker.validateFromEnv({ envPath: options.path, tokenVar: options.var, }); this.displayResult(result); } catch (error) { this.handleError(error); } } async checkApiToken(options) { console.log(chalk_1.default.blue('🌐 Discord Token API Checker\n')); try { const checker = new token_checker_1.DiscordTokenChecker({ checkApi: true, timeout: parseInt(options.timeout, 10), includeUserInfo: options.userInfo !== false, }); const result = await checker.validateFromFile({ filePath: options.file, cleanup: options.cleanup, }); this.displayResult(result); } catch (error) { this.handleError(error); } } async testDirectToken(token, options) { console.log(chalk_1.default.blue('⚔ Direct Token Test\n')); try { let method = 'both'; if (options.formatOnly) { method = 'format'; } else if (options.apiOnly) { method = 'api'; } const checker = new token_checker_1.DiscordTokenChecker({ checkApi: method !== 'format', timeout: parseInt(options.timeout, 10), includeUserInfo: true, }); const result = await checker.validateDirect(token, method); this.displayResult(result); } catch (error) { this.handleError(error); } } async quickCheck(token) { console.log(chalk_1.default.blue('⚔ Quick Format Check\n')); try { const isValid = token_checker_1.DiscordTokenChecker.quickFormatCheck(token); if (isValid) { console.log(chalk_1.default.green('āœ… Token format appears valid')); } else { console.log(chalk_1.default.red('āŒ Token format is invalid')); } } catch (error) { this.handleError(error); } } async extractTokenInfo(token) { console.log(chalk_1.default.blue('šŸ” Token Information Extractor\n')); try { const userId = token_checker_1.DiscordTokenChecker.extractUserId(token); const timestamp = token_checker_1.DiscordTokenChecker.extractTimestamp(token); console.log(chalk_1.default.cyan('šŸ“Š Token Analysis:')); console.log(`šŸ“ Length: ${token.length} characters`); console.log(`šŸ”¢ Parts: ${token.split('.').length}`); if (userId) { console.log(chalk_1.default.green(`šŸ‘¤ User ID: ${userId}`)); } else { console.log(chalk_1.default.yellow('šŸ‘¤ User ID: Could not extract')); } if (timestamp) { console.log(chalk_1.default.green(`ā° Created: ${timestamp.toISOString()}`)); console.log(chalk_1.default.green(`šŸ“… Age: ${this.getTokenAge(timestamp)}`)); } else { console.log(chalk_1.default.yellow('ā° Timestamp: Could not extract')); } } catch (error) { this.handleError(error); } } displayResult(result) { console.log(chalk_1.default.cyan('šŸ“Š Validation Results:\n')); // Overall status if (result.isValid) { console.log(chalk_1.default.green('āœ… Token is VALID and ACTIVE')); } else { console.log(chalk_1.default.red('āŒ Token is INVALID')); } // Metadata console.log(chalk_1.default.cyan('\nšŸ“ Token Metadata:')); console.log(` Length: ${result.metadata.length} characters`); console.log(` Parts: ${result.metadata.parts}`); console.log(` Source: ${result.metadata.source}`); // Format validation console.log(chalk_1.default.cyan('\nšŸ” Format Validation:')); this.displayFormatResult(result.format); // API validation if (result.api) { console.log(chalk_1.default.cyan('\n🌐 API Validation:')); this.displayApiResult(result.api); } // Errors if (result.errors.length > 0) { console.log(chalk_1.default.red('\nāŒ Errors:')); result.errors.forEach(error => { console.log(chalk_1.default.red(` • ${error}`)); }); } // Warnings if (result.warnings.length > 0) { console.log(chalk_1.default.yellow('\nāš ļø Warnings:')); result.warnings.forEach(warning => { console.log(chalk_1.default.yellow(` • ${warning}`)); }); } } displayFormatResult(format) { const checks = [ { name: 'Correct parts (3)', value: format.hasCorrectParts }, { name: 'Correct length', value: format.hasCorrectLength }, { name: 'No spaces', value: format.hasNoSpaces }, { name: 'No quotes', value: format.hasNoQuotes }, { name: 'Not bot token', value: format.isNotBotToken }, ]; checks.forEach(check => { const icon = check.value ? 'āœ…' : 'āŒ'; const color = check.value ? chalk_1.default.green : chalk_1.default.red; console.log(color(` ${icon} ${check.name}`)); }); } displayApiResult(api) { if (api.isActive) { console.log(chalk_1.default.green(' āœ… Token is active')); if (api.userInfo) { console.log(chalk_1.default.cyan('\nšŸ‘¤ User Information:')); console.log(` Username: ${api.userInfo.username}#${api.userInfo.discriminator}`); console.log(` User ID: ${api.userInfo.id}`); if (api.userInfo.email) { console.log(` Email: ${api.userInfo.email}`); } if (api.userInfo.verified !== undefined) { const verifiedIcon = api.userInfo.verified ? 'āœ…' : 'āŒ'; console.log(` Verified: ${verifiedIcon}`); } if (api.userInfo.mfaEnabled !== undefined) { const mfaIcon = api.userInfo.mfaEnabled ? 'šŸ”’' : 'šŸ”“'; console.log(` MFA: ${mfaIcon}`); } if (api.userInfo.premium) { console.log(chalk_1.default.magenta(' šŸ’Ž Premium: Yes')); } } } else { console.log(chalk_1.default.red(' āŒ Token is not active')); if (api.error) { console.log(chalk_1.default.red(` Error: ${api.error}`)); } } } handleError(error) { if (error instanceof token_types_1.TokenValidationError) { console.log(chalk_1.default.red(`āŒ ${error.message}`)); if (error.type === token_types_1.TokenErrorType.FILE_NOT_FOUND) { console.log(chalk_1.default.yellow('\nšŸ’” Suggestions:')); console.log(chalk_1.default.yellow(' • Check the file path')); console.log(chalk_1.default.yellow(' • Ensure the file exists')); console.log(chalk_1.default.yellow(' • Check file permissions')); } else if (error.type === token_types_1.TokenErrorType.TOKEN_NOT_FOUND) { console.log(chalk_1.default.yellow('\nšŸ’” Suggestions:')); console.log(chalk_1.default.yellow(' • Add your Discord token to the file')); console.log(chalk_1.default.yellow(' • Check the environment variable name')); console.log(chalk_1.default.yellow(' • Ensure the token is not empty')); } } else { console.log(chalk_1.default.red(`āŒ Unexpected error: ${error.message || error}`)); } process.exit(1); } getTokenAge(timestamp) { const now = new Date(); const diffMs = now.getTime() - timestamp.getTime(); const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24)); if (diffDays < 1) { const diffHours = Math.floor(diffMs / (1000 * 60 * 60)); return `${diffHours} hours`; } else if (diffDays < 30) { return `${diffDays} days`; } else if (diffDays < 365) { const diffMonths = Math.floor(diffDays / 30); return `${diffMonths} months`; } else { const diffYears = Math.floor(diffDays / 365); return `${diffYears} years`; } } run() { program.parse(); } } exports.TokenCheckerCLI = TokenCheckerCLI; // Run CLI if this file is executed directly if (require.main === module) { const cli = new TokenCheckerCLI(); cli.run(); } //# sourceMappingURL=cli.js.map