Skip to content

Commit

Permalink
Added command and tab completion handling.
Browse files Browse the repository at this point in the history
Events:
- tab_complete_command
Functions:
- register_command
- unregister_command
- set_executor
- set_tabcompleter
  • Loading branch information
jb_aero committed Nov 10, 2013
1 parent 8a472f2 commit c9789d6
Show file tree
Hide file tree
Showing 11 changed files with 582 additions and 20 deletions.
Expand Up @@ -43,4 +43,13 @@ public <T> T runOnMainThreadAndWait(Callable<T> callable) throws Exception{
public MCWorldCreator getWorldCreator(String worldName) {
throw new UnsupportedOperationException("Not supported.");
}

public MCCommand getNewCommand(String name) {
throw new UnsupportedOperationException("Not supported in this implementation.");
}

@Override
public MCCommandSender GetCorrectSender(MCCommandSender unspecific) {
throw new UnsupportedOperationException("Not supported in this implementation.");
}
}
14 changes: 14 additions & 0 deletions src/main/java/com/laytonsmith/abstraction/Convertor.java
Expand Up @@ -186,4 +186,18 @@ public interface Convertor {
* @return specific type
*/
public MCRecipe GetRecipe(MCRecipe unspecific);

/**
*
* @param name
* @return a new MCCommand instance
*/
public MCCommand getNewCommand(String name);

/**
*
* @param an ambiguous MCCommandSender
* @return a properly typed MCCommandSender
*/
public MCCommandSender GetCorrectSender(MCCommandSender unspecific);
}
4 changes: 4 additions & 0 deletions src/main/java/com/laytonsmith/abstraction/MCCommand.java
Expand Up @@ -49,4 +49,8 @@ public interface MCCommand extends AbstractionObject {
public void setExecutor(MCPlugin plugin);

public void setTabCompleter(MCPlugin plugin);

public List<String> handleTabComplete(MCCommandSender sender, String alias, String[] args);

public boolean handleCustomCommand(MCCommandSender sender, String label, String[] args);
}
18 changes: 18 additions & 0 deletions src/main/java/com/laytonsmith/abstraction/MCCommandMap.java
Expand Up @@ -8,12 +8,30 @@ public interface MCCommandMap extends AbstractionObject {

public boolean isCommand(String name);

/**
*
* @param name name of the command
* @return a command if found, or null if one isn't
*/
public MCCommand getCommand(String name);

public List<MCCommand> getCommands();

/**
*
* @param fallback the text added to the start of the command if the chosen name is already taken
* @param cmd
* @return
*/
public boolean register(String fallback, MCCommand cmd);

/**
*
* @param label
* @param fallback the text added to the start of the command if the chosen name is already taken
* @param cmd
* @return
*/
public boolean register(String label, String fallback, MCCommand cmd);

public boolean unregister(MCCommand cmd);
Expand Down
Expand Up @@ -31,6 +31,9 @@
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.block.DoubleChest;
import org.bukkit.command.BlockCommandSender;
import org.bukkit.command.CommandSender;
import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.*;
import org.bukkit.event.Listener;
Expand Down Expand Up @@ -499,4 +502,29 @@ public static MCRecipe BukkitGetRecipe(Recipe r) {
return null;
}
}

@Override
public MCCommand getNewCommand(String name) {
return BukkitMCCommand.newCommand(name);
}

@Override
public MCCommandSender GetCorrectSender(MCCommandSender unspecific) {
if (unspecific == null) {
return null;
}
return BukkitGetCorrectSender(((BukkitMCCommandSender) unspecific)._CommandSender());
}

public static MCCommandSender BukkitGetCorrectSender(CommandSender sender) {
if (sender instanceof Player) {
return new BukkitMCPlayer((Player) sender);
} else if (sender instanceof ConsoleCommandSender) {
return new BukkitMCConsoleCommandSender((ConsoleCommandSender) sender);
} else if (sender instanceof BlockCommandSender) {
return new BukkitMCBlockCommandSender((BlockCommandSender) sender);
} else {
return null;
}
}
}
@@ -1,5 +1,6 @@
package com.laytonsmith.abstraction.bukkit;

import java.util.ArrayList;
import java.util.List;

