package fr.Alphart.BAT.Modules.Kick;
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.config.ListenerInfo;
import net.md_5.bungee.api.connection.ProxiedPlayer;
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.PermissionManager;
import fr.Alphart.BAT.Modules.Core.PermissionManager.Action;
import fr.Alphart.BAT.Utils.FormatUtils;
import fr.Alphart.BAT.Utils.Utils;
public class KickCommand extends CommandHandler {
private static Kick kick;
public KickCommand(final Kick kickModule) {
super(kickModule);
kick = kickModule;
}
@RunAsync
public static class KickCmd extends BATCommand {
public KickCmd() {
super("kick", "<player> [reason]", "Kick the player from his current server to the lobby", Action.KICK
.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("kick").getCommands(),
sender, "KICK");
} catch (final InvalidModuleException e) {
e.printStackTrace();
}
return;
}
checkArgument(args.length != 1 || !BAT.getInstance().getConfiguration().isMustGiveReason(),
_("noReasonInCommand"));
final String pName = args[0];
final ProxiedPlayer player = ProxyServer.getInstance().getPlayer(pName);
// The player is online on the proxy
if(player != null){
final String pServer = player.getServer().getInfo().getName();
checkArgument(
pServer != null && !pServer.equals(player.getPendingConnection().getListener().getDefaultServer()),
_("cantKickDefaultServer", new String[] { pName }));
checkArgument(
PermissionManager.canExecuteAction(Action.KICK, sender, player.getServer().getInfo().getName()),
_("noPerm"));
checkArgument(!PermissionManager.isExemptFrom(Action.KICK, pName), _("isExempt"));
final String returnedMsg = kick.kick(player, sender.getName(),
(args.length == 1) ? IModule.NO_REASON : Utils.getFinalArg(args, 1));
BAT.broadcast(returnedMsg, Action.KICK_BROADCAST.getPermission());
}else{
if(!BAT.getInstance().getRedis().isRedisEnabled()){
throw new IllegalArgumentException(_("playerNotFound"));
}
// Check if the per server kick with Redis is working fine.
final UUID pUUID = RedisBungee.getApi().getUuidFromName(pName, true);
final String pServer = RedisBungee.getApi().getServerFor(pUUID).getName();
checkArgument(pUUID != null, _("playerNotFound"));
// Check if the server of the target isn't the default one. We assume there is the same default server on both Bungee
// TODO: Add a method to check if it's really on default server
String defaultServer = null;
for(final ListenerInfo listener : ProxyServer.getInstance().getConfig().getListeners()){
defaultServer = listener.getDefaultServer();
}
if(defaultServer == null || pServer.equals(defaultServer)){
throw new IllegalArgumentException(_("cantKickDefaultServer", new String[] { pName }));
}
checkArgument(PermissionManager.canExecuteAction(Action.KICK, sender, pServer), _("noPerm"));
final String returnedMsg;
returnedMsg = kick.kickSQL(pUUID, RedisBungee.getApi().getServerFor(pUUID).getName(), sender.getName(),
(args.length == 1) ? IModule.NO_REASON : Utils.getFinalArg(args, 1));
BAT.getInstance().getRedis().sendMoveDefaultServerPlayer(pUUID);
BAT.broadcast(returnedMsg, Action.KICK_BROADCAST.getPermission());
}
}
}
@RunAsync
public static class GKickCmd extends BATCommand {
public GKickCmd() {
super("gkick", "<player> [reason]", "Kick the player from the network", Action.KICK.getPermission()
+ ".global");
}
@Override
public void onCommand(final CommandSender sender, final String[] args, final boolean confirmedCmd)
throws IllegalArgumentException {
final String pName = args[0];
checkArgument(args.length != 1 || !BAT.getInstance().getConfiguration().isMustGiveReason(),
_("noReasonInCommand"));
if (BAT.getInstance().getRedis().isRedisEnabled()) {
UUID pUUID = RedisBungee.getApi().getUuidFromName(pName, true);
checkArgument(pUUID != null, _("playerNotFound"));
checkArgument(!PermissionManager.isExemptFrom(Action.KICK, pName), _("isExempt"));
final ProxiedPlayer player = ProxyServer.getInstance().getPlayer(pName);
final String returnedMsg;
if (player != null) {
returnedMsg = kick.gKick(player, sender.getName(),
(args.length == 1) ? IModule.NO_REASON : Utils.getFinalArg(args, 1));
} else {
returnedMsg = kick.gKickSQL(pUUID, sender.getName(),
(args.length == 1) ? IModule.NO_REASON : Utils.getFinalArg(args, 1));
BAT.getInstance().getRedis().sendGKickPlayer(pUUID, returnedMsg);
}
BAT.broadcast(returnedMsg, Action.KICK_BROADCAST.getPermission());
} else {
final ProxiedPlayer player = ProxyServer.getInstance().getPlayer(pName);
checkArgument(player != null, _("playerNotFound"));
checkArgument(!PermissionManager.isExemptFrom(Action.KICK, pName), _("isExempt"));
final String returnedMsg = kick.gKick(player, sender.getName(),
(args.length == 1) ? IModule.NO_REASON : Utils.getFinalArg(args, 1));
BAT.broadcast(returnedMsg, Action.KICK_BROADCAST.getPermission());
}
}
}
}