From 6f8083c6341064000e91fcf9543094a1c67244ee Mon Sep 17 00:00:00 2001 From: Ne0n x3r0 Date: Sat, 21 Apr 2012 19:54:44 -0500 Subject: [PATCH] Initial commit --- aliases.yml | 16 ++++ com/gmail/Ne0nx3r0/AliasManager/Alias.java | 17 ++++ .../Ne0nx3r0/AliasManager/AliasManager.java | 91 +++++++++++++++++++ com/gmail/Ne0nx3r0/BetterAlias.java | 44 +++++++++ .../Ne0nx3r0/BetterAliasCommandExecutor.java | 48 ++++++++++ .../Ne0nx3r0/BetterAliasCommandListener.java | 24 +++++ .../Ne0nx3r0/BetterAliasPlayerListener.java | 90 ++++++++++++++++++ plugin.yml | 5 + 8 files changed, 335 insertions(+) create mode 100644 aliases.yml create mode 100644 com/gmail/Ne0nx3r0/AliasManager/Alias.java create mode 100644 com/gmail/Ne0nx3r0/AliasManager/AliasManager.java create mode 100644 com/gmail/Ne0nx3r0/BetterAlias.java create mode 100644 com/gmail/Ne0nx3r0/BetterAliasCommandExecutor.java create mode 100644 com/gmail/Ne0nx3r0/BetterAliasCommandListener.java create mode 100644 com/gmail/Ne0nx3r0/BetterAliasPlayerListener.java create mode 100644 plugin.yml diff --git a/aliases.yml b/aliases.yml new file mode 100644 index 0000000..52d3492 --- /dev/null +++ b/aliases.yml @@ -0,0 +1,16 @@ +#'dumb' parameter, will just use what you put in +banhammer: + 1: /ban !1 +#name parameter is replaced with the person's name +gmon: + 0: /gamemode !name 1 +gmoff: + 0: /gamemode !name 0 +# putting a P after the parameter specifies this is a player, and BA should try to guess which player +# useful for things like "/to e0n" instead of "/to Ne0nx3r0" +# This will ONLY look for players that are online +to: + 1: /tp !name !1p + 2: /tp !1p !2p +bring: + 1: /tp !1p !name diff --git a/com/gmail/Ne0nx3r0/AliasManager/Alias.java b/com/gmail/Ne0nx3r0/AliasManager/Alias.java new file mode 100644 index 0000000..98c581b --- /dev/null +++ b/com/gmail/Ne0nx3r0/AliasManager/Alias.java @@ -0,0 +1,17 @@ +package com.gmail.Ne0nx3r0.AliasManager; + +import java.util.HashMap; +import java.util.Map; + +class Alias{ + //mapping number of parameters to string(s) to be executed + private Map params = new HashMap(); + + public Alias(Map p){ + this.params = p; + } + + public String[] getCommands(int p){ + return this.params.get(p); + } +} \ No newline at end of file diff --git a/com/gmail/Ne0nx3r0/AliasManager/AliasManager.java b/com/gmail/Ne0nx3r0/AliasManager/AliasManager.java new file mode 100644 index 0000000..6dc80bc --- /dev/null +++ b/com/gmail/Ne0nx3r0/AliasManager/AliasManager.java @@ -0,0 +1,91 @@ +package com.gmail.Ne0nx3r0.AliasManager; + +import com.gmail.Ne0nx3r0.BetterAlias; +import java.io.File; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; + +public class AliasManager{ + private static Map aliases; + private static BetterAlias plugin; + + public AliasManager(BetterAlias ba){ + plugin = ba; + + // loadAliasesLocal(); + + loadAliases(); + } + + private void loadAliases(){ + aliases = new HashMap(); + + File configFile = new File(plugin.getDataFolder(), "aliases.yml"); + + if(!configFile.exists()){ + configFile.getParentFile().mkdirs(); + copy(plugin.getResource("aliases.yml"), configFile); + } + + FileConfiguration yml = YamlConfiguration.loadConfiguration(configFile); + + Set aliasList = yml.getKeys(false); + + if(aliasList.isEmpty()){ + plugin.log("No aliases found in aliases.yml"); + return; + } + + for(String sAlias : aliasList){ + Map shareMap = new HashMap(); + + for(int i=0;i<10;i++){ + + if(yml.isList(sAlias+"."+i)){ + + shareMap.put(i,yml.getStringList(sAlias+"."+i).toArray(new String[]{})); + + }else if(yml.isString(sAlias+"."+i)){ + + shareMap.put(i,new String[]{yml.getString(sAlias+"."+i)}); + + } + + } + + aliases.put(sAlias,new Alias(shareMap)); + + } + + } + + public boolean isAliased(String alias){ + return aliases.containsKey(alias); + } + + public String[] getAliasCommands(String alias,int paramsCount){ + return aliases.get(alias).getCommands(paramsCount); + } + + private void copy(InputStream in, File file) { + try { + OutputStream out = new FileOutputStream(file); + byte[] buf = new byte[1024]; + int len; + while((len=in.read(buf))>0){ + out.write(buf,0,len); + } + out.close(); + in.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/com/gmail/Ne0nx3r0/BetterAlias.java b/com/gmail/Ne0nx3r0/BetterAlias.java new file mode 100644 index 0000000..72a798c --- /dev/null +++ b/com/gmail/Ne0nx3r0/BetterAlias.java @@ -0,0 +1,44 @@ +package com.gmail.Ne0nx3r0; + +import com.gmail.Ne0nx3r0.AliasManager.AliasManager; +import java.util.logging.Level; +import org.bukkit.plugin.PluginManager; +import org.bukkit.plugin.java.JavaPlugin; + +public class BetterAlias extends JavaPlugin{ + public static AliasManager aliasManager; + + @Override + public void onEnable() { + //Create an alias manager (also loads aliases) + aliasManager = new AliasManager(this); + + //Register listeners + PluginManager pm = getServer().getPluginManager(); + + pm.registerEvents(new BetterAliasPlayerListener(this,aliasManager), this); + + //Register commands + //getCommand("ba").setExecutor(new BetterAliasCommandExecutor(this)); + + + log("[BetterAlias] Enabled"); + } + + @Override + public void onDisable() { + log("[BetterAlias] Disabled"); + } + +//Generic wrappers for console messages + public void log(Level level,String sMessage){ + if(!sMessage.equals("")) + getLogger().log(level,sMessage); + } + public void log(String sMessage){ + log(Level.INFO,sMessage); + } + public void error(String sMessage){ + log(Level.WARNING,sMessage); + } +} \ No newline at end of file diff --git a/com/gmail/Ne0nx3r0/BetterAliasCommandExecutor.java b/com/gmail/Ne0nx3r0/BetterAliasCommandExecutor.java new file mode 100644 index 0000000..995f2f4 --- /dev/null +++ b/com/gmail/Ne0nx3r0/BetterAliasCommandExecutor.java @@ -0,0 +1,48 @@ +package com.gmail.Ne0nx3r0; + +import org.bukkit.GameMode; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +public class BetterAliasCommandExecutor implements CommandExecutor { + private BetterAlias plugin; + + public BetterAliasCommandExecutor(BetterAlias plugin) + { + this.plugin = plugin; + } + + @Override + public boolean onCommand(CommandSender cs, Command cmd, String alias, String[] args) { + if (!(cs instanceof Player)){ + System.out.println("You can't run this from the console!"); + return false; + } + + Player player = (Player) cs; + + if(cmd.getName().equalsIgnoreCase("to") && args.length == 1 && player.isOp()){ + String sPlayerName = args[0].toLowerCase(); + + for(Player p : plugin.getServer().getOnlinePlayers()){ + if(p.getName().toLowerCase().contains(sPlayerName)){ + player.chat("/tp "+player.getName()+" "+p.getName()); + break; + } + } + } + else if(cmd.getName().equalsIgnoreCase("gm")){ + if(player.getGameMode() == GameMode.SURVIVAL){ + player.chat("/gamemode "+player.getName()+" 1"); + }else{ + player.chat("/gamemode "+player.getName()+" 0"); + } + } + else if(cmd.getName().equalsIgnoreCase("go") && args.length > 0){ + player.chat("/res tp "+args[0]); + } + return true; + } +} \ No newline at end of file diff --git a/com/gmail/Ne0nx3r0/BetterAliasCommandListener.java b/com/gmail/Ne0nx3r0/BetterAliasCommandListener.java new file mode 100644 index 0000000..dd394b1 --- /dev/null +++ b/com/gmail/Ne0nx3r0/BetterAliasCommandListener.java @@ -0,0 +1,24 @@ +//TODO: remove if not implemented + +package com.gmail.Ne0nx3r0; + +import com.gmail.Ne0nx3r0.AliasManager.AliasManager; +import org.bukkit.command.CommandSender; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +class BetterAliasCommandListener implements Listener{ + private final BetterAlias plugin; + private final AliasManager aliasManager; + + BetterAliasCommandListener(BetterAlias p, AliasManager am) { + this.plugin = p; + this.aliasManager = am; + } + + @EventHandler + public void onServerCommandEvent(CommandSender sender, String command){ + System.out.println(sender); + System.out.println(command); + } +} \ No newline at end of file diff --git a/com/gmail/Ne0nx3r0/BetterAliasPlayerListener.java b/com/gmail/Ne0nx3r0/BetterAliasPlayerListener.java new file mode 100644 index 0000000..3f557b1 --- /dev/null +++ b/com/gmail/Ne0nx3r0/BetterAliasPlayerListener.java @@ -0,0 +1,90 @@ +package com.gmail.Ne0nx3r0; + +import com.gmail.Ne0nx3r0.AliasManager.AliasManager; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerCommandPreprocessEvent; + +class BetterAliasPlayerListener implements Listener{ + private final BetterAlias plugin; + private final AliasManager aliasManager; + + BetterAliasPlayerListener(BetterAlias p, AliasManager am) { + this.plugin = p; + this.aliasManager = am; + } + + @EventHandler + public void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent e) { + + String[] cmd = e.getMessage().substring(1).split(" "); + + if(aliasManager.isAliased(cmd[0])){ + String[] commandsToExecute = aliasManager.getAliasCommands(cmd[0],cmd.length-1); + + //in case they specified an invalid number of parameters + if(commandsToExecute != null){ + Player player = e.getPlayer(); + + for(String commandToExecute : commandsToExecute){ + //regex time! + Pattern patt = Pattern.compile("!([0-9a-zA-Z~]+)"); + Matcher m = patt.matcher(commandToExecute); + StringBuffer sb = new StringBuffer(commandToExecute.length()); + + while(m.find()){ + String text = m.group(0).substring(1); + + if(text.equalsIgnoreCase("name")){ + text = player.getName(); + }else if(text.length() >= 2 && text.substring(1,2).equalsIgnoreCase("p")){ + int iParam = -1; + + try{ + iParam = Integer.parseInt(text.substring(0,1)); + }catch(Exception ex){return; } + + if(iParam > -1 && cmd.length >= iParam){ + String sPlayerName = cmd[iParam]; + + text = "notFound"; + + for(Player p : plugin.getServer().getOnlinePlayers()){ + if(p.getName().toLowerCase().contains(sPlayerName)){ + text = p.getName(); + break; + } + } + } + }else{ + int iParam = -1; + + try{ + iParam = Integer.parseInt(text); + } catch(Exception ex){} + + if(iParam > -1 && cmd.length >= iParam){ + text = cmd[iParam]; + } + } + //else if is numeric and cmd[i] exists, replace with cmd[i] + + m.appendReplacement(sb, Matcher.quoteReplacement(text)); + } + m.appendTail(sb); + + //tp !name !~1 + //tp !1 !2 + //tp !~1 !~2 + //debug: player.sendMessage(sb.toString()); + player.chat(sb.toString()); + } + + e.setCancelled(true); + } + } + } +} \ No newline at end of file diff --git a/plugin.yml b/plugin.yml new file mode 100644 index 0000000..7f46580 --- /dev/null +++ b/plugin.yml @@ -0,0 +1,5 @@ +name: BetterAlias +main: com.gmail.Ne0nx3r0.BetterAlias +version: '0.1' +database: false +description: Command alias system \ No newline at end of file