This should work properly!

This commit is contained in:
Paul Reilly
2023-04-09 23:05:57 -05:00
parent 2a3a48f2ae
commit 11f9313653
12 changed files with 128 additions and 127 deletions

View File

@ -5,17 +5,25 @@ import me.totalfreedom.totalfreedommod.perms.GroupWrapper;
import me.totalfreedom.totalfreedommod.perms.TrackWrapper;
import me.totalfreedom.totalfreedommod.perms.UserWrapper;
import me.totalfreedom.totalfreedommod.util.FLog;
import net.luckperms.api.event.EventBus;
import net.luckperms.api.event.EventSubscription;
import net.luckperms.api.event.node.NodeAddEvent;
import net.luckperms.api.event.node.NodeRemoveEvent;
import net.luckperms.api.model.group.Group;
import net.luckperms.api.node.NodeEqualityPredicate;
import net.luckperms.api.model.user.User;
import net.luckperms.api.node.NodeType;
import net.luckperms.api.node.types.InheritanceNode;
import net.luckperms.api.platform.PlayerAdapter;
import net.luckperms.api.track.DemotionResult;
import net.luckperms.api.track.PromotionResult;
import net.luckperms.api.track.Track;
import org.bukkit.Bukkit;
import org.bukkit.NamespacedKey;
import org.bukkit.entity.Player;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.atomic.AtomicBoolean;
public class Hierarchy
{
@ -23,13 +31,16 @@ public class Hierarchy
private final GroupWrapper groupWrapper;
private final TrackWrapper trackWrapper;
private final UserWrapper userWrapper;
private final PlayerAdapter<Player> playerAdapter;
private Hierarchy()
{
this.playerAdapter = TotalFreedomMod.getPlugin().lpb.getAPI().getPlayerAdapter(Player.class);
this.groupWrapper = new GroupWrapper(TotalFreedomMod.getPlugin().lpb.getAPI().getGroupManager());
this.trackWrapper = new TrackWrapper(TotalFreedomMod.getPlugin().lpb.getAPI().getTrackManager());
this.userWrapper = new UserWrapper(TotalFreedomMod.getPlugin().lpb.getAPI().getUserManager(),
TotalFreedomMod.getPlugin().lpb.getAPI().getPlayerAdapter(Player.class));
getPlayerAdapter());
new LuckPermsUserDataListener().register();
}
public static Hierarchy getHierarchy()
@ -37,32 +48,17 @@ public class Hierarchy
return hierarchy;
}
public PlayerAdapter<Player> getPlayerAdapter()
{
return playerAdapter;
}
public boolean isUserOnAdminTrack(Player player)
{
AtomicBoolean isOnAdminTrack = new AtomicBoolean(false);
userWrapper.getUser(player).thenAccept(user ->
user.data().toCollection().stream()
.filter(NodeType.INHERITANCE::matches)
.map(NodeType.INHERITANCE::cast)
.filter(NodeEqualityPredicate.ONLY_KEY
.equalTo(InheritanceNode
.builder(GroupProvider.ADMIN.getGroup().getLuckPermsGroup().getName())
.build()))
.forEach(node ->
{
if (node.getGroupName().startsWith("admin"))
{
isOnAdminTrack.set(true);
}
})).whenComplete((a, b) ->
{
if (b != null)
{
FLog.severe(b);
}
});
return isOnAdminTrack.get();
return userWrapper.getUser(player)
.thenApply(user -> user.getNodes(NodeType.INHERITANCE)
.contains(GroupProvider.inheritanceNode(GroupProvider.ADMIN.getGroup())))
.join();
}
public Track op()
@ -115,7 +111,8 @@ public class Hierarchy
});
}
public void addUserData(Player player) {
public void addUserData(Player player)
{
userWrapper.addUserData(player).whenComplete((a, b) ->
{
if (b != null)
@ -125,7 +122,8 @@ public class Hierarchy
});
}
public void updateUserData(Player player) {
public void updateUserData(Player player)
{
userWrapper.updateUserData(player).whenComplete((a, b) ->
{
if (b != null)
@ -135,7 +133,8 @@ public class Hierarchy
});
}
public void dropUserData(Player player) {
public void dropUserData(Player player)
{
userWrapper.removeUserData(player).whenComplete((a, b) ->
{
if (b != null)
@ -147,71 +146,26 @@ public class Hierarchy
public CompletableFuture<PromotionResult> promoteUser(Track track, Player player)
{
return userWrapper.getUserData(player).thenApply(data ->
{
boolean isOnTrack = false;
for (String trackGroup : track.getGroups())
{
for (Group userGroup : data.getUser().getInheritedGroups(data.getQueryOptions()))
{
if (userGroup.getName().equals(trackGroup))
{
isOnTrack = true;
}
}
}
if (isOnTrack)
{
return track.promote(data.getUser(), data.getContextSet());
} else
{
addUserToGroup(GroupProvider.fromString(track.getGroups().get(0)).getGroup(), player);
return null;
}
});
return userWrapper.getUserData(player)
.thenApply(data -> track.promote(data.getUser(), data.getContextSet()));
}
public CompletableFuture<DemotionResult> demoteUser(Track track, Player player)
{
return userWrapper.getUserData(player).thenApply(data ->
{
boolean isOnTrack = false;
for (String trackGroup : track.getGroups())
{
for (Group userGroup : data.getUser().getInheritedGroups(data.getQueryOptions()))
{
if (userGroup.getName().equals(trackGroup))
{
isOnTrack = true;
}
}
}
if (isOnTrack)
{
return track.demote(data.getUser(), data.getContextSet());
} else
{
return null;
}
});
return userWrapper.getUserData(player)
.thenApply(data -> track.demote(data.getUser(), data.getContextSet()));
}
public void addUserToGroup(DisplayableGroup group, Player player)
{
userWrapper.getUserData(player).thenAccept(user ->
{
userWrapper.addToGroup(user.getUser(), group.getLuckPermsGroup());
userWrapper.saveUser(user.getUser());
}).whenComplete((a, b) ->
userWrapper.addToGroup(user.getUser(), group))
.whenComplete((a, b) ->
{
if (b != null)
{
FLog.severe(b);
}
updateUserData(player);
});
}
@ -229,18 +183,56 @@ public class Hierarchy
return;
}
userWrapper.removeFromGroup(data.getUser(), g);
if (data.getUser().getNodes(NodeType.INHERITANCE)
.contains(InheritanceNode.builder(g).build()))
userWrapper.removeFromGroup(data.getUser(), g);
});
}
userWrapper.saveUser(data.getUser());
}).whenComplete((a, b) ->
{
if (b != null)
{
FLog.severe(b);
}
updateUserData(player);
});
}
private class LuckPermsUserDataListener
{
private final Map<NamespacedKey, EventSubscription<?>> subscriptions = new HashMap<>();
public void register()
{
EventBus eventBus = TotalFreedomMod.getPlugin().lpb.getAPI().getEventBus();
subscriptions.put(new NamespacedKey(TotalFreedomMod.getPlugin(), "node_add"), eventBus.subscribe(TotalFreedomMod.getPlugin(), NodeAddEvent.class, this::onNodeAdd));
subscriptions.put(new NamespacedKey(TotalFreedomMod.getPlugin(), "node_remove"), eventBus.subscribe(TotalFreedomMod.getPlugin(), NodeRemoveEvent.class, this::onNodeRemove));
}
private void onNodeAdd(NodeAddEvent event)
{
if (event.isUser())
{
User user = (User) event.getTarget();
Player player = Bukkit.getPlayer(user.getUniqueId());
if (player != null)
{
updateUserData(player);
}
}
}
private void onNodeRemove(NodeRemoveEvent event)
{
if (event.isUser())
{
User user = (User) event.getTarget();
Player player = Bukkit.getPlayer(user.getUniqueId());
if (player != null)
{
TotalFreedomMod.getPlugin().rm.updateDisplay(player);
updateUserData(player);
}
}
}
}
}