Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package pine;
- import java.time.Year;
- import java.util.Arrays;
- 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 key
- */
- private static NavigableMap<Integer, String> trialKeys = new TreeMap<>((k1, k2) -> {
- return Integer.compare(k1, k2);
- });
- /**
- * Key: Integer order of the key<br>
- * Value: The key
- */
- private static NavigableMap<Integer, String> subKeys = new TreeMap<>((k1, k2) -> {
- return Integer.compare(k1, k2);
- });
- /** Calendar. */
- private static Calendar calendar = Calendar.getInstance();
- /**
- * @param args Syntax: validVarName:String numMembers: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>numMembers</i> is an integer that designates the total number of active member keys to
- * generate (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 < 3) {
- throw new IllegalArgumentException("Invalid argument count.");
- }
- String varName = args[0];
- varName = varName.equals("validTrial") || varName.equals("validSub") ? varName + "1" : varName;
- int dayRate = Integer.valueOf(args[2]);
- Set<String> bytes = new HashSet<>();
- KeyGenerator keygen = KeyGenerator.getInstance("AES");
- keygen.init(128);
- int maxL = 0;
- SecretKey sKey;
- byte[] enc;
- for (int i = 0; i < 365; i += dayRate) {
- sKey = keygen.generateKey();
- enc = sKey.getEncoded();
- String s = Arrays.toString(enc).replace(", ", "").replace("-", "");
- s = s.substring(1, s.length() - 1);
- while (bytes.contains(s)) {
- sKey = keygen.generateKey();
- enc = sKey.getEncoded();
- s = Arrays.toString(enc).replace(", ", "").replace("-", "");
- s = s.substring(1, s.length() - 1);
- }
- trialKeys.put(i, s);
- bytes.add(s);
- maxL = Math.max(maxL, s.length());
- }
- int numSubs = Integer.valueOf(args[1]);
- for (int i = 0; i < numSubs; i++) {
- sKey = keygen.generateKey();
- enc = sKey.getEncoded();
- String s = Arrays.toString(enc).replace(", ", "").replace("-", "");
- s = s.substring(1, s.length() - 1);
- while (bytes.contains(s)) {
- sKey = keygen.generateKey();
- enc = sKey.getEncoded();
- s = Arrays.toString(enc).replace(", ", "").replace("-", "");
- s = s.substring(1, s.length() - 1);
- }
- subKeys.put(i, s);
- bytes.add(s);
- maxL = Math.max(maxL, s.length());
- }
- for (Entry<Integer, String> e : trialKeys.entrySet()) {
- String key = e.getValue();
- while (key.length() < maxL) {
- key = "0" + key;
- }
- trialKeys.put(e.getKey(), key);
- }
- for (Entry<Integer, String> e : subKeys.entrySet()) {
- String key = e.getValue();
- while (key.length() < maxL) {
- key = "0" + key;
- }
- subKeys.put(e.getKey(), key);
- }
- String timezone = "default";
- int hour = 23;
- int minute = 59;
- if (args.length > 3) {
- try {
- hour = Integer.valueOf(args[3]);
- } catch (NumberFormatException e) {
- timezone = args[3];
- }
- if (args.length > 4) {
- if (timezone.equals("default")) {
- minute = Integer.valueOf(args[4]);
- } else {
- hour = Integer.valueOf(args[4]);
- }
- if (args.length > 5) {
- minute = Integer.valueOf(args[5]);
- }
- }
- }
- 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());
- calendar.add(Calendar.DATE, -dayRate);
- int pYear = calendar.get(Calendar.YEAR);
- int pMonth = calendar.get(Calendar.MONTH) + 1;
- int pDay = calendar.get(Calendar.DAY_OF_MONTH);
- calendar.add(Calendar.DATE, dayRate);
- // 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, pYear, pMonth, pDay, hour, minute))
- .append(" and t <= ").append(timestamp(timezone, year, month, day, hour, minute))
- .append(") or ");
- sb2.append("// ").append(key).append(": ").append(
- formatYearMonthDay(pYear, pMonth, pDay, hour, minute)).append(" ---> ")
- .append(formatYearMonthDay(year, month, day, hour, minute)).append("\n");
- pYear = year;
- pMonth = month;
- pDay = day;
- }
- String out = sb.toString();
- sb = new StringBuilder(out.substring(0, out.length() - 4))
- .append("\n\nvalidSub = ");
- for (Entry<Integer, String> e : subKeys.entrySet()) {
- String key = e.getValue();
- sb.append("key == \"").append(key).append("\" or ");
- }
- out = sb.toString();
- sb = new StringBuilder(out.substring(0, out.length() - 4))
- .append("\n\n").append(varName).append(" = ").append("validTrial or validSub")
- .append("\n\n").append(sb2.toString())
- .append("\n\n// Subscription Keys\n\n");
- for (Entry<Integer, String> e : subKeys.entrySet()) {
- sb.append("// ").append(e.getValue()).append("\n");
- }
- System.out.println(sb.toString());
- } catch (Exception e) {
- System.out
- .println("\nSyntax: expiredVarName:String 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" +
- "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 14 12 0\n\n will generate a 20 member subscription 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();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement