token-discord-checker
Version:
A comprehensive Discord token validation and verification tool
306 lines ⢠12.6 kB
JavaScript
;
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