Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,15 +1,21 @@
package com.denizenscript.depenizen.bukkit.bridges;

import com.denizenscript.denizencore.DenizenCore;
import com.denizenscript.denizencore.objects.ObjectFetcher;
import com.denizenscript.denizencore.objects.core.DurationTag;
import com.denizenscript.denizencore.objects.core.ListTag;
import com.denizenscript.denizencore.tags.PseudoObjectTagBase;
import com.denizenscript.denizencore.tags.TagManager;
import com.denizenscript.depenizen.bukkit.Bridge;
import com.denizenscript.depenizen.bukkit.commands.luckperms.LuckPermsCommand;
import com.denizenscript.depenizen.bukkit.objects.luckperms.LuckPermsGroupTag;
import com.denizenscript.depenizen.bukkit.objects.luckperms.LuckPermsTrackTag;
import com.denizenscript.depenizen.bukkit.properties.luckperms.LuckPermsPlayerExtensions;
import net.luckperms.api.LuckPerms;
import net.luckperms.api.LuckPermsProvider;
import net.luckperms.api.node.types.PermissionNode;

import java.util.Collection;

public class LuckPermsBridge extends Bridge {

Expand Down Expand Up @@ -65,6 +71,7 @@ public void register() {
@Override
public void init() {
luckPermsInstance = LuckPermsProvider.get();
DenizenCore.commandRegistry.registerCommand(LuckPermsCommand.class);
LuckPermsPlayerExtensions.register();
ObjectFetcher.registerWithObjectFetcher(LuckPermsGroupTag.class, LuckPermsGroupTag.tagProcessor);
ObjectFetcher.registerWithObjectFetcher(LuckPermsTrackTag.class, LuckPermsTrackTag.tagProcessor);
Expand All @@ -81,4 +88,26 @@ public void init() {
return param;
});
}

public static DurationTag getPermissionExpiry(Collection<PermissionNode> nodes, String permission) {
PermissionNode bestNode = null;
int wildcardLevel = 0;
for (PermissionNode node : nodes) {
if (node.getKey().equalsIgnoreCase(permission)) {
bestNode = node;
break;
}
else if (node.isWildcard() && node.getWildcardLevel().isPresent()) {
int size = node.getKey().substring(0, node.getKey().length() - 1).length();
if (permission.length() < size || !permission.substring(0, size).equalsIgnoreCase(node.getKey().substring(0, size))) {
continue;
}
if (node.getWildcardLevel().getAsInt() > wildcardLevel) {
bestNode = node;
wildcardLevel = node.getWildcardLevel().getAsInt();
}
}
}
return bestNode != null ? new DurationTag(bestNode.getExpiryDuration() != null ? (int) bestNode.getExpiryDuration().getSeconds() : 0) : null;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
package com.denizenscript.depenizen.bukkit.commands.luckperms;

import com.denizenscript.denizen.objects.PlayerTag;
import com.denizenscript.denizencore.exceptions.InvalidArgumentsRuntimeException;
import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.objects.core.*;
import com.denizenscript.denizencore.scripts.ScriptEntry;
import com.denizenscript.denizencore.scripts.commands.AbstractCommand;
import com.denizenscript.denizencore.scripts.commands.generator.*;
import com.denizenscript.denizencore.utilities.debugging.Debug;
import com.denizenscript.denizencore.utilities.text.StringHolder;
import com.denizenscript.depenizen.bukkit.bridges.LuckPermsBridge;
import com.denizenscript.depenizen.bukkit.objects.luckperms.LuckPermsGroupTag;
import net.luckperms.api.model.user.User;
import net.luckperms.api.node.Node;
import net.luckperms.api.node.NodeBuilder;

import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

public class LuckPermsCommand extends AbstractCommand {

public LuckPermsCommand() {
setName("luckperms");
setSyntax("luckperms ({set}/unset) [users:<player>|.../groups:<group>|...] [permission] (state:{true}/false) (duration:<duration>) (contexts:<map>)");
setRequiredArguments(2, 6);
autoCompile();
}

// <--[command]
// @Name mcMMO
// @Syntax luckperms ({set}/unset) [users:<player>|.../groups:<group>|...] [permission] (state:{true}/false) (duration:<duration>) (contexts:<map>)
// @Group Depenizen
// @Plugin Depenizen, mcMMO
// @Required 2
// @Maximum 6
// @Short Edits LuckPerms permissions.
//
// @Description
// This command allows you to add or unset permission nodes from players and LuckPerms groups.
//
// The 'duration' argument specifies how long a player or group will have the specified permission
// before it is removed. Not using this argument will result in the permission staying until manually removed.
//
// The 'contexts' argument sets the contexts in which the permission and state specified is active.
// Format is in MapTag format: 'type=value'.
// The 'value' accepts a ListTag for multiple entries of the same key.
//
// @Tags
// <PlayerTag.has_permission[<permission.node>]>
// <PlayerTag.luckperms_permission_expiration[<permission.node>]>
// <LuckPermsGroupTag.has_permission[<permission.node>]>
// <LuckPermsGroupTag.permission_expiration[<permission.node>]>
//
// @Usage
// Use to give two players the 'dscript.help' permission.
// - luckperms set users:<[player]>|<[other_player]> dscript.help state:true
//
// @Usage
// Use to give a player the 'dscript.warp' permission for 5 minutes in the main world.
// - luckperms users:<player> dscript.warp duration:5m contexts:[world=world]
//
// @Usage
// Use to disallow two groups access to the 'dscript.spawn' permission in the nether and end.
// - luckperms groups:<[group]>|<[other_group]> dscript.spawn state:false contexts:[dimension_type=the_nether|the_end]
//
// @Usage
// Use to unset the 'dscript.ban' permission back to the default for a player when in survival mode on the hub server.
// - luckperms unset users:<player> dscript.ban contexts:[gamemode=survival;server=hub]
//
// -->

public enum Action {SET, UNSET}

public static void autoExecute(ScriptEntry scriptEntry,
@ArgName("action") @ArgDefaultText("set") Action action,
@ArgName("user") @ArgPrefixed @ArgDefaultNull @ArgSubType(PlayerTag.class) List<PlayerTag> players,
@ArgName("group") @ArgPrefixed @ArgDefaultNull @ArgSubType(LuckPermsGroupTag.class) List<LuckPermsGroupTag> groups,
@ArgName("permission") @ArgLinear String permission,
@ArgName("state") @ArgPrefixed @ArgDefaultText("true") boolean state,
@ArgName("duration") @ArgPrefixed @ArgDefaultNull DurationTag duration,
@ArgName("contexts") @ArgPrefixed @ArgDefaultNull MapTag contexts) {
if (players == null && groups == null) {
throw new InvalidArgumentsRuntimeException("Must specify either players or groups!");
}
if (players != null && groups != null) {
throw new InvalidArgumentsRuntimeException("Cannot specify both players and groups!");
}
NodeBuilder<?, ?> nodeBuilder = Node.builder(permission).value(state);
if (duration != null) {
nodeBuilder = nodeBuilder.expiry((long) duration.getSeconds(), TimeUnit.SECONDS);
}
if (contexts != null) {
for (Map.Entry<StringHolder, ObjectTag> entry : contexts.entrySet()) {
for (String value : entry.getValue().asType(ListTag.class, scriptEntry.context)) {
nodeBuilder = nodeBuilder.withContext(entry.getKey().low, value);
}
}
}
Node node = nodeBuilder.build();
switch (action) {
case SET: {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we could use that new switch without needing to break it

if (players != null) {
for (PlayerTag player : players) {
User user = LuckPermsBridge.luckPermsInstance.getUserManager().getUser(player.getUUID());
if (user == null) {
Debug.echoError("User " + player.getUUID() + " does not exist, have they joined the server before?");
continue;
}
user.data().add(node);
LuckPermsBridge.luckPermsInstance.getUserManager().saveUser(user);
}
}
else {
for (LuckPermsGroupTag group : groups) {
group.getGroup().data().add(node);
LuckPermsBridge.luckPermsInstance.getGroupManager().saveGroup(group.getGroup());
}
}
}
case UNSET: {
if (players != null) {
for (PlayerTag player : players) {
User user = LuckPermsBridge.luckPermsInstance.getUserManager().getUser(player.getUUID());
if (user == null) {
Debug.echoError("User " + player.getUUID() + " does not exist, have they joined the server before?");
continue;
}
user.data().remove(node);
LuckPermsBridge.luckPermsInstance.getUserManager().saveUser(user);
}
}
else {
for (LuckPermsGroupTag group : groups) {
group.getGroup().data().remove(node);
LuckPermsBridge.luckPermsInstance.getGroupManager().saveGroup(group.getGroup());
}
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,14 @@

import com.denizenscript.denizencore.objects.Fetchable;
import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.objects.core.DurationTag;
import com.denizenscript.denizencore.objects.core.ElementTag;
import com.denizenscript.denizencore.tags.Attribute;
import com.denizenscript.denizencore.tags.ObjectTagProcessor;
import com.denizenscript.denizencore.tags.TagContext;
import com.denizenscript.depenizen.bukkit.bridges.LuckPermsBridge;
import net.luckperms.api.model.group.Group;
import net.luckperms.api.node.NodeType;

import java.util.OptionalInt;

Expand Down Expand Up @@ -153,6 +155,18 @@ public static void register() {
tagProcessor.registerTag(ElementTag.class, ElementTag.class, "has_permission", (attribute, object, p) -> {
return new ElementTag(object.getGroup().getCachedData().getPermissionData().checkPermission(p.asString()).asBoolean());
});

// <--[tag]
// @attribute <LuckPermsGroupTag.permission_expiration[<permission.node>]>
// @returns DurationTag
// @plugin Depenizen, LuckPerms
// @description
// Returns how long a group has a permission for.
// If the group does not have the specific permission set, this will return the time for the closest wildcard permission, if any.
// -->
tagProcessor.registerTag(DurationTag.class, ElementTag.class, "permission_expiration", (attribute, object, p) -> {
return LuckPermsBridge.getPermissionExpiry(object.getGroup().getNodes(NodeType.PERMISSION), p.asString());
});
}

public static ObjectTagProcessor<LuckPermsGroupTag> tagProcessor = new ObjectTagProcessor<>();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.denizenscript.depenizen.bukkit.properties.luckperms;

import com.denizenscript.denizen.objects.PlayerTag;
import com.denizenscript.denizencore.objects.core.DurationTag;
import com.denizenscript.denizencore.objects.core.ElementTag;
import com.denizenscript.denizencore.objects.core.ListTag;
import com.denizenscript.depenizen.bukkit.bridges.LuckPermsBridge;
import com.denizenscript.depenizen.bukkit.objects.luckperms.LuckPermsGroupTag;
Expand Down Expand Up @@ -67,5 +69,17 @@ public static void register() {
return new LuckPermsGroupTag(group);
});

// <--[tag]
// @attribute <PlayerTag.luckperms_permission_expiration[<permission.node>]>
// @returns DurationTag
// @plugin Depenizen, LuckPerms
// @description
// Returns how long a player has a permission for.
// If the player does not have the specific permission set, this will return the time for the closest wildcard permission, if any.
// -->
PlayerTag.tagProcessor.registerTag(DurationTag.class, ElementTag.class, "luckperms_permission_expiration", (attribute, player, param) -> {
User user = LuckPermsBridge.luckPermsInstance.getUserManager().getUser(player.getUUID());
return user != null ? LuckPermsBridge.getPermissionExpiry(user.getNodes(NodeType.PERMISSION), param.asString()) : null;
});
}
}