package tterrag.tppibot.registry;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.apache.commons.lang3.ArrayUtils;
import org.pircbotx.Channel;
import org.pircbotx.PircBotX;
import org.pircbotx.User;
import org.pircbotx.hooks.events.DisconnectEvent;
import tterrag.tppibot.config.Config;
import tterrag.tppibot.interfaces.ICommand.PermLevel;
import tterrag.tppibot.util.IRCUtils;
import com.google.common.eventbus.Subscribe;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
public enum PermRegistry {
INSTANCE;
/**
* {@link Channel} -> ({@link User} -> {@link PermLevel})
*/
private Map<String, Map<String, PermLevel>> registrar;
private Set<String> controllers;
private Config registrarConfig, controllersConfig;
public final String[] defaultControllers = new String[] { "tterrag", "esKaayY", "TehNut" };
private PermRegistry() {
registrarConfig = new Config("permRegistry.json");
controllersConfig = new Config("controllers.json");
registrar = new Gson().fromJson(registrarConfig.getText(), new TypeToken<Map<String, Map<String, PermLevel>>>() {
}.getType());
controllers = new Gson().fromJson(controllersConfig.getText(), new TypeToken<Set<String>>() {
}.getType());
registrar = registrar == null ? new HashMap<String, Map<String, PermLevel>>() : registrar;
controllers = controllers == null ? new HashSet<String>() : controllers;
if (controllers.isEmpty())
controllers.addAll(Arrays.asList(defaultControllers));
}
public boolean registerUser(Channel chan, User user, PermLevel level) {
String acct = IRCUtils.getAccount(user);
if (acct == null) {
return false;
}
// controllers are global
if (level == PermLevel.CONTROLLER) {
controllers.add(acct);
} else {
controllers.remove(acct);
// can't assign op/voice
if (!ArrayUtils.contains(PermLevel.getSettablePermLevels(), level))
throw new IllegalArgumentException("Cannot register a user with the level " + level.toString());
String chanName = chan.getName();
registrar.put(chanName, register(registrar.get(chanName), acct, level));
}
return true;
}
private Map<String, PermLevel> register(Map<String, PermLevel> curChanMap, String acct, PermLevel level) {
if (curChanMap == null)
curChanMap = new HashMap<String, PermLevel>();
curChanMap.put(acct, level);
return curChanMap;
}
public PermLevel getPermLevelForUser(Channel chan, User user) {
String acct = IRCUtils.getAccount(user);
if (controllers.contains(acct))
return PermLevel.CONTROLLER;
if (!registrar.containsKey(chan.getName()))
return PermLevel.DEFAULT;
PermLevel perm = registrar.get(chan.getName()).get(acct);
return perm == null ? PermLevel.DEFAULT : perm;
}
@Subscribe
public void onDisconnect(DisconnectEvent<PircBotX> event) {
registrarConfig.writeJsonToFile(registrar);
controllersConfig.writeJsonToFile(controllers);
}
public boolean isController(User user) {
return controllers.contains(IRCUtils.getAccount(user));
}
public boolean isDefaultController(User user) {
return ArrayUtils.contains(defaultControllers, IRCUtils.getAccount(user));
}
}