mirror of
https://bitbucket.org/projectswg/cucore.git
synced 2026-10-11 03:13:20 -04:00
Re-did container permissions
This commit is contained in:
@@ -26,182 +26,38 @@
|
||||
******************************************************************************/
|
||||
package resources.containers;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.EnumSet;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import resources.network.NetBufferStream;
|
||||
import resources.objects.SWGObject;
|
||||
import resources.persistable.Persistable;
|
||||
|
||||
/**
|
||||
* Structure for creating permission sets that will allow the object to be viewed/modified/added/removed by a requested
|
||||
* object depending on the implemented abstract methods.
|
||||
* @author Waverunner
|
||||
*/
|
||||
public abstract class ContainerPermissions implements Persistable {
|
||||
|
||||
public static final WorldPermissions WORLD = new WorldPermissions();
|
||||
public static final InventoryPermissions INVENTORY = new InventoryPermissions();
|
||||
|
||||
private Map<String, Integer> permissionGroups;
|
||||
private List<String> joinedGroups;
|
||||
|
||||
public abstract class ContainerPermissions {
|
||||
|
||||
public ContainerPermissions() {
|
||||
this.permissionGroups = new HashMap<>();
|
||||
this.joinedGroups = new ArrayList<>();
|
||||
}
|
||||
|
||||
protected boolean hasPermissions(String group, Permission... permissions) {
|
||||
if (!hasPermissionGroup(group))
|
||||
return false;
|
||||
|
||||
EnumSet<Permission> groupPermissions = Permission.getFlags(permissionGroups.get(group));
|
||||
|
||||
for (Permission permission : permissions) {
|
||||
if (!groupPermissions.contains(permission))
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean hasPermissions(List<String> requesterGroups, Permission ... permission) {
|
||||
for (String group : requesterGroups) {
|
||||
if (hasPermissions(group, permission))
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public void addPermissions(String group, Permission... permissions) {
|
||||
if (!hasPermissionGroup(group)) {
|
||||
permissionGroups.put(group, Permission.valueOf(permissions));
|
||||
return;
|
||||
}
|
||||
|
||||
EnumSet<Permission> groupPermissions = Permission.getFlags(permissionGroups.get(group));
|
||||
|
||||
for (Permission permission : permissions) {
|
||||
groupPermissions.add(permission);
|
||||
}
|
||||
|
||||
synchronized (permissionGroups) {
|
||||
permissionGroups.put(group, Permission.valueOf(groupPermissions));
|
||||
}
|
||||
}
|
||||
|
||||
public void removePermissions(String group, Permission... permissions) {
|
||||
|
||||
if (!hasPermissionGroup(group))
|
||||
return;
|
||||
|
||||
EnumSet<Permission> groupPermissions = Permission.getFlags(permissionGroups.get(group));
|
||||
|
||||
for (Permission permission : permissions) {
|
||||
groupPermissions.add(permission);
|
||||
}
|
||||
|
||||
synchronized (permissionGroups) {
|
||||
permissionGroups.put(group, Permission.valueOf(groupPermissions));
|
||||
}
|
||||
}
|
||||
|
||||
public void clearPermissions(String group) {
|
||||
synchronized (permissionGroups) {
|
||||
if (permissionGroups.containsKey(group))
|
||||
permissionGroups.put(group, 0);
|
||||
}
|
||||
}
|
||||
|
||||
public boolean hasPermissionGroup(String group) {
|
||||
return permissionGroups.containsKey(group);
|
||||
}
|
||||
|
||||
public Set<String> getPermissionGroups() {
|
||||
synchronized(permissionGroups) {
|
||||
return permissionGroups.keySet();
|
||||
}
|
||||
}
|
||||
|
||||
public List<String> getJoinedGroups() {
|
||||
return joinedGroups;
|
||||
}
|
||||
|
||||
public void addDefaultWorldPermissions() {
|
||||
addPermissions("world", Permission.VIEW, Permission.ENTER);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void save(NetBufferStream stream) {
|
||||
stream.addByte(0);
|
||||
synchronized (permissionGroups) {
|
||||
stream.addMap(permissionGroups, (e) -> {
|
||||
stream.addAscii(e.getKey());
|
||||
stream.addInt(e.getValue());
|
||||
});
|
||||
}
|
||||
synchronized (joinedGroups) {
|
||||
stream.addList(joinedGroups, (g) -> stream.addAscii(g));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void read(NetBufferStream stream) {
|
||||
stream.getByte();
|
||||
stream.getList((i) -> permissionGroups.put(stream.getAscii(), stream.getInt()));
|
||||
stream.getList((i) -> joinedGroups.add(stream.getAscii()));
|
||||
}
|
||||
|
||||
public abstract boolean canView(SWGObject viewer, SWGObject container);
|
||||
public abstract boolean canEnter(SWGObject requester, SWGObject container);
|
||||
public abstract boolean canRemove(SWGObject requester, SWGObject container);
|
||||
public abstract boolean canMove(SWGObject requester, SWGObject container);
|
||||
public abstract boolean canAdd(SWGObject requester, SWGObject container);
|
||||
|
||||
public enum Permission {
|
||||
VIEW(1),
|
||||
REMOVE(1<<1),
|
||||
ADD(1<<2),
|
||||
MOVE(1<<3),
|
||||
ENTER(1<<4);
|
||||
|
||||
int bitmask;
|
||||
|
||||
Permission(int bitmask) {
|
||||
this.bitmask = bitmask;
|
||||
}
|
||||
|
||||
public static EnumSet<Permission> getFlags(int bits) {
|
||||
EnumSet <Permission> states = EnumSet.noneOf(Permission.class);
|
||||
for (Permission state : values()) {
|
||||
if ((state.bitmask & bits) != 0)
|
||||
states.add(state);
|
||||
}
|
||||
return states;
|
||||
}
|
||||
|
||||
public static int valueOf(EnumSet<Permission> bitmaskSet) {
|
||||
int value = 0;
|
||||
|
||||
for (Permission permission : bitmaskSet) {
|
||||
value += permission.bitmask;
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
public static int valueOf(Permission... permissions) {
|
||||
int value = 0;
|
||||
|
||||
for (Permission permission : permissions) {
|
||||
value += permission.bitmask;
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
public boolean canView(SWGObject container) {
|
||||
return canView(null, container);
|
||||
}
|
||||
|
||||
public boolean canEnter(SWGObject container) {
|
||||
return canEnter(null, container);
|
||||
}
|
||||
|
||||
public boolean canRemove(SWGObject container) {
|
||||
return canRemove(null, container);
|
||||
}
|
||||
|
||||
public boolean canMove(SWGObject container) {
|
||||
return canMove(null, container);
|
||||
}
|
||||
|
||||
public boolean canAdd(SWGObject container) {
|
||||
return canAdd(null, container);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user