mirror of
https://github.com/BentoBoxWorld/BentoBox.git
synced 2025-02-20 06:11:37 +01:00
parent
dc56156904
commit
b5367200df
@ -0,0 +1,165 @@
|
|||||||
|
package world.bentobox.bentobox.api.commands.admin.purge;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.EventPriority;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
|
||||||
|
import world.bentobox.bentobox.api.commands.CompositeCommand;
|
||||||
|
import world.bentobox.bentobox.api.events.island.IslandEvent.IslandDeletedEvent;
|
||||||
|
import world.bentobox.bentobox.api.localization.TextVariables;
|
||||||
|
import world.bentobox.bentobox.api.user.User;
|
||||||
|
|
||||||
|
public class AdminPurgeCommand extends CompositeCommand implements Listener {
|
||||||
|
|
||||||
|
private int count;
|
||||||
|
private boolean inPurge;
|
||||||
|
private boolean toBeConfirmed;
|
||||||
|
private Iterator<String> it;
|
||||||
|
private User user;
|
||||||
|
private Set<String> islands = new HashSet<>();
|
||||||
|
|
||||||
|
public AdminPurgeCommand(CompositeCommand parent) {
|
||||||
|
super(parent, "purge");
|
||||||
|
getAddon().registerListener(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setup() {
|
||||||
|
setPermission("admin.purge");
|
||||||
|
setOnlyPlayer(false);
|
||||||
|
setParametersHelp("commands.admin.purge.parameters");
|
||||||
|
setDescription("commands.admin.purge.description");
|
||||||
|
new AdminPurgeStopCommand(this);
|
||||||
|
new AdminPurgeUnownedCommand(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean execute(User user, String label, List<String> args) {
|
||||||
|
if (inPurge) {
|
||||||
|
user.sendMessage("commands.admin.purge.purge-in-progress");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (args.isEmpty()) {
|
||||||
|
// Show help
|
||||||
|
showHelp(this, user);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (args.get(0).equalsIgnoreCase("confirm") && toBeConfirmed && this.user.equals(user)) {
|
||||||
|
removeIslands();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
// Clear tbc
|
||||||
|
toBeConfirmed = false;
|
||||||
|
islands.clear();
|
||||||
|
this.user = user;
|
||||||
|
try {
|
||||||
|
Integer days = Integer.parseInt(args.get(0));
|
||||||
|
if (days < 1) {
|
||||||
|
user.sendMessage("commands.admin.purge.days-one-or-more");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
islands = getOldIslands(days);
|
||||||
|
user.sendMessage("commands.admin.purge.purgable-islands", TextVariables.NUMBER, String.valueOf(islands.size()));
|
||||||
|
if (!islands.isEmpty()) {
|
||||||
|
toBeConfirmed = true;
|
||||||
|
user.sendMessage("commands.admin.purge.confirm", TextVariables.LABEL, this.getTopLabel());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} catch(Exception e) {
|
||||||
|
user.sendMessage("commands.admin.purge.number-error");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void removeIslands() {
|
||||||
|
inPurge = true;
|
||||||
|
user.sendMessage("commands.admin.purge.see-console-for-status");
|
||||||
|
it = islands.iterator();
|
||||||
|
count = 0;
|
||||||
|
// Delete first island
|
||||||
|
deleteIsland();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void deleteIsland() {
|
||||||
|
if (it.hasNext()) {
|
||||||
|
getIslands().getIslandById(it.next()).ifPresent(i -> {
|
||||||
|
getIslands().deleteIsland(i, true, null);
|
||||||
|
count++;
|
||||||
|
getPlugin().log(count + " islands purged");
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
user.sendMessage("commands.admin.purge.completed");
|
||||||
|
inPurge = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true)
|
||||||
|
void onIslandDeleted(IslandDeletedEvent e) {
|
||||||
|
if (inPurge && it.hasNext()) {
|
||||||
|
getIslands().getIslandById(it.next()).ifPresent(i -> {
|
||||||
|
getIslands().deleteIsland(i, true, null);
|
||||||
|
count++;
|
||||||
|
getPlugin().log(count + " islands purged");
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
user.sendMessage("commands.admin.purge.completed");
|
||||||
|
inPurge = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Set<String> getUnownedIslands() {
|
||||||
|
return getPlugin().getIslands().getIslands().stream()
|
||||||
|
.filter(i -> i.getWorld().equals(this.getWorld()))
|
||||||
|
.filter(i -> i.getOwner() == null)
|
||||||
|
.map(i -> i.getUniqueId())
|
||||||
|
.collect(Collectors.toSet());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
Set<String> getOldIslands(int days) {
|
||||||
|
return getPlugin().getIslands().getIslands().stream()
|
||||||
|
.filter(i -> i.getWorld().equals(this.getWorld()))
|
||||||
|
.filter(i -> i.getOwner() != null)
|
||||||
|
.filter(i -> i.getMembers().size() == 1)
|
||||||
|
.filter(i -> (System.currentTimeMillis() - Bukkit.getOfflinePlayer(i.getOwner()).getLastPlayed()) > days * 1000 * 24 * 3600)
|
||||||
|
.map(i -> i.getUniqueId())
|
||||||
|
.collect(Collectors.toSet());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the inPurge
|
||||||
|
*/
|
||||||
|
boolean isInPurge() {
|
||||||
|
return inPurge;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stop the purge
|
||||||
|
*/
|
||||||
|
void stop() {
|
||||||
|
inPurge = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param user the user to set
|
||||||
|
*/
|
||||||
|
public void setUser(User user) {
|
||||||
|
this.user = user;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param islands the islands to set
|
||||||
|
*/
|
||||||
|
public void setIslands(Set<String> islands) {
|
||||||
|
this.islands = islands;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,38 @@
|
|||||||
|
package world.bentobox.bentobox.api.commands.admin.purge;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import world.bentobox.bentobox.api.commands.CompositeCommand;
|
||||||
|
import world.bentobox.bentobox.api.user.User;
|
||||||
|
|
||||||
|
public class AdminPurgeStopCommand extends CompositeCommand {
|
||||||
|
|
||||||
|
public AdminPurgeStopCommand(CompositeCommand parent) {
|
||||||
|
super(parent, "stop", "cancel");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setup() {
|
||||||
|
setPermission("admin.purge");
|
||||||
|
setOnlyPlayer(false);
|
||||||
|
setDescription("commands.admin.purge.stop.description");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean execute(User user, String label, List<String> args) {
|
||||||
|
if (!args.isEmpty()) {
|
||||||
|
// Show help
|
||||||
|
showHelp(this, user);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
AdminPurgeCommand parentCommand = ((AdminPurgeCommand)getParent());
|
||||||
|
if (parentCommand.isInPurge()) {
|
||||||
|
user.sendMessage("commands.admin.purge.stop.stopping");
|
||||||
|
parentCommand.stop();
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
user.sendMessage("commands.admin.purge.stop.no-purge-in-progress");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,47 @@
|
|||||||
|
package world.bentobox.bentobox.api.commands.admin.purge;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import world.bentobox.bentobox.api.commands.ConfirmableCommand;
|
||||||
|
import world.bentobox.bentobox.api.localization.TextVariables;
|
||||||
|
import world.bentobox.bentobox.api.user.User;
|
||||||
|
|
||||||
|
public class AdminPurgeUnownedCommand extends ConfirmableCommand {
|
||||||
|
|
||||||
|
public AdminPurgeUnownedCommand(AdminPurgeCommand parent) {
|
||||||
|
super(parent, "unowned");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setup() {
|
||||||
|
setPermission("admin.purge");
|
||||||
|
setOnlyPlayer(false);
|
||||||
|
setParametersHelp("commands.admin.purge.unowned.parameters");
|
||||||
|
setDescription("commands.admin.purge.unowned.description");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean execute(User user, String label, List<String> args) {
|
||||||
|
if (!args.isEmpty()) {
|
||||||
|
// Show help
|
||||||
|
showHelp(this, user);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
AdminPurgeCommand parentCommand = ((AdminPurgeCommand)getParent());
|
||||||
|
if (parentCommand.isInPurge()) {
|
||||||
|
user.sendMessage("commands.admin.purge.purge-in-progress");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
Set<String> unowned = parentCommand.getUnownedIslands();
|
||||||
|
user.sendMessage("commands.admin.purge.unowned.unowned-islands", TextVariables.NUMBER, String.valueOf(unowned.size()));
|
||||||
|
if (!unowned.isEmpty()) {
|
||||||
|
this.askConfirmation(user, () -> {
|
||||||
|
parentCommand.setUser(user);
|
||||||
|
parentCommand.setIslands(unowned);
|
||||||
|
parentCommand.removeIslands();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
@ -57,6 +57,24 @@ commands:
|
|||||||
reset:
|
reset:
|
||||||
description: "resets the resets of this player to 0"
|
description: "resets the resets of this player to 0"
|
||||||
parameters: "<player>"
|
parameters: "<player>"
|
||||||
|
purge:
|
||||||
|
parameters: "[days]"
|
||||||
|
description: "purge islands abandoned for more than [days]"
|
||||||
|
days-or-more: "Must be at least 1 day or more"
|
||||||
|
purgable-islands: "Found [number] purgable islands."
|
||||||
|
purge-in-progress: "&cPurging in progress. Use purge stop to cancel"
|
||||||
|
number-error: "&cArgument must be a number of days"
|
||||||
|
confirm: "&dType [label] purge confirm to start purging"
|
||||||
|
completed: "&aPurging stopped"
|
||||||
|
see-console-for-status: "Purge started. See console for status"
|
||||||
|
stop:
|
||||||
|
description: "Stop a purge in progress"
|
||||||
|
stopping: "Stopping the purge"
|
||||||
|
no-purge-in-progress: "&cNo purge in progress!"
|
||||||
|
unowned:
|
||||||
|
description: "Purge unowned islands - requires confirmation"
|
||||||
|
unowned-islands: "&dFound [number] islands"
|
||||||
|
|
||||||
team:
|
team:
|
||||||
add:
|
add:
|
||||||
parameters: "<owner> <player>"
|
parameters: "<owner> <player>"
|
||||||
|
Loading…
Reference in New Issue
Block a user