Newer
Older
ultramine_bukkit / src / main / java / org / bukkit / event / player / PlayerCommandPreprocessEvent.java
@vlad20012 vlad20012 on 24 Feb 2017 5 KB initial
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;
	}
}