package tc.oc.commons.bukkit.whitelist;
import java.util.HashSet;
import java.util.Set;
import javax.inject.Inject;
import javax.inject.Singleton;
import com.google.common.collect.ForwardingSet;
import net.md_5.bungee.api.chat.TranslatableComponent;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerLoginEvent;
import tc.oc.api.bukkit.users.BukkitUserStore;
import tc.oc.api.bukkit.users.OnlinePlayers;
import tc.oc.api.docs.PlayerId;
import tc.oc.api.docs.Server;
import tc.oc.commons.bukkit.chat.ComponentRenderContext;
import tc.oc.commons.bukkit.event.UserLoginEvent;
import tc.oc.commons.bukkit.event.WhitelistStateChangeEvent;
import tc.oc.commons.core.plugin.PluginFacet;
@Singleton
public class Whitelist extends ForwardingSet<PlayerId> implements PluginFacet, Listener {
public static final String EDIT_PERM = "whitelist.edit";
public static final String BYPASS_PERM = "whitelist.bypass";
private final Server localServer;
private final BukkitUserStore userStore;
private final OnlinePlayers onlinePlayers;
private final ComponentRenderContext renderer;
private boolean enabled;
private final Set<PlayerId> whitelist = new HashSet<>();
@Inject Whitelist(Server localServer, BukkitUserStore userStore, OnlinePlayers onlinePlayers, ComponentRenderContext renderer) {
this.localServer = localServer;
this.userStore = userStore;
this.onlinePlayers = onlinePlayers;
this.renderer = renderer;
}
@Override
protected Set<PlayerId> delegate() {
return whitelist;
}
@Override
public void enable() {
reset();
setEnabled(localServer.whitelist_enabled());
}
public void reset() {
clear();
if(localServer.team() != null) {
addAll(localServer.team().members());
}
}
public boolean isEnabled() {
return enabled;
}
public boolean isWhitelisted(Player player) {
return !enabled ||
player.isOp() ||
player.hasPermission(BYPASS_PERM) ||
whitelist.contains(userStore.getUser(player));
}
public void setEnabled(boolean yes) {
enabled = yes;
Bukkit.getServer().getPluginManager().callEvent(new WhitelistStateChangeEvent(enabled));
}
public int addAllOnline() {
int count = 0;
for(Player player : onlinePlayers.all()) {
if(!player.hasPermission(BYPASS_PERM) && add(userStore.getUser(player))) {
count++;
}
}
return count;
}
public int kickAll() {
int count = 0;
for(Player player : onlinePlayers.all()) {
if(!isWhitelisted(player)) {
player.kickPlayer(renderer.renderLegacy(new TranslatableComponent("whitelist.kicked"), player));
count++;
}
}
return count;
}
@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
public void onLogin(UserLoginEvent event) {
if(!isWhitelisted(event.getPlayer())) {
event.disallow(PlayerLoginEvent.Result.KICK_WHITELIST, new TranslatableComponent("whitelist.kicked"));
}
}
}