Ability to get all players inheriting a PermGroup

This commit is contained in:
Marc Baloup 2023-01-07 17:12:21 +01:00
parent c4ab62c857
commit c5e59537a0
Signed by: marcbal
GPG Key ID: BBC0FE3ABC30B893
2 changed files with 45 additions and 4 deletions

View File

@ -1,12 +1,15 @@
package fr.pandacube.lib.permissions;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import fr.pandacube.lib.db.DBException;
import fr.pandacube.lib.permissions.PermissionsCachedBackendReader.CachedGroup;
import fr.pandacube.lib.permissions.SQLPermissions.EntityType;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.UUID;
import java.util.stream.Collectors;
/**
* Represents an group in the permission system.
*/
@ -47,6 +50,23 @@ public final class PermGroup extends PermEntity {
.toList());
}
/**
* Gets all the players that inherits from this group.
* This method does not use cached data.
* @param recursive true to include players that are in inherited groups.
* @return the players that inherits from this group.
* @throws DBException if a database error occurs.
*/
public Set<UUID> getInheritedPlayers(boolean recursive) throws DBException {
Set<UUID> players = new HashSet<>(getBackendEntity().getPlayersInGroup());
if (recursive) {
for (PermGroup inheritedGroups : getInheritedGroups()) {
players.addAll(inheritedGroups.getInheritedPlayers(true));
}
}
return players;
}
/**
* Tells if this group is a default group.
* A player inherits all default groups when they dont explicitely inherit from at least one group.

View File

@ -1,6 +1,7 @@
package fr.pandacube.lib.permissions;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@ -119,6 +120,13 @@ import fr.pandacube.lib.util.Log;
private final Map<String, CachedGroup> groupsCache = new LinkedHashMap<>();
private boolean cacheIsUpdating = false;
@ -299,6 +307,19 @@ import fr.pandacube.lib.util.Log;
super(n, p, s, perms);
deflt = dflt;
}
/* package */ Set<UUID> getPlayersInGroup() throws DBException {
Set<UUID> ids = new HashSet<>();
DB.forEach(SQLPermissions.class,
SQLPermissions.type.eq(EntityType.User.getCode())
.and(SQLPermissions.key.eq("groups"))
.and(SQLPermissions.value.eq(name)),
e -> ids.add(UUID.fromString(e.get(SQLPermissions.name)))
);
return ids;
}
}
}