package org.bukkit.event.player; import org.apache.commons.lang.Validate; import org.bukkit.entity.Player; import org.bukkit.event.Cancellable; import org.bukkit.event.HandlerList; import java.util.HashSet; import java.util.Set; /** * This event is called whenever a player runs a command (by placing a slash * at the start of their message). It is called early in the command handling * process, and modifications in this event (via {@link #setMessage(String)}) * will be shown in the behavior. * <p> * Many plugins will have <b>no use for this event</b>, and you should * attempt to avoid using it if it is not necessary. * <p> * Some examples of valid uses for this event are: * <ul> * <li>Logging executed commands to a separate file * <li>Variable substitution. For example, replacing * <code>${nearbyPlayer}</code> with the name of the nearest other * player, or simulating the <code>@a</code> and <code>@p</code> * decorators used by Command Blocks in plugins that do not handle it. * <li>Conditionally blocking commands belonging to other plugins. For * example, blocking the use of the <code>/home</code> command in a * combat arena. * <li>Per-sender command aliases. For example, after a player runs the * command <code>/calias cr gamemode creative</code>, the next time they * run <code>/cr</code>, it gets replaced into * <code>/gamemode creative</code>. (Global command aliases should be * done by registering the alias.) * </ul> * <p> * Examples of incorrect uses are: * <ul> * <li>Using this event to run command logic * </ul> * <p> * If the event is cancelled, processing of the command will halt. * <p> * The state of whether or not there is a slash (<code>/</code>) at the * beginning of the message should be preserved. If a slash is added or * removed, unexpected behavior may result. */ public class PlayerCommandPreprocessEvent extends PlayerEvent implements Cancellable { private static final HandlerList handlers = new HandlerList(); private boolean cancel = false; private String message; private String format = "<%1$s> %2$s"; private final Set<Player> recipients; public PlayerCommandPreprocessEvent(final Player player, final String message) { super(player); this.recipients = new HashSet<Player>(player.getServer().getOnlinePlayers()); this.message = message; } public PlayerCommandPreprocessEvent(final Player player, final String message, final Set<Player> recipients) { super(player); this.recipients = recipients; this.message = message; } public boolean isCancelled() { return cancel; } public void setCancelled(boolean cancel) { this.cancel = cancel; } /** * Gets the command that the player is attempting to send. * <p> * All commands begin with a special character; implementations do not * consider the first character when executing the content. * * @return Message the player is attempting to send */ public String getMessage() { return message; } /** * Sets the command that the player will send. * <p> * All commands begin with a special character; implementations do not * consider the first character when executing the content. * * @param command New message that the player will send * @throws IllegalArgumentException if command is null or empty */ public void setMessage(String command) throws IllegalArgumentException { Validate.notNull(command, "Command cannot be null"); Validate.notEmpty(command, "Command cannot be empty"); this.message = command; } /** * Sets the player that this command will be executed as. * * @param player New player which this event will execute as * @throws IllegalArgumentException if the player provided is null */ public void setPlayer(final Player player) throws IllegalArgumentException { Validate.notNull(player, "Player cannot be null"); this.player = player; } /** * Gets the format to use to display this chat message * * @return String.Format compatible format string * @deprecated This method is provided for backward compatibility with no * guarantee to the use of the format. */ @Deprecated public String getFormat() { return format; } /** * Sets the format to use to display this chat message * * @param format String.Format compatible format string * @deprecated This method is provided for backward compatibility with no * guarantee to the effect of modifying the format. */ @Deprecated public void setFormat(final String format) { // Oh for a better way to do this! try { String.format(format, player, message); } catch(RuntimeException ex) { ex.fillInStackTrace(); throw ex; } this.format = format; } /** * Gets a set of recipients that this chat message will be displayed to. * <p> * The set returned is not guaranteed to be mutable and may auto-populate * on access. Any listener accessing the returned set should be aware that * it may reduce performance for a lazy set implementation. Listeners * should be aware that modifying the list may throw {@link * UnsupportedOperationException} if the event caller provides an * unmodifiable set. * * @return All Players who will see this chat message * @deprecated This method is provided for backward compatibility with no * guarantee to the effect of viewing or modifying the set. */ @Deprecated public Set<Player> getRecipients() { return recipients; } @Override public HandlerList getHandlers() { return handlers; } public static HandlerList getHandlerList() { return handlers; } }