Implements the scrapper edit command

This commit is contained in:
2023-11-16 13:06:24 +01:00
parent 4f885135e3
commit 72d33ed7a2
15 changed files with 302 additions and 143 deletions

View File

@@ -0,0 +1,171 @@
package net.knarcraft.blacksmith.command;
import net.citizensnpcs.api.CitizensAPI;
import net.citizensnpcs.api.npc.NPC;
import net.knarcraft.blacksmith.BlacksmithPlugin;
import net.knarcraft.blacksmith.config.Setting;
import net.knarcraft.blacksmith.config.SettingValueType;
import net.knarcraft.blacksmith.config.Settings;
import net.knarcraft.blacksmith.formatting.BlacksmithTranslatableMessage;
import net.knarcraft.blacksmith.trait.CustomTrait;
import net.knarcraft.blacksmith.util.InputParsingHelper;
import net.knarcraft.blacksmith.util.TypeValidationHelper;
import net.md_5.bungee.api.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Arrays;
import java.util.logging.Level;
import static net.knarcraft.blacksmith.formatting.BlacksmithTranslatableMessage.getCurrentValueMessage;
import static net.knarcraft.blacksmith.formatting.BlacksmithTranslatableMessage.getValueChangedMessage;
/**
* A generic implementation of the edit command
*
* @param <K> <p>The type of trait to edit</p>
* @param <L> <p>The type of setting the trait uses</p>
*/
public abstract class EditCommand<K extends CustomTrait<L>, L extends Setting> implements CommandExecutor {
protected Class<K> traitClass;
public EditCommand(Class<K> traitClass) {
this.traitClass = traitClass;
}
/**
* Gets the setting corresponding to the given input
*
* @param input <p>The input given by the user</p>
* @return <p>The corresponding setting, or null if not recognized</p>
*/
public abstract L getSetting(String input);
/**
* Gets the global settings to use
*
* @return <p>The global settings</p>
*/
public abstract @NotNull Settings<L> getGlobalSettings();
@Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String s,
@NotNull String[] args) {
NPC npc = CitizensAPI.getDefaultNPCSelector().getSelected(sender);
if (npc == null || !npc.hasTrait(traitClass)) {
BlacksmithPlugin.getStringFormatter().displayErrorMessage(sender,
BlacksmithTranslatableMessage.NO_NPC_SELECTED);
return true;
}
if (args.length < 1) {
return false;
}
K trait = npc.getTraitNullable(traitClass);
if (trait == null) {
return false;
}
L setting = getSetting(args[0]);
if (setting != null) {
String newValue = args.length < 2 ? null : args[1];
//This makes sure all arguments are treated as a sentence
if (setting.getValueType() == SettingValueType.STRING && args.length > 2) {
newValue = String.join(" ", Arrays.asList(args).subList(1, args.length));
}
Settings<L> settings = getGlobalSettings();
return displayOrChangeNPCSetting(trait, setting, settings, newValue, sender);
} else {
return false;
}
}
/**
* Changes the given NPC setting, or displays the current value if a new value isn't specified
*
* @param trait <p>The trait belonging to the selected NPC</p>
* @param setting <p>The NPC setting to change</p>
* @param globalSettings <p>The global settings to get default values from</p>
* @param newValue <p>The value to change the setting to</p>
* @param sender <p>The command sender to notify about results</p>
* @return <p>True if everything went successfully</p>
*/
private boolean displayOrChangeNPCSetting(@NotNull CustomTrait<L> trait,
@NotNull L setting,
@NotNull Settings<L> globalSettings,
@Nullable String newValue,
@NotNull CommandSender sender) {
if (newValue == null) {
//Display the current value of the setting
displayNPCSetting(trait, setting, globalSettings, sender);
} else {
//If an empty value or null, clear the value instead of changing it
if (InputParsingHelper.isEmpty(newValue)) {
newValue = null;
} else {
//Abort if an invalid value is given
boolean isValidType = TypeValidationHelper.isValid(setting.getValueType(), newValue, sender);
if (!isValidType) {
return false;
}
newValue = ChatColor.translateAlternateColorCodes('&', newValue);
}
//Change the setting
Settings<L> settings = trait.getTraitSettings();
if (settings == null) {
BlacksmithPlugin.getInstance().getLogger().log(Level.SEVERE, "Settings for a CustomTrait has not " +
"been initialized! Please inform the developer!");
return false;
}
settings.changeValue(setting, newValue);
BlacksmithPlugin.getStringFormatter().displaySuccessMessage(sender,
getValueChangedMessage(setting.getCommandName(), String.valueOf(newValue)));
//Save the changes immediately to prevent data loss on server crash
CitizensAPI.getNPCRegistry().saveToStore();
}
return true;
}
/**
* Displays the current value of the given NPC setting
*
* @param trait <p>The trait of the NPC to get the value from</p>
* @param setting <p>The NPC setting to see the value of</p>
* @param globalSettings <p>The global settings to get default values from</p>
* @param sender <p>The command sender to display the value to</p>
*/
private void displayNPCSetting(@NotNull CustomTrait<L> trait,
@NotNull L setting,
@NotNull Settings<L> globalSettings,
@NotNull CommandSender sender) {
Settings<L> settings = trait.getTraitSettings();
if (settings == null) {
BlacksmithPlugin.getInstance().getLogger().log(Level.SEVERE, "Settings for a CustomTrait has not " +
"been initialized! Please inform the developer!");
return;
}
String rawValue = String.valueOf(settings.getRawValue(setting));
if (InputParsingHelper.isEmpty(rawValue)) {
//Display the default value, if no custom value has been specified
rawValue = String.valueOf(globalSettings.getRawValue(setting));
BlacksmithPlugin.getStringFormatter().displaySuccessMessage(sender,
getCurrentValueMessage(setting.getCommandName(), rawValue));
} else {
//Add a marker if the value has been customized
String marker = BlacksmithPlugin.translate(BlacksmithTranslatableMessage.SETTING_OVERRIDDEN_MARKER);
BlacksmithPlugin.getStringFormatter().displaySuccessMessage(sender,
getCurrentValueMessage(setting.getCommandName(), rawValue) + marker);
}
if (setting.isMessage()) {
sender.sendMessage(BlacksmithTranslatableMessage.getRawValueMessage(
rawValue.replace(ChatColor.COLOR_CHAR, '&')));
}
}
}

