package utils;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
class JamRateLimitSimulator {
private static JamRateLimitSimulator singleton = new JamRateLimitSimulator();
public boolean useFakeRateLimit = false; // Set to true to simulate rate limit
private static int SIMULATE_RESET_NEXT_IN_SEC = 20; // Modify to test next rate limit reset
private static int SIMULATE_TOTAL_LIMIT = 800; // Modify to test total rate limit total
private static int SIMULATE_TOTAL_REMAINING = 3; // Modify to test remaining limits
static class FakeRateLimit {
public int rateLimitTotal = SIMULATE_TOTAL_LIMIT;
public int rateLimitRemaining = SIMULATE_TOTAL_REMAINING;
public int rateLimitReset = SIMULATE_RESET_NEXT_IN_SEC;
public Date nextUpdateTime = new Date();
}
public static JamRateLimitSimulator getInstance() {
return singleton;
}
private JamRateLimitSimulator() {}
public void update( String host ) {
FakeRateLimit frl = fakeRateLimit.get("host");
System.out.println(" [JAMRATELIMITSIMULATOR] updating similator for: " + host);
if(useFakeRateLimit && frl !=null) {
Calendar cal = Calendar.getInstance();
Date dateNow = cal.getTime();
System.out.println(" now: " + dateNow.toLocaleString());
System.out.println(" nextUpdateTime: " + frl.nextUpdateTime.toLocaleString());
double timeDiff = (double)((frl.nextUpdateTime.getTime() - dateNow.getTime()) / 1000.0);
System.out.println(" [JAMRATELIMITSIMULATOR] Next reset " + timeDiff);
// Check for time to reset
if(timeDiff < 0 ) {
System.out.println(" [JAMRATELIMITSIMULATOR] LIMIT RESET!!");
cal.setTime(dateNow);
cal.add(Calendar.SECOND, frl.rateLimitReset);
frl.rateLimitRemaining = SIMULATE_TOTAL_REMAINING;
frl.nextUpdateTime = cal.getTime();
timeDiff = (double)((frl.nextUpdateTime.getTime() - dateNow.getTime()) / 1000.0);
}
frl.rateLimitReset = (int)(timeDiff+0.5);
frl.rateLimitRemaining = SIMULATE_TOTAL_REMAINING;
}
}
public void setFakeRateLimit(String host) {
if(useFakeRateLimit) {
System.out.println(" [JAMRATELIMITSIMULATOR] RESET FAKE LIMITS: " + host );
if(!fakeRateLimit.containsKey(host)) {
FakeRateLimit frl = new FakeRateLimit();
frl.rateLimitTotal = SIMULATE_TOTAL_LIMIT;
frl.rateLimitRemaining = SIMULATE_TOTAL_REMAINING;
frl.rateLimitReset = SIMULATE_RESET_NEXT_IN_SEC;
Calendar cal = Calendar.getInstance(); // creates calendar
Date dateNow = cal.getTime();
cal.setTime(dateNow);
cal.add(Calendar.SECOND, frl.rateLimitReset);
frl.nextUpdateTime = cal.getTime();
fakeRateLimit.put(host, frl);
System.out.println(" [JAMRATELIMITSIMULATOR] Create rate limit for :" + host );
// update(host);
} else {
FakeRateLimit frl = fakeRateLimit.get(host);
frl.rateLimitRemaining -= 1;
frl.rateLimitReset -= 1;
}
}
}
public HashMap<String, FakeRateLimit> fakeRateLimit = new HashMap<String, FakeRateLimit>();
}