mirror of
https://github.com/ProjectSWGCore/Holocore.git
synced 2026-10-12 02:13:42 -04:00
178 lines
5.3 KiB
Java
178 lines
5.3 KiB
Java
/*******************************************************************************
|
|
* Copyright (c) 2015 /// Project SWG /// www.projectswg.com
|
|
*
|
|
* ProjectSWG is the first NGE emulator for Star Wars Galaxies founded on
|
|
* July 7th, 2011 after SOE announced the official shutdown of Star Wars Galaxies.
|
|
* Our goal is to create an emulator which will provide a server for players to
|
|
* continue playing a game similar to the one they used to play. We are basing
|
|
* it on the final publish of the game prior to end-game events.
|
|
*
|
|
* This file is part of Holocore.
|
|
*
|
|
* --------------------------------------------------------------------------------
|
|
*
|
|
* Holocore is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU Affero General Public License as
|
|
* published by the Free Software Foundation, either version 3 of the
|
|
* License, or (at your option) any later version.
|
|
*
|
|
* Holocore is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU Affero General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Affero General Public License
|
|
* along with Holocore. If not, see <http://www.gnu.org/licenses/>
|
|
******************************************************************************/
|
|
|
|
package resources.containers;
|
|
|
|
import resources.objects.SWGObject;
|
|
|
|
import java.io.Serializable;
|
|
import java.util.*;
|
|
|
|
/**
|
|
* 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 Serializable {
|
|
private static final long serialVersionUID = 1L;
|
|
|
|
public static final WorldPermissions WORLD = new WorldPermissions();
|
|
public static final InventoryPermissions INVENTORY = new InventoryPermissions();
|
|
|
|
private Map<String, Integer> permissionGroups;
|
|
private List<String> joinedGroups;
|
|
|
|
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);
|
|
}
|
|
|
|
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) {
|
|
Permission[] permissions = bitmaskSet.toArray(new Permission[0]);
|
|
return valueOf(permissions);
|
|
}
|
|
|
|
public static int valueOf(Permission... permissions) {
|
|
int value = 0;
|
|
|
|
for (Permission permission : permissions) {
|
|
value += permission.bitmask;
|
|
}
|
|
|
|
return value;
|
|
}
|
|
}
|
|
}
|