View File

@@ -57,7 +57,7 @@ public class PresetCommand implements CommandExecutor {
materialNames.add(material.name());
}
BlacksmithPlugin.getStringFormatter().displaySuccessMessage(sender, StringFormatter.replacePlaceholder(
BlacksmithPlugin.getTranslator().getTranslatedMessage(BlacksmithTranslatableMessage.PRESET_MATERIALS),
BlacksmithPlugin.translate(BlacksmithTranslatableMessage.PRESET_MATERIALS),
"{materials}", String.join(", ", materialNames)));
return true;
}

View File

@@ -1,126 +1,32 @@
package net.knarcraft.blacksmith.command.blacksmith;
import net.citizensnpcs.api.CitizensAPI;
import net.citizensnpcs.api.npc.NPC;
import net.knarcraft.blacksmith.BlacksmithPlugin;
import net.knarcraft.blacksmith.config.SettingValueType;
import net.knarcraft.blacksmith.command.EditCommand;
import net.knarcraft.blacksmith.config.Settings;
import net.knarcraft.blacksmith.config.blacksmith.BlacksmithSetting;
import net.knarcraft.blacksmith.formatting.BlacksmithTranslatableMessage;
import net.knarcraft.blacksmith.trait.BlacksmithTrait;
import net.knarcraft.blacksmith.util.InputParsingHelper;
import net.knarcraft.blacksmith.util.TypeValidationHelper;
import net.md_5.bungee.api.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Arrays;
import static net.knarcraft.blacksmith.formatting.BlacksmithTranslatableMessage.getCurrentValueMessage;
import static net.knarcraft.blacksmith.formatting.BlacksmithTranslatableMessage.getValueChangedMessage;
/**
* The main command used for blacksmith editing
*/
public class BlackSmithEditCommand implements CommandExecutor {
public class BlackSmithEditCommand extends EditCommand<BlacksmithTrait, BlacksmithSetting> {
/**
* Instantiates a new blacksmith edit command
*/
public BlackSmithEditCommand() {
super(BlacksmithTrait.class);
}
@Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label,
@NotNull String[] args) {
NPC npc = CitizensAPI.getDefaultNPCSelector().getSelected(sender);
if (npc == null || !npc.hasTrait(BlacksmithTrait.class)) {
BlacksmithPlugin.getStringFormatter().displayErrorMessage(sender,
BlacksmithTranslatableMessage.NO_NPC_SELECTED);
return true;
}
if (args.length < 1) {
return false;
}
BlacksmithTrait blacksmithTrait = npc.getTraitNullable(BlacksmithTrait.class);
BlacksmithSetting setting = BlacksmithSetting.getSetting(args[0]);
if (setting != null) {
String newValue = args.length < 2 ? null : args[1];
//This makes sure all arguments are treated as a sentence
if (setting.getValueType() == SettingValueType.STRING && args.length > 2) {
newValue = String.join(" ", Arrays.asList(args).subList(1, args.length));
}
return displayOrChangeNPCSetting(blacksmithTrait, setting, newValue, sender);
} else {
return false;
}
public BlacksmithSetting getSetting(String input) {
return BlacksmithSetting.getSetting(input);
}
/**
* Changes the given NPC setting, or displays the current value if a new value isn't specified
*
* @param blacksmithTrait <p>The blacksmith trait belonging to the selected NPC</p>
* @param blacksmithSetting <p>The NPC setting to change</p>
* @param newValue <p>The value to change the setting to</p>
* @param sender <p>The command sender to notify about results</p>
* @return <p>True if everything went successfully</p>
*/
private boolean displayOrChangeNPCSetting(@NotNull BlacksmithTrait blacksmithTrait,
@NotNull BlacksmithSetting blacksmithSetting,
@Nullable String newValue,
@NotNull CommandSender sender) {
if (newValue == null) {
//Display the current value of the setting
displayNPCSetting(blacksmithTrait, blacksmithSetting, sender);
} else {
//If an empty value or null, clear the value instead of changing it
if (InputParsingHelper.isEmpty(newValue)) {
newValue = null;
} else {
//Abort if an invalid value is given
boolean isValidType = TypeValidationHelper.isValid(blacksmithSetting.getValueType(), newValue, sender);
if (!isValidType) {
return false;
}
newValue = ChatColor.translateAlternateColorCodes('&', newValue);
}
//Change the setting
blacksmithTrait.getSettings().changeValue(blacksmithSetting, newValue);
BlacksmithPlugin.getStringFormatter().displaySuccessMessage(sender,
getValueChangedMessage(blacksmithSetting.getCommandName(), String.valueOf(newValue)));
//Save the changes immediately to prevent data loss on server crash
CitizensAPI.getNPCRegistry().saveToStore();
}
return true;
}
/**
* Displays the current value of the given NPC setting
*
* @param blacksmithTrait <p>The blacksmith trait of the NPC to get the value from</p>
* @param blacksmithSetting <p>The NPC setting to see the value of</p>
* @param sender <p>The command sender to display the value to</p>
*/
private void displayNPCSetting(@NotNull BlacksmithTrait blacksmithTrait,
@NotNull BlacksmithSetting blacksmithSetting, @NotNull CommandSender sender) {
String rawValue = String.valueOf(blacksmithTrait.getSettings().getRawValue(blacksmithSetting));
if (InputParsingHelper.isEmpty(rawValue)) {
//Display the default value, if no custom value has been specified
rawValue = String.valueOf(BlacksmithPlugin.getInstance().getGlobalBlacksmithSettings().getRawValue(
blacksmithSetting));
BlacksmithPlugin.getStringFormatter().displaySuccessMessage(sender,
getCurrentValueMessage(blacksmithSetting.getCommandName(), rawValue));
} else {
//Add a marker if the value has been customized
String marker = BlacksmithPlugin.getTranslator().getTranslatedMessage(
BlacksmithTranslatableMessage.SETTING_OVERRIDDEN_MARKER);
BlacksmithPlugin.getStringFormatter().displaySuccessMessage(sender,
getCurrentValueMessage(blacksmithSetting.getCommandName(), rawValue) + marker);
}
if (blacksmithSetting.getPath().startsWith("defaults.messages")) {
sender.sendMessage(BlacksmithTranslatableMessage.getRawValueMessage(
rawValue.replace(ChatColor.COLOR_CHAR, '&')));
}
@Override
public @NotNull Settings<BlacksmithSetting> getGlobalSettings() {
return BlacksmithPlugin.getInstance().getGlobalBlacksmithSettings();
}
}

View File

@@ -1,15 +1,32 @@
package net.knarcraft.blacksmith.command.scrapper;
import org.apache.commons.lang.NotImplementedException;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import net.knarcraft.blacksmith.BlacksmithPlugin;
import net.knarcraft.blacksmith.command.EditCommand;
import net.knarcraft.blacksmith.config.Settings;
import net.knarcraft.blacksmith.config.scrapper.ScrapperSetting;
import net.knarcraft.blacksmith.trait.ScrapperTrait;
import org.jetbrains.annotations.NotNull;
public class ScrapperEditCommand implements CommandExecutor {
@Override
public boolean onCommand(@NotNull CommandSender commandSender, @NotNull Command command, @NotNull String s,
@NotNull String[] strings) {
throw new NotImplementedException();
/**
* The main command used for scrapper editing
*/
public class ScrapperEditCommand extends EditCommand<ScrapperTrait, ScrapperSetting> {
/**
* Instantiates a new scrapper edit command
*/
public ScrapperEditCommand() {
super(ScrapperTrait.class);
}
@Override
public ScrapperSetting getSetting(String input) {
return ScrapperSetting.getSetting(input);
}
@Override
public @NotNull Settings<ScrapperSetting> getGlobalSettings() {
return BlacksmithPlugin.getInstance().getGlobalScrapperSettings();
}
}

View File

@@ -1,18 +1,62 @@
package net.knarcraft.blacksmith.command.scrapper;
import org.apache.commons.lang.NotImplementedException;
import net.knarcraft.blacksmith.config.scrapper.ScrapperSetting;
import net.knarcraft.blacksmith.util.TabCompleteValuesHelper;
import net.knarcraft.knarlib.util.TabCompletionHelper;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabCompleter;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.List;
/**
* The tab completer for the scrapper editing command
*/
public class ScrapperEditTabCompleter implements TabCompleter {
@Override
public @Nullable List<String> onTabComplete(@NotNull CommandSender commandSender, @NotNull Command command,
@NotNull String s, @NotNull String[] strings) {
throw new NotImplementedException();
public @Nullable List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command,
@NotNull String s, @NotNull String[] args) {
if (!sender.hasPermission("blacksmith.edit")) {
return new ArrayList<>();
}
List<String> npcSettings = new ArrayList<>();
for (ScrapperSetting setting : ScrapperSetting.values()) {
if (setting.isPerNPC()) {
npcSettings.add(setting.getCommandName());
}
}
if (args.length == 1) {
return TabCompletionHelper.filterMatchingContains(npcSettings, args[0]);
} else {
if (npcSettings.contains(args[0]) && args.length == 2) {
return tabCompleteCommandValues(args[0], args[1]);
} else {
return new ArrayList<>();
}
}
}
/**
* Tab completes the values available for the given command
*
* @param commandName <p>The name of the used command</p>
* @param commandValue <p>The command value used to filter tab-completions</p>
* @return <p>Some valid options for the command's argument</p>
*/
private @Nullable List<String> tabCompleteCommandValues(@NotNull String commandName, @NotNull String commandValue) {
ScrapperSetting setting = ScrapperSetting.getSetting(commandName);
if (setting != null) {
return TabCompletionHelper.filterMatchingContains(TabCompleteValuesHelper.getTabCompletions(
setting.getValueType()), commandValue);
} else {
return null;
}
}
}