Use the Things API for per-class permissions.

This replaces the Map<String, Boolean> approach in ArenaClass with a List<Thing> approach. This greatly simplifies how per-class permissions are handled.
This commit is contained in:
Andreas Troelsen 2018-06-24 13:02:46 +02:00
parent c1d1728144
commit a9d0ca0828
4 changed files with 32 additions and 86 deletions

View File

@ -10,16 +10,11 @@ import org.bukkit.Material;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.PlayerInventory; import org.bukkit.inventory.PlayerInventory;
import org.bukkit.permissions.PermissionAttachment;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.EnumSet; import java.util.EnumSet;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.stream.IntStream; import java.util.stream.IntStream;
public class ArenaClass public class ArenaClass
@ -29,8 +24,8 @@ public class ArenaClass
private List<Thing> armor; private List<Thing> armor;
private List<Thing> items; private List<Thing> items;
private List<Thing> effects; private List<Thing> effects;
private Map<String,Boolean> perms; private List<Thing> perms;
private Map<String,Boolean> lobbyperms; private List<Thing> lobbyperms;
private boolean unbreakableWeapons, unbreakableArmor; private boolean unbreakableWeapons, unbreakableArmor;
private Thing price; private Thing price;
private Location classchest; private Location classchest;
@ -46,8 +41,8 @@ public class ArenaClass
this.items = new ArrayList<>(); this.items = new ArrayList<>();
this.armor = new ArrayList<>(4); this.armor = new ArrayList<>(4);
this.effects = new ArrayList<>(); this.effects = new ArrayList<>();
this.perms = new HashMap<>(); this.perms = new ArrayList<>();
this.lobbyperms = new HashMap<>(); this.lobbyperms = new ArrayList<>();
this.unbreakableWeapons = unbreakableWeapons; this.unbreakableWeapons = unbreakableWeapons;
this.unbreakableArmor = unbreakableArmor; this.unbreakableArmor = unbreakableArmor;
@ -178,66 +173,35 @@ public class ArenaClass
/** /**
* Add a permission value to the class. * Add a permission value to the class.
* @param perm the permission
* @param value the value
*/ */
public void addPermission(String perm, boolean value) { public void addPermission(Thing permission) {
perms.put(perm, value); perms.add(permission);
} }
/** /**
* Get an unmodifiable map of permissions and values for the class. * Get an unmodifiable map of permissions and values for the class.
* @return a map of permissions and values * @return a map of permissions and values
*/ */
public Map<String,Boolean> getPermissions() { public List<Thing> getPermissions() {
return Collections.unmodifiableMap(perms); return Collections.unmodifiableList(perms);
} }
public void addLobbyPermission(String perm, boolean value) { public void addLobbyPermission(Thing permission) {
lobbyperms.put(perm, value); lobbyperms.add(permission);
}
public Map<String,Boolean> getLobbyPermissions() {
return Collections.unmodifiableMap(lobbyperms);
} }
/** /**
* Grant the given player all the permissions of the class. * Grant the given player all the permissions of the class.
* All permissions will be attached to a PermissionAttachment object, which * All permissions will be attached to a PermissionAttachment object, which
* will be returned to the caller. * will be returned to the caller.
* @param plugin a MobArena instance
* @param p a player * @param p a player
* @return the PermissionAttachment with all the permissions
*/ */
public PermissionAttachment grantPermissions(MobArena plugin, Player p) { public void grantPermissions(Player p) {
if (perms.isEmpty()) return null; perms.forEach(perm -> perm.giveTo(p));
PermissionAttachment pa = p.addAttachment(plugin);
grantPerms(pa, perms, p);
return pa;
} }
public PermissionAttachment grantLobbyPermissions(MobArena plugin, Player p) { public void grantLobbyPermissions(Player p) {
if (lobbyperms.isEmpty()) return null; lobbyperms.forEach(perm -> perm.giveTo(p));
PermissionAttachment pa = p.addAttachment(plugin);
grantPerms(pa, lobbyperms, p);
return pa;
}
private void grantPerms(PermissionAttachment pa, Map<String,Boolean> map, Player p) {
for (Entry<String,Boolean> entry : map.entrySet()) {
try {
pa.setPermission(entry.getKey(), entry.getValue());
}
catch (Exception e) {
String perm = entry.getKey() + ":" + entry.getValue();
String player = p.getName();
pa.getPlugin().getLogger().warning("[PERM00] Failed to attach permission '" + perm + "' to player '" + player + " with class " + this.configName
+ "'.\nPlease verify that your class permissions are well-formed.");
}
}
} }
public Location getClassChest() { public Location getClassChest() {

View File

@ -1166,7 +1166,7 @@ public class ArenaImpl implements Arena
removePotionEffects(p); removePotionEffects(p);
arenaPlayer.setArenaClass(arenaClass); arenaPlayer.setArenaClass(arenaClass);
arenaClass.grantItems(p); arenaClass.grantItems(p);
arenaClass.grantLobbyPermissions(plugin, p); arenaClass.grantLobbyPermissions(p);
autoReady(p); autoReady(p);
} }
@ -1240,7 +1240,7 @@ public class ArenaImpl implements Arena
inv.setBoots(boots); inv.setBoots(boots);
inv.setItemInOffHand(offhand); inv.setItemInOffHand(offhand);
arenaClass.grantLobbyPermissions(plugin, p); arenaClass.grantLobbyPermissions(p);
autoReady(p); autoReady(p);
} }
@ -1290,7 +1290,7 @@ public class ArenaImpl implements Arena
return; return;
} }
removePermissionAttachments(player); removePermissionAttachments(player);
arenaClass.grantPermissions(plugin, player); arenaClass.grantPermissions(player);
} }
private void removePermissionAttachments(Player player) { private void removePermissionAttachments(Player player) {

View File

@ -425,33 +425,19 @@ public class ArenaMasterImpl implements ArenaMaster
} }
private void loadClassPermissions(ArenaClass arenaClass, ConfigurationSection section) { private void loadClassPermissions(ArenaClass arenaClass, ConfigurationSection section) {
List<String> perms = section.getStringList("permissions"); section.getStringList("permissions").stream()
if (perms.isEmpty()) return; .map(perm -> "perm:" + perm)
.map(plugin.getThingManager()::parse)
for (String perm : perms) { .filter(Objects::nonNull)
// If the permission starts with - or ^, it must be revoked. .forEach(arenaClass::addPermission);
boolean value = true;
if (perm.startsWith("-") || perm.startsWith("^")) {
perm = perm.substring(1).trim();
value = false;
}
arenaClass.addPermission(perm, value);
}
} }
private void loadClassLobbyPermissions(ArenaClass arenaClass, ConfigurationSection section) { private void loadClassLobbyPermissions(ArenaClass arenaClass, ConfigurationSection section) {
List<String> perms = section.getStringList("lobby-permissions"); section.getStringList("lobby-permissions").stream()
if (perms.isEmpty()) return; .map(perm -> "perm:" + perm)
.map(plugin.getThingManager()::parse)
for (String perm : perms) { .filter(Objects::nonNull)
// If the permission starts with - or ^, it must be revoked. .forEach(arenaClass::addLobbyPermission);
boolean value = true;
if (perm.startsWith("-") || perm.startsWith("^")) {
perm = perm.substring(1).trim();
value = false;
}
arenaClass.addLobbyPermission(perm, value);
}
} }
public ArenaClass createClassNode(String classname, PlayerInventory inv, boolean safe) { public ArenaClass createClassNode(String classname, PlayerInventory inv, boolean safe) {

View File

@ -4,11 +4,11 @@ import com.garbagemule.MobArena.ArenaClass;
import com.garbagemule.MobArena.commands.Command; import com.garbagemule.MobArena.commands.Command;
import com.garbagemule.MobArena.commands.CommandInfo; import com.garbagemule.MobArena.commands.CommandInfo;
import com.garbagemule.MobArena.framework.ArenaMaster; import com.garbagemule.MobArena.framework.ArenaMaster;
import com.garbagemule.MobArena.things.Thing;
import com.garbagemule.MobArena.util.TextUtils; import com.garbagemule.MobArena.util.TextUtils;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import java.util.Map; import java.util.List;
import java.util.Map.Entry;
@CommandInfo( @CommandInfo(
name = "listclassperms", name = "listclassperms",
@ -33,18 +33,14 @@ public class ListClassPermsCommand implements Command
} }
am.getGlobalMessenger().tell(sender, "Permissions for '" + className + "':"); am.getGlobalMessenger().tell(sender, "Permissions for '" + className + "':");
Map<String,Boolean> perms = arenaClass.getPermissions(); List<Thing> perms = arenaClass.getPermissions();
if (perms.isEmpty()) { if (perms.isEmpty()) {
am.getGlobalMessenger().tell(sender, "<none>"); am.getGlobalMessenger().tell(sender, "<none>");
return true; return true;
} }
for (Entry<String,Boolean> entry : arenaClass.getPermissions().entrySet()) { for (Thing perm : perms) {
String perm = entry.getKey(); am.getGlobalMessenger().tell(sender, perm.toString());
if (!entry.getValue()) {
perm = "^" + perm;
}
am.getGlobalMessenger().tell(sender, "- " + perm);
} }
return true; return true;
} }