Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package pine;
- import java.time.Year;
- import java.util.Calendar;
- import java.util.HashSet;
- import java.util.Map.Entry;
- import java.util.NavigableMap;
- import java.util.Set;
- import java.util.TreeMap;
- import javax.crypto.KeyGenerator;
- import javax.crypto.SecretKey;
- /**
- * Generates the String text necessary to generate pinescript code for trial and member secret keys.
- */
- public class PineKeygen {
- /** Default time zone. */
- private static final String defaultTZ = "America/New_York";
- /**
- * Key: Integer order of the key<br>
- * Value: The secret key
- */
- private static NavigableMap<Integer, String> trialKeys = new TreeMap<>();
- /**
- * Key: Integer order of the key<br>
- * Value: Key: Integer order of the key, Value = The secret key
- */
- private static NavigableMap<Integer, NavigableMap<Integer, String>> subKeys = new TreeMap<>();
- /** Master Key. */
- private static String masterKey = "";
- /** Calendar. */
- private static Calendar calendar = Calendar.getInstance();
- /**
- * @param args Syntax: validVarName:String numMembers:int numProducts:int everyXWeeks:int timeZone:String
- * endHour:int endMinute:int
- * <p>
- * <i>validVarName</i> will have a boolean <tt>true</tt> or <tt>false</tt> if the tested key is
- * currently valid. A valid key is <tt>true</tt> only if the time stamp associated with that
- * key (if it exists) has not yet expired for a trial, or it is an active subscription key
- * (required).
- * <p>
- * <i>numProducts</i> is an integer that designates the total number of products to generate
- * active member keys for (required)
- * <p>
- * <i>numMembers</i> is an integer that designates the total number of active member keys to
- * generate for each product(required)
- * <p>
- * <i>everyXDays</i> is an integer that designates how often a key is generated, in days.
- * <b>7</b> designates that 1 key will be generated every 7 days starting at 23:59 on the first
- * Sunday of the year (required).
- * <p>
- * <i>timeZone</i> optional argument, example = GMT+5
- * <p>
- * <i>endHour</i> optional argument, example = 23
- * <p>
- * <i>endMinute</i> optional argument, example = 59
- * <p>
- */
- public static void main(String[] args) {
- try {
- if (args.length < 4) {
- throw new IllegalArgumentException("Invalid argument count.");
- }
- String varName = args[0];
- varName = varName.equals("validTrial") || varName.equals("validSub") ? varName + "_" : varName;
- int numProducts = Integer.valueOf(args[2]);
- int dayRate = Integer.valueOf(args[3]);
- Set<String> bytes = new HashSet<>();
- KeyGenerator keygen = KeyGenerator.getInstance("AES");
- keygen.init(128);
- SecretKey sKey;
- byte[] enc;
- for (int i = 0; i < 365; i += dayRate) {
- sKey = keygen.generateKey();
- enc = sKey.getEncoded();
- StringBuilder sb = new StringBuilder();
- for (int j = 0; j < enc.length; j++) {
- sb.append(integerToHex(enc[j]));
- }
- String s = sb.toString();
- while (bytes.contains(s)) {
- sKey = keygen.generateKey();
- enc = sKey.getEncoded();
- sb = new StringBuilder();
- for (int j = 0; j < enc.length; j++) {
- sb.append(integerToHex(enc[j]));
- }
- s = sb.toString();
- }
- trialKeys.put(i, s);
- bytes.add(s);
- }
- int numSubs = Integer.valueOf(args[1]);
- for (int i = 0; i < numProducts; i++) {
- NavigableMap<Integer, String> map = new TreeMap<>();
- subKeys.put(i, map);
- for (int j = 0; j < numSubs; j++) {
- sKey = keygen.generateKey();
- enc = sKey.getEncoded();
- StringBuilder sb = new StringBuilder();
- for (int k = 0; k < enc.length; k++) {
- sb.append(integerToHex(enc[k]));
- }
- String s = sb.toString();
- while (bytes.contains(s)) {
- sKey = keygen.generateKey();
- enc = sKey.getEncoded();
- sb = new StringBuilder();
- for (int k = 0; k < enc.length; k++) {
- sb.append(integerToHex(enc[k]));
- }
- s = sb.toString();
- }
- map.put(j, s);
- bytes.add(s);
- }
- }
- for (int i = 0; i < 1; i++) {
- sKey = keygen.generateKey();
- enc = sKey.getEncoded();
- StringBuilder sb = new StringBuilder();
- for (int j = 0; j < enc.length; j++) {
- sb.append(integerToHex(enc[j]));
- }
- String s = sb.toString();
- while (bytes.contains(s)) {
- sKey = keygen.generateKey();
- enc = sKey.getEncoded();
- sb = new StringBuilder();
- for (int j = 0; j < enc.length; j++) {
- sb.append(integerToHex(enc[j]));
- }
- s = sb.toString();
- }
- masterKey = s;
- }
- String timezone = "default";
- int hour = 23;
- int minute = 59;
- if (args.length > 4) {
- try {
- hour = Integer.valueOf(args[4]);
- } catch (NumberFormatException e) {
- timezone = args[4];
- }
- if (args.length > 5) {
- if (timezone.equals("default")) {
- minute = Integer.valueOf(args[5]);
- } else {
- hour = Integer.valueOf(args[5]);
- }
- if (args.length > 6) {
- minute = Integer.valueOf(args[6]);
- }
- }
- }
- timezone = timezone.equals("default") ? defaultTZ : timezone;
- timezone = timezone.trim().replaceAll(" ", "");
- hour = Math.max(0, Math.min(23, hour));
- minute = Math.max(0, Math.min(59, minute));
- StringBuilder sb = new StringBuilder("\n\nkey = input(\"\", title=\"Key\")\n\n")
- .append("t = timenow\n\n")
- .append("validTrial").append(" = ");
- StringBuilder sb2 = new StringBuilder("// Trial Keys\n\n");
- setFirstSunday(Year.now().getValue());
- // for trading view, add + 1 to the month,
- for (Entry<Integer, String> e : trialKeys.entrySet()) {
- String key = e.getValue();
- int year = calendar.get(Calendar.YEAR);
- int month = calendar.get(Calendar.MONTH) + 1;
- int day = calendar.get(Calendar.DAY_OF_MONTH);
- calendar.add(Calendar.DATE, dayRate);
- sb.append("(key == \"").append(key).append("\" and ")
- .append("t <= ").append(timestamp(timezone, year, month, day, hour, minute))
- .append(") or ");
- sb2.append("// ").append(key).append(" (")
- .append(formatYearMonthDay(year, month, day, hour, minute)).append(")\n");
- }
- String out = sb.toString();
- sb = new StringBuilder(out.substring(0, out.length() - 4));
- int pNum = 1;
- for (Entry<Integer, NavigableMap<Integer, String>> p : subKeys.entrySet()) {
- sb.append("\n\nvalidSub").append(pNum++).append(" = ");
- for (Entry<Integer, String> e : p.getValue().entrySet()) {
- String key = e.getValue();
- sb.append("key == \"").append(key).append("\" or ");
- }
- sb.append("key == \"").append(masterKey).append("\"");
- }
- sb.append("\n\n").append(varName).append(" = ").append("validTrial");
- for (int i = 0; i < numProducts; i++) {
- sb.append(" or validSub").append(i + 1);
- }
- sb.append("\n\n").append(sb2.toString());
- pNum = 1;
- for (Entry<Integer, NavigableMap<Integer, String>> p : subKeys.entrySet()) {
- sb.append("\n// Subscription Keys - ").append(pNum++).append("\n\n");
- for (Entry<Integer, String> e : p.getValue().entrySet()) {
- sb.append("// ").append(e.getValue()).append("\n");
- }
- }
- sb.append("\n// Master Key\n\n").append("// ").append(masterKey).append("\n");
- System.out.println(sb.toString());
- } catch (Exception e) {
- System.out
- .println("\nSyntax: expiredVarName:String numMembers:int numProducts:int everyXDays:int timeZone:String endHour:int endMinute:int\n\n"
- +
- "validVarName = A boolean true or false if the tested key "
- +
- "is currently valid. A valid key is true only if the time stamp "
- +
- "associated with that key (if it exists) has not yet expired for a trial, "
- +
- "or it is an active subscription key(required)\n\n"
- +
- "numMembers = an integer that designates the number of active members subscription "
- +
- "keys to generate (required) \n\n"
- +
- "numProducts = is an integer that designates the total number of products to generate "
- +
- "active member keys for (required) \n\n"
- +
- "everyXDays = an integer that designates how often a key is "
- +
- "generated, in days. 7 designates that 1 key will be generated every 7 days starting "
- +
- "at endHour:endMinute on the first Sunday of the year (required)\n\n"
- +
- "timeZone = Designates the timezone, example = GMT+5 or America/New_York (optional)\n\n"
- +
- "endHour = Designates the end hour, example = 23 (optional)\n\n"
- +
- "endMinute = Designates the end minute, example = 59 (optional)\n\n"
- +
- "Full Example\n\n> valid 20 3 14 12 0\n\n will generate a 20 member " +
- "subscription keys for 3 different products (total of 60 member keys), " +
- "and a trial key every 14 days starting on Sunday at 12:00 PM America/New_York\n");
- e.printStackTrace();
- }
- }
- static void setFirstSunday(int year) {
- setFirstDayOfWeek(year, Calendar.JANUARY, Calendar.SUNDAY);
- }
- static void setFirstDayOfWeek(int year, int dayofWeek) {
- setFirstDayOfWeek(year, Calendar.JANUARY, dayofWeek);
- }
- static void setFirstDayOfWeek(int year, int month, int dayofweek) {
- calendar.set(Calendar.MONTH, month);
- calendar.set(Calendar.YEAR, year);
- int dom = 1;
- calendar.set(Calendar.DAY_OF_MONTH, dom);
- while (calendar.get(Calendar.DAY_OF_WEEK) != dayofweek) {
- calendar.set(Calendar.DAY_OF_MONTH, ++dom);
- }
- }
- static String timestamp(String tz, int year, int month, int dayofmonth, int hour, int minute) {
- return new StringBuilder("timestamp(\"")
- .append(tz).append("\", ")
- .append(year).append(", ")
- .append(month).append(", ")
- .append(dayofmonth).append(", ")
- .append(hour).append(", ")
- .append(minute)
- .append(")").toString();
- }
- static String formatYearMonthDay(int year, int month, int day, int hour, int minute) {
- String m = (month < 10 ? "0" : "") + String.valueOf(month);
- String d = (day < 10 ? "0" : "") + String.valueOf(day);
- String h = (hour < 10 ? "0" : "") + String.valueOf(hour);
- String min = (minute < 10 ? "0" : "") + String.valueOf(minute);
- return new StringBuilder().append(year).append("-").append(m).append("-").append(d).append("-")
- .append(h).append(":").append(min)
- .toString();
- }
- static String integerToHex(int value) {
- value = value + 128; // convert to unsigned int
- int base = (int) Math.floor(value / 16);
- int rem = value - base * 16;
- String c1 = base == 10 ? "A" : base == 11 ? "B" : base == 12 ? "C" :
- base == 13 ? "D" : base == 14 ? "E" : base == 15 ? "F" : String.valueOf(base);
- String c2 = rem == 10 ? "A" : rem == 11 ? "B" : rem == 12 ? "C" :
- rem == 13 ? "D" : rem == 14 ? "E" : rem == 15 ? "F" : String.valueOf(rem);
- return c1 + c2;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement