package com.kinancity.core;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.DefaultParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.kinancity.core.creation.PtcAccountCreator;
import com.kinancity.core.creation.PtcCreationResult;
import com.kinancity.core.creation.PtcCreationSummary;
import com.kinancity.core.data.AccountData;
import com.kinancity.core.errors.AccountCreationException;
import com.kinancity.core.generator.impl.SequenceAccountGenerator;
public class KinanCityCli {
private static Logger LOGGER = LoggerFactory.getLogger(KinanCityCli.class);
public static void main(String[] args) {
Thread t = Thread.currentThread();
t.setName("Kinan City");
try {
LOGGER.info(" -- Start Kinan City CLI -- ");
// CLI Options
Options options = new Options();
// Dry Run Mode
options.addOption(CliOptions.DRY_RUN.asOption());
// Creates only 1 account
options.addOption(CliOptions.EMAIL.asOption());
options.addOption(CliOptions.SINGLE_USERNAME.asOption());
options.addOption(CliOptions.PASSWORD.asOption());
// Create Multiple accounts
options.addOption(CliOptions.MULTIPLE_ACCOUNTS.asOption());
// Create a Sequence of accounts
options.addOption(CliOptions.SEQ_ACCOUNTS_COUNT.asOption());
options.addOption(CliOptions.SEQ_ACCOUNTS_FORMAT.asOption());
options.addOption(CliOptions.SEQ_ACCOUNTS_START.asOption());
// Captcha key given at commandLine
options.addOption(CliOptions.CK.asOption());
// Number of Threads
options.addOption(CliOptions.NB_THREADS.asOption());
// Proxies
options.addOption(CliOptions.PROXIES.asOption());
options.addOption(CliOptions.NO_PROXY_CHECK.asOption());
options.addOption(CliOptions.NO_LIMIT.asOption());
CommandLineParser parser = new DefaultParser();
CommandLine cmd = parser.parse(options, args);
// Load Config Options
Configuration config = Configuration.getInstance();
if (cmd.hasOption(CliOptions.DRY_RUN.shortName)) {
config.setDryRun(true);
}
if (cmd.hasOption(CliOptions.CK.shortName)) {
config.setTwoCaptchaApiKey(cmd.getOptionValue(CliOptions.CK.shortName));
}
if (cmd.hasOption(CliOptions.PROXIES.shortName)) {
config.loadProxies(cmd.getOptionValue(CliOptions.PROXIES.shortName));
}
if (cmd.hasOption(CliOptions.OUTPUT.shortName)) {
config.setResultLogFilename(cmd.getOptionValue(CliOptions.OUTPUT.shortName));
}
if (cmd.hasOption(CliOptions.NO_PROXY_CHECK.shortName)) {
config.setSkipProxyTest(true);
}
if (cmd.hasOption(CliOptions.NO_LIMIT.shortName)) {
config.setSkipProxyTest(true);
}
if (cmd.hasOption(CliOptions.NB_THREADS.shortName)) {
config.setNbThreads(Integer.valueOf(cmd.getOptionValue(CliOptions.NB_THREADS.shortName)));
}
if (config.checkConfiguration()) {
PtcAccountCreator creator = new PtcAccountCreator(config);
if (cmd.hasOption(CliOptions.SEQ_ACCOUNTS_FORMAT.shortName) && cmd.hasOption(CliOptions.SEQ_ACCOUNTS_COUNT.shortName) && cmd.hasOption(CliOptions.EMAIL.shortName) && cmd.hasOption(CliOptions.PASSWORD.shortName)) {
SequenceAccountGenerator generator = new SequenceAccountGenerator();
generator.setBaseEmail(cmd.getOptionValue(CliOptions.EMAIL.shortName));
generator.setStaticPassword(cmd.getOptionValue(CliOptions.PASSWORD.shortName));
generator.setUsernamePattern(cmd.getOptionValue(CliOptions.SEQ_ACCOUNTS_FORMAT.shortName));
generator.setNbAccounts(Integer.parseInt(cmd.getOptionValue(CliOptions.SEQ_ACCOUNTS_COUNT.shortName)));
generator.setStartFrom(Integer.parseInt(cmd.getOptionValue(CliOptions.SEQ_ACCOUNTS_START.shortName, "0")));
List<AccountData> accountsToCreate = new ArrayList<>();
AccountData account;
while ((account = generator.nextAccountData()) != null) {
accountsToCreate.add(account);
}
try {
PtcCreationSummary summary = creator.createAccounts(accountsToCreate);
LOGGER.info(" All creations DONE : {}", summary);
System.exit(0);
} catch (AccountCreationException e) {
LOGGER.error("\n Account Creation Error : {}", e.getMessage());
System.exit(1);
}
} else if (cmd.hasOption(CliOptions.EMAIL.shortName) && cmd.hasOption(CliOptions.SINGLE_USERNAME.shortName) && cmd.hasOption(CliOptions.PASSWORD.shortName)) {
LOGGER.info("Create a single account");
AccountData account = new AccountData();
account.setEmail(cmd.getOptionValue(CliOptions.EMAIL.shortName));
account.setUsername(cmd.getOptionValue(CliOptions.SINGLE_USERNAME.shortName));
account.setPassword(cmd.getOptionValue(CliOptions.PASSWORD.shortName));
try {
PtcCreationResult result = creator.createAccount(account);
LOGGER.info("DONE : {}", result.getMessage());
System.exit(0);
} catch (AccountCreationException e) {
LOGGER.error("Account Creation Error : {}", e.getMessage());
System.exit(1);
}
} else if (cmd.hasOption(CliOptions.MULTIPLE_ACCOUNTS.shortName)) {
String accountFileName = cmd.getOptionValue(CliOptions.MULTIPLE_ACCOUNTS.shortName);
PtcCreationSummary summary = creator.createAccounts(accountFileName);
LOGGER.info(" All creations DONE : {}", summary);
System.exit(0);
} else {
LOGGER.error("invalid arguments\n");
HelpFormatter formatter = new HelpFormatter();
StringWriter out = new StringWriter();
PrintWriter writer = new PrintWriter(out);
String cmdLineSyntax = " one of \n"
+ " -m <email> -u <username> -p <password> \n"
+ " -a <accounts.csv> \n"
+ " -m <email> -c <#ofAccounts> -f <format**> -p <password> (-s <first#>)\n"
+ " and optional : -ck <captchakey> \n\n";
formatter.setWidth(180);
formatter.printHelp(cmdLineSyntax, options);
System.exit(0);
}
} else {
LOGGER.error("Account creation failed, missing configuration");
System.exit(1);
}
} catch (ParseException e) {
LOGGER.error("Command line cannot be parsed {}", e.getMessage());
System.exit(1);
}
}
}