Skip to content

Commit

Permalink
Implement PermissionChecker pointer on NeoForge
Browse files Browse the repository at this point in the history
  • Loading branch information
jpenilla committed Jul 29, 2024
1 parent d497b01 commit e9f9d0c
Showing 1 changed file with 37 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,11 @@
package net.kyori.adventure.platform.neoforge.impl;

import com.google.auto.service.AutoService;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import java.util.Objects;
import java.util.concurrent.ExecutionException;
import net.kyori.adventure.permission.PermissionChecker;
import net.kyori.adventure.platform.modcommon.impl.AdventureCommon;
import net.kyori.adventure.platform.modcommon.impl.ClickCallbackRegistry;
import net.kyori.adventure.platform.modcommon.impl.LocaleHolderBridge;
Expand All @@ -38,13 +42,19 @@
import net.kyori.adventure.platform.neoforge.impl.services.DataComponentValueConverterProvider;
import net.kyori.adventure.platform.neoforge.impl.services.GsonComponentSerializerProviderImpl;
import net.kyori.adventure.platform.neoforge.impl.services.PlainTextComponentSerializerProviderImpl;
import net.kyori.adventure.pointer.Pointered;
import net.kyori.adventure.pointer.Pointers;
import net.kyori.adventure.util.TriState;
import net.minecraft.server.level.ServerPlayer;
import net.neoforged.api.distmarker.Dist;
import net.neoforged.fml.common.Mod;
import net.neoforged.fml.loading.FMLLoader;
import net.neoforged.neoforge.common.NeoForge;
import net.neoforged.neoforge.event.RegisterCommandsEvent;
import net.neoforged.neoforge.event.entity.player.ClientInformationUpdatedEvent;
import net.neoforged.neoforge.server.permission.PermissionAPI;
import net.neoforged.neoforge.server.permission.nodes.PermissionNode;
import net.neoforged.neoforge.server.permission.nodes.PermissionTypes;
import org.jetbrains.annotations.Nullable;

@Mod("adventure_platform_neoforge")
Expand Down Expand Up @@ -88,6 +98,8 @@ public AdventureNeoforgeCommon() {

@AutoService(PlatformHooks.class)
public static final class ForgeHooks implements PlatformHooks {
private static final Cache<String, PermissionNode<Boolean>> PERMISSION_NODE_CACHE = CacheBuilder.newBuilder().maximumSize(100).build();
private static final PermissionNode<Boolean> NULL = new PermissionNode<>("adventure", "null", PermissionTypes.BOOLEAN, (player, playerUUID, context) -> true);

@Override
public SidedProxy sidedProxy() {
Expand All @@ -105,5 +117,30 @@ public void updateTabList(
footer == null ? player.getTabListFooter() : footer
);
}

@Override
public void collectPointers(final Pointered pointered, final Pointers.Builder builder) {
PlatformHooks.super.collectPointers(pointered, builder);
if (pointered instanceof ServerPlayer player) {
builder.withStatic(PermissionChecker.POINTER, perm -> this.hasPermission(player, perm));
}
}

@SuppressWarnings("unchecked")
private TriState hasPermission(final ServerPlayer player, final String permission) {
final PermissionNode<Boolean> node;
try {
node = PERMISSION_NODE_CACHE.get(permission, () -> (PermissionNode<Boolean>) PermissionAPI.getRegisteredNodes().stream()
.filter(n -> n.getNodeName().equals(permission) && n.getType() == PermissionTypes.BOOLEAN)
.findFirst()
.orElse(NULL));
} catch (final ExecutionException e) {
throw new RuntimeException(e);
}
if (node == NULL) {
return TriState.NOT_SET;
}
return TriState.byBoolean(PermissionAPI.getPermission(player, node));
}
}
}

0 comments on commit e9f9d0c

Please sign in to comment.