diff --git a/src/main/java/com/garbagemule/MobArena/things/PermissionThing.java b/src/main/java/com/garbagemule/MobArena/things/PermissionThing.java new file mode 100644 index 0000000..3f04ed4 --- /dev/null +++ b/src/main/java/com/garbagemule/MobArena/things/PermissionThing.java @@ -0,0 +1,63 @@ +package com.garbagemule.MobArena.things; + +import com.garbagemule.MobArena.MobArena; +import org.bukkit.entity.Player; +import org.bukkit.permissions.PermissionAttachment; +import org.bukkit.permissions.PermissionAttachmentInfo; + +public class PermissionThing implements Thing { + private final String perm; + private final boolean value; + private final MobArena plugin; + + public PermissionThing(String perm, boolean value, MobArena plugin) { + this.perm = perm; + this.value = value; + this.plugin = plugin; + } + + @Override + public boolean giveTo(Player player) { + removeExistingAttachment(player); + PermissionAttachment attachment = player.addAttachment(plugin); + attachment.setPermission(perm, value); + return true; + } + + @Override + public boolean takeFrom(Player player) { + removeExistingAttachment(player); + return true; + } + + private void removeExistingAttachment(Player player) { + player.getEffectivePermissions().stream() + .filter(info -> info.getAttachment() != null) + .filter(info -> info.getAttachment().getPlugin().equals(plugin)) + .filter(info -> info.getPermission().equals(perm)) + .map(PermissionAttachmentInfo::getAttachment) + .findAny() + .ifPresent(PermissionAttachment::remove); + } + + String getPermission() { + return perm; + } + + boolean getValue() { + return value; + } + + @Override + public boolean heldBy(Player player) { + return player.hasPermission(perm); + } + + @Override + public String toString() { + if (value) { + return perm; + } + return "-" + perm; + } +} diff --git a/src/main/java/com/garbagemule/MobArena/things/PermissionThingParser.java b/src/main/java/com/garbagemule/MobArena/things/PermissionThingParser.java new file mode 100644 index 0000000..d1435c1 --- /dev/null +++ b/src/main/java/com/garbagemule/MobArena/things/PermissionThingParser.java @@ -0,0 +1,33 @@ +package com.garbagemule.MobArena.things; + +import com.garbagemule.MobArena.MobArena; + +class PermissionThingParser implements ThingParser { + private static final String PREFIX = "perm:"; + + private MobArena plugin; + + PermissionThingParser(MobArena plugin) { + this.plugin = plugin; + } + + @Override + public PermissionThing parse(String s) { + String value = trimPrefix(s); + if (value == null) { + return null; + } + + if (value.startsWith("-") || value.startsWith("^")) { + return new PermissionThing(value.substring(1), false, plugin); + } + return new PermissionThing(value, true, plugin); + } + + private String trimPrefix(String s) { + if (s.startsWith(PREFIX)) { + return s.substring(PREFIX.length()); + } + return null; + } +} diff --git a/src/main/java/com/garbagemule/MobArena/things/ThingManager.java b/src/main/java/com/garbagemule/MobArena/things/ThingManager.java index 71c4428..31927ea 100644 --- a/src/main/java/com/garbagemule/MobArena/things/ThingManager.java +++ b/src/main/java/com/garbagemule/MobArena/things/ThingManager.java @@ -13,6 +13,7 @@ public class ThingManager implements ThingParser { parsers = new ArrayList<>(); parsers.add(new CommandThingParser()); parsers.add(new MoneyThingParser(plugin)); + parsers.add(new PermissionThingParser(plugin)); parsers.add(new PotionEffectThingParser()); items = parser; } diff --git a/src/test/java/com/garbagemule/MobArena/things/PermissionThingParserTest.java b/src/test/java/com/garbagemule/MobArena/things/PermissionThingParserTest.java new file mode 100644 index 0000000..41b1690 --- /dev/null +++ b/src/test/java/com/garbagemule/MobArena/things/PermissionThingParserTest.java @@ -0,0 +1,65 @@ +package com.garbagemule.MobArena.things; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.nullValue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.mockito.Mockito.mock; + +import com.garbagemule.MobArena.MobArena; +import org.junit.Before; +import org.junit.Test; + +public class PermissionThingParserTest { + + private PermissionThingParser subject; + + @Before + public void setup() { + MobArena plugin = mock(MobArena.class); + subject = new PermissionThingParser(plugin); + } + + @Test + public void noPrefixNoPerms() { + String input = "mobarena.use.join"; + + PermissionThing result = subject.parse(input); + + assertThat(result, is(nullValue())); + } + + @Test + public void grant() { + String perm = "mobarena.use.leave"; + String input = "perm:" + perm; + + PermissionThing result = subject.parse(input); + + assertThat(result.getPermission(), equalTo(perm)); + assertThat(result.getValue(), equalTo(true)); + } + + @Test + public void denyMinus() { + String perm = "mobarena.setup.addarena"; + String input = "perm:-" + perm; + + PermissionThing result = subject.parse(input); + + assertThat(result.getPermission(), equalTo(perm)); + assertThat(result.getValue(), equalTo(false)); + } + + @Test + public void denyCaret() { + String perm = "mobarena.use.join"; + String input = "perm:^" + perm; + + PermissionThing result = subject.parse(input); + + assertThat(result.getPermission(), equalTo(perm)); + assertThat(result.getValue(), equalTo(false)); + } + +}