Initial commit
This commit is contained in:
@@ -0,0 +1,197 @@
|
||||
package me.lucko.luckperms.users;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import me.lucko.luckperms.LuckPermsPlugin;
|
||||
import me.lucko.luckperms.exceptions.ObjectAlreadyHasException;
|
||||
import me.lucko.luckperms.exceptions.ObjectLacksPermissionException;
|
||||
import me.lucko.luckperms.groups.Group;
|
||||
import me.lucko.luckperms.utils.PermissionObject;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
public abstract class User extends PermissionObject {
|
||||
|
||||
/**
|
||||
* The users Mojang UUID
|
||||
*/
|
||||
@Getter
|
||||
private final UUID uuid;
|
||||
|
||||
/**
|
||||
* The last known username of a player
|
||||
*/
|
||||
@Getter
|
||||
@Setter
|
||||
private String name;
|
||||
|
||||
public User(UUID uuid, LuckPermsPlugin plugin) {
|
||||
super(plugin, uuid.toString());
|
||||
this.uuid = uuid;
|
||||
this.name = null;
|
||||
}
|
||||
|
||||
public User(UUID uuid, String name, LuckPermsPlugin plugin) {
|
||||
super(plugin, uuid.toString());
|
||||
this.uuid = uuid;
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Refresh and re-assign the users permissions
|
||||
*/
|
||||
public abstract void refreshPermissions();
|
||||
|
||||
/**
|
||||
* Check to see if the user is a member of a group
|
||||
* @param group The group to check membership of
|
||||
* @return true if the user is a member of the group
|
||||
*/
|
||||
public boolean isInGroup(Group group) {
|
||||
return isInGroup(group, "global");
|
||||
}
|
||||
|
||||
/**
|
||||
* Check to see if a user is a member of a group on a specific server
|
||||
* @param group The group to check membership of
|
||||
* @param server The server to check on
|
||||
* @return true if the user is a member of the group
|
||||
*/
|
||||
public boolean isInGroup(Group group, String server) {
|
||||
return getLocalGroups(server).contains(group.getName());
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a user to a group
|
||||
* @param group The group to add the user to
|
||||
* @throws ObjectAlreadyHasException if the user is already a member of the group
|
||||
*/
|
||||
public void addGroup(Group group) throws ObjectAlreadyHasException {
|
||||
addGroup(group, "global");
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a user to a group on a specific server
|
||||
* @param group The group to add the user to
|
||||
* @param server The server to add the group on
|
||||
* @throws ObjectAlreadyHasException if the user is already a member of the group on that server
|
||||
*/
|
||||
public void addGroup(Group group, String server) throws ObjectAlreadyHasException {
|
||||
if (server == null) {
|
||||
server = "global";
|
||||
}
|
||||
|
||||
if (isInGroup(group, server)) {
|
||||
throw new ObjectAlreadyHasException();
|
||||
}
|
||||
|
||||
if (server.equalsIgnoreCase("global")) {
|
||||
getNodes().put("luckperms.group." + group.getName(), true);
|
||||
} else {
|
||||
getNodes().put(server + "/luckperms.group." + group.getName(), true);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the user from a group
|
||||
* @param group the group to remove the user from
|
||||
* @throws ObjectLacksPermissionException
|
||||
*/
|
||||
public void removeGroup(Group group) throws ObjectLacksPermissionException {
|
||||
removeGroup(group, "global");
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the user from a group
|
||||
* @param group The group to remove the user from
|
||||
* @param server The server to remove the group on
|
||||
* @throws ObjectLacksPermissionException if the user isn't a member of the group
|
||||
*/
|
||||
public void removeGroup(Group group, String server) throws ObjectLacksPermissionException {
|
||||
if (server == null) {
|
||||
server = "global";
|
||||
}
|
||||
|
||||
if (!getLocalGroups(server).contains(group.getName())) {
|
||||
throw new ObjectLacksPermissionException();
|
||||
}
|
||||
|
||||
if (server.equalsIgnoreCase("global")) {
|
||||
getNodes().remove("luckperms.group." + group.getName());
|
||||
} else {
|
||||
getNodes().remove(server + "/luckperms.group." + group.getName());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Clear all of the users permission nodes
|
||||
*/
|
||||
public void clearNodes() {
|
||||
String defaultGroupNode = getPlugin().getConfiguration().getDefaultGroupNode();
|
||||
getNodes().clear();
|
||||
getNodes().put(defaultGroupNode, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a {@link List} of all of the groups the user is a member of, on all servers
|
||||
* @return a {@link List} of group names
|
||||
*/
|
||||
public List<String> getGroupNames() {
|
||||
return getGroups(null, true, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a {@link List} of the groups the user is a member of on a specific server
|
||||
* @param server the server to check
|
||||
* @return a {@link List} of group names
|
||||
*/
|
||||
public List<String> getLocalGroups(String server) {
|
||||
return getGroups(server, false, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a {@link List} of the groups the user is a member of on a specific server with the option to include global groups or all groups
|
||||
* @param server Which server to check on
|
||||
* @param includeGlobal Whether to include global groups
|
||||
* @param includeAll Whether to get all groups
|
||||
* @return a {@link List} of group names
|
||||
*/
|
||||
public List<String> getGroups(String server, boolean includeGlobal, boolean includeAll) {
|
||||
List<String> groups = new ArrayList<>();
|
||||
|
||||
if (server == null || server.equals("")) {
|
||||
server = "global";
|
||||
}
|
||||
|
||||
for (String node : getNodes().keySet()) {
|
||||
String originalNode = node;
|
||||
// Has a defined server
|
||||
if (node.contains("/")) {
|
||||
String[] parts = node.split("\\/", 2);
|
||||
if (!parts[0].equalsIgnoreCase(server) && !includeAll) {
|
||||
continue;
|
||||
}
|
||||
node = parts[1];
|
||||
} else {
|
||||
if (!includeGlobal) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (node.matches("luckperms\\.group\\..*")) {
|
||||
if (getNodes().get(originalNode)) {
|
||||
String groupName = node.split("\\.", 3)[2];
|
||||
groups.add(groupName);
|
||||
}
|
||||
}
|
||||
}
|
||||
return groups;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return getUuid().toString();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,120 @@
|
||||
package me.lucko.luckperms.users;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import me.lucko.luckperms.LuckPermsPlugin;
|
||||
import me.lucko.luckperms.commands.Sender;
|
||||
import me.lucko.luckperms.commands.Util;
|
||||
import me.lucko.luckperms.data.Datastore;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
@NoArgsConstructor
|
||||
public abstract class UserManager {
|
||||
|
||||
/**
|
||||
* A {@link Map} containing all online/loaded users
|
||||
*/
|
||||
@Getter
|
||||
private final Map<UUID, User> users = new ConcurrentHashMap<>();
|
||||
|
||||
/**
|
||||
* Get a user object by UUID
|
||||
* @param uuid The uuid to search by
|
||||
* @return a {@link User} object if the user is loaded, returns null if the user is not loaded
|
||||
*/
|
||||
public User getUser(UUID uuid) {
|
||||
return users.get(uuid);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a user object by name
|
||||
* @param name The name to search by
|
||||
* @return a {@link User} object if the user is loaded, returns null if the user is not loaded
|
||||
*/
|
||||
public User getUser(String name) {
|
||||
User user = null;
|
||||
|
||||
for (User u : users.values()) {
|
||||
if (u.getName().equalsIgnoreCase(name)) {
|
||||
user = u;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return user;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a user to the {@link #getUsers()} map
|
||||
* @param user the user to add
|
||||
*/
|
||||
public void setUser(User user) {
|
||||
users.put(user.getUuid(), user);
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates (or sets if the user wasn't already loaded) a user in the {@link #getUsers()} map
|
||||
* @param user The user to update or set
|
||||
*/
|
||||
public void updateOrSetUser(User user) {
|
||||
if (!users.containsKey(user.getUuid())) {
|
||||
// The user isn't already loaded, so we can just add
|
||||
users.put(user.getUuid(), user);
|
||||
// They're probably not online, but in case they are...
|
||||
user.refreshPermissions();
|
||||
} else {
|
||||
// Override the user's current loaded nodes, and force a refresh
|
||||
users.get(user.getUuid()).setNodes(user.getNodes());
|
||||
users.get(user.getUuid()).refreshPermissions();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Saves a user object in the datastore
|
||||
* @param user the user to save
|
||||
* @param datastore the datastore
|
||||
*/
|
||||
public void saveUser(User user, Datastore datastore) {
|
||||
user.refreshPermissions();
|
||||
datastore.saveUser(user, success -> {});
|
||||
}
|
||||
|
||||
/**
|
||||
* Check to see if a user is loaded or not
|
||||
* @param uuid the UUID of the user
|
||||
* @return true if the user is loaded
|
||||
*/
|
||||
public boolean isLoaded(UUID uuid) {
|
||||
return users.containsKey(uuid);
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes and unloads any permission links of the user from the internal storage
|
||||
* @param user The user to unload
|
||||
*/
|
||||
public abstract void unloadUser(User user);
|
||||
|
||||
/**
|
||||
* Checks to see if the user is online, and if they are not, runs {@link #unloadUser(User)}
|
||||
* @param user The user to be cleaned up
|
||||
*/
|
||||
public abstract void cleanupUser(User user);
|
||||
|
||||
/**
|
||||
* Makes a new {@link User} object
|
||||
* @param uuid The UUID of the user
|
||||
* @return a new {@link User} object
|
||||
*/
|
||||
public abstract User makeUser(UUID uuid);
|
||||
|
||||
/**
|
||||
* Makes a new {@link User} object
|
||||
* @param uuid The UUID of the user
|
||||
* @param username The username of the user
|
||||
* @return a new {@link User} object
|
||||
*/
|
||||
public abstract User makeUser(UUID uuid, String username);
|
||||
}
|
||||
Reference in New Issue
Block a user