package com.dsh105.holoapi.command.sub;
import com.dsh105.command.Command;
import com.dsh105.command.CommandEvent;
import com.dsh105.command.CommandListener;
import com.dsh105.commodus.GeneralUtil;
import com.dsh105.commodus.IdentUtil;
import com.dsh105.commodus.StringUtil;
import com.dsh105.holoapi.HoloAPI;
import com.dsh105.holoapi.api.Hologram;
import com.dsh105.holoapi.config.Lang;
import com.dsh105.holoapi.conversation.InputFactory;
import com.dsh105.holoapi.conversation.script.ScriptBuilderPrompt;
import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.conversations.*;
import org.bukkit.entity.Player;
import java.util.concurrent.ConcurrentHashMap;
public class ScriptCommand implements CommandListener {
private final static ConcurrentHashMap<String, ScriptBuilderPrompt> SCRIPT_EDITORS = new ConcurrentHashMap<>();
@Command(
command = "script add <id> <script_name>",
description = "Adds the given script to the hologram with the given id",
permission = "holoapi.holo.script.add"
)
public boolean addScript(CommandEvent event) {
final Hologram hologram = HoloAPI.getManager().getHologram(event.variable("id"));
if (hologram == null) {
event.respond(Lang.HOLOGRAM_NOT_FOUND.getValue("id", event.variable("id")));
return true;
}
return false;
}
@Command(
command = "script remove <id> <script_name>",
description = "Removes a script from the given hologram",
permission = "holoapi.holo.script.remove"
)
public boolean removeScript(CommandEvent event) {
return false;
}
@Command(
command = "script create <name>",
description = "Created a new Script with the given name",
permission = "holoapi.holo.script.create"
)
public boolean createScript(final CommandEvent event) {
if (!(event.sender() instanceof Player) && !(event.sender() instanceof ConsoleCommandSender)) {
event.respond(Lang.NOT_CONVERSABLE.getValue());
return true;
}
String ident = event.sender() instanceof Player ? IdentUtil.getIdentificationForAsString((Player) event.sender()) : "CONSOLE";
final String scriptName = event.variable("script_name");
InputFactory.buildBasicConversation().withFirstPrompt(new StringPrompt() {
boolean failed;
@Override
public String getPromptText(ConversationContext context) {
return failed ? Lang.PROMPT_SCRIPT_VALID_TYPE.getValue() : Lang.PROMPT_SCRIPT_TYPE.getValue();
}
@Override
public Prompt acceptInput(ConversationContext context, String input) {
if (input.equalsIgnoreCase("FORMAT") || input.equalsIgnoreCase("TOUCH")) {
Lang.PROMPT_SCRIPT_ENTER.send(context.getForWhom());
ScriptBuilderPrompt scriptBuilder = new ScriptBuilderPrompt(input.toLowerCase(), scriptName);
SCRIPT_EDITORS.put(event.sender() instanceof Player ? IdentUtil.getIdentificationForAsString((Player) event.sender()) : "CONSOLE", scriptBuilder);
return END_OF_CONVERSATION;
}
failed = true;
return this;
}
}).buildConversation((Conversable) event.sender());
// Now that we have our type...
ScriptBuilderPrompt prompt = SCRIPT_EDITORS.get(ident);
// And now we build it!
InputFactory.buildBasicConversation().withFirstPrompt(prompt).addConversationAbandonedListener(new ScriptAbandonedListener()).buildConversation((Conversable) event.sender());
return true;
}
/*
* NOT INTENDED TO BE USED OUTSIDE OF HOVER TOOLTIPS
* ONLY FOR CLICKED SCRIPT LINES
*/
@Command(
command = "script editcurrent <line>",
description = "Edits a script currently being built. Not intended for general use outside of context.",
includeInHelp = false
// No permission, as this cannot be called without another command executing it
)
public boolean editCurrentScript(CommandEvent event) {
if (!(event.sender() instanceof Conversable)) {
event.respond(Lang.NOT_CONVERSABLE.getValue());
return true;
}
ScriptBuilderPrompt scriptBuilder = SCRIPT_EDITORS.get(getIdent((Conversable) event.sender()));
if (scriptBuilder == null) {
event.respond(Lang.PROMPT_SCRIPT_NOT_EDITING.getValue());
return true;
}
int line = 0;
try {
line = GeneralUtil.toInteger(event.variable("line"));
} catch (NumberFormatException e) {
event.respond(Lang.INT_ONLY.getValue("string", event.variable("line")));
}
event.respond(Lang.PROMPT_SCRIPT_LINE_CHANGE.getValue("line", event.variable("line")));
scriptBuilder.setCurrentlyEditing(line);
return true;
}
@Command(
command = "script edit <name>",
description = "Edits the script with the given name",
permission = "holoapi.holo.script.edit"
)
public boolean editScript(CommandEvent event) {
return false;
}
@Command(
command = "script list",
description = "Displays a list of all loaded Scripts",
permission = "holoapi.holo.script.list"
)
public boolean showScript(CommandEvent event) {
return true;
}
private String getIdent(Conversable conversable) {
return conversable instanceof Player ? IdentUtil.getIdentificationForAsString((Player) conversable) : "CONSOLE";
}
class ScriptAbandonedListener implements ConversationAbandonedListener {
@Override
public void conversationAbandoned(ConversationAbandonedEvent event) {
// Make sure to cleanup!
SCRIPT_EDITORS.remove(getIdent(event.getContext().getForWhom()));
}
}
}