package fr.Alphart.BAT.Modules.Ban;
import static com.google.common.base.Preconditions.checkArgument;
import static fr.Alphart.BAT.I18n.I18n._;
import java.util.UUID;
import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import com.google.common.base.Joiner;
import com.imaginarycode.minecraft.redisbungee.RedisBungee;
import fr.Alphart.BAT.BAT;
import fr.Alphart.BAT.Modules.BATCommand;
import fr.Alphart.BAT.Modules.BATCommand.RunAsync;
import fr.Alphart.BAT.Modules.CommandHandler;
import fr.Alphart.BAT.Modules.IModule;
import fr.Alphart.BAT.Modules.InvalidModuleException;
import fr.Alphart.BAT.Modules.Core.Core;
import fr.Alphart.BAT.Modules.Core.PermissionManager;
import fr.Alphart.BAT.Modules.Core.PermissionManager.Action;
import fr.Alphart.BAT.Utils.FormatUtils;
import fr.Alphart.BAT.Utils.Utils;
public class BanCommand extends CommandHandler {
private static Ban ban;
public BanCommand(final Ban banModule) {
super(banModule);
ban = banModule;
}
@RunAsync
public static class BanCmd extends BATCommand {
public BanCmd() {
super("ban", "<player> [server] [reason]",
"Ban the player on username basis on the specified server permanently or until unbanned.",
Action.BAN.getPermission());
}
@Override
public void onCommand(final CommandSender sender, final String[] args, final boolean confirmedCmd)
throws IllegalArgumentException {
if (args[0].equals("help")) {
try {
FormatUtils.showFormattedHelp(BAT.getInstance().getModules().getModule("ban").getCommands(),
sender, "BAN");
} catch (final InvalidModuleException e) {
e.printStackTrace();
}
return;
}
handleBanCommand(this, false, false, sender, args, confirmedCmd);
}
}
@RunAsync
public static class BanIPCmd extends BATCommand {
public BanIPCmd() {
super("banip", "<player/ip> [server] [reason]",
"Ban player on an IP basis on the specified server permanently or until unbanned. ", Action.BANIP
.getPermission());
}
@Override
public void onCommand(final CommandSender sender, final String[] args, final boolean confirmedCmd)
throws IllegalArgumentException {
handleBanCommand(this, false, true, sender, args, confirmedCmd);
}
}
@RunAsync
public static class GBanCmd extends BATCommand {
public GBanCmd() {
super(
"gban",
"<player> [reason]",
"Ban the player on username basis on all servers (the whole network) permanently or until unbanned.",
Action.BAN.getPermission() + ".global");
}
@Override
public void onCommand(final CommandSender sender, final String[] args, final boolean confirmedCmd)
throws IllegalArgumentException {
handleBanCommand(this, true, false, sender, args, confirmedCmd);
}
}
@RunAsync
public static class GBanIPCmd extends BATCommand {
public GBanIPCmd() {
super("gbanip", "<player/ip> [reason]",
"Ban player on an IP basis on all servers (the whole network) permanently or until unbanned.",
Action.BANIP.getPermission() + ".global");
}
@Override
public void onCommand(final CommandSender sender, final String[] args, final boolean confirmedCmd)
throws IllegalArgumentException {
handleBanCommand(this, true, true, sender, args, confirmedCmd);
}
}
public static void handleBanCommand(final BATCommand command, final boolean global, final boolean ipBan,
final CommandSender sender, final String[] args, final boolean confirmedCmd) {
String target = args[0];
String server = IModule.GLOBAL_SERVER;
final String staff = sender.getName();
String reason = IModule.NO_REASON;
final ProxiedPlayer player = ProxyServer.getInstance().getPlayer(target);
UUID pUUID = null;
if (BAT.getInstance().getRedis().isRedisEnabled()) {
UUID tempUUID = RedisBungee.getApi().getUuidFromName(target, false);
if (tempUUID != null && RedisBungee.getApi().isPlayerOnline(tempUUID)) pUUID = tempUUID;
}
String ip = null;
String returnedMsg;
if (global) {
if (args.length > 1) {
reason = Utils.getFinalArg(args, 1);
}
} else {
if (args.length == 1) {
checkArgument(sender instanceof ProxiedPlayer, _("specifyServer"));
server = ((ProxiedPlayer) sender).getServer().getInfo().getName();
} else {
checkArgument(Utils.isServer(args[1]), _("invalidServer"));
server = args[1];
reason = (args.length > 2) ? Utils.getFinalArg(args, 2) : IModule.NO_REASON;
}
}
checkArgument(
!reason.equalsIgnoreCase(IModule.NO_REASON) || !BAT.getInstance().getConfiguration().isMustGiveReason(),
_("noReasonInCommand"));
// Check if the target isn't an ip and the player is offline
if (!Utils.validIP(target) && player == null && pUUID == null) {
ip = Core.getPlayerIP(target);
if (ipBan) {
checkArgument(!"0.0.0.0".equals(ip), _("ipUnknownPlayer"));
}
// If ip = 0.0.0.0, it means the player never connects
else {
if ("0.0.0.0".equals(ip) && !confirmedCmd) {
command.mustConfirmCommand(sender, command.getName() + " " + Joiner.on(' ').join(args),
_("operationUnknownPlayer", new String[] { target }));
return;
}
// Set the ip to null to avoid checking if the ip is banned
ip = null;
}
}
if (!global) {
checkArgument(PermissionManager.canExecuteAction((ipBan) ? Action.BANIP : Action.BAN, sender, server),
_("noPerm"));
}
target = (ip == null) ? target : ip;
// We just check if the target is exempt from the ban, which means he's
// exempt from the full module command
checkArgument(!PermissionManager.isExemptFrom(Action.BAN, target), _("isExempt"));
checkArgument(!ban.isBan((ip == null) ? target : ip, server), _("alreadyBan"));
if (ipBan && player != null) {
returnedMsg = ban.banIP(player, server, staff, 0, reason);
} else if (ipBan && pUUID != null) {
returnedMsg = ban.banRedisIP(pUUID, server, staff, 0, reason);
} else {
returnedMsg = ban.ban(target, server, staff, 0, reason);
}
BAT.broadcast(returnedMsg, Action.banBroadcast.getPermission());
}
@RunAsync
public static class TempBanCmd extends BATCommand {
public TempBanCmd() {
super("tempban", "<player> <duration> [server] [reason]",
"Temporarily ban the player on username basis on from the specified server for duration.",
Action.TEMPBAN.getPermission());
}
@Override
public void onCommand(final CommandSender sender, final String[] args, final boolean confirmedCmd)
throws IllegalArgumentException {
handleTempBanCommand(this, false, false, sender, args, confirmedCmd);
}
}
@RunAsync
public static class TempBanIPCmd extends BATCommand {
public TempBanIPCmd() {
super("tempbanip", "<player/ip> <duration> [server] [reason]",
"Temporarily ban the player on IP basis on the specified server for duration.", Action.TEMPBANIP
.getPermission());
}
@Override
public void onCommand(final CommandSender sender, final String[] args, final boolean confirmedCmd)
throws IllegalArgumentException {
handleTempBanCommand(this, false, true, sender, args, confirmedCmd);
}
}
@RunAsync
public static class GTempBanCmd extends BATCommand {
public GTempBanCmd() {
super("gtempban", "<player> <duration> [reason]",
"Temporarily ban the player on username basis on all servers (the whole network) for duration.",
Action.TEMPBAN.getPermission() + ".global");
}
@Override
public void onCommand(final CommandSender sender, final String[] args, final boolean confirmedCmd)
throws IllegalArgumentException {
handleTempBanCommand(this, true, false, sender, args, confirmedCmd);
}
}
@RunAsync
public static class GTempBanIPCmd extends BATCommand {
public GTempBanIPCmd() {
super("gtempbanip", "<player/ip> <duration> [reason]",
"Temporarily ban the player on IP basis on all servers (the whole network) for duration.",
Action.TEMPBANIP.getPermission() + ".global");
}
@Override
public void onCommand(final CommandSender sender, final String[] args, final boolean confirmedCmd)
throws IllegalArgumentException {
handleTempBanCommand(this, true, true, sender, args, confirmedCmd);
}
}
public static void handleTempBanCommand(final BATCommand command, final boolean global, final boolean ipBan,
final CommandSender sender, final String[] args, final boolean confirmedCmd) {
String target = args[0];
final long expirationTimestamp = Utils.parseDuration(args[1]);
String server = IModule.GLOBAL_SERVER;
final String staff = sender.getName();
String reason = IModule.NO_REASON;
final ProxiedPlayer player = ProxyServer.getInstance().getPlayer(target);
UUID pUUID = null;
if (BAT.getInstance().getRedis().isRedisEnabled()) {
UUID tempUUID = RedisBungee.getApi().getUuidFromName(target, false);
if (tempUUID != null && RedisBungee.getApi().isPlayerOnline(tempUUID)) pUUID = tempUUID;
}
String ip = null;
String returnedMsg;
if (global) {
if (args.length > 2) {
reason = Utils.getFinalArg(args, 2);
}
} else {
if (args.length == 2) {
checkArgument(sender instanceof ProxiedPlayer, _("specifyServer"));
server = ((ProxiedPlayer) sender).getServer().getInfo().getName();
} else {
checkArgument(Utils.isServer(args[2]), _("invalidServer"));
server = args[2];
reason = (args.length > 3) ? Utils.getFinalArg(args, 3) : IModule.NO_REASON;
}
}
checkArgument(
!reason.equalsIgnoreCase(IModule.NO_REASON) || !BAT.getInstance().getConfiguration().isMustGiveReason(),
_("noReasonInCommand"));
// Check if the target isn't an ip and the player is offline
if (!Utils.validIP(target) && player == null && pUUID == null) {
ip = Core.getPlayerIP(target);
if (ipBan) {
checkArgument(!"0.0.0.0".equals(ip), _("ipUnknownPlayer"));
} else {
// If ip = 0.0.0.0, it means the player never connects
if ("0.0.0.0".equals(ip) && !confirmedCmd) {
command.mustConfirmCommand(sender, command.getName() + " " + Joiner.on(' ').join(args),
_("operationUnknownPlayer", new String[] { target }));
return;
}
// Set the ip to null to avoid checking if the ip is banned
ip = null;
}
}
if (!global) {
checkArgument(
PermissionManager.canExecuteAction((ipBan) ? Action.TEMPBANIP : Action.TEMPBAN, sender, server),
_("noPerm"));
}
target = (ip == null) ? target : ip;
checkArgument(!PermissionManager.isExemptFrom(Action.BAN, target), _("isExempt"));
checkArgument(!ban.isBan(target, server), _("alreadyBan"));
if (ipBan && player != null) {
returnedMsg = ban.banIP(player, server, staff, expirationTimestamp, reason);
} else if (ipBan && pUUID != null) {
returnedMsg = ban.banRedisIP(pUUID, server, staff, expirationTimestamp, reason);
} else {
returnedMsg = ban.ban(target , server, staff, expirationTimestamp, reason);
}
BAT.broadcast(returnedMsg, Action.banBroadcast.getPermission());
}
@RunAsync
public static class UnbanCmd extends BATCommand {
public UnbanCmd() {
super("unban", "<player> [server] [reason]",
"Unban the player on a username basis from the specified server.", Action.UNBAN.getPermission(),
"pardon");
}
@Override
public void onCommand(final CommandSender sender, final String[] args, final boolean confirmedCmd)
throws IllegalArgumentException {
handlePardonCommand(this, false, false, sender, args, confirmedCmd);
}
}
@RunAsync
public static class UnbanIPCmd extends BATCommand {
public UnbanIPCmd() {
super("unbanip", "<player/ip> [server] [reason]", "Unban IP from the specified server", Action.UNBANIP
.getPermission(), "pardonip");
}
@Override
public void onCommand(final CommandSender sender, final String[] args, final boolean confirmedCmd)
throws IllegalArgumentException {
handlePardonCommand(this, false, true, sender, args, confirmedCmd);
}
}
@RunAsync
public static class GUnbanCmd extends BATCommand {
public GUnbanCmd() {
super("gunban", "<player> [reason]",
"Unban the player on a username basis from all servers (the whole network).", Action.UNBAN
.getPermission() + ".global", "gpardon");
}
@Override
public void onCommand(final CommandSender sender, final String[] args, final boolean confirmedCmd)
throws IllegalArgumentException {
handlePardonCommand(this, true, false, sender, args, confirmedCmd);
}
}
@RunAsync
public static class GUnbanIPCmd extends BATCommand {
public GUnbanIPCmd() {
super("gunbanip", "<player/ip> [reason]",
"Unban the player on an IP basis from all servers (the whole network).", Action.UNBANIP
.getPermission() + ".global", "gpardonip");
}
@Override
public void onCommand(final CommandSender sender, final String[] args, final boolean confirmedCmd)
throws IllegalArgumentException {
handlePardonCommand(this, true, true, sender, args, confirmedCmd);
}
}
public static void handlePardonCommand(final BATCommand command, final boolean global, final boolean ipUnban,
final CommandSender sender, final String[] args, final boolean confirmedCmd) {
String target = args[0];
String server = IModule.ANY_SERVER;
final String staff = sender.getName();
String reason = IModule.NO_REASON;
String ip = null;
String returnedMsg;
if (global) {
if (args.length > 1) {
reason = Utils.getFinalArg(args, 1);
}
} else {
if (args.length == 1) {
checkArgument(sender instanceof ProxiedPlayer, _("specifyServer"));
server = ((ProxiedPlayer) sender).getServer().getInfo().getName();
} else {
checkArgument(Utils.isServer(args[1]), _("invalidServer"));
server = args[1];
reason = (args.length > 2) ? Utils.getFinalArg(args, 2) : IModule.NO_REASON;
}
}
checkArgument(
!reason.equalsIgnoreCase(IModule.NO_REASON) || !BAT.getInstance().getConfiguration().isMustGiveReason(),
_("noReasonInCommand"));
// Check if the target isn't an ip and the player is offline
if (!Utils.validIP(target) && ipUnban) {
ip = Core.getPlayerIP(target);
checkArgument(!"0.0.0.0".equals(ip), _("ipUnknownPlayer"));
}
if (!global) {
checkArgument(
PermissionManager.canExecuteAction((ipUnban) ? Action.UNBANIP : Action.UNBAN, sender, server),
_("noPerm"));
}
target = (ip == null) ? target : ip;
final String[] formatArgs = { args[0] };
checkArgument(
ban.isBan((ip == null) ? target : ip, server),
(IModule.ANY_SERVER.equals(server) ? _("notBannedAny", formatArgs) : ((ipUnban) ? _("notBannedIP",
formatArgs) : _("notBanned", formatArgs))));
if (ipUnban) {
returnedMsg = ban.unBanIP(target, server, staff, reason);
} else {
returnedMsg = ban.unBan(target, server, staff, reason);
}
BAT.broadcast(returnedMsg, Action.banBroadcast.getPermission());
}
}