Skip to content

Commit d3f89b4

Browse files
committed
first draft of sequence generator
1 parent 1a6be0b commit d3f89b4

13 files changed

+269
-42
lines changed

KinanCity-core/src/main/java/com/kinancity/core/CliOptions.java

+6-2
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,13 @@ public enum CliOptions {
1111

1212
CK("ck", "captchaKey", true, "2 captcha API Key"),
1313

14-
SINGLE_EMAIL("m", "mail", true, "account email address"),
14+
EMAIL("m", "mail", true, "account email address"),
1515
SINGLE_USERNAME("u", "username", true, "account username/login"),
16-
SINGLE_PASSWORD("p", "password", true, "account password"),
16+
PASSWORD("p", "password", true, "account password"),
17+
18+
SEQ_ACCOUNTS_COUNT("c", "count", true, "number of accounts to generate"),
19+
SEQ_ACCOUNTS_START("s", "startnum", true, "number of the first one"),
20+
SEQ_ACCOUNTS_FORMAT("f", "format", true, "format of the username : prefix*****suffix with enough *"),
1721

1822
MULTIPLE_ACCOUNTS("a", "accounts", true, "name of an account file");
1923

KinanCity-core/src/main/java/com/kinancity/core/Configuration.java

+27-22
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.kinancity.core;
22

33
import java.io.BufferedWriter;
4+
import java.io.File;
5+
import java.io.FileInputStream;
46
import java.io.FileWriter;
57
import java.io.IOException;
68
import java.io.InputStream;
@@ -32,19 +34,19 @@ public class Configuration {
3234
private String twoCaptchaApiKey;
3335

3436
private String mailHost;
35-
37+
3638
private int nbThreads = 5;
37-
39+
3840
private CaptchaProvider captchaProvider;
39-
41+
4042
private ProxyManager proxyManager;
41-
43+
4244
private String resultLogFilename = "result.csv";
43-
45+
4446
private PrintWriter resultLogWriter;
45-
47+
4648
private boolean initDone = false;
47-
49+
4850
// If true, everything will be mocked
4951
private boolean dryRun = false;
5052

@@ -57,62 +59,65 @@ public static Configuration getInstance() {
5759
return instance;
5860
}
5961

60-
public void init() throws ConfigurationException{
61-
62+
public void init() throws ConfigurationException {
63+
6264
try {
63-
if(captchaProvider == null){
65+
if (captchaProvider == null) {
6466
captchaProvider = new TwoCaptchaService(twoCaptchaApiKey, dryRun);
6567
}
66-
67-
if(proxyManager == null){
68+
69+
if (proxyManager == null) {
6870
proxyManager = new ProxyManager();
6971
// Add Direct connection
7072
proxyManager.addProxy(new ProxyInfo(new NintendoTimeLimitPolicy(), new NoProxy()));
7173
}
72-
74+
7375
resultLogWriter = new PrintWriter(new FileWriter(resultLogFilename, true));
7476
} catch (IOException e) {
7577
throw new ConfigurationException(e);
7678
}
77-
79+
7880
initDone = true;
7981
}
80-
82+
8183
/**
8284
* Check if all config are OK
8385
*
8486
* @return
8587
*/
8688
public boolean checkConfiguration() {
87-
if(!initDone){
89+
if (!initDone) {
8890
try {
8991
init();
9092
} catch (ConfigurationException e) {
9193
logger.error("Configuration Init Failed", e);
9294
return false;
9395
}
9496
}
95-
97+
9698
if (captchaProvider == null) {
9799
return false;
98100
}
99101

100102
return true;
101103
}
102-
104+
103105
/**
104106
* Load config from prop file
105107
*
106-
* @param configFile
108+
* @param configFilePath
107109
*/
108-
private void load(String configFile) {
110+
private void load(String configFilePath) {
109111
try {
110112
Properties prop = new Properties();
111-
InputStream in = getClass().getResourceAsStream("/" + CONFIG_FILE);
112-
if (in == null) {
113+
File configFile = new File(CONFIG_FILE);
114+
115+
if (!configFile.exists()) {
113116
logger.warn("Skipping loading configuration file, you may copy config.example.properties as config.properties and edit your configuration");
114117
return;
115118
}
119+
120+
InputStream in = new FileInputStream(configFile);
116121
prop.load(in);
117122
in.close();
118123

KinanCity-core/src/main/java/com/kinancity/core/KinanCityCli.java

+54-17
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import java.io.PrintWriter;
44
import java.io.StringWriter;
5+
import java.util.ArrayList;
6+
import java.util.List;
57

68
import org.apache.commons.cli.CommandLine;
79
import org.apache.commons.cli.CommandLineParser;
@@ -17,6 +19,7 @@
1719
import com.kinancity.core.creation.PtcCreationSummary;
1820
import com.kinancity.core.data.AccountData;
1921
import com.kinancity.core.errors.AccountCreationException;
22+
import com.kinancity.core.generator.impl.SequenceAccountGenerator;
2023

2124
public class KinanCityCli {
2225

@@ -26,7 +29,7 @@ public static void main(String[] args) {
2629

2730
Thread t = Thread.currentThread();
2831
t.setName("Kinan City");
29-
32+
3033
try {
3134
LOGGER.info(" -- Start Kinan City CLI -- ");
3235

@@ -35,42 +38,73 @@ public static void main(String[] args) {
3538

3639
// Dry Run Mode
3740
options.addOption(CliOptions.DRY_RUN.asOption());
38-
41+
3942
// Creates only 1 account
40-
options.addOption(CliOptions.SINGLE_EMAIL.asOption());
43+
options.addOption(CliOptions.EMAIL.asOption());
4144
options.addOption(CliOptions.SINGLE_USERNAME.asOption());
42-
options.addOption(CliOptions.SINGLE_PASSWORD.asOption());
45+
options.addOption(CliOptions.PASSWORD.asOption());
4346

4447
// Create Multiple accounts
4548
options.addOption(CliOptions.MULTIPLE_ACCOUNTS.asOption());
4649

50+
// Create a Sequence of accounts
51+
options.addOption(CliOptions.SEQ_ACCOUNTS_COUNT.asOption());
52+
options.addOption(CliOptions.SEQ_ACCOUNTS_FORMAT.asOption());
53+
options.addOption(CliOptions.SEQ_ACCOUNTS_START.asOption());
54+
4755
// Captcha key given at commandLine
4856
options.addOption(CliOptions.CK.asOption());
4957

5058
CommandLineParser parser = new DefaultParser();
5159
CommandLine cmd = parser.parse(options, args);
5260

5361
Configuration config = Configuration.getInstance();
54-
55-
if(cmd.hasOption(CliOptions.DRY_RUN.shortName)){
62+
63+
if (cmd.hasOption(CliOptions.DRY_RUN.shortName)) {
5664
config.setDryRun(true);
57-
}
65+
}
5866

5967
if (cmd.hasOption(CliOptions.CK.shortName)) {
6068
config.setTwoCaptchaApiKey(cmd.getOptionValue(CliOptions.CK.shortName));
6169
}
6270

6371
if (config.checkConfiguration()) {
64-
72+
6573
PtcAccountCreator creator = new PtcAccountCreator(config);
6674

67-
if (cmd.hasOption(CliOptions.SINGLE_EMAIL.shortName) && cmd.hasOption(CliOptions.SINGLE_USERNAME.shortName) && cmd.hasOption(CliOptions.SINGLE_PASSWORD.shortName)) {
75+
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)) {
76+
77+
SequenceAccountGenerator generator = new SequenceAccountGenerator();
78+
generator.setBaseEmail(cmd.getOptionValue(CliOptions.EMAIL.shortName));
79+
generator.setStaticPassword(cmd.getOptionValue(CliOptions.PASSWORD.shortName));
80+
81+
generator.setUsernamePattern(cmd.getOptionValue(CliOptions.SEQ_ACCOUNTS_FORMAT.shortName));
82+
generator.setNbAccounts(Integer.parseInt(cmd.getOptionValue(CliOptions.SEQ_ACCOUNTS_COUNT.shortName)));
83+
generator.setStartFrom(Integer.parseInt(cmd.getOptionValue(CliOptions.SEQ_ACCOUNTS_START.shortName, "0")));
84+
85+
List<AccountData> accountsToCreate = new ArrayList<>();
86+
AccountData account;
87+
while ((account = generator.nextAccountData()) != null) {
88+
accountsToCreate.add(account);
89+
}
90+
91+
try {
92+
PtcCreationSummary summary = creator.createAccounts(accountsToCreate);
93+
94+
LOGGER.info(" All creations DONE : {}", summary);
95+
System.exit(0);
96+
} catch (AccountCreationException e) {
97+
LOGGER.error("\n Account Creation Error : {}", e.getMessage());
98+
System.exit(1);
99+
}
100+
101+
} else if (cmd.hasOption(CliOptions.EMAIL.shortName) && cmd.hasOption(CliOptions.SINGLE_USERNAME.shortName) && cmd.hasOption(CliOptions.PASSWORD.shortName)) {
68102
LOGGER.info("Create a single account");
69103

70104
AccountData account = new AccountData();
71-
account.setEmail(cmd.getOptionValue(CliOptions.SINGLE_EMAIL.shortName));
105+
account.setEmail(cmd.getOptionValue(CliOptions.EMAIL.shortName));
72106
account.setUsername(cmd.getOptionValue(CliOptions.SINGLE_USERNAME.shortName));
73-
account.setPassword(cmd.getOptionValue(CliOptions.SINGLE_PASSWORD.shortName));
107+
account.setPassword(cmd.getOptionValue(CliOptions.PASSWORD.shortName));
74108

75109
try {
76110
PtcCreationResult result = creator.createAccount(account);
@@ -84,23 +118,26 @@ public static void main(String[] args) {
84118
String accountFileName = cmd.getOptionValue(CliOptions.MULTIPLE_ACCOUNTS.shortName);
85119

86120
PtcCreationSummary summary = creator.createAccounts(accountFileName);
87-
88-
LOGGER.info(" All creations DONE : {}",summary);
121+
122+
LOGGER.info(" All creations DONE : {}", summary);
89123
System.exit(0);
90124

91125
} else {
92126

93-
LOGGER.error("\ninvalid arguments\n");
127+
LOGGER.error("invalid arguments\n");
94128

95129
HelpFormatter formatter = new HelpFormatter();
96130
StringWriter out = new StringWriter();
97131
PrintWriter writer = new PrintWriter(out);
98132

99-
String cmdLineSyntax = " (-m <email> -u <username> -p <password>) (-a <accounts.csv> ) [-ck <captchakey>]";
133+
String cmdLineSyntax = " one of \n"
134+
+ " -m <email> -u <username> -p <password> \n"
135+
+ " -a <accounts.csv> \n"
136+
+ " -m <email> -c <#ofAccounts> -f <format**> -p <password> (-s <first#>)\n"
137+
+ " and optional : -ck <captchakey> \n\n";
138+
formatter.setWidth(180);
100139
formatter.printHelp(cmdLineSyntax, options);
101140

102-
String usage = out.toString();
103-
LOGGER.error(usage);
104141
System.exit(0);
105142
}
106143

KinanCity-core/src/main/java/com/kinancity/core/creation/PtcAccountCreator.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ public PtcCreationSummary createAccounts(String accountFileName) {
104104
* @return
105105
* @throws AccountCreationException
106106
*/
107-
private PtcCreationSummary createAccounts(List<AccountData> accountsToCreate) throws AccountCreationException {
107+
public PtcCreationSummary createAccounts(List<AccountData> accountsToCreate) throws AccountCreationException {
108108
logger.info("Start creating {} account in batch loaded from csv");
109109

110110
// add all accounts to pool
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.kinancity.core.generator;
2+
3+
import com.kinancity.core.data.AccountData;
4+
5+
public interface AccountGenerator {
6+
AccountData nextAccountData();
7+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package com.kinancity.core.generator;
2+
3+
public interface EmailGenerator {
4+
String generateEmail(String... args);
5+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package com.kinancity.core.generator;
2+
3+
public interface PasswordGenerator {
4+
String generatePassword();
5+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package com.kinancity.core.generator;
2+
3+
public interface UsernameGenerator {
4+
String generateUsername();
5+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.kinancity.core.generator.impl;
2+
3+
import com.kinancity.core.generator.EmailGenerator;
4+
5+
/**
6+
* Generate and email using the Plus Trick
7+
*
8+
* Output will be [email protected]
9+
*
10+
* @author drallieiv
11+
*
12+
*/
13+
public class PlusTrickEmailGenerator implements EmailGenerator {
14+
15+
@Override
16+
public String generateEmail(String... args) {
17+
if(args.length < 2){
18+
throw new IllegalArgumentException("Plus Trick needs the base email and the plus part");
19+
}
20+
21+
String baseMail = args[0];
22+
String username = args[1];
23+
24+
return generateEmail(baseMail, username);
25+
}
26+
27+
public String generateEmail(String baseMail, String username) {
28+
return baseMail.replaceFirst("@", "+"+username+"@");
29+
}
30+
31+
}

0 commit comments

Comments
 (0)