package org.buckit.commands.admin;
import java.util.List;
import org.buckit.Config;
import org.buckit.access.AccessLevel;
import org.buckit.datasource.type.AccessDataSource;
import org.buckit.datasource.type.UserDataSource;
import org.buckit.model.UserDataHolder;
import org.bukkit.Server;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
public class ModifyCommand extends Command {
private final Server server;
private final UserDataSource userData;
private final AccessDataSource accessData;
public ModifyCommand(String name, Server server) {
super(name);
this.description = "Modifies a player's properties.";
this.usageMessage = "Usage: /modify [player] [key1]:[value1] <key2>:<value2> <keyN>:<valueN>";
this.accessname = "buckit.admin.modify";
this.server = server;
this.userData = server.getDataSourceManager().getUserDataSource();
this.accessData = server.getDataSourceManager().getAccessDataSource();
}
@Override
public boolean execute(CommandSender sender, String currentAlias, String[] args) {
if (args.length < 2) {
sender.sendMessage(Config.DEFAULT_ERROR_COLOR + "Insufficient arguments specified");
sender.sendMessage(Config.DEFAULT_ERROR_COLOR + this.getUsage());
return true;
}
List<Player> players = server.matchPlayer(args[0].toLowerCase());
if (players.size() == 0) {
sender.sendMessage(Config.DEFAULT_ERROR_COLOR + "No players found to modify");
return true;
}
else if (players.size() == 1) {
Player player = players.get(0);
UserDataHolder playerData = player.getUserDataHolder();
sender.sendMessage(Config.DEFAULT_INFO_COLOR + "Modifying player: " + player.getDisplayName());
for (int i=1; i<args.length; i++) {
String[] key_value = args[i].split(":");
if (key_value.length<2) {
sender.sendMessage(Config.DEFAULT_ERROR_COLOR + "Syntax error!");
return true;
}
String key = key_value[0].toLowerCase();
String value = key_value[1].toLowerCase();
if (key.equals("accesslevel") || key.equals("al")) {
AccessLevel newAccessLevel;
try {
newAccessLevel = accessData.getAccessLevel(Integer.parseInt(value));
} catch (NumberFormatException e) {
newAccessLevel = accessData.getAccessLevel(value);
}
AccessLevel playerAccessLevel = player.getAccessLevel();
AccessLevel senderAccessLevel = ((Player)sender).getAccessLevel();
if (newAccessLevel == null) {
sender.sendMessage(Config.DEFAULT_ERROR_COLOR + "[accesslevel] : unknown value");
}
else if (senderAccessLevel.getId() < newAccessLevel.getId()) {
sender.sendMessage(Config.DEFAULT_ERROR_COLOR + "[accesslevel] : you are not able to modify this in this way");
}
else {
playerData.setAccesslevel(newAccessLevel);
sender.sendMessage(Config.DEFAULT_ERROR_COLOR + "[accesslevel] : " + playerAccessLevel.getName() + " -> " + newAccessLevel.getName());
}
}
else if (key.equals("format") || key.equals("f")) {
playerData.setUsernameformat(value);
sender.sendMessage(Config.DEFAULT_INFO_COLOR + "[format] : modified");
}
else if (key.equals("commands") || key.equals("c")) {
playerData.setCommands(value);
sender.sendMessage(Config.DEFAULT_INFO_COLOR + "[commands] : modified");
}
else if (key.equals("admin") || key.equals("a")) {
boolean before = playerData.isAdmin();
boolean after = before;
if (value.equals("true") || value.equals("1"))
after = true;
else if (value.equals("false") || value.equals("0"))
after = false;
playerData.setAdmin(after);
sender.sendMessage(Config.DEFAULT_INFO_COLOR + "[admin] : " + before + " -> " + after);
}
else if (key.equals("canbuild") || key.equals("cb")) {
boolean before = playerData.canbuild();
boolean after = before;
if (value.equals("true") || value.equals("1")) {
after = true;
}
else if (value.equals("false") || value.equals("0")) {
after = false;
}
playerData.setCanbuild(after);
sender.sendMessage(Config.DEFAULT_INFO_COLOR + "[canbuild] : " + before + " -> " + after);
}
else {
sender.sendMessage(Config.DEFAULT_ERROR_COLOR + "Unknown modify-key: " + key);
}
}
userData.updateUser(playerData);
return true;
}
else {
String names = "";
for (int i=0; i<players.size(); i++)
names += ", " + players.get(i).getDisplayName() + Config.DEFAULT_ERROR_COLOR;
names = names.substring(2);
sender.sendMessage(Config.DEFAULT_ERROR_COLOR + "Multiple players found: "+names);
return true;
}
}
}