package tc.oc.commons.bukkit.restart;
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.CommandPermissionsException;
import com.sk89q.minecraft.util.commands.Console;
import net.md_5.bungee.api.chat.TranslatableComponent;
import tc.oc.api.docs.virtual.ServerDoc;
import tc.oc.minecraft.scheduler.SyncExecutor;
import tc.oc.commons.core.chat.Audience;
import tc.oc.commons.core.chat.Audiences;
import tc.oc.commons.core.commands.CommandFutureCallback;
import tc.oc.commons.core.commands.Commands;
import tc.oc.commons.core.commands.TranslatableCommandException;
import tc.oc.commons.core.restart.RestartManager;
import tc.oc.minecraft.api.command.CommandSender;
public class RestartCommands implements Commands {
private final RestartManager restartManager;
private final SyncExecutor syncExecutor;
private final Audiences audiences;
@Inject RestartCommands(RestartManager restartManager, SyncExecutor syncExecutor, Audiences audiences) {
this.restartManager = restartManager;
this.syncExecutor = syncExecutor;
this.audiences = audiences;
}
@Command(
aliases = {"queuerestart", "qr"},
desc = "Restart the server at the next safe opportunity",
usage = "[-l/h (low/high priority)]",
min = 0,
max = 0,
flags = "lh"
)
@CommandPermissions("server.queuerestart")
@Console
public void queueRestart(CommandContext args, final CommandSender sender) throws CommandException {
final Audience audience = audiences.get(sender);
final int priority;
if(args.hasFlag('l')) {
priority = ServerDoc.Restart.Priority.LOW;
} else if(args.hasFlag('h')) {
if(!sender.hasPermission("server.queuerestart.high")) {
throw new CommandPermissionsException();
}
priority = ServerDoc.Restart.Priority.HIGH;
} else {
priority = ServerDoc.Restart.Priority.NORMAL;
}
if(restartManager.isRestartRequested(priority)) {
audience.sendMessage(new TranslatableComponent("command.admin.queueRestart.restartQueued"));
return;
}
syncExecutor.callback(
restartManager.requestRestart("/queuerestart command", priority),
CommandFutureCallback.onSuccess(sender, args, result -> {
if(restartManager.isRestartDeferred()) {
audience.sendMessage(new TranslatableComponent("command.admin.queueRestart.restartQueued"));
} else {
audience.sendMessage(new TranslatableComponent("command.admin.queueRestart.restartingNow"));
}
})
);
}
@Command(
aliases = {"cancelrestart", "cr"},
desc = "Cancels a previously requested restart",
min = 0,
max = 0
)
@CommandPermissions("server.cancelrestart")
@Console
public void cancelRestart(CommandContext args, final CommandSender sender) throws CommandException {
if(!restartManager.isRestartRequested()) {
throw new TranslatableCommandException("command.admin.cancelRestart.noActionTaken");
}
syncExecutor.callback(
restartManager.cancelRestart(),
CommandFutureCallback.onSuccess(sender, args, o -> {
audiences.get(sender).sendMessage(new TranslatableComponent("command.admin.cancelRestart.restartUnqueued"));
})
);
}
}