Made admin unregister command confirmable.

Uses new canExecute API.
Also correctly removes any island members from the island.
This commit is contained in:
tastybento 2019-02-10 21:57:58 -08:00
parent 1dc56dfc4f
commit ac2e3596f7
2 changed files with 39 additions and 17 deletions

View File

@ -7,7 +7,10 @@ import java.util.UUID;
import org.bukkit.Bukkit;
import com.google.common.collect.ImmutableSet;
import world.bentobox.bentobox.api.commands.CompositeCommand;
import world.bentobox.bentobox.api.commands.ConfirmableCommand;
import world.bentobox.bentobox.api.events.IslandBaseEvent;
import world.bentobox.bentobox.api.events.island.IslandEvent;
import world.bentobox.bentobox.api.localization.TextVariables;
@ -15,7 +18,7 @@ import world.bentobox.bentobox.api.user.User;
import world.bentobox.bentobox.database.objects.Island;
import world.bentobox.bentobox.util.Util;
public class AdminUnregisterCommand extends CompositeCommand {
public class AdminUnregisterCommand extends ConfirmableCommand {
public AdminUnregisterCommand(CompositeCommand parent) {
super(parent, "unregister");
@ -28,6 +31,21 @@ public class AdminUnregisterCommand extends CompositeCommand {
setDescription("commands.admin.unregister.description");
}
@Override
public boolean canExecute(User user, String label, List<String> args) {
// Get target
UUID targetUUID = getPlayers().getUUID(args.get(0));
if (targetUUID == null) {
user.sendMessage("general.errors.unknown-player", TextVariables.NAME, args.get(0));
return false;
}
if (!getIslands().hasIsland(getWorld(), targetUUID)) {
user.sendMessage("general.errors.player-has-no-island");
return false;
}
return true;
}
@Override
public boolean execute(User user, String label, List<String> args) {
// If args are not right, show help
@ -37,21 +55,15 @@ public class AdminUnregisterCommand extends CompositeCommand {
}
// Get target
UUID targetUUID = getPlayers().getUUID(args.get(0));
if (targetUUID == null) {
user.sendMessage("general.errors.unknown-player", TextVariables.NAME, args.get(0));
return false;
}
if (!getIslands().hasIsland(getWorld(), targetUUID) && !getIslands().inTeam(getWorld(), targetUUID)) {
user.sendMessage("general.errors.player-has-no-island");
return false;
}
// Everything's fine, we can set the island as spawn :)
askConfirmation(user, () -> unregisterPlayer(user, targetUUID));
return true;
}
private void unregisterPlayer(User user, UUID targetUUID) {
// Unregister island
Island oldIsland = getIslands().getIsland(getWorld(), targetUUID);
user.sendMessage("commands.admin.unregister.unregistered-island", "[xyz]", Util.xyz(oldIsland.getCenter().toVector()));
getIslands().removePlayer(getWorld(), targetUUID);
getPlayers().clearHomeLocations(getWorld(), targetUUID);
user.sendMessage("general.success");
IslandBaseEvent event = IslandEvent.builder()
.island(oldIsland)
.location(oldIsland.getCenter())
@ -60,7 +72,12 @@ public class AdminUnregisterCommand extends CompositeCommand {
.admin(true)
.build();
Bukkit.getServer().getPluginManager().callEvent(event);
return true;
// Remove all island members
new ImmutableSet.Builder<UUID>().addAll(oldIsland.getMembers().keySet()).build().forEach(m -> {
getIslands().removePlayer(getWorld(), m);
getPlayers().clearHomeLocations(getWorld(), m);
});
user.sendMessage("general.success");
}
@Override

View File

@ -27,6 +27,7 @@ import org.powermock.modules.junit4.PowerMockRunner;
import org.powermock.reflect.Whitebox;
import world.bentobox.bentobox.BentoBox;
import world.bentobox.bentobox.Settings;
import world.bentobox.bentobox.api.commands.CompositeCommand;
import world.bentobox.bentobox.api.user.User;
import world.bentobox.bentobox.database.objects.Island;
@ -64,6 +65,11 @@ public class AdminUnregisterCommandTest {
CommandsManager cm = mock(CommandsManager.class);
when(plugin.getCommandsManager()).thenReturn(cm);
// Settings
Settings s = mock(Settings.class);
when(s.getResetCooldown()).thenReturn(0);
when(plugin.getSettings()).thenReturn(s);
// Player
Player p = mock(Player.class);
// Sometimes use Mockito.withSettings().verboseLogging()
@ -139,7 +145,7 @@ public class AdminUnregisterCommandTest {
AdminUnregisterCommand itl = new AdminUnregisterCommand(ac);
String[] name = {"tastybento"};
when(pm.getUUID(Mockito.any())).thenReturn(null);
assertFalse(itl.execute(user, itl.getLabel(), Arrays.asList(name)));
assertFalse(itl.canExecute(user, itl.getLabel(), Arrays.asList(name)));
Mockito.verify(user).sendMessage("general.errors.unknown-player", "[name]", name[0]);
}
@ -152,7 +158,7 @@ public class AdminUnregisterCommandTest {
String[] name = {"tastybento"};
when(pm.getUUID(Mockito.any())).thenReturn(notUUID);
when(im.hasIsland(Mockito.any(), Mockito.any(UUID.class))).thenReturn(false);
assertFalse(itl.execute(user, itl.getLabel(), Arrays.asList(name)));
assertFalse(itl.canExecute(user, itl.getLabel(), Arrays.asList(name)));
Mockito.verify(user).sendMessage(Mockito.eq("general.errors.player-has-no-island"));
}
@ -173,8 +179,7 @@ public class AdminUnregisterCommandTest {
AdminUnregisterCommand itl = new AdminUnregisterCommand(ac);
assertTrue(itl.execute(user, itl.getLabel(), Arrays.asList(name)));
// Add other verifications
Mockito.verify(user).sendMessage("commands.admin.unregister.unregistered-island", "[xyz]", "123,123,432");
Mockito.verify(user).sendMessage(Mockito.eq("general.success"));
Mockito.verify(user).sendMessage("commands.confirmation.confirm", "[seconds]", "0");
}
}