/*
* Copyright 2011 Tyler Blair. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
* permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ''AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* The views and conclusions contained in the software and documentation are those of the
* authors and contributors and should not be interpreted as representing official policies,
* either expressed or implied, of anybody else.
*/
package com.griefcraft.modules.setup;
import com.griefcraft.lwc.LWC;
import com.griefcraft.modules.limits.LimitsV2;
import com.griefcraft.scripting.JavaModule;
import com.griefcraft.scripting.event.LWCCommandEvent;
import com.griefcraft.util.Colors;
import com.griefcraft.util.config.Configuration;
import org.bukkit.Material;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.List;
public class LimitsSetup extends JavaModule {
@Override
public void onCommand(LWCCommandEvent event) {
if (event.isCancelled()) {
return;
}
if (!event.hasFlag("s", "setup")) {
return;
}
LWC lwc = event.getLWC();
CommandSender sender = event.getSender();
String[] args = event.getArgs();
if (!args[0].equals("limits")) {
return;
}
// we have the right command
event.setCancelled(true);
// Load limits v2
LimitsV2 limits = (LimitsV2) lwc.getModuleLoader().getModule(LimitsV2.class);
// Send them the default limits
if (args.length == 1) {
sender.sendMessage("Default limits:");
limits.sendLimits(sender, null, limits.getDefaultLimits());
} else {
String name = args[1];
boolean isGroup = false;
if (name.startsWith("g:")) {
isGroup = true;
name = name.substring(2);
}
// They just want to know the limits
if (args.length == 2) {
// if they're a player it is simple
if (!isGroup) {
List<LimitsV2.Limit> found = limits.getPlayerLimits().get(name.toLowerCase());
Player target = lwc.getPlugin().getServer().getPlayer(name);
if (found == null) {
sender.sendMessage(Colors.Red + "Player override not found.");
} else {
limits.sendLimits(sender, target, found);
}
} else {
List<LimitsV2.Limit> found = limits.getGroupLimits().get(name);
if (found == null) {
sender.sendMessage(Colors.Red + "Group override not found.");
} else {
limits.sendLimits(sender, null, found);
}
}
} else {
Configuration configuration = limits.getConfiguration();
// Generate the base path
String path;
boolean modified = false;
if (name.equalsIgnoreCase("default")) {
path = "defaults.";
} else if (isGroup) {
path = "groups." + name + ".";
} else {
path = "players." + getCaseCorrectPlayerName(configuration, name) + ".";
}
// If they only gave an integer, we assume it's to be the default
if (args.length == 3) {
Object value;
if (args[2].equalsIgnoreCase("unlimited")) {
value = "unlimited";
} else {
try {
value = Integer.parseInt(args[2]);
} catch (NumberFormatException e) {
sender.sendMessage(Colors.Red + "Invalid number for \"" + args[2] + "\"");
return;
}
}
configuration.setProperty(path + "default", value);
modified = true;
} else {
// Begin scanning
for (int index = 2; index < args.length; index += 2) {
if ((index + 1) > args.length) {
continue;
}
String key = args[index];
String value = args[index + 1];
Object intValue;
if (value.equalsIgnoreCase("unlimited")) {
intValue = value;
} else {
try {
// attempt to parse it as an integer (it must always be one)
intValue = Integer.parseInt(value);
} catch (NumberFormatException e) {
sender.sendMessage(Colors.Red + "Invalid number for: \"" + value + "\"!");
return;
}
}
// Is it a default?
if (key.equalsIgnoreCase("default")) {
configuration.setProperty(path + "default", intValue);
modified = true;
} else {
// it should be a material
Material material = Material.getMaterial(key.toUpperCase());
// if it's null, try to parse it as a block value
if (material == null) {
try {
material = Material.getMaterial(Integer.parseInt(key));
} catch (NumberFormatException e) { }
}
if (material == null) {
sender.sendMessage(Colors.Red + "Invalid material/block: \"" + value + "\"!");
return;
}
// good good
configuration.setProperty(path + material.toString().toLowerCase(), intValue);
modified = true;
}
}
}
// If we modified the config we need to save it and reload
if (modified) {
configuration.save();
limits.reload();
sender.sendMessage(Colors.Green + "Set the limits for \"" + name + "\" successfully.");
}
}
}
}
/**
* Gets the case correct player name in the limits config
*
* @param player
* @return
*/
private String getCaseCorrectPlayerName(Configuration configuration, String player) {
try {
List<String> keys = configuration.getKeys("players");
for (String key : keys) {
if (key.equalsIgnoreCase(player)) {
return key;
}
}
} catch (NullPointerException e) { }
// Not found, so we assume we're creating a new one
return player;
}
}