001 package org.bukkit.event.server;
002
003 import java.net.InetAddress;
004 import java.util.Iterator;
005
006 import org.apache.commons.lang.Validate;
007 import org.bukkit.entity.Player;
008 import org.bukkit.event.HandlerList;
009 import org.bukkit.util.CachedServerIcon;
010
011 /**
012 * Called when a server list ping is coming in. Displayed players can be
013 * checked and removed by {@link #iterator() iterating} over this event.
014 */
015 public class ServerListPingEvent extends ServerEvent implements Iterable<Player> {
016 private static final int MAGIC_PLAYER_COUNT = Integer.MIN_VALUE;
017 private static final HandlerList handlers = new HandlerList();
018 private final InetAddress address;
019 private String motd;
020 private final int numPlayers;
021 private int maxPlayers;
022
023 public ServerListPingEvent(final InetAddress address, final String motd, final int numPlayers, final int maxPlayers) {
024 Validate.isTrue(numPlayers >= 0, "Cannot have negative number of players online", numPlayers);
025 this.address = address;
026 this.motd = motd;
027 this.numPlayers = numPlayers;
028 this.maxPlayers = maxPlayers;
029 }
030
031 /**
032 * This constructor is intended for implementations that provide the
033 * {@link #iterator()} method, thus provided the {@link #getNumPlayers()}
034 * count.
035 */
036 protected ServerListPingEvent(final InetAddress address, final String motd, final int maxPlayers) {
037 this.numPlayers = MAGIC_PLAYER_COUNT;
038 this.address = address;
039 this.motd = motd;
040 this.maxPlayers = maxPlayers;
041 }
042
043 /**
044 * Get the address the ping is coming from.
045 *
046 * @return the address
047 */
048 public InetAddress getAddress() {
049 return address;
050 }
051
052 /**
053 * Get the message of the day message.
054 *
055 * @return the message of the day
056 */
057 public String getMotd() {
058 return motd;
059 }
060
061 /**
062 * Change the message of the day message.
063 *
064 * @param motd the message of the day
065 */
066 public void setMotd(String motd) {
067 this.motd = motd;
068 }
069
070 /**
071 * Get the number of players sent.
072 *
073 * @return the number of players
074 */
075 public int getNumPlayers() {
076 int numPlayers = this.numPlayers;
077 if (numPlayers == MAGIC_PLAYER_COUNT) {
078 numPlayers = 0;
079 for (@SuppressWarnings("unused") final Player player : this) {
080 numPlayers++;
081 }
082 }
083 return numPlayers;
084 }
085
086 /**
087 * Get the maximum number of players sent.
088 *
089 * @return the maximum number of players
090 */
091 public int getMaxPlayers() {
092 return maxPlayers;
093 }
094
095 /**
096 * Set the maximum number of players sent.
097 *
098 * @param maxPlayers the maximum number of player
099 */
100 public void setMaxPlayers(int maxPlayers) {
101 this.maxPlayers = maxPlayers;
102 }
103
104 /**
105 * Sets the server-icon sent to the client.
106 *
107 * @param icon the icon to send to the client
108 * @throws IllegalArgumentException if the {@link CachedServerIcon} is not
109 * created by the caller of this event; null may be accepted for some
110 * implementations
111 * @throws UnsupportedOperationException if the caller of this event does
112 * not support setting the server icon
113 */
114 public void setServerIcon(CachedServerIcon icon) throws IllegalArgumentException, UnsupportedOperationException {
115 throw new UnsupportedOperationException();
116 }
117
118 @Override
119 public HandlerList getHandlers() {
120 return handlers;
121 }
122
123 public static HandlerList getHandlerList() {
124 return handlers;
125 }
126
127 /**
128 * {@inheritDoc}
129 * <p>
130 * Calling the {@link Iterator#remove()} method will force that particular
131 * player to not be displayed on the player list, decrease the size
132 * returned by {@link #getNumPlayers()}, and will not be returned again by
133 * any new iterator.
134 *
135 * @throws UnsupportedOperationException if the caller of this event does
136 * not support removing players
137 */
138 @Override
139 public Iterator<Player> iterator() throws UnsupportedOperationException {
140 throw new UnsupportedOperationException();
141 }
142 }