package server;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import client.MapleClient;
import java.util.concurrent.locks.ReentrantLock;
public class AutobanManager implements Runnable {
private static class ExpirationEntry implements Comparable<ExpirationEntry> {
public long time;
public int acc;
public int points;
public ExpirationEntry(long time, int acc, int points) {
this.time = time;
this.acc = acc;
this.points = points;
}
@Override
public int compareTo(AutobanManager.ExpirationEntry o) {
return (int) (time - o.time);
}
@Override
public boolean equals(Object oth) {
if (!(oth instanceof AutobanManager.ExpirationEntry)) {
return false;
}
final AutobanManager.ExpirationEntry ee = (AutobanManager.ExpirationEntry) oth;
return (time == ee.time && points == ee.points && acc == ee.acc);
}
}
private final Map<Integer, Integer> points = new HashMap<>();
private final Map<Integer, List<String>> reasons = new HashMap<>();
private final Set<ExpirationEntry> expirations = new TreeSet<>();
private static final int AUTOBAN_POINTS = 5000; // change this if pop
private static final AutobanManager instance = new AutobanManager();
private final ReentrantLock lock = new ReentrantLock(true);
public static final AutobanManager getInstance() {
return instance;
}
public final void autoban(final MapleClient c, final String reason) {
/*if (c.getPlayer() == null) {
return;
}
if (c.getPlayer().isGM() || c.getPlayer().isClone()) {
c.getPlayer().dropMessage(5, "[WARNING] A/b triggled : " + reason);
return;
}
addPoints(c, AUTOBAN_POINTS, 0, reason);*/
}
public final void addPoints(final MapleClient c, final int points, final long expiration, final String reason) {
/*lock.lock();
try {
List<String> reasonList;
final int acc = c.getPlayer().getAccountID();
if (this.points.containsKey(acc)) {
final int SavedPoints = this.points.get(acc);
if (SavedPoints >= AUTOBAN_POINTS) { // Already auto ban'd.
return;
}
this.points.put(acc, SavedPoints + points); // Add
reasonList = this.reasons.get(acc);
reasonList.add(reason);
} else {
this.points.put(acc, points);
reasonList = new LinkedList<String>();
reasonList.add(reason);
this.reasons.put(acc, reasonList);
}
if (this.points.get(acc) >= AUTOBAN_POINTS) { // See if it's sufficient to auto ban
if (c.getPlayer().isGM() || c.getPlayer().isClone()) {
c.getPlayer().dropMessage(5, "[WARNING] A/b triggled : " + reason);
return;
}
final StringBuilder sb = new StringBuilder("a/b ");
sb.append(c.getPlayer().getName());
sb.append(" (IP ");
sb.append(c.getSession().getRemoteAddress().toString());
sb.append("): ");
for (final String s : reasons.get(acc)) {
sb.append(s);
sb.append(", ");
}
World.Broadcast.broadcastMessage(CWvsContext.serverNotice(0, "[Autoban] " + c.getPlayer().getName() + " banned by the system (Last reason: " + reason + ")"));
// Calendar cal = Calendar.getInstance();
// cal.add(Calendar.DATE, 60);
// c.getPlayer().tempban(sb.toString(), cal, 1, false);
c.getPlayer().ban(sb.toString(), false, true, false);
c.disconnect(true, false);
} else {
if (expiration > 0) {
expirations.add(new ExpirationEntry(System.currentTimeMillis() + expiration, acc, points));
}
}
} finally {
lock.unlock();
}*/
}
@Override
public final void run() {
final long now = System.currentTimeMillis();
for (final ExpirationEntry e : expirations) {
if (e.time <= now) {
this.points.put(e.acc, this.points.get(e.acc) - e.points);
} else {
return;
}
}
}
}