mirror of
https://github.com/AtlasMediaGroup/TotalFreedomMod.git
synced 2025-07-01 04:26:42 +00:00
Adjusting some stuff :)
This commit is contained in:
@ -1,193 +1,179 @@
|
||||
package me.totalfreedom.totalfreedommod.rank;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.TotalFreedomMod;
|
||||
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.LuckPerms;
|
||||
import net.luckperms.api.model.group.Group;
|
||||
import net.luckperms.api.model.user.User;
|
||||
import net.luckperms.api.query.QueryOptions;
|
||||
import net.luckperms.api.node.NodeEqualityPredicate;
|
||||
import net.luckperms.api.node.NodeType;
|
||||
import net.luckperms.api.node.types.InheritanceNode;
|
||||
import net.luckperms.api.track.DemotionResult;
|
||||
import net.luckperms.api.track.PromotionResult;
|
||||
import net.luckperms.api.track.Track;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
public class Hierarchy
|
||||
{
|
||||
private final LuckPerms lp;
|
||||
private final Track track;
|
||||
private static final Hierarchy hierarchy = new Hierarchy(); // static singleton for global state.
|
||||
private final GroupWrapper groupWrapper;
|
||||
private final TrackWrapper trackWrapper;
|
||||
private final UserWrapper userWrapper;
|
||||
|
||||
public Hierarchy(String name)
|
||||
private Hierarchy()
|
||||
{
|
||||
this.lp = TotalFreedomMod.getPlugin().lpb.getAPI();
|
||||
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(OfflinePlayer.class));
|
||||
}
|
||||
|
||||
if (lp == null)
|
||||
{
|
||||
throw new IllegalStateException("LuckPerms not found!");
|
||||
}
|
||||
public static Hierarchy getHierarchy()
|
||||
{
|
||||
return hierarchy;
|
||||
}
|
||||
|
||||
if (!lp.getTrackManager().isLoaded(name))
|
||||
public boolean isUserOnAdminTrack(OfflinePlayer 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) ->
|
||||
{
|
||||
this.track = lp.getTrackManager().createAndLoadTrack(name).whenComplete((ignored, throwable) ->
|
||||
if (b != null)
|
||||
{
|
||||
if (throwable != null)
|
||||
FLog.severe(b);
|
||||
}
|
||||
});
|
||||
|
||||
return isOnAdminTrack.get();
|
||||
}
|
||||
|
||||
public Track op()
|
||||
{
|
||||
return trackWrapper.getTrack("OP").join();
|
||||
}
|
||||
|
||||
public Track builder()
|
||||
{
|
||||
return trackWrapper.getTrack("BUILDER").join();
|
||||
}
|
||||
|
||||
public Track admin()
|
||||
{
|
||||
return trackWrapper.getTrack("ADMIN").join();
|
||||
}
|
||||
|
||||
public void addInheritance(DisplayableGroup previous, DisplayableGroup current)
|
||||
{
|
||||
CompletableFuture.runAsync(() ->
|
||||
{
|
||||
current.getLuckPermsGroup().data().add(InheritanceNode.builder(previous.getLuckPermsGroup()).build());
|
||||
groupWrapper.saveGroup(current.getLuckPermsGroup().getName());
|
||||
}).whenComplete((a, b) ->
|
||||
{
|
||||
if (b != null)
|
||||
{
|
||||
FLog.severe(b);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public Group getGroup(String name) {
|
||||
return groupWrapper.getGroup(name).join();
|
||||
}
|
||||
|
||||
public void addGroupToTrack(Track track, DisplayableGroup group)
|
||||
{
|
||||
trackWrapper.getTrack(track.getName()).thenAccept(t ->
|
||||
{
|
||||
t.appendGroup(group.getLuckPermsGroup());
|
||||
trackWrapper.saveTrack(t.getName());
|
||||
}).whenComplete((a, b) ->
|
||||
{
|
||||
if (b != null)
|
||||
{
|
||||
FLog.severe(b);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public CompletableFuture<PromotionResult> promoteUser(Track track, OfflinePlayer player)
|
||||
{
|
||||
return userWrapper.getUserData(player).thenApply(data ->
|
||||
track.promote(data.getUser(), data.getContextSet()));
|
||||
}
|
||||
|
||||
public CompletableFuture<DemotionResult> demoteUser(Track track, OfflinePlayer player)
|
||||
{
|
||||
return userWrapper.getUserData(player).thenApply(data ->
|
||||
track.demote(data.getUser(), data.getContextSet()));
|
||||
}
|
||||
|
||||
public void addUserToGroup(DisplayableGroup group, OfflinePlayer player)
|
||||
{
|
||||
userWrapper.getUserData(player).thenAccept(user ->
|
||||
{
|
||||
for (InheritanceNode node : group.getLuckPermsGroup().getNodes(NodeType.INHERITANCE))
|
||||
{
|
||||
user.getUser().data().add(node);
|
||||
}
|
||||
|
||||
user.getUser().getInheritedGroups(user.getQueryOptions()).add(group.getLuckPermsGroup());
|
||||
|
||||
userWrapper.saveUser(user.getUser());
|
||||
}).whenComplete((a, b) ->
|
||||
{
|
||||
if (b != null)
|
||||
{
|
||||
FLog.severe(b);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void dropUserFromAll(Track track, OfflinePlayer player)
|
||||
{
|
||||
userWrapper.getUserData(player).thenAccept(data ->
|
||||
{
|
||||
for (String group : track.getGroups())
|
||||
{
|
||||
groupWrapper.getGroup(group).whenComplete((g, b) ->
|
||||
{
|
||||
throw new IllegalStateException("Failed to create track " + name, throwable);
|
||||
}
|
||||
}).join(); // Block and wait for the track to load.
|
||||
} else
|
||||
{
|
||||
this.track = lp.getTrackManager().getTrack(name);
|
||||
}
|
||||
}
|
||||
if (b != null)
|
||||
{
|
||||
FLog.severe(b);
|
||||
return;
|
||||
}
|
||||
|
||||
public void addGroup(DisplayableGroup group)
|
||||
{
|
||||
updateAppend(group.getLuckPermsGroup()).join(); // wait for the group to be updated.
|
||||
}
|
||||
|
||||
public void addGroup(Group group, int index)
|
||||
{
|
||||
updateInsert(group, index).join(); // wait for the group to be updated.
|
||||
}
|
||||
|
||||
public void dropGroup(Group group) // This is non-blocking by default.
|
||||
{
|
||||
updateDrop(group).whenComplete((ignored, throwable) ->
|
||||
{
|
||||
if (throwable != null)
|
||||
{
|
||||
FLog.severe("Failed to update track " + track.getName());
|
||||
for (InheritanceNode node : g.getNodes(NodeType.INHERITANCE))
|
||||
{
|
||||
data.getUser().data().remove(node);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void addGroupNonBlocking(Group group, int index)
|
||||
{
|
||||
updateInsert(group, index).whenComplete((ignored, throwable) ->
|
||||
userWrapper.saveUser(data.getUser());
|
||||
}).whenComplete((a, b) ->
|
||||
{
|
||||
if (throwable != null)
|
||||
if (b != null)
|
||||
{
|
||||
FLog.severe("Failed to update track " + track.getName());
|
||||
FLog.severe(b);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public CompletableFuture<Boolean> trackUser(User user)
|
||||
{
|
||||
Group group = fromName(track.getGroups().get(0)); // First group.
|
||||
|
||||
return CompletableFuture.supplyAsync(() ->
|
||||
lp.getContextManager()
|
||||
.getContext(user)
|
||||
.map(context -> user
|
||||
.getInheritedGroups(QueryOptions.defaultContextualOptions())
|
||||
.add(group))
|
||||
.orElse(false));
|
||||
}
|
||||
|
||||
public CompletableFuture<PromotionResult> promoteUser(User user)
|
||||
{
|
||||
boolean empty = user.getInheritedGroups(QueryOptions.defaultContextualOptions())
|
||||
.stream()
|
||||
.filter(group -> track.getGroups().contains(group.getName()))
|
||||
.findFirst()
|
||||
.isEmpty();
|
||||
|
||||
if (empty) trackUser(user).whenComplete((ignored, throwable) ->
|
||||
{
|
||||
if (throwable != null)
|
||||
{
|
||||
FLog.severe("Failed to track user " + user.getFriendlyName());
|
||||
}
|
||||
});
|
||||
|
||||
return CompletableFuture.supplyAsync(() ->
|
||||
{
|
||||
AtomicReference<PromotionResult> result = new AtomicReference<>();
|
||||
lp.getContextManager()
|
||||
.getContext(user)
|
||||
.ifPresent(context -> result.set(track.promote(user, context)));
|
||||
return result.get();
|
||||
});
|
||||
}
|
||||
|
||||
public void dropUserFromAll(User user)
|
||||
{
|
||||
for (String group : track.getGroups())
|
||||
{
|
||||
dropUserFromGroup(user, fromName(group))
|
||||
.whenComplete((ignored, throwable) ->
|
||||
{
|
||||
if (throwable != null)
|
||||
{
|
||||
FLog.severe("Failed to drop user "
|
||||
+ user.getFriendlyName()
|
||||
+ " from group "
|
||||
+ group);
|
||||
return;
|
||||
}
|
||||
FLog.info("Successfully removed " + user.getFriendlyName() + " from group " + group);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
public CompletableFuture<Void> demoteUser(User user)
|
||||
{
|
||||
return CompletableFuture.supplyAsync(() -> {
|
||||
lp.getContextManager()
|
||||
.getContext(user)
|
||||
.ifPresent(context -> track.demote(user, context));
|
||||
return null;
|
||||
});
|
||||
}
|
||||
|
||||
public CompletableFuture<Boolean> dropUserFromGroup(User user, Group group)
|
||||
{
|
||||
return CompletableFuture.supplyAsync(() -> user
|
||||
.getInheritedGroups(QueryOptions.defaultContextualOptions())
|
||||
.remove(group));
|
||||
}
|
||||
|
||||
public Group fromName(String name)
|
||||
{
|
||||
return lp.getGroupManager().getGroup(name);
|
||||
}
|
||||
|
||||
public CompletableFuture<Void> updateAppend(Group group)
|
||||
{
|
||||
return CompletableFuture.supplyAsync(() ->
|
||||
{
|
||||
if (!track.containsGroup(group.getName()))
|
||||
{
|
||||
track.appendGroup(group);
|
||||
}
|
||||
return null;
|
||||
});
|
||||
}
|
||||
|
||||
public CompletableFuture<Void> updateInsert(Group group, int index)
|
||||
{
|
||||
return CompletableFuture.supplyAsync(() ->
|
||||
{
|
||||
if (!track.containsGroup(group))
|
||||
{
|
||||
track.insertGroup(group, index);
|
||||
}
|
||||
return null;
|
||||
});
|
||||
}
|
||||
|
||||
public CompletableFuture<Void> updateDrop(Group group)
|
||||
{
|
||||
return CompletableFuture.supplyAsync(() ->
|
||||
{
|
||||
if (track.containsGroup(group))
|
||||
{
|
||||
track.removeGroup(group);
|
||||
}
|
||||
|
||||
return null;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user