/*
* This file is part of Libelula Minecraft Edition Project.
*
* Libelula Minecraft Edition is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Libelula Minecraft Edition is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Libelula Minecraft Edition.
* If not, see <http://www.gnu.org/licenses/>.
*
*/
package me.libelula.libelulalogger;
import com.sk89q.worldedit.bukkit.selections.Selection;
import org.apache.commons.lang.NotImplementedException;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
/**
* Class Commands of the plugin.
*
* @author Diego Lucio D'Onofrio <ddonofrio@member.fsf.org>
* @version 1.0
*/
public class Commands implements CommandExecutor {
private final LibelulaLogger plugin;
public Commands(LibelulaLogger plugin) {
this.plugin = plugin;
}
public void registerCommands() {
plugin.getCommand("libelulalogger").setExecutor(this);
plugin.getCommand("whomadethis").setExecutor(this);
plugin.getCommand("/whoeditedthisarea").setExecutor(this);
plugin.getCommand("whoeditedthisarea").setExecutor(this);
plugin.getCommand("blockrestore").setExecutor(this);
plugin.getCommand("undoedited").setExecutor(this);
plugin.getCommand("/undoedited").setExecutor(this);
plugin.getCommand("redoedited").setExecutor(this);
plugin.getCommand("/redoedited").setExecutor(this);
}
@Override
public boolean onCommand(CommandSender sender, Command command, String string, String[] args) {
if (!(sender instanceof Player)) {
if (!command.getName().equals("libelulalogger")) {
sender.sendMessage("This command must be used by a player in game.");
return true;
}
}
switch (command.getName()) {
case "libelulalogger":
if (args.length == 0) {
sender.sendMessage(plugin.getPluginFullDescription());
sender.sendMessage("Posible commands are:");
sender.sendMessage(ChatColor.GREEN + "/ll config" + ChatColor.RESET + " - List configuration keys.");
sender.sendMessage(ChatColor.GREEN + "/whomadethis" + ChatColor.RESET + " - Activates the block by block Discovery Tool.");
sender.sendMessage(ChatColor.GREEN + "/blockrestore " + ChatColor.RESET + " - Activates the block by block restore tool.");
sender.sendMessage(ChatColor.GREEN + "/whoeditedthisarea [radius]" + ChatColor.RESET + " - Shows who edited current area.");
sender.sendMessage(ChatColor.GREEN + "//whoeditedthisarea " + ChatColor.RESET + " - The same but with a WE selection.");
sender.sendMessage(ChatColor.GREEN + "/undoedited [playername] [radius]" + ChatColor.RESET + " - Undo given player editions from current area.");
sender.sendMessage(ChatColor.GREEN + "//undoedited [playername]" + ChatColor.RESET + " - The same but with a WE selection.");
sender.sendMessage(ChatColor.GREEN + "/redoedited [playername] [radius]" + ChatColor.RESET + " - Redo given player editions from current area.");
sender.sendMessage(ChatColor.GREEN + "//redoedited [playername]" + ChatColor.RESET + " - The same but with a WE selection.");
return true;
} else if (args.length == 1 && args[0].equalsIgnoreCase("version")) {
sender.sendMessage(plugin.getPluginFullDescription());
return true;
}
switch (args[0].toLowerCase()) {
case "config":
processLibelulaConfigCommand(sender, args);
return true;
case "reload":
if (args.length == 1) {
plugin.config.reload();
sender.sendMessage(ChatColor.GREEN + "Configuration reloaded.");
return true;
}
break;
default:
break;
}
break;
case "whomadethis":
if (args.length == 0) {
plugin.toolbox.giveDiscoveryTool((Player) sender);
return true;
}
break;
case "/whoeditedthisarea":
return processWhoEditedThisAreaCmd(args, sender);
case "whoeditedthisarea":
return processWhoEditedThisAreaByRadCmd(args, sender);
case "blockrestore":
if (args.length == 0) {
if (sender instanceof Player) {
plugin.toolbox.giveRestoreTool((Player) sender);
} else {
sender.sendMessage("This command must be used by a player in game.");
}
return true;
}
break;
case "undoedited":
return processEditedByRadiusCmd(args, sender, true);
case "/undoedited":
return processEditedCmd(args, sender, true);
case "redoedited":
return processEditedByRadiusCmd(args, sender, false);
case "/redoedited":
return processEditedCmd(args, sender, false);
default:
throw new NotImplementedException();
}
return false;
}
void processLibelulaConfigCommand(CommandSender sender, String[] args) {
if (args.length == 1 || (args.length == 2 && args[1].equalsIgnoreCase("list"))) {
for (String configLine : plugin.config.toString().split("\\|")) {
sender.sendMessage(ChatColor.GREEN + configLine);
}
return;
}
switch (args[1].toLowerCase()) {
case "reload":
if (args.length == 2) {
plugin.config.reload();
return;
}
case "set":
if (args.length > 3) {
String value = args[3];
for (int i = 4; i < args.length; i++) {
value = value.concat(",").concat(args[i]);
}
plugin.config.setValue(args[2], value, sender);
return;
}
case "del":
if (args.length == 3) {
plugin.config.delValue(args[2], sender);
return;
}
}
sender.sendMessage(ChatColor.RED + "Incorrect usage of the config command.");
}
private boolean validateArea(int area, CommandSender sender) {
if (area <= 4000000) {
sender.sendMessage(ChatColor.AQUA + "Quering for " + area + " selected blocks...");
} else {
sender.sendMessage(ChatColor.RED + "You tried to query for " + area + " selected blocks...");
sender.sendMessage(ChatColor.RED + "Current maximum max amount is configured to 4 millons, please perform multiple queries.");
return false;
}
if (area > 500000) {
sender.sendMessage(ChatColor.AQUA + "This may take some time, please be patience...");
}
return true;
}
private Selection getWESelection(CommandSender sender) {
if (plugin.we == null) {
sender.sendMessage(ChatColor.RED + "This command must be used with WordlEdit and it is not installed.");
sender.sendMessage(ChatColor.RED + "Instead you can use the radius version of this command by typing it with a single slash.");
return null;
}
Selection selection = plugin.we.getSelection((Player) sender);
if (selection == null) {
sender.sendMessage(ChatColor.RED + "Make a region selection first.");
}
return selection;
}
boolean processWhoEditedThisAreaByRadCmd(String[] args, CommandSender sender) {
int radius;
int area;
if (args.length != 1) {
return false;
}
try {
radius = Integer.parseInt(args[0]);
} catch (Exception ex) {
sender.sendMessage(ChatColor.RED + "The radius must be a positive integer number.");
return true;
}
if (radius < 1) {
sender.sendMessage(ChatColor.RED + "The value of the radius must be 1 at least.");
}
area = (int) Math.pow(radius, 3);
if (!validateArea(area, sender)) {
return true;
}
Player player = (Player) sender;
plugin.meode.asyncQuerySellection(player.getLocation(), radius, player, null);
return true;
}
boolean processWhoEditedThisAreaCmd(String[] args, CommandSender sender) {
if (args.length == 0) {
Selection selection = getWESelection(sender);
if (selection == null) {
return true;
} else {
if (!validateArea(selection.getArea(), sender)) {
return true;
}
plugin.meode.asyncQuerySellection(selection.getMinimumPoint(),
selection.getMaximumPoint(), (Player) sender, null);
return true;
}
}
return false;
}
boolean processEditedCmd(String[] args, CommandSender sender, boolean undo) {
if (args.length != 1) {
return false;
}
String playerName = args[0];
if (!plugin.getServer().getOfflinePlayer(playerName).hasPlayedBefore()) {
if (plugin.getServer().getPlayer(playerName) == null) {
sender.sendMessage(ChatColor.RED + "The player \"".concat(playerName).concat("\" never played on this server."));
return true;
}
}
Selection selection = getWESelection(sender);
if (selection == null) {
return true;
}
if (!validateArea(selection.getArea(), sender)) {
return true;
}
plugin.meode.asyncEditSellection(selection.getMinimumPoint(),
selection.getMaximumPoint(), (Player) sender, playerName, undo);
return true;
}
private boolean processEditedByRadiusCmd(String[] args, CommandSender sender, boolean undo) {
if (args.length < 2 || args.length > 3) {
return false;
}
String playerName = args[0];
if (!plugin.getServer().getOfflinePlayer(playerName).hasPlayedBefore()) {
if (plugin.getServer().getPlayer(playerName) == null) {
sender.sendMessage(ChatColor.RED + "The player \"".concat(playerName).concat("\" never played on this server."));
return true;
}
}
int radius;
try {
radius = Integer.parseInt(args[1]);
} catch (Exception ex) {
sender.sendMessage(ChatColor.RED + "Use a integer positive number for radius.");
return true;
}
if (radius < 1) {
sender.sendMessage(ChatColor.RED + "You have to specify a radius or use the double slashed command with worldedit selections.");
return true;
}
int area = (int) Math.pow(radius, 3);
if (!validateArea(area, sender)) {
return true;
}
Player player = (Player) sender;
plugin.meode.asyncEditSellection(player.getLocation(), radius, (Player) sender, playerName, undo);
return true;
}
}