import org.bukkit.command.Command;
Expand All @@ -11,7 +12,17 @@
import com.laytonsmith.abstraction.MCCommandMap;
import com.laytonsmith.abstraction.MCCommandSender;
import com.laytonsmith.abstraction.MCPlugin;
import com.laytonsmith.abstraction.bukkit.events.BukkitMiscEvents.BukkitMCCommandTabCompleteEvent;
import com.laytonsmith.commandhelper.CommandHelperPlugin;
import com.laytonsmith.core.constructs.CArray;
import com.laytonsmith.core.constructs.CBoolean;
import com.laytonsmith.core.constructs.CString;
import com.laytonsmith.core.constructs.Construct;
import com.laytonsmith.core.constructs.Target;
import com.laytonsmith.core.events.Driver;
import com.laytonsmith.core.events.EventUtils;
import com.laytonsmith.core.exceptions.FunctionReturnException;
import com.laytonsmith.core.functions.Commands;

/**
*
Expand Down Expand Up @@ -160,4 +171,60 @@ public boolean equals(Object obj) {
public String toString() {
return cmd.toString();
}

// I may be able to move these to c.l.c.f.Commands.java
@Override
public List<String> handleTabComplete(MCCommandSender sender, String alias, String[] args) {
if (Commands.onTabComplete.containsKey(cmd.getName().toLowerCase())) {
Target t = Target.UNKNOWN;
CArray cargs = new CArray(t);
for (String arg : args) {
cargs.push(new CString(arg, t));
}
try {
Commands.onTabComplete.get(cmd.getName().toLowerCase()).execute(new Construct[]{
new CString(alias, t), new CString(sender.getName(), t), cargs,
new CArray(t) // reserved for an obgen style command array
});
} catch (FunctionReturnException e) {
Construct fret = e.getReturn();
if (fret instanceof CArray) {
List<String> ret = new ArrayList<String>();
for (Construct key : ((CArray) fret).asList()) {
ret.add(key.val());
}
return ret;
}
}
}
BukkitMCCommandTabCompleteEvent event = new BukkitMCCommandTabCompleteEvent(sender, cmd, alias, args);
EventUtils.TriggerExternal(event);
EventUtils.TriggerListener(Driver.TAB_COMPLETE, "tab_complete_command", event);
return event.getCompletions();
}

@Override
public boolean handleCustomCommand(MCCommandSender sender, String label, String[] args) {
if (Commands.onCommand.containsKey(cmd.getName().toLowerCase())) {
Target t = Target.UNKNOWN;
CArray cargs = new CArray(t);
for (String arg : args) {
cargs.push(new CString(arg, t));
}
try {
Commands.onCommand.get(cmd.getName().toLowerCase()).execute(new Construct[]{
new CString(label, t), new CString(sender.getName(), t), cargs,
new CArray(t) // reserved for an obgen style command array
});
} catch (FunctionReturnException e) {
Construct fret = e.getReturn();
if (fret instanceof CBoolean) {
return ((CBoolean) fret).getBoolean();
}
}
return true;
} else {
return false;
}
}
}
Expand Up @@ -119,11 +119,11 @@ public void setMOTD(String motd) {
public static class BukkitMCCommandTabCompleteEvent implements MCCommandTabCompleteEvent {

List<String> comp;
CommandSender sender;
MCCommandSender sender;
Command cmd;
String alias;
String[] args;
public BukkitMCCommandTabCompleteEvent(CommandSender sender, Command cmd, String alias, String[] args) {
public BukkitMCCommandTabCompleteEvent(MCCommandSender sender, Command cmd, String alias, String[] args) {
this.comp = new ArrayList<String>();
this.sender = sender;
this.cmd = cmd;
Expand All @@ -136,14 +136,7 @@ public Object _GetObject() {
}

public MCCommandSender getCommandSender() {
if (sender instanceof Player) {
return new BukkitMCPlayer((Player) sender);
} else if (sender instanceof ConsoleCommandSender) {
// There is an open PR that will make this possible
return new BukkitMCConsoleCommandSender((ConsoleCommandSender) sender);
} else {
return null;
}
return sender;
}

public MCCommand getCommand() {
Expand Down
Expand Up @@ -8,7 +8,7 @@

public interface MCCommandTabCompleteEvent extends BindableEvent {

public MCCommandSender getCommandSender();
public MCCommandSender getCommandSender();

public MCCommand getCommand();

Expand Down
Expand Up @@ -26,7 +26,9 @@
import com.laytonsmith.PureUtilities.Common.StringUtils;
import com.laytonsmith.PureUtilities.TermColors;
import com.laytonsmith.abstraction.*;
import com.laytonsmith.abstraction.bukkit.BukkitConvertor;
import com.laytonsmith.abstraction.bukkit.BukkitMCBlockCommandSender;
import com.laytonsmith.abstraction.bukkit.BukkitMCCommand;
import com.laytonsmith.abstraction.bukkit.BukkitMCPlayer;
import com.laytonsmith.abstraction.enums.MCChatColor;
import com.laytonsmith.core.*;
Expand All @@ -43,6 +45,7 @@
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutorService;
Expand Down Expand Up @@ -296,6 +299,13 @@ public void stopExecutionQueue() {
public void registerEvent(Listener listener) {
getServer().getPluginManager().registerEvents(listener, this);
}

@Override
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
MCCommandSender mcsender = BukkitConvertor.BukkitGetCorrectSender(sender);
MCCommand cmd = new BukkitMCCommand(command);
return cmd.handleTabComplete(mcsender, alias, args);
}

/**
* Called when a command registered by this plugin is received.
Expand All @@ -307,9 +317,10 @@ public void registerEvent(Listener listener) {
*/
@Override
public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
String cmdName = cmd.getName().toLowerCase();
if ((sender.isOp() || (sender instanceof Player && (permissionsResolver.hasPermission(((Player) sender).getName(), "commandhelper.reloadaliases")
|| permissionsResolver.hasPermission(((Player) sender).getName(), "ch.reloadaliases"))))
&& (cmd.getName().equals("reloadaliases") || cmd.getName().equals("reloadalias") || cmd.getName().equals("recompile"))) {
&& (cmdName.equals("reloadaliases") || cmdName.equals("reloadalias") || cmdName.equals("recompile"))) {
MCPlayer player = null;
if (sender instanceof Player) {
player = new BukkitMCPlayer((Player) sender);
Expand All @@ -327,9 +338,9 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel,
// System.out.println(TermColors.RED + "An error occured when trying to compile the script. Check the console for more information." + TermColors.reset());
// }
return true;
} else if (cmd.getName().equals("commandhelper") && args.length >= 1 && args[0].equalsIgnoreCase("null")) {
} else if (cmdName.equals("commandhelper") && args.length >= 1 && args[0].equalsIgnoreCase("null")) {
return true;
} else if (cmd.getName().equals("runalias")) {
} else if (cmdName.equals("runalias")) {
//Hardcoded alias rebroadcast
if (sender instanceof Player) {
PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent((Player) sender, StringUtils.Join(args, " "));
Expand All @@ -347,7 +358,7 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel,
Static.getAliasCore().alias(cmd2, s, new ArrayList<Script>());
}
return true;
} else if(cmd.getName().equalsIgnoreCase("interpreter-on")){
} else if(cmdName.equalsIgnoreCase("interpreter-on")){
if(sender instanceof ConsoleCommandSender){
int interpreterTimeout = Prefs.InterpreterTimeout();
if(interpreterTimeout != 0){
Expand All @@ -358,9 +369,10 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel,
sender.sendMessage("This command can only be run from console.");
}
return true;
} else if (sender instanceof Player) {
} else if (sender instanceof Player && java.util.Arrays.asList(new String[]{"commandhelper", "repeat",
"viewalias", "delalias", "interpreter"}).contains(cmdName)) {
try {
return runCommand(new BukkitMCPlayer((Player) sender), cmd.getName(), args);
return runCommand(new BukkitMCPlayer((Player) sender), cmdName, args);
} catch (DataSourceException ex) {
Logger.getLogger(CommandHelperPlugin.class.getName()).log(Level.SEVERE, null, ex);
} catch (ReadOnlyException ex) {
Expand All @@ -370,7 +382,9 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel,
}
return true;
} else {
return false;
MCCommandSender mcsender = BukkitConvertor.BukkitGetCorrectSender(sender);
MCCommand mccmd = new BukkitMCCommand(cmd);
return mccmd.handleCustomCommand(mcsender, commandLabel, args);
}
}

Expand Down

0 comments on commit c9789d6

Please sign in to comment.