summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/main/java/org/bukkit/BanEntry.java97
-rw-r--r--src/main/java/org/bukkit/BanList.java66
-rw-r--r--src/main/java/org/bukkit/Bukkit.java7
-rw-r--r--src/main/java/org/bukkit/OfflinePlayer.java2
-rw-r--r--src/main/java/org/bukkit/Server.java8
-rw-r--r--src/main/java/org/bukkit/command/defaults/BanCommand.java6
-rw-r--r--src/main/java/org/bukkit/command/defaults/BanIpCommand.java21
-rw-r--r--src/main/java/org/bukkit/command/defaults/BanListCommand.java19
-rw-r--r--src/main/java/org/bukkit/command/defaults/PardonCommand.java3
9 files changed, 216 insertions, 13 deletions
diff --git a/src/main/java/org/bukkit/BanEntry.java b/src/main/java/org/bukkit/BanEntry.java
new file mode 100644
index 00000000..4359067a
--- /dev/null
+++ b/src/main/java/org/bukkit/BanEntry.java
@@ -0,0 +1,97 @@
+package org.bukkit;
+
+import java.util.Date;
+
+/**
+ * A single entry from the ban list. This may represent either a player ban or an
+ * IP ban.<br />
+ * Ban entries include the following properties:
+ * <ul>
+ * <li><b>Target Name/IP Address</b> - The target name or IP address
+ * <li><b>Creation Date</b> - The creation date of the ban
+ * <li><b>Source</b> - The source of the ban, such as a player, console, plugin, etc
+ * <li><b>Expiration Date</b> - The expiration date of the ban
+ * <li><b>Reason</b> - The reason for the ban
+ * </ul>
+ * Unsaved information is not automatically written to the implementation's ban list, instead,
+ * the {@link #save()} method must be called to write the changes to the ban list. If this ban
+ * entry has expired (such as from an unban) and is no longer found in the list, the {@link #save()}
+ * call will re-add it to the list, therefore banning the victim specified.
+ */
+public interface BanEntry {
+ /**
+ * Gets the target involved. This may be in the form of an IP or a player name.
+ *
+ * @return The target name or IP address
+ */
+ public String getTarget();
+
+ /**
+ * Gets the date this ban entry was created.
+ *
+ * @return The creation date
+ */
+ public Date getCreated();
+
+ /**
+ * Sets the date this ban entry was created.<br />
+ * Use {@link #save()} to save the changes.
+ *
+ * @param created The new created date, cannot be null
+ */
+ public void setCreated(Date created);
+
+ /**
+ * Gets the source of this ban.<br />
+ * A source is considered any String, although this is generally a player name.
+ *
+ * @return The source of the ban
+ */
+ public String getSource();
+
+ /**
+ * Sets the source of this ban.<br />
+ * A source is considered any String, although this is generally a player name.<br />
+ * Use {@link #save()} to save the changes.
+ *
+ * @param source The new source where null values become empty strings
+ */
+ public void setSource(String source);
+
+ /**
+ * Gets the date this ban expires on, or null for no defined end date.
+ *
+ * @return The expiration date
+ */
+ public Date getExpiration();
+
+ /**
+ * Sets the date this ban expires on. Null values are considered "infinite" bans.<br />
+ * Use {@link #save()} to save the changes.
+ *
+ * @param expiry The new expiration date, or null to indicate an eternity
+ */
+ public void setExpiration(Date expiration);
+
+ /**
+ * Gets the reason for this ban.
+ *
+ * @return The ban reason or null if not set
+ */
+ public String getReason();
+
+ /**
+ * Sets the reason for this ban. Reasons must not be null.<br />
+ * Use {@link #save()} to save the changes.
+ *
+ * @param reason The new reason, null values assume the implementation default
+ */
+ public void setReason(String reason);
+
+ /**
+ * Saves the ban entry, overwriting any previous data in the ban list.<br />
+ * Saving the ban entry of an unbanned player will cause the player to be banned once again.
+ */
+ public void save();
+
+}
diff --git a/src/main/java/org/bukkit/BanList.java b/src/main/java/org/bukkit/BanList.java
new file mode 100644
index 00000000..86ae7cd2
--- /dev/null
+++ b/src/main/java/org/bukkit/BanList.java
@@ -0,0 +1,66 @@
+package org.bukkit;
+
+import java.util.Date;
+import java.util.Set;
+
+/**
+ * A ban list, containing bans of type {@link org.bukkit.BanList.Type}
+ */
+public interface BanList {
+ /**
+ * Gets a {@link BanEntry} by target.
+ *
+ * @param target Entry parameter to search for
+ * @return BanEntry for the submitted query, or null if none found
+ */
+ public BanEntry getBanEntry(String target);
+
+ /**
+ * Adds a ban to the ban list. If a previous ban exists, this will overwrite the previous
+ * entry.
+ *
+ * @param target The target of the ban
+ * @param reason Reason for the ban. If null, the implementation default is assumed
+ * @param expires Expiration Date of the ban. If null, "infinity" is assumed
+ * @param source Source of the ban. If null, the implementation default is assumed
+ * @return The BanEntry of the added ban
+ */
+ public BanEntry addBan(String target, String reason, Date expires, String source);
+
+ /**
+ * Gets a set containing every {@link BanEntry} in the BanList.
+ *
+ * @return an immutable set containing every BanEntry tracked by the BanList
+ */
+ public Set<BanEntry> getBanEntries();
+
+ /**
+ * Gets if a {@link BanEntry} exists for the target, indicating ban status
+ *
+ * @param target Entry target to lookup
+ * @return true if a {@link BanEntry} exists for the name, indicating ban status
+ */
+ public boolean isBanned(String target);
+
+ /**
+ * Removes the specified target from the list, therefore indicating a "not banned" status.
+ *
+ * @param target The target to remove from the list
+ */
+ public void pardon(String target);
+
+ /**
+ * Represents the various types a {@link BanList} may track.
+ */
+ public enum Type {
+ /**
+ * Banned player names
+ */
+ NAME,
+ /**
+ * Banned player IP addresses
+ */
+ IP;
+ }
+
+}
diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java
index db57b6d5..a90b3901 100644
--- a/src/main/java/org/bukkit/Bukkit.java
+++ b/src/main/java/org/bukkit/Bukkit.java
@@ -448,6 +448,13 @@ public final class Bukkit {
}
/**
+ * @see Server#getBanList(BanList.Type)
+ */
+ public static BanList getBanList(BanList.Type type){
+ return server.getBanList(type);
+ }
+
+ /**
* @see Server#setWhitelist(boolean value)
*/
public static void setWhitelist(boolean value) {
diff --git a/src/main/java/org/bukkit/OfflinePlayer.java b/src/main/java/org/bukkit/OfflinePlayer.java
index 21d13c3b..61964597 100644
--- a/src/main/java/org/bukkit/OfflinePlayer.java
+++ b/src/main/java/org/bukkit/OfflinePlayer.java
@@ -32,7 +32,9 @@ public interface OfflinePlayer extends ServerOperator, AnimalTamer, Configuratio
* Bans or unbans this player
*
* @param banned true if banned
+ * @deprecated Use {@link org.bukkit.BanList#addBan(String, String, java.util.Date, String)} or {@link org.bukkit.BanList#unban(String)} to enhance functionality
*/
+ @Deprecated
public void setBanned(boolean banned);
/**
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
index 57e7b30b..3b6ea63b 100644
--- a/src/main/java/org/bukkit/Server.java
+++ b/src/main/java/org/bukkit/Server.java
@@ -573,6 +573,14 @@ public interface Server extends PluginMessageRecipient {
public Set<OfflinePlayer> getBannedPlayers();
/**
+ * Gets a BanList for the supplied BanList Type
+ *
+ * @param type The BanList Type to fetch, cannot be null
+ * @return the BanList of the specified type
+ */
+ public BanList getBanList(BanList.Type type);
+
+ /**
* Gets a set containing all player operators
*
* @return Set containing player operators
diff --git a/src/main/java/org/bukkit/command/defaults/BanCommand.java b/src/main/java/org/bukkit/command/defaults/BanCommand.java
index 69b12135..df891b80 100644
--- a/src/main/java/org/bukkit/command/defaults/BanCommand.java
+++ b/src/main/java/org/bukkit/command/defaults/BanCommand.java
@@ -2,7 +2,9 @@ package org.bukkit.command.defaults;
import java.util.List;
+import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.Validate;
+import org.bukkit.BanList;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
@@ -27,8 +29,8 @@ public class BanCommand extends VanillaCommand {
return false;
}
- // TODO: Ban Reason support
- Bukkit.getOfflinePlayer(args[0]).setBanned(true);
+ String reason = args.length > 0 ? StringUtils.join(args, ' ', 1, args.length) : null;
+ Bukkit.getBanList(BanList.Type.NAME).addBan(args[0], reason, null, sender.getName());
Player player = Bukkit.getPlayer(args[0]);
if (player != null) {
diff --git a/src/main/java/org/bukkit/command/defaults/BanIpCommand.java b/src/main/java/org/bukkit/command/defaults/BanIpCommand.java
index 0d7b2997..6f7c8bd8 100644
--- a/src/main/java/org/bukkit/command/defaults/BanIpCommand.java
+++ b/src/main/java/org/bukkit/command/defaults/BanIpCommand.java
@@ -3,7 +3,9 @@ package org.bukkit.command.defaults;
import java.util.List;
import java.util.regex.Pattern;
+import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.Validate;
+import org.bukkit.BanList;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
@@ -30,9 +32,10 @@ public class BanIpCommand extends VanillaCommand {
return false;
}
- // TODO: Ban Reason support
+ String reason = args.length > 0 ? StringUtils.join(args, ' ', 1, args.length) : null;
+
if (ipValidity.matcher(args[0]).matches()) {
- processIPBan(args[0], sender);
+ processIPBan(args[0], sender, reason);
} else {
Player player = Bukkit.getPlayer(args[0]);
@@ -41,15 +44,21 @@ public class BanIpCommand extends VanillaCommand {
return false;
}
- processIPBan(player.getAddress().getAddress().getHostAddress(), sender);
+ processIPBan(player.getAddress().getAddress().getHostAddress(), sender, reason);
}
return true;
}
- private void processIPBan(String ip, CommandSender sender) {
- // TODO: Kick on ban
- Bukkit.banIP(ip);
+ private void processIPBan(String ip, CommandSender sender, String reason) {
+ Bukkit.getBanList(BanList.Type.IP).addBan(ip, reason, null, sender.getName());
+
+ // Find all matching players and kick
+ for (Player player : Bukkit.getOnlinePlayers()) {
+ if (player.getAddress().getAddress().getHostAddress().equals(ip)) {
+ player.kickPlayer("You have been IP banned.");
+ }
+ }
Command.broadcastCommandMessage(sender, "Banned IP Address " + ip);
}
diff --git a/src/main/java/org/bukkit/command/defaults/BanListCommand.java b/src/main/java/org/bukkit/command/defaults/BanListCommand.java
index 45f2ea03..262a2371 100644
--- a/src/main/java/org/bukkit/command/defaults/BanListCommand.java
+++ b/src/main/java/org/bukkit/command/defaults/BanListCommand.java
@@ -4,8 +4,10 @@ import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang.Validate;
+import org.bukkit.BanEntry;
+import org.bukkit.BanList;
import org.bukkit.Bukkit;
-import org.bukkit.OfflinePlayer;
+import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.util.StringUtil;
@@ -25,9 +27,18 @@ public class BanListCommand extends VanillaCommand {
public boolean execute(CommandSender sender, String currentAlias, String[] args) {
if (!testPermission(sender)) return true;
- // TODO: ips support
+ BanList.Type banType = BanList.Type.NAME;
+ if (args.length > 0) {
+ if (args[0].equalsIgnoreCase("ips")) {
+ banType = BanList.Type.IP;
+ } else if (!args[0].equalsIgnoreCase("players")) {
+ sender.sendMessage(ChatColor.RED + "Usage: " + usageMessage);
+ return false;
+ }
+ }
+
StringBuilder message = new StringBuilder();
- OfflinePlayer[] banlist = Bukkit.getServer().getBannedPlayers().toArray(new OfflinePlayer[0]);
+ BanEntry[] banlist = Bukkit.getBanList(banType).getBanEntries().toArray(new BanEntry[0]);
for (int x = 0; x < banlist.length; x++) {
if (x != 0) {
@@ -37,7 +48,7 @@ public class BanListCommand extends VanillaCommand {
message.append(", ");
}
}
- message.append(banlist[x].getName());
+ message.append(banlist[x].getTarget());
}
sender.sendMessage("There are " + banlist.length + " total banned players:");
diff --git a/src/main/java/org/bukkit/command/defaults/PardonCommand.java b/src/main/java/org/bukkit/command/defaults/PardonCommand.java
index 692f0f26..82c7a954 100644
--- a/src/main/java/org/bukkit/command/defaults/PardonCommand.java
+++ b/src/main/java/org/bukkit/command/defaults/PardonCommand.java
@@ -4,6 +4,7 @@ import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang.Validate;
+import org.bukkit.BanList;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.OfflinePlayer;
@@ -29,7 +30,7 @@ public class PardonCommand extends VanillaCommand {
return false;
}
- Bukkit.getOfflinePlayer(args[0]).setBanned(false);
+ Bukkit.getBanList(BanList.Type.NAME).pardon(args[0]);
Command.broadcastCommandMessage(sender, "Pardoned " + args[0]);
return true;
}