package tc.oc.commons.bukkit.whitelist;
import java.util.Iterator;
import javax.inject.Inject;
import com.sk89q.minecraft.util.commands.Command;
import com.sk89q.minecraft.util.commands.CommandContext;
import com.sk89q.minecraft.util.commands.CommandException;
import com.sk89q.minecraft.util.commands.CommandPermissions;
import com.sk89q.minecraft.util.commands.NestedCommand;
import net.md_5.bungee.api.ChatColor;
import net.md_5.bungee.api.chat.TranslatableComponent;
import org.bukkit.command.CommandSender;
import tc.oc.api.docs.PlayerId;
import tc.oc.minecraft.scheduler.SyncExecutor;
import tc.oc.commons.bukkit.chat.Audiences;
import tc.oc.commons.bukkit.chat.ListComponent;
import tc.oc.commons.bukkit.chat.NameStyle;
import tc.oc.commons.bukkit.chat.PlayerComponent;
import tc.oc.commons.bukkit.commands.UserFinder;
import tc.oc.commons.bukkit.format.MiscFormatter;
import tc.oc.commons.bukkit.nick.IdentityProvider;
import tc.oc.commons.core.chat.Audience;
import tc.oc.commons.core.chat.Component;
import tc.oc.commons.core.commands.CommandFutureCallback;
import tc.oc.commons.core.commands.Commands;
import tc.oc.commons.core.commands.NestedCommands;
import tc.oc.commons.core.commands.TranslatableCommandException;
public class WhitelistCommands implements NestedCommands {
public static class Parent implements Commands {
@Command(
aliases = {"whitelist", "wl"},
desc = "Commands to manipulate the player whitelist",
min = 1,
max = -1
)
@NestedCommand(WhitelistCommands.class)
@CommandPermissions(Whitelist.EDIT_PERM)
public void whitelist() {}
}
private final Whitelist whitelist;
private final SyncExecutor syncExecutor;
private final Audiences audiences;
private final MiscFormatter misc;
private final IdentityProvider identities;
private final UserFinder userFinder;
@Inject WhitelistCommands(Whitelist whitelist, SyncExecutor syncExecutor, Audiences audiences, MiscFormatter misc, IdentityProvider identities, UserFinder userFinder) {
this.whitelist = whitelist;
this.syncExecutor = syncExecutor;
this.audiences = audiences;
this.misc = misc;
this.identities = identities;
this.userFinder = userFinder;
}
@Command(
aliases = {"status", "state"},
desc = "Check if the whitelist is on or off",
min = 0,
max = 0
)
public void status(CommandContext args, CommandSender sender) throws CommandException {
audiences.get(sender).sendMessage(
new TranslatableComponent(
"whitelist.status",
misc.abled(whitelist.isEnabled())
)
);
}
@Command(
aliases = {"on", "enable"},
desc = "Enable the whitelist",
min = 0,
max = 0
)
public void enable(CommandContext args, CommandSender sender) throws CommandException {
whitelist.setEnabled(true);
status(args, sender);
}
@Command(
aliases = {"off", "disable"},
desc = "Disable the whitelist",
min = 0,
max = 0
)
public void disable(CommandContext args, CommandSender sender) throws CommandException {
whitelist.setEnabled(false);
status(args, sender);
}
@Command(
aliases = {"list", "show"},
desc = "Show the complete whitelist",
min = 0,
max = 0
)
public void list(CommandContext args, CommandSender sender) throws CommandException {
final Audience audience = audiences.get(sender);
if(whitelist.isEmpty()) {
audience.sendMessage(new TranslatableComponent("whitelist.empty"));
return;
}
final ListComponent list = new ListComponent(
whitelist.stream()
.map(identities::currentIdentity)
.map(identity -> new PlayerComponent(identity, NameStyle.FANCY))
);
audience.sendMessage(
new Component()
.extra(new TranslatableComponent("whitelist.size", new Component(whitelist.size(), ChatColor.AQUA)))
.extra(": ")
.extra(list)
);
}
@Command(
aliases = {"reset", "clear"},
desc = "Reset whitelist members to default",
min = 0,
max = 0
)
public void clear(CommandContext args, final CommandSender sender) throws CommandException {
whitelist.reset();
audiences.get(sender).sendMessage(new TranslatableComponent(whitelist.isEmpty() ? "whitelist.empty" : "whitelist.default"));
}
@Command(
aliases = {"add"},
desc = "Add a player to the whitelist",
usage = "<username>",
min = 1,
max = 1
)
public void add(CommandContext args, final CommandSender sender) throws CommandException {
syncExecutor.callback(
userFinder.findUser(sender, args, 0),
CommandFutureCallback.onSuccess(sender, args, result -> {
whitelist.add(result.user);
audiences.get(sender).sendMessage(
new TranslatableComponent(
"whitelist.add",
new PlayerComponent(identities.currentIdentity(result.user), NameStyle.FANCY)
)
);
})
);
}
@Command(
aliases = {"remove"},
desc = "Remove a player from the whitelist",
usage = "<username>",
min = 1,
max = 1
)
public void remove(CommandContext args, final CommandSender sender) throws CommandException {
final String username = args.getString(0);
for(Iterator<PlayerId> iter = whitelist.iterator(); iter.hasNext();) {
PlayerId playerId = iter.next();
if(username.equalsIgnoreCase(playerId.username())) {
iter.remove();
audiences.get(sender).sendMessage(
new TranslatableComponent(
"whitelist.remove",
new PlayerComponent(identities.currentIdentity(playerId), NameStyle.FANCY)
)
);
return;
}
}
throw new TranslatableCommandException("whitelist.notFound", username);
}
@Command(
aliases = {"all"},
desc = "Whitelist all players currently on the server",
min = 0,
max = 0
)
public void all(CommandContext args, final CommandSender sender) throws CommandException {
audiences.get(sender).sendMessage(new TranslatableComponent(
"whitelist.addMulti",
new Component(whitelist.addAllOnline(), ChatColor.AQUA)
));
}
@Command(
aliases = {"kick"},
desc = "Kick any players not currently on the whitelist",
min = 0,
max = 0
)
public void kick(CommandContext args, final CommandSender sender) throws CommandException {
audiences.get(sender).sendMessage(new TranslatableComponent(
"whitelist.kickMulti",
new Component(whitelist.kickAll(), ChatColor.AQUA)
));
}
}