[WIP] FTB Ranks/LuckPerms API's

This commit is contained in:
2024-11-25 14:06:59 +02:00
parent cc26cd450d
commit d2aca8ffa9
10 changed files with 284 additions and 2 deletions

View File

@@ -2,6 +2,7 @@ archivesBaseName = "${mod_name.replace(" ", "")}-Common-${minecraft_version}"
dependencies {
stupidRemapArch("dev.ftb.mods:ftb-essentials:${ftb_essentials}")
stupidRemapArch("dev.ftb.mods:ftb-ranks:${ftb_ranks}")
}
shadowJar {

View File

@@ -0,0 +1,56 @@
// @excludeplugin
package com.hypherionmc.craterlib.api.events.compat;
import com.hypherionmc.craterlib.compat.ftbranks.BridgedRank;
import com.hypherionmc.craterlib.core.event.CraterEvent;
import com.hypherionmc.craterlib.nojang.authlib.BridgedGameProfile;
import com.mojang.authlib.GameProfile;
import dev.ftb.mods.ftbranks.api.Rank;
import lombok.Getter;
public class FTBRankEvents {
@Getter
public static class RankAddedEvent extends CraterEvent {
private final BridgedGameProfile gameProfile;
private final BridgedRank rank;
private RankAddedEvent(BridgedGameProfile gameProfile, BridgedRank rank) {
this.gameProfile = gameProfile;
this.rank = rank;
}
public static RankAddedEvent of(GameProfile profile, Rank rank) {
return new RankAddedEvent(BridgedGameProfile.of(profile), BridgedRank.of(rank));
}
}
@Getter
public static class RankRemovedEvent extends CraterEvent {
private final BridgedGameProfile gameProfile;
private final BridgedRank rank;
private RankRemovedEvent(BridgedGameProfile gameProfile, BridgedRank rank) {
this.gameProfile = gameProfile;
this.rank = rank;
}
public static RankRemovedEvent of(GameProfile profile, Rank rank) {
return new RankRemovedEvent(BridgedGameProfile.of(profile), BridgedRank.of(rank));
}
}
@Getter
public static class RankDeletedEvent extends CraterEvent {
private final BridgedRank rank;
private RankDeletedEvent(BridgedRank rank) {
this.rank = rank;
}
public static RankDeletedEvent of(Rank rank) {
return new RankDeletedEvent(BridgedRank.of(rank));
}
}
}

View File

@@ -0,0 +1,32 @@
package com.hypherionmc.craterlib.api.events.compat;
import com.hypherionmc.craterlib.core.event.CraterEvent;
import com.hypherionmc.craterlib.nojang.authlib.BridgedGameProfile;
import lombok.RequiredArgsConstructor;
import java.util.UUID;
public class LuckPermsCompatEvents {
@RequiredArgsConstructor(staticName = "of")
public static class GroupAddedEvent extends CraterEvent {
private final String identifier;
private final UUID uuid;
private final String username;
public BridgedGameProfile toProfile() {
return BridgedGameProfile.mojang(uuid, username);
}
}
@RequiredArgsConstructor(staticName = "of")
public static class GroupRemovedEvent extends CraterEvent {
private final String identifier;
private final UUID uuid;
private final String username;
public BridgedGameProfile toProfile() {
return BridgedGameProfile.mojang(uuid, username);
}
}
}

View File

@@ -1,20 +1,102 @@
package com.hypherionmc.craterlib.compat;
import com.hypherionmc.craterlib.api.events.compat.LuckPermsCompatEvents;
import com.hypherionmc.craterlib.core.event.CraterEventBus;
import net.luckperms.api.LuckPerms;
import net.luckperms.api.LuckPermsProvider;
import net.luckperms.api.event.EventBus;
import net.luckperms.api.event.node.NodeMutateEvent;
import net.luckperms.api.model.group.Group;
import net.luckperms.api.model.user.User;
import net.luckperms.api.node.NodeType;
import net.luckperms.api.node.types.InheritanceNode;
import net.minecraft.server.level.ServerPlayer;
import java.util.*;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Collectors;
public class LuckPermsCompat {
public static final LuckPermsCompat INSTANCE = new LuckPermsCompat();
private final LuckPerms luckPerms = LuckPermsProvider.get();
LuckPermsCompat() {}
LuckPermsCompat() {
EventBus bus = luckPerms.getEventBus();
bus.subscribe(NodeMutateEvent.class, e -> {
if (!e.isUser())
return;
User user = (User) e.getTarget();
Set<InheritanceNode> addedInheritance = e.getDataAfter().stream()
.filter(node -> node.getType() == NodeType.INHERITANCE && !e.getDataBefore().contains(node))
.map(NodeType.INHERITANCE::cast)
.collect(Collectors.toSet());
Set<InheritanceNode> removedInheritance = e.getDataBefore().stream()
.filter(node -> node.getType() == NodeType.INHERITANCE && !e.getDataAfter().contains(node))
.map(NodeType.INHERITANCE::cast)
.collect(Collectors.toSet());
if(addedInheritance.isEmpty() && removedInheritance.isEmpty()) return;
addedInheritance.forEach(node -> {
CraterEventBus.INSTANCE.postEvent(LuckPermsCompatEvents.GroupAddedEvent.of(node.getGroupName(), user.getUniqueId(), user.getUsername()));
});
removedInheritance.forEach(node -> {
CraterEventBus.INSTANCE.postEvent(LuckPermsCompatEvents.GroupRemovedEvent.of(node.getGroupName(), user.getUniqueId(), user.getUsername()));
});
});
}
public boolean hasPermission(ServerPlayer player, String perm) {
User luckPermsUser = luckPerms.getPlayerAdapter(ServerPlayer.class).getUser(player);
return luckPermsUser.getCachedData().getPermissionData().checkPermission(perm).asBoolean();
}
public boolean hasGroup(UUID uuid, String group) {
return getUserGroups(uuid).stream().anyMatch(g -> g.equalsIgnoreCase(group));
}
public Set<String> getUserGroups(UUID uuid) {
User user = luckPerms.getUserManager().getUser(uuid);
if (user == null)
return new HashSet<>();
return user.getNodes(NodeType.INHERITANCE).stream().map(InheritanceNode::getGroupName).collect(Collectors.toSet());
}
public boolean addGroupToUser(UUID uuid, String group) {
AtomicBoolean added = new AtomicBoolean(false);
Group g = luckPerms.getGroupManager().getGroup(group);
if (g == null) {
return false;
}
luckPerms.getUserManager().loadUser(uuid).thenAcceptAsync(user -> {
if (user == null) return;
user.data().add(InheritanceNode.builder(group).build());
luckPerms.getUserManager().saveUser(user);
added.set(true);
});
return added.get();
}
public boolean removeGroupFromUser(UUID uuid, String group) {
AtomicBoolean removed = new AtomicBoolean(false);
luckPerms.getUserManager().loadUser(uuid).thenAcceptAsync(user -> {
if (user == null) return;
user.data().remove(InheritanceNode.builder(group).build());
luckPerms.getUserManager().saveUser(user);
removed.set(true);
});
return removed.get();
}
}

View File

@@ -0,0 +1,24 @@
// @excludeplugin
package com.hypherionmc.craterlib.compat.ftbranks;
import dev.ftb.mods.ftbranks.api.Rank;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor(staticName = "of")
public class BridgedRank {
private final Rank internal;
public String name() {
return internal.getName();
}
public String id() {
return internal.getId();
}
public Rank toFtb() {
return internal;
}
}

View File

@@ -0,0 +1,83 @@
// @excludeplugin
package com.hypherionmc.craterlib.compat.ftbranks;
import com.hypherionmc.craterlib.api.events.compat.FTBRankEvents;
import com.hypherionmc.craterlib.core.event.CraterEventBus;
import com.hypherionmc.craterlib.nojang.authlib.BridgedGameProfile;
import dev.ftb.mods.ftbranks.api.FTBRanksAPI;
import dev.ftb.mods.ftbranks.api.event.PlayerAddedToRankEvent;
import dev.ftb.mods.ftbranks.api.event.PlayerRemovedFromRankEvent;
import dev.ftb.mods.ftbranks.api.event.RankDeletedEvent;
import dev.ftb.mods.ftbranks.api.event.RankEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
public class FTBRanks {
public static final FTBRanks INSTANCE = new FTBRanks();
private FTBRanks() {
registerEvents();
}
public List<BridgedRank> getPlayerRanks(BridgedGameProfile profile) {
List<BridgedRank> ranks = new ArrayList<>();
FTBRanksAPI.manager().getAddedRanks(profile.toMojang()).forEach(rank -> ranks.add(BridgedRank.of(rank)));
return ranks;
}
public List<BridgedRank> getAllRanks() {
List<BridgedRank> ranks = new ArrayList<>();
FTBRanksAPI.manager().getAllRanks().forEach(r -> ranks.add(BridgedRank.of(r)));
return ranks;
}
public boolean hasRank(BridgedGameProfile profile, String rank) {
return getPlayerRanks(profile).stream().anyMatch(r -> r.toFtb().getName().equalsIgnoreCase(rank) || r.toFtb().getId().equalsIgnoreCase(rank));
}
public boolean addRank(BridgedGameProfile profile, String rank) {
rank = rank.toLowerCase();
AtomicBoolean didAddRank = new AtomicBoolean(false);
FTBRanksAPI.manager().getRank(rank).ifPresent(r -> {
r.add(profile.toMojang());
didAddRank.set(true);
});
return didAddRank.get();
}
public boolean removeRank(BridgedGameProfile profile, String rank) {
rank = rank.toLowerCase();
AtomicBoolean didRemoveRank = new AtomicBoolean(false);
FTBRanksAPI.manager().getRank(rank).ifPresent(r -> {
r.remove(profile.toMojang());
didRemoveRank.set(true);
});
return didRemoveRank.get();
}
public void registerEvents() {
RankEvent.ADD_PLAYER.register(this::playerAddedToRank);
RankEvent.REMOVE_PLAYER.register(this::playerRemovedFromRank);
RankEvent.DELETED.register(this::rankDeleted);
}
private void rankDeleted(RankDeletedEvent rankDeletedEvent) {
CraterEventBus.INSTANCE.postEvent(FTBRankEvents.RankDeletedEvent.of(rankDeletedEvent.getRank()));
}
private void playerRemovedFromRank(PlayerRemovedFromRankEvent playerRemovedFromRankEvent) {
CraterEventBus.INSTANCE.postEvent(FTBRankEvents.RankRemovedEvent.of(playerRemovedFromRankEvent.getPlayer(), playerRemovedFromRankEvent.getRank()));
}
private void playerAddedToRank(PlayerAddedToRankEvent playerAddedToRankEvent) {
CraterEventBus.INSTANCE.postEvent(FTBRankEvents.RankAddedEvent.of(playerAddedToRankEvent.getPlayer(), playerAddedToRankEvent.getRank()));
}
}