141 lines
5.2 KiB
Java
141 lines
5.2 KiB
Java
package xyz.etztech.mixtape.listeners;
|
|
|
|
import org.apache.commons.lang.StringUtils;
|
|
import org.bukkit.Bukkit;
|
|
import org.bukkit.ChatColor;
|
|
import org.bukkit.command.CommandSender;
|
|
import org.bukkit.entity.Player;
|
|
import org.bukkit.event.EventHandler;
|
|
import org.bukkit.event.EventPriority;
|
|
import org.bukkit.event.Listener;
|
|
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
|
import org.bukkit.event.server.ServerCommandEvent;
|
|
import xyz.etztech.mixtape.Mixtape;
|
|
import xyz.etztech.mixtape.MixtapeUtil;
|
|
|
|
import java.util.Arrays;
|
|
import java.util.LinkedHashMap;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
import java.util.regex.Matcher;
|
|
import java.util.regex.Pattern;
|
|
|
|
public class CommandPreprocessListener implements Listener {
|
|
|
|
private final String ERROR = "Mixtape/Error";
|
|
private final Pattern PATTERN = Pattern.compile("<([^>]+)>");
|
|
|
|
Mixtape plugin;
|
|
|
|
public CommandPreprocessListener(Mixtape plugin) {
|
|
this.plugin = plugin;
|
|
}
|
|
|
|
@EventHandler(priority= EventPriority.HIGH, ignoreCancelled=true)
|
|
public void onServerCommandPreprocess(ServerCommandEvent event) {
|
|
String command = event.getCommand();
|
|
if (command.startsWith("/")) {
|
|
command = command.substring(1);
|
|
}
|
|
String base = command.split(" ")[0];
|
|
String[] args = command.trim().length() == base.trim().length() ? new String[0] : command.substring(base.length()+1).split(" ");
|
|
|
|
event.setCancelled(handleEvent(Bukkit.getConsoleSender(), base, args));
|
|
}
|
|
|
|
@EventHandler(priority= EventPriority.HIGH, ignoreCancelled=true)
|
|
public void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent event) {
|
|
|
|
String command = event.getMessage().substring(1); // Strip the slash
|
|
String base = command.split(" ")[0];
|
|
String[] args = command.trim().length() == base.trim().length() ? new String[0] : command.substring(base.length()+1).split(" ");
|
|
|
|
event.setCancelled(handleEvent(event.getPlayer(), base, args));
|
|
|
|
}
|
|
|
|
private boolean handleEvent(CommandSender sender, String base, String[] args) {
|
|
// Global aliases
|
|
if (Mixtape.getGlobal()) {
|
|
List<?> configs = plugin.getConfig().getList("aliases");
|
|
for (int i = 0; i < configs.size(); i++) {
|
|
LinkedHashMap<String, String> config = (LinkedHashMap<String, String>) configs.get(i);
|
|
String configBase = MixtapeUtil.stripSlash(config.get("alias"));
|
|
if (configBase.equalsIgnoreCase(base)) {
|
|
String configCommand = MixtapeUtil.stripSlash(config.get("command"));
|
|
String resolved = resolve(configCommand, args);
|
|
if (!ERROR.equalsIgnoreCase(resolved)) {
|
|
Bukkit.dispatchCommand(sender, resolved);
|
|
} else {
|
|
sender.sendMessage(ChatColor.RED + usage(base, configCommand));
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Personal aliases
|
|
if (sender instanceof Player) {
|
|
Player player = (Player) sender;
|
|
|
|
// Command aliases
|
|
Map<String, String> commands = Mixtape.getCommandAliases(player.getUniqueId().toString());
|
|
for (String alias : commands.keySet()) {
|
|
if (alias.equalsIgnoreCase(base)) {
|
|
String resolved = resolve(commands.get(alias), args);
|
|
if (!ERROR.equalsIgnoreCase(resolved)) {
|
|
Bukkit.dispatchCommand(player, resolved);
|
|
} else {
|
|
player.sendMessage(ChatColor.RED + usage(base, commands.get(alias)));
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
|
|
// Chat aliases
|
|
Map<String, String> chats = Mixtape.getChatAliases(player.getUniqueId().toString());
|
|
for (String alias : chats.keySet()) {
|
|
if (alias.equalsIgnoreCase(base)) {
|
|
String resolved = resolve(chats.get(alias), args);
|
|
if (!ERROR.equalsIgnoreCase(resolved)) {
|
|
resolved = resolved.startsWith("/") ? "." + resolved : resolved;
|
|
player.chat(resolved);
|
|
} else {
|
|
player.sendMessage(ChatColor.RED + usage(base, chats.get(alias)));
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
|
|
|
|
private String usage(String base, String template) {
|
|
StringBuilder usage = new StringBuilder("/" + base);
|
|
Matcher matcher = PATTERN.matcher(template);
|
|
while (matcher.find()) {
|
|
usage.append(" ").append(matcher.group(0));
|
|
}
|
|
return usage.toString();
|
|
}
|
|
|
|
private String resolve(String template, String... parts) {
|
|
Matcher matcher = PATTERN.matcher(template);
|
|
int idx = 0;
|
|
try {
|
|
while (matcher.find()) {
|
|
template = template.replaceFirst(matcher.group(0), parts[idx]);
|
|
idx++;
|
|
}
|
|
} catch (Exception ex) {
|
|
return ERROR;
|
|
}
|
|
return template.trim() + " " + StringUtils.join(Arrays.copyOfRange(parts, idx, parts.length), " ");
|
|
}
|
|
|
|
|
|
}
|