diff --git a/api/src/main/java/me/lucko/luckperms/api/LuckPermsApi.java b/api/src/main/java/me/lucko/luckperms/api/LuckPermsApi.java index 0fc35278..f8bf13e1 100644 --- a/api/src/main/java/me/lucko/luckperms/api/LuckPermsApi.java +++ b/api/src/main/java/me/lucko/luckperms/api/LuckPermsApi.java @@ -40,6 +40,9 @@ import me.lucko.luckperms.api.platform.PlatformInfo; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; +import javafx.print.Collation; + +import java.util.Collection; import java.util.Optional; import java.util.Set; import java.util.UUID; @@ -210,6 +213,14 @@ public interface LuckPermsApi { */ @NonNull ContextManager getContextManager(); + /** + * Gets a {@link Collection} of all known permission strings. + * + * @return a collection of the known permissions + * @since 4.4 + */ + @NonNull Collection getKnownPermissions(); + /** * Gets the {@link NodeFactory}. * diff --git a/common/src/main/java/me/lucko/luckperms/common/api/LuckPermsApiProvider.java b/common/src/main/java/me/lucko/luckperms/common/api/LuckPermsApiProvider.java index 7ede9ced..24b1e685 100644 --- a/common/src/main/java/me/lucko/luckperms/common/api/LuckPermsApiProvider.java +++ b/common/src/main/java/me/lucko/luckperms/common/api/LuckPermsApiProvider.java @@ -56,6 +56,7 @@ import me.lucko.luckperms.common.plugin.LuckPermsPlugin; import org.checkerframework.checker.nullness.qual.NonNull; +import java.util.Collection; import java.util.Optional; import java.util.concurrent.CompletableFuture; @@ -154,6 +155,11 @@ public class LuckPermsApiProvider implements LuckPermsApi { return this.contextManager; } + @Override + public @NonNull Collection getKnownPermissions() { + return this.plugin.getPermissionRegistry().rootAsList(); + } + @Override public @NonNull NodeFactory getNodeFactory() { return ApiNodeFactory.INSTANCE; diff --git a/common/src/main/java/me/lucko/luckperms/common/treeview/PermissionRegistry.java b/common/src/main/java/me/lucko/luckperms/common/treeview/PermissionRegistry.java index 8c6730a9..396a2066 100644 --- a/common/src/main/java/me/lucko/luckperms/common/treeview/PermissionRegistry.java +++ b/common/src/main/java/me/lucko/luckperms/common/treeview/PermissionRegistry.java @@ -28,6 +28,7 @@ package me.lucko.luckperms.common.treeview; import com.google.common.base.Splitter; import me.lucko.luckperms.common.plugin.scheduler.SchedulerAdapter; +import me.lucko.luckperms.common.util.ImmutableCollectors; import me.lucko.luckperms.common.util.RepeatingTask; import java.util.List; @@ -82,7 +83,7 @@ public class PermissionRegistry extends RepeatingTask { } public List rootAsList() { - return this.rootNode.makeImmutableCopy().getNodeEndings().stream().map(Map.Entry::getValue).collect(Collectors.toList()); + return this.rootNode.makeImmutableCopy().getNodeEndings().stream().map(Map.Entry::getValue).collect(ImmutableCollectors.toList()); } public int getSize() { diff --git a/sponge/sponge-service-api6/src/main/java/me/lucko/luckperms/sponge/service/proxy/api6/DescriptionBuilder.java b/sponge/sponge-service-api6/src/main/java/me/lucko/luckperms/sponge/service/proxy/api6/DescriptionBuilder.java index 04db2e41..5be56ca0 100644 --- a/sponge/sponge-service-api6/src/main/java/me/lucko/luckperms/sponge/service/proxy/api6/DescriptionBuilder.java +++ b/sponge/sponge-service-api6/src/main/java/me/lucko/luckperms/sponge/service/proxy/api6/DescriptionBuilder.java @@ -31,6 +31,7 @@ import me.lucko.luckperms.sponge.service.model.LPPermissionDescription; import me.lucko.luckperms.sponge.service.model.LPPermissionService; import me.lucko.luckperms.sponge.service.model.LPSubject; import me.lucko.luckperms.sponge.service.model.LPSubjectCollection; +import me.lucko.luckperms.sponge.service.model.ProxiedServiceObject; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; @@ -43,7 +44,16 @@ import java.util.HashMap; import java.util.Map; import java.util.Objects; -public final class DescriptionBuilder implements PermissionDescription.Builder { +public final class DescriptionBuilder implements PermissionDescription.Builder, ProxiedServiceObject { + + public static LPPermissionDescription registerDescription(LPPermissionService service, PermissionDescription description) { + //noinspection ConstantConditions + if (description.getOwner() == null) { + return null; + } + return service.registerPermissionDescription(description.getId(), description.getDescription(), description.getOwner()); + } + private final @NonNull LPPermissionService service; private final @NonNull PluginContainer container; private final @NonNull Map roles = new HashMap<>(); diff --git a/sponge/sponge-service-api6/src/main/java/me/lucko/luckperms/sponge/service/proxy/api6/PermissionDescriptionProxy.java b/sponge/sponge-service-api6/src/main/java/me/lucko/luckperms/sponge/service/proxy/api6/PermissionDescriptionProxy.java index 1fab7505..e59f41c7 100644 --- a/sponge/sponge-service-api6/src/main/java/me/lucko/luckperms/sponge/service/proxy/api6/PermissionDescriptionProxy.java +++ b/sponge/sponge-service-api6/src/main/java/me/lucko/luckperms/sponge/service/proxy/api6/PermissionDescriptionProxy.java @@ -28,6 +28,7 @@ package me.lucko.luckperms.sponge.service.proxy.api6; import me.lucko.luckperms.common.util.ImmutableCollectors; import me.lucko.luckperms.sponge.service.model.LPPermissionDescription; import me.lucko.luckperms.sponge.service.model.LPPermissionService; +import me.lucko.luckperms.sponge.service.model.ProxiedServiceObject; import org.checkerframework.checker.nullness.qual.NonNull; import org.spongepowered.api.Sponge; @@ -38,7 +39,7 @@ import org.spongepowered.api.text.Text; import java.util.Map; -public final class PermissionDescriptionProxy implements PermissionDescription { +public final class PermissionDescriptionProxy implements PermissionDescription, ProxiedServiceObject { private final LPPermissionService service; private final LPPermissionDescription handle; diff --git a/sponge/sponge-service-api6/src/main/java/me/lucko/luckperms/sponge/service/proxy/api6/PermissionServiceProxy.java b/sponge/sponge-service-api6/src/main/java/me/lucko/luckperms/sponge/service/proxy/api6/PermissionServiceProxy.java index 65999263..18e278ec 100644 --- a/sponge/sponge-service-api6/src/main/java/me/lucko/luckperms/sponge/service/proxy/api6/PermissionServiceProxy.java +++ b/sponge/sponge-service-api6/src/main/java/me/lucko/luckperms/sponge/service/proxy/api6/PermissionServiceProxy.java @@ -28,6 +28,7 @@ package me.lucko.luckperms.sponge.service.proxy.api6; import me.lucko.luckperms.common.util.ImmutableCollectors; import me.lucko.luckperms.sponge.service.model.LPPermissionDescription; import me.lucko.luckperms.sponge.service.model.LPPermissionService; +import me.lucko.luckperms.sponge.service.model.ProxiedServiceObject; import org.checkerframework.checker.nullness.qual.NonNull; import org.spongepowered.api.Sponge; @@ -42,7 +43,7 @@ import java.util.Collection; import java.util.Map; import java.util.Optional; -public final class PermissionServiceProxy implements PermissionService { +public final class PermissionServiceProxy implements PermissionService, ProxiedServiceObject { private final LPPermissionService handle; public PermissionServiceProxy(LPPermissionService handle) { diff --git a/sponge/sponge-service-api6/src/main/java/me/lucko/luckperms/sponge/service/proxy/api6/SubjectCollectionProxy.java b/sponge/sponge-service-api6/src/main/java/me/lucko/luckperms/sponge/service/proxy/api6/SubjectCollectionProxy.java index 1fbab208..b9628cda 100644 --- a/sponge/sponge-service-api6/src/main/java/me/lucko/luckperms/sponge/service/proxy/api6/SubjectCollectionProxy.java +++ b/sponge/sponge-service-api6/src/main/java/me/lucko/luckperms/sponge/service/proxy/api6/SubjectCollectionProxy.java @@ -30,6 +30,7 @@ import me.lucko.luckperms.sponge.service.CompatibilityUtil; import me.lucko.luckperms.sponge.service.model.LPPermissionService; import me.lucko.luckperms.sponge.service.model.LPSubject; import me.lucko.luckperms.sponge.service.model.LPSubjectCollection; +import me.lucko.luckperms.sponge.service.model.ProxiedServiceObject; import org.checkerframework.checker.nullness.qual.NonNull; import org.spongepowered.api.service.context.Context; @@ -41,7 +42,7 @@ import java.util.Map; import java.util.Set; @SuppressWarnings("unchecked") -public final class SubjectCollectionProxy implements SubjectCollection { +public final class SubjectCollectionProxy implements SubjectCollection, ProxiedServiceObject { private final LPPermissionService service; private final LPSubjectCollection handle; diff --git a/sponge/sponge-service-api6/src/main/java/me/lucko/luckperms/sponge/service/proxy/api6/SubjectDataProxy.java b/sponge/sponge-service-api6/src/main/java/me/lucko/luckperms/sponge/service/proxy/api6/SubjectDataProxy.java index 82588d82..67b69409 100644 --- a/sponge/sponge-service-api6/src/main/java/me/lucko/luckperms/sponge/service/proxy/api6/SubjectDataProxy.java +++ b/sponge/sponge-service-api6/src/main/java/me/lucko/luckperms/sponge/service/proxy/api6/SubjectDataProxy.java @@ -31,6 +31,7 @@ import me.lucko.luckperms.sponge.service.model.LPPermissionService; import me.lucko.luckperms.sponge.service.model.LPSubject; import me.lucko.luckperms.sponge.service.model.LPSubjectData; import me.lucko.luckperms.sponge.service.model.LPSubjectReference; +import me.lucko.luckperms.sponge.service.model.ProxiedServiceObject; import org.checkerframework.checker.nullness.qual.NonNull; import org.spongepowered.api.service.context.Context; @@ -44,7 +45,7 @@ import java.util.Set; import java.util.concurrent.CompletableFuture; @SuppressWarnings("unchecked") -public final class SubjectDataProxy implements SubjectData { +public final class SubjectDataProxy implements SubjectData, ProxiedServiceObject { private final LPPermissionService service; private final LPSubjectReference ref; private final boolean enduring; diff --git a/sponge/sponge-service-api6/src/main/java/me/lucko/luckperms/sponge/service/proxy/api6/SubjectProxy.java b/sponge/sponge-service-api6/src/main/java/me/lucko/luckperms/sponge/service/proxy/api6/SubjectProxy.java index d910c00e..e06905d1 100644 --- a/sponge/sponge-service-api6/src/main/java/me/lucko/luckperms/sponge/service/proxy/api6/SubjectProxy.java +++ b/sponge/sponge-service-api6/src/main/java/me/lucko/luckperms/sponge/service/proxy/api6/SubjectProxy.java @@ -33,6 +33,7 @@ import me.lucko.luckperms.sponge.service.CompatibilityUtil; import me.lucko.luckperms.sponge.service.model.LPPermissionService; import me.lucko.luckperms.sponge.service.model.LPSubject; import me.lucko.luckperms.sponge.service.model.LPSubjectReference; +import me.lucko.luckperms.sponge.service.model.ProxiedServiceObject; import me.lucko.luckperms.sponge.service.model.ProxiedSubject; import org.checkerframework.checker.nullness.qual.NonNull; @@ -49,7 +50,7 @@ import java.util.Set; import java.util.concurrent.CompletableFuture; @SuppressWarnings("unchecked") -public final class SubjectProxy implements Subject, ProxiedSubject { +public final class SubjectProxy implements Subject, ProxiedSubject, ProxiedServiceObject { private final LPPermissionService service; private final LPSubjectReference ref; diff --git a/sponge/sponge-service-api7/src/main/java/me/lucko/luckperms/sponge/service/proxy/api7/DescriptionBuilder.java b/sponge/sponge-service-api7/src/main/java/me/lucko/luckperms/sponge/service/proxy/api7/DescriptionBuilder.java index 1c46a5fa..4d68e3d7 100644 --- a/sponge/sponge-service-api7/src/main/java/me/lucko/luckperms/sponge/service/proxy/api7/DescriptionBuilder.java +++ b/sponge/sponge-service-api7/src/main/java/me/lucko/luckperms/sponge/service/proxy/api7/DescriptionBuilder.java @@ -31,6 +31,7 @@ import me.lucko.luckperms.sponge.service.model.LPPermissionDescription; import me.lucko.luckperms.sponge.service.model.LPPermissionService; import me.lucko.luckperms.sponge.service.model.LPSubject; import me.lucko.luckperms.sponge.service.model.LPSubjectCollection; +import me.lucko.luckperms.sponge.service.model.ProxiedServiceObject; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; @@ -43,7 +44,15 @@ import java.util.HashMap; import java.util.Map; import java.util.Objects; -public final class DescriptionBuilder implements PermissionDescription.Builder { +public final class DescriptionBuilder implements PermissionDescription.Builder, ProxiedServiceObject { + + public static LPPermissionDescription registerDescription(LPPermissionService service, PermissionDescription description) { + if (!description.getOwner().isPresent()) { + return null; + } + return service.registerPermissionDescription(description.getId(), description.getDescription().orElse(null), description.getOwner().get()); + } + private final @NonNull LPPermissionService service; private final @NonNull PluginContainer container; private final @NonNull Map roles = new HashMap<>(); diff --git a/sponge/sponge-service-api7/src/main/java/me/lucko/luckperms/sponge/service/proxy/api7/PermissionDescriptionProxy.java b/sponge/sponge-service-api7/src/main/java/me/lucko/luckperms/sponge/service/proxy/api7/PermissionDescriptionProxy.java index 02f39c0e..f9ad286b 100644 --- a/sponge/sponge-service-api7/src/main/java/me/lucko/luckperms/sponge/service/proxy/api7/PermissionDescriptionProxy.java +++ b/sponge/sponge-service-api7/src/main/java/me/lucko/luckperms/sponge/service/proxy/api7/PermissionDescriptionProxy.java @@ -28,6 +28,7 @@ package me.lucko.luckperms.sponge.service.proxy.api7; import me.lucko.luckperms.common.util.ImmutableCollectors; import me.lucko.luckperms.sponge.service.model.LPPermissionDescription; import me.lucko.luckperms.sponge.service.model.LPPermissionService; +import me.lucko.luckperms.sponge.service.model.ProxiedServiceObject; import org.checkerframework.checker.nullness.qual.NonNull; import org.spongepowered.api.plugin.PluginContainer; @@ -40,7 +41,7 @@ import java.util.Map; import java.util.Optional; import java.util.concurrent.CompletableFuture; -public final class PermissionDescriptionProxy implements PermissionDescription { +public final class PermissionDescriptionProxy implements PermissionDescription, ProxiedServiceObject { private final LPPermissionService service; private final LPPermissionDescription handle; diff --git a/sponge/sponge-service-api7/src/main/java/me/lucko/luckperms/sponge/service/proxy/api7/PermissionServiceProxy.java b/sponge/sponge-service-api7/src/main/java/me/lucko/luckperms/sponge/service/proxy/api7/PermissionServiceProxy.java index 1feb9b4f..91b61909 100644 --- a/sponge/sponge-service-api7/src/main/java/me/lucko/luckperms/sponge/service/proxy/api7/PermissionServiceProxy.java +++ b/sponge/sponge-service-api7/src/main/java/me/lucko/luckperms/sponge/service/proxy/api7/PermissionServiceProxy.java @@ -31,6 +31,7 @@ import me.lucko.luckperms.common.util.ImmutableCollectors; import me.lucko.luckperms.sponge.service.model.LPPermissionDescription; import me.lucko.luckperms.sponge.service.model.LPPermissionService; import me.lucko.luckperms.sponge.service.model.LPSubjectCollection; +import me.lucko.luckperms.sponge.service.model.ProxiedServiceObject; import org.checkerframework.checker.nullness.qual.NonNull; import org.spongepowered.api.Sponge; @@ -50,7 +51,7 @@ import java.util.Set; import java.util.concurrent.CompletableFuture; import java.util.function.Predicate; -public final class PermissionServiceProxy implements PermissionService { +public final class PermissionServiceProxy implements PermissionService, ProxiedServiceObject { private final LPPermissionService handle; public PermissionServiceProxy(LPPermissionService handle) { diff --git a/sponge/sponge-service-api7/src/main/java/me/lucko/luckperms/sponge/service/proxy/api7/SubjectCollectionProxy.java b/sponge/sponge-service-api7/src/main/java/me/lucko/luckperms/sponge/service/proxy/api7/SubjectCollectionProxy.java index 826e16aa..5ed8e1af 100644 --- a/sponge/sponge-service-api7/src/main/java/me/lucko/luckperms/sponge/service/proxy/api7/SubjectCollectionProxy.java +++ b/sponge/sponge-service-api7/src/main/java/me/lucko/luckperms/sponge/service/proxy/api7/SubjectCollectionProxy.java @@ -29,6 +29,7 @@ import me.lucko.luckperms.common.util.ImmutableCollectors; import me.lucko.luckperms.sponge.service.CompatibilityUtil; import me.lucko.luckperms.sponge.service.model.LPSubject; import me.lucko.luckperms.sponge.service.model.LPSubjectCollection; +import me.lucko.luckperms.sponge.service.model.ProxiedServiceObject; import org.checkerframework.checker.nullness.qual.NonNull; import org.spongepowered.api.service.context.Context; @@ -45,7 +46,7 @@ import java.util.concurrent.CompletableFuture; import java.util.function.Predicate; @SuppressWarnings("unchecked") -public final class SubjectCollectionProxy implements SubjectCollection { +public final class SubjectCollectionProxy implements SubjectCollection, ProxiedServiceObject { private final LPSubjectCollection handle; public SubjectCollectionProxy(LPSubjectCollection handle) { diff --git a/sponge/sponge-service-api7/src/main/java/me/lucko/luckperms/sponge/service/proxy/api7/SubjectDataProxy.java b/sponge/sponge-service-api7/src/main/java/me/lucko/luckperms/sponge/service/proxy/api7/SubjectDataProxy.java index 97c52f08..6b837bba 100644 --- a/sponge/sponge-service-api7/src/main/java/me/lucko/luckperms/sponge/service/proxy/api7/SubjectDataProxy.java +++ b/sponge/sponge-service-api7/src/main/java/me/lucko/luckperms/sponge/service/proxy/api7/SubjectDataProxy.java @@ -31,6 +31,7 @@ import me.lucko.luckperms.sponge.service.model.LPPermissionService; import me.lucko.luckperms.sponge.service.model.LPSubject; import me.lucko.luckperms.sponge.service.model.LPSubjectData; import me.lucko.luckperms.sponge.service.model.LPSubjectReference; +import me.lucko.luckperms.sponge.service.model.ProxiedServiceObject; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; @@ -44,7 +45,7 @@ import java.util.Set; import java.util.concurrent.CompletableFuture; @SuppressWarnings("unchecked") -public final class SubjectDataProxy implements SubjectData { +public final class SubjectDataProxy implements SubjectData, ProxiedServiceObject { private final LPPermissionService service; private final LPSubjectReference ref; private final boolean enduring; diff --git a/sponge/sponge-service-api7/src/main/java/me/lucko/luckperms/sponge/service/proxy/api7/SubjectProxy.java b/sponge/sponge-service-api7/src/main/java/me/lucko/luckperms/sponge/service/proxy/api7/SubjectProxy.java index fd1e48e9..61be67cc 100644 --- a/sponge/sponge-service-api7/src/main/java/me/lucko/luckperms/sponge/service/proxy/api7/SubjectProxy.java +++ b/sponge/sponge-service-api7/src/main/java/me/lucko/luckperms/sponge/service/proxy/api7/SubjectProxy.java @@ -32,6 +32,7 @@ import me.lucko.luckperms.sponge.service.CompatibilityUtil; import me.lucko.luckperms.sponge.service.model.LPPermissionService; import me.lucko.luckperms.sponge.service.model.LPSubject; import me.lucko.luckperms.sponge.service.model.LPSubjectReference; +import me.lucko.luckperms.sponge.service.model.ProxiedServiceObject; import me.lucko.luckperms.sponge.service.model.ProxiedSubject; import org.checkerframework.checker.nullness.qual.NonNull; @@ -49,7 +50,7 @@ import java.util.Set; import java.util.concurrent.CompletableFuture; @SuppressWarnings("unchecked") -public final class SubjectProxy implements Subject, ProxiedSubject { +public final class SubjectProxy implements Subject, ProxiedSubject, ProxiedServiceObject { private final LPPermissionService service; private final LPSubjectReference ref; diff --git a/sponge/sponge-service/src/main/java/me/lucko/luckperms/sponge/service/model/ProxiedServiceObject.java b/sponge/sponge-service/src/main/java/me/lucko/luckperms/sponge/service/model/ProxiedServiceObject.java new file mode 100644 index 00000000..66960fd5 --- /dev/null +++ b/sponge/sponge-service/src/main/java/me/lucko/luckperms/sponge/service/model/ProxiedServiceObject.java @@ -0,0 +1,33 @@ +/* + * This file is part of LuckPerms, licensed under the MIT License. + * + * Copyright (c) lucko (Luck) + * Copyright (c) contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package me.lucko.luckperms.sponge.service.model; + +/** + * Marks that an object is a proxy implementation for a PermissionService related class. + */ +public interface ProxiedServiceObject { + +} diff --git a/sponge/sponge-service/src/main/java/me/lucko/luckperms/sponge/service/model/ProxiedSubject.java b/sponge/sponge-service/src/main/java/me/lucko/luckperms/sponge/service/model/ProxiedSubject.java index 09e99693..2f69b66a 100644 --- a/sponge/sponge-service/src/main/java/me/lucko/luckperms/sponge/service/model/ProxiedSubject.java +++ b/sponge/sponge-service/src/main/java/me/lucko/luckperms/sponge/service/model/ProxiedSubject.java @@ -33,7 +33,7 @@ import org.spongepowered.api.service.permission.Subject; /** * Marks that an object is a proxied representation of a {@link Subject}. */ -public interface ProxiedSubject { +public interface ProxiedSubject extends ProxiedServiceObject { @NonNull LPSubjectReference asSubjectReference(); diff --git a/sponge/src/main/java/me/lucko/luckperms/sponge/LPSpongePlugin.java b/sponge/src/main/java/me/lucko/luckperms/sponge/LPSpongePlugin.java index 1360c698..703503cb 100644 --- a/sponge/src/main/java/me/lucko/luckperms/sponge/LPSpongePlugin.java +++ b/sponge/src/main/java/me/lucko/luckperms/sponge/LPSpongePlugin.java @@ -55,9 +55,11 @@ import me.lucko.luckperms.sponge.messaging.SpongeMessagingFactory; import me.lucko.luckperms.sponge.model.manager.SpongeGroupManager; import me.lucko.luckperms.sponge.model.manager.SpongeUserManager; import me.lucko.luckperms.sponge.service.LuckPermsService; +import me.lucko.luckperms.sponge.service.ProxyFactory; import me.lucko.luckperms.sponge.service.events.UpdateEventHandler; import me.lucko.luckperms.sponge.service.model.LPPermissionService; import me.lucko.luckperms.sponge.service.model.LPSubjectCollection; +import me.lucko.luckperms.sponge.service.model.ProxiedServiceObject; import me.lucko.luckperms.sponge.service.model.persisted.PersistedCollection; import me.lucko.luckperms.sponge.tasks.ServiceCacheHousekeepingTask; @@ -69,6 +71,7 @@ import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; +import java.util.Collection; import java.util.Collections; import java.util.EnumSet; import java.util.List; @@ -162,10 +165,18 @@ public class LPSpongePlugin extends AbstractLuckPermsPlugin { this.updateEventHandler = UpdateEventHandler.obtain(this); this.service = new LuckPermsService(this); - // before registering our permission service, copy any existing permission descriptions - PermissionRegistry permissionRegistry = getPermissionRegistry(); - this.bootstrap.getGame().getServiceManager().provide(PermissionService.class) - .ifPresent(ps -> ps.getDescriptions().stream().map(PermissionDescription::getId).forEach(permissionRegistry::insert)); + PermissionService oldService = this.bootstrap.getGame().getServiceManager().provide(PermissionService.class).orElse(null); + if (oldService != null && !(oldService instanceof ProxiedServiceObject)) { + + // before registering our permission service, copy any existing permission descriptions + Collection permissionDescriptions = oldService.getDescriptions(); + for (PermissionDescription description : permissionDescriptions) { + if (description instanceof ProxiedServiceObject) { + continue; + } + ProxyFactory.registerDescription(this.service, description); + } + } if (this.bootstrap.getGame().getPluginManager().getPlugin("permissionsex").isPresent()) { getLogger().warn("Detected PermissionsEx - assuming it's loaded for migration."); diff --git a/sponge/src/main/java/me/lucko/luckperms/sponge/service/LuckPermsService.java b/sponge/src/main/java/me/lucko/luckperms/sponge/service/LuckPermsService.java index 69b7632e..357ba894 100644 --- a/sponge/src/main/java/me/lucko/luckperms/sponge/service/LuckPermsService.java +++ b/sponge/src/main/java/me/lucko/luckperms/sponge/service/LuckPermsService.java @@ -196,6 +196,7 @@ public class LuckPermsService implements LPPermissionService { @Override public LPPermissionDescription registerPermissionDescription(String id, Text description, PluginContainer owner) { + Objects.requireNonNull(id, "id"); SimplePermissionDescription desc = new SimplePermissionDescription(this, id, description, owner); this.permissionDescriptions.put(id, desc); this.plugin.getPermissionRegistry().insert(id); diff --git a/sponge/src/main/java/me/lucko/luckperms/sponge/service/ProxyFactory.java b/sponge/src/main/java/me/lucko/luckperms/sponge/service/ProxyFactory.java index 170118ba..3fe9798a 100644 --- a/sponge/src/main/java/me/lucko/luckperms/sponge/service/ProxyFactory.java +++ b/sponge/src/main/java/me/lucko/luckperms/sponge/service/ProxyFactory.java @@ -84,6 +84,12 @@ public final class ProxyFactory { new me.lucko.luckperms.sponge.service.proxy.api6.PermissionDescriptionProxy(luckPerms.getService(), luckPerms); } + public static LPPermissionDescription registerDescription(LPPermissionService service, PermissionDescription description) { + return IS_API_7 ? + me.lucko.luckperms.sponge.service.proxy.api7.DescriptionBuilder.registerDescription(service, description) : + me.lucko.luckperms.sponge.service.proxy.api6.DescriptionBuilder.registerDescription(service, description); + } + private ProxyFactory() {} }