Add events

This commit is contained in:
Luck
2016-08-20 15:43:54 +01:00
Unverified
parent 7e933966cf
commit 4aa753515d
43 changed files with 1128 additions and 111 deletions
@@ -23,6 +23,7 @@
package me.lucko.luckperms;
import me.lucko.luckperms.api.Logger;
import me.lucko.luckperms.api.implementation.ApiProvider;
import me.lucko.luckperms.commands.Sender;
import me.lucko.luckperms.constants.Message;
import me.lucko.luckperms.core.LPConfiguration;
@@ -44,47 +45,18 @@ import java.util.UUID;
*/
public interface LuckPermsPlugin {
/**
* Retrieves the {@link UserManager} used to manage users and their permissions/groups
* @return the {@link UserManager} instance
/*
* Access to all of the main internal manager classes
*/
UserManager getUserManager();
/**
* Retrieves the {@link GroupManager} used to manage the loaded groups and modify their permissions
* @return the {@link GroupManager} instance
*/
GroupManager getGroupManager();
/**
* Retrieves the {@link TrackManager} used to manage the loaded tracks
* @return the {@link TrackManager} instance
*/
TrackManager getTrackManager();
/**
* Retrieves the {@link LPConfiguration} for getting values from the config
* @return the {@link LPConfiguration} implementation for the platform
*/
LPConfiguration getConfiguration();
/**
* Retrieves the {@link Datastore} for loading/saving plugin data
* @return the {@link Datastore} object
*/
Datastore getDatastore();
/**
* Retrieves the {@link Logger} for the plugin
* @return the plugin's {@link Logger}
*/
Logger getLog();
/**
* Retrieves the {@link UuidCache} for the plugin
* @return the plugin's {@link UuidCache}
*/
UuidCache getUuidCache();
ApiProvider getApiProvider();
Importer getImporter();
/**
* @return the version of the plugin
@@ -101,11 +73,6 @@ public interface LuckPermsPlugin {
*/
File getDataFolder();
/**
* @return the importer instance for the platform
*/
Importer getImporter();
/**
* Returns a colored string indicating the status of a player
* @param uuid The player's uuid
@@ -126,14 +93,12 @@ public interface LuckPermsPlugin {
List<String> getPlayerList();
/**
* Gets a list of all Senders online on the platform
* @return a {@link List} of senders
* @return a {@link List} of senders online on the platform
*/
List<Sender> getSenders();
/**
* Gets the console sender of the instance
* @return a the console sender of the instance
* @return the console sender of the instance
*/
Sender getConsoleSender();
@@ -22,10 +22,13 @@
package me.lucko.luckperms.api.implementation;
import com.google.common.eventbus.EventBus;
import lombok.AllArgsConstructor;
import lombok.NonNull;
import me.lucko.luckperms.LuckPermsPlugin;
import me.lucko.luckperms.api.*;
import me.lucko.luckperms.api.event.LPEvent;
import me.lucko.luckperms.api.event.LPListener;
import me.lucko.luckperms.api.implementation.internal.*;
import java.util.Optional;
@@ -39,6 +42,21 @@ import java.util.stream.Collectors;
@AllArgsConstructor
public class ApiProvider implements LuckPermsApi {
private final LuckPermsPlugin plugin;
private final EventBus eventBus = new EventBus("LuckPerms");
public void fireEventAsync(LPEvent event) {
plugin.doAsync(() -> fireEvent(event));
}
public void fireEvent(LPEvent event) {
try {
event.setApi(this);
eventBus.post(event);
} catch (Exception e) {
getLogger().severe("Couldn't fire LuckPerms Event: " + event.getEventName());
e.printStackTrace();
}
}
@Override
public void runUpdateTask() {
@@ -50,6 +68,16 @@ public class ApiProvider implements LuckPermsApi {
return plugin.getVersion();
}
@Override
public void registerListener(LPListener listener) {
eventBus.register(listener);
}
@Override
public void unregisterListener(LPListener listener) {
eventBus.unregister(listener);
}
@Override
public LPConfiguration getConfiguration() {
return new LPConfigurationLink(plugin.getConfiguration());
@@ -22,7 +22,6 @@
package me.lucko.luckperms.api.implementation.internal;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.NonNull;
import me.lucko.luckperms.api.PermissionHolder;
@@ -39,8 +38,8 @@ import static me.lucko.luckperms.api.implementation.internal.Utils.*;
* Provides a link between {@link PermissionHolder} and {@link me.lucko.luckperms.core.PermissionHolder}
*/
@SuppressWarnings("unused")
@AllArgsConstructor(access = AccessLevel.PACKAGE)
class PermissionHolderLink implements PermissionHolder {
@AllArgsConstructor
public class PermissionHolderLink implements PermissionHolder {
@NonNull
private final me.lucko.luckperms.core.PermissionHolder master;
@@ -23,6 +23,9 @@
package me.lucko.luckperms.commands.user.subcommands;
import me.lucko.luckperms.LuckPermsPlugin;
import me.lucko.luckperms.api.event.events.UserDemoteEvent;
import me.lucko.luckperms.api.implementation.internal.TrackLink;
import me.lucko.luckperms.api.implementation.internal.UserLink;
import me.lucko.luckperms.commands.*;
import me.lucko.luckperms.constants.Message;
import me.lucko.luckperms.constants.Permission;
@@ -107,6 +110,7 @@ public class UserDemote extends SubCommand<User> {
.action("demote " + track.getName() + "(from " + old + " to " + previousGroup.getName() + ")")
.build().submit(plugin);
save(user, sender, plugin);
plugin.getApiProvider().fireEventAsync(new UserDemoteEvent(new TrackLink(track), new UserLink(user), old, previousGroup.getName()));
return CommandResult.SUCCESS;
}
@@ -23,6 +23,9 @@
package me.lucko.luckperms.commands.user.subcommands;
import me.lucko.luckperms.LuckPermsPlugin;
import me.lucko.luckperms.api.event.events.UserPromoteEvent;
import me.lucko.luckperms.api.implementation.internal.TrackLink;
import me.lucko.luckperms.api.implementation.internal.UserLink;
import me.lucko.luckperms.commands.*;
import me.lucko.luckperms.constants.Message;
import me.lucko.luckperms.constants.Permission;
@@ -107,6 +110,7 @@ public class UserPromote extends SubCommand<User> {
.action("promote " + track.getName() + "(from " + old + " to " + nextGroup.getName() + ")")
.build().submit(plugin);
save(user, sender, plugin);
plugin.getApiProvider().fireEventAsync(new UserPromoteEvent(new TrackLink(track), new UserLink(user), old, nextGroup.getName()));
return CommandResult.SUCCESS;
}
@@ -26,6 +26,11 @@ import lombok.AccessLevel;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import me.lucko.luckperms.LuckPermsPlugin;
import me.lucko.luckperms.api.event.events.GroupRemoveEvent;
import me.lucko.luckperms.api.event.events.PermissionExpireEvent;
import me.lucko.luckperms.api.event.events.PermissionSetEvent;
import me.lucko.luckperms.api.event.events.PermissionUnsetEvent;
import me.lucko.luckperms.api.implementation.internal.PermissionHolderLink;
import me.lucko.luckperms.constants.Patterns;
import me.lucko.luckperms.exceptions.ObjectAlreadyHasException;
import me.lucko.luckperms.exceptions.ObjectLacksException;
@@ -252,11 +257,7 @@ public abstract class PermissionHolder {
* @throws ObjectAlreadyHasException if the object already has the permission
*/
public void setPermission(String node, boolean value) throws ObjectAlreadyHasException {
if (node.startsWith("global/")) node = node.replace("global/", "");
if (hasPermission(node, value)) {
throw new ObjectAlreadyHasException();
}
this.nodes.put(node, value);
setPermission(node, value, null, null, 0L);
}
/**
@@ -267,7 +268,7 @@ public abstract class PermissionHolder {
* @throws ObjectAlreadyHasException if the object already has the permission
*/
public void setPermission(String node, boolean value, String server) throws ObjectAlreadyHasException {
setPermission(server + "/" + node, value);
setPermission(node, value, server, null, 0L);
}
/**
@@ -279,7 +280,7 @@ public abstract class PermissionHolder {
* @throws ObjectAlreadyHasException if the object already has the permission
*/
public void setPermission(String node, boolean value, String server, String world) throws ObjectAlreadyHasException {
setPermission(server + "-" + world + "/" + node, value);
setPermission(node, value, server, world, 0L);
}
/**
@@ -290,7 +291,7 @@ public abstract class PermissionHolder {
* @throws ObjectAlreadyHasException if the object already has the permission
*/
public void setPermission(String node, boolean value, long expireAt) throws ObjectAlreadyHasException {
setPermission(node + "$" + expireAt, value);
setPermission(node, value, null, null, expireAt);
}
/**
@@ -302,7 +303,7 @@ public abstract class PermissionHolder {
* @throws ObjectAlreadyHasException if the object already has the permission
*/
public void setPermission(String node, boolean value, String server, long expireAt) throws ObjectAlreadyHasException {
setPermission(node + "$" + expireAt, value, server);
setPermission(node, value, server, null, expireAt);
}
/**
@@ -315,7 +316,43 @@ public abstract class PermissionHolder {
* @throws ObjectAlreadyHasException if the object already has the permission
*/
public void setPermission(String node, boolean value, String server, String world, long expireAt) throws ObjectAlreadyHasException {
setPermission(node + "$" + expireAt, value, server, world);
if (node.startsWith("global/")) node = node.replace("global/", "");
if (server != null && server.equals("")) server = null;
if (world != null && world.equals("")) world = null;
StringBuilder builder = new StringBuilder();
if (server != null) {
builder.append(server);
if (world != null) {
builder.append("-").append(world);
}
builder.append("/");
} else {
if (world != null) {
builder.append("global-").append(world);
}
builder.append("/");
}
builder.append(node);
if (expireAt != 0L) {
builder.append("$").append(expireAt);
}
final String finalNode = builder.toString();
if (hasPermission(node, value)) {
throw new ObjectAlreadyHasException();
}
this.nodes.put(finalNode, value);
plugin.getApiProvider().fireEventAsync(new PermissionSetEvent(
new PermissionHolderLink(this), node, value, server, world, expireAt));
}
/**
@@ -325,26 +362,7 @@ public abstract class PermissionHolder {
* @throws ObjectLacksException if the node wasn't already set
*/
public void unsetPermission(String node, boolean temporary) throws ObjectLacksException {
if (node.startsWith("global/")) node = node.replace("global/", "");
final String fNode = node;
Optional<String> match = Optional.empty();
if (temporary) {
match = this.nodes.keySet().stream()
.filter(n -> n.contains("$"))
.filter(n -> Patterns.TEMP_DELIMITER.split(n)[0].equalsIgnoreCase(fNode))
.findFirst();
} else {
if (this.nodes.containsKey(fNode)) {
match = Optional.of(fNode);
}
}
if (match.isPresent()) {
this.nodes.remove(match.get());
} else {
throw new ObjectLacksException();
}
unsetPermission(node, null, null, temporary);
}
/**
@@ -353,7 +371,7 @@ public abstract class PermissionHolder {
* @throws ObjectLacksException if the node wasn't already set
*/
public void unsetPermission(String node) throws ObjectLacksException {
unsetPermission(node, node.contains("$"));
unsetPermission(node, null, null, false);
}
/**
@@ -363,7 +381,7 @@ public abstract class PermissionHolder {
* @throws ObjectLacksException if the node wasn't already set
*/
public void unsetPermission(String node, String server) throws ObjectLacksException {
unsetPermission(server + "/" + node);
unsetPermission(node, server, null, false);
}
/**
@@ -374,7 +392,7 @@ public abstract class PermissionHolder {
* @throws ObjectLacksException if the node wasn't already set
*/
public void unsetPermission(String node, String server, String world) throws ObjectLacksException {
unsetPermission(server + "-" + world + "/" + node);
unsetPermission(node, server, world, false);
}
/**
@@ -385,7 +403,7 @@ public abstract class PermissionHolder {
* @throws ObjectLacksException if the node wasn't already set
*/
public void unsetPermission(String node, String server, boolean temporary) throws ObjectLacksException {
unsetPermission(server + "/" + node, temporary);
unsetPermission(node, server, null, temporary);
}
/**
@@ -397,7 +415,55 @@ public abstract class PermissionHolder {
* @throws ObjectLacksException if the node wasn't already set
*/
public void unsetPermission(String node, String server, String world, boolean temporary) throws ObjectLacksException {
unsetPermission(server + "-" + world + "/" + node, temporary);
if (node.startsWith("global/")) node = node.replace("global/", "");
if (server != null && server.equals("")) server = null;
if (world != null && world.equals("")) world = null;
StringBuilder builder = new StringBuilder();
if (server != null) {
builder.append(server);
if (world != null) {
builder.append("-").append(world);
}
builder.append("/");
} else {
if (world != null) {
builder.append("global-").append(world);
}
builder.append("/");
}
builder.append(node);
final String finalNode = builder.toString();
Optional<String> match = Optional.empty();
if (temporary) {
match = this.nodes.keySet().stream()
.filter(n -> n.contains("$"))
.filter(n -> Patterns.TEMP_DELIMITER.split(n)[0].equalsIgnoreCase(finalNode))
.findFirst();
} else {
if (this.nodes.containsKey(finalNode)) {
match = Optional.of(finalNode);
}
}
if (match.isPresent()) {
this.nodes.remove(match.get());
plugin.getApiProvider().fireEventAsync(new PermissionUnsetEvent(
new PermissionHolderLink(this), node, server, world, temporary));
if (node.startsWith("group.")) {
plugin.getApiProvider().fireEventAsync(new GroupRemoveEvent(
new PermissionHolderLink(this), Patterns.DOT.split(node, 2)[1], server, world, temporary));
}
} else {
throw new ObjectLacksException();
}
}
/**
@@ -476,7 +542,10 @@ public abstract class PermissionHolder {
.filter(s -> DateUtil.shouldExpire(Long.parseLong(Patterns.TEMP_DELIMITER.split(s)[1])))
.collect(Collectors.toList());
toExpire.forEach(s -> this.nodes.remove(s));
toExpire.forEach(s -> {
plugin.getApiProvider().fireEventAsync(new PermissionExpireEvent(new PermissionHolderLink(this), s));
this.nodes.remove(s);
});
return !toExpire.isEmpty();
}
@@ -23,6 +23,7 @@
package me.lucko.luckperms.data;
import me.lucko.luckperms.LuckPermsPlugin;
import me.lucko.luckperms.api.event.events.LogNotifyEvent;
import me.lucko.luckperms.commands.Sender;
import me.lucko.luckperms.constants.Message;
import me.lucko.luckperms.constants.Permission;
@@ -46,6 +47,10 @@ public class LogEntry extends me.lucko.luckperms.api.LogEntry {
public void submit(LuckPermsPlugin plugin) {
plugin.getDatastore().logAction(this);
LogNotifyEvent event = new LogNotifyEvent(this);
plugin.getApiProvider().fireEvent(event);
if (event.isCancelled()) return;
final String msg = super.getFormatted();
List<Sender> senders = plugin.getSenders().stream()
@@ -26,6 +26,9 @@ import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.ToString;
import me.lucko.luckperms.LuckPermsPlugin;
import me.lucko.luckperms.api.event.events.GroupAddEvent;
import me.lucko.luckperms.api.implementation.internal.GroupLink;
import me.lucko.luckperms.api.implementation.internal.PermissionHolderLink;
import me.lucko.luckperms.constants.Patterns;
import me.lucko.luckperms.core.PermissionHolder;
import me.lucko.luckperms.exceptions.ObjectAlreadyHasException;
@@ -92,7 +95,12 @@ public class Group extends PermissionHolder implements Identifiable<String> {
* @throws ObjectAlreadyHasException if the group already inherits the group
*/
public void setInheritGroup(Group group) throws ObjectAlreadyHasException {
setInheritGroup(group, "global");
if (group.getName().equalsIgnoreCase(this.getName())) {
throw new ObjectAlreadyHasException();
}
setPermission("group." + group.getName(), true);
getPlugin().getApiProvider().fireEventAsync(new GroupAddEvent(new PermissionHolderLink(this), new GroupLink(group), null, null, 0L));
}
/**
@@ -111,6 +119,7 @@ public class Group extends PermissionHolder implements Identifiable<String> {
}
setPermission("group." + group.getName(), true, server);
getPlugin().getApiProvider().fireEventAsync(new GroupAddEvent(new PermissionHolderLink(this), new GroupLink(group), server, null, 0L));
}
/**
@@ -130,6 +139,7 @@ public class Group extends PermissionHolder implements Identifiable<String> {
}
setPermission("group." + group.getName(), true, server, world);
getPlugin().getApiProvider().fireEventAsync(new GroupAddEvent(new PermissionHolderLink(this), new GroupLink(group), server, world, 0L));
}
/**
@@ -144,6 +154,7 @@ public class Group extends PermissionHolder implements Identifiable<String> {
}
setPermission("group." + group.getName(), true, expireAt);
getPlugin().getApiProvider().fireEventAsync(new GroupAddEvent(new PermissionHolderLink(this), new GroupLink(group), null, null, expireAt));
}
/**
@@ -163,6 +174,7 @@ public class Group extends PermissionHolder implements Identifiable<String> {
}
setPermission("group." + group.getName(), true, server, expireAt);
getPlugin().getApiProvider().fireEventAsync(new GroupAddEvent(new PermissionHolderLink(this), new GroupLink(group), server, null, expireAt));
}
/**
@@ -183,6 +195,7 @@ public class Group extends PermissionHolder implements Identifiable<String> {
}
setPermission("group." + group.getName(), true, server, world, expireAt);
getPlugin().getApiProvider().fireEventAsync(new GroupAddEvent(new PermissionHolderLink(this), new GroupLink(group), server, world, expireAt));
}
/**
@@ -24,13 +24,22 @@ package me.lucko.luckperms.runnables;
import lombok.AllArgsConstructor;
import me.lucko.luckperms.LuckPermsPlugin;
import me.lucko.luckperms.api.event.events.PostSyncEvent;
import me.lucko.luckperms.api.event.events.PreSyncEvent;
@AllArgsConstructor
public class UpdateTask implements Runnable {
private final LuckPermsPlugin plugin;
/**
* Called ASYNC
*/
@Override
public void run() {
PreSyncEvent event = new PreSyncEvent();
plugin.getApiProvider().fireEvent(event);
if (event.isCancelled()) return;
// Reload all groups
plugin.getDatastore().loadAllGroups();
String defaultGroup = plugin.getConfiguration().getDefaultGroupName();
@@ -43,5 +52,7 @@ public class UpdateTask implements Runnable {
// Refresh all online users.
plugin.getUserManager().updateAllUsers();
plugin.getApiProvider().fireEvent(new PostSyncEvent());;
}
}
@@ -27,6 +27,9 @@ import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import me.lucko.luckperms.LuckPermsPlugin;
import me.lucko.luckperms.api.event.events.GroupAddEvent;
import me.lucko.luckperms.api.implementation.internal.GroupLink;
import me.lucko.luckperms.api.implementation.internal.PermissionHolderLink;
import me.lucko.luckperms.constants.Patterns;
import me.lucko.luckperms.core.PermissionHolder;
import me.lucko.luckperms.exceptions.ObjectAlreadyHasException;
@@ -121,7 +124,8 @@ public abstract class User extends PermissionHolder implements Identifiable<UUID
* @throws ObjectAlreadyHasException if the user is already a member of the group
*/
public void addGroup(Group group) throws ObjectAlreadyHasException {
addGroup(group, "global");
setPermission("group." + group.getName(), true);
getPlugin().getApiProvider().fireEventAsync(new GroupAddEvent(new PermissionHolderLink(this), new GroupLink(group), null, null, 0L));
}
/**
@@ -136,6 +140,7 @@ public abstract class User extends PermissionHolder implements Identifiable<UUID
}
setPermission("group." + group.getName(), true, server);
getPlugin().getApiProvider().fireEventAsync(new GroupAddEvent(new PermissionHolderLink(this), new GroupLink(group), server, null, 0L));
}
/**
@@ -151,6 +156,7 @@ public abstract class User extends PermissionHolder implements Identifiable<UUID
}
setPermission("group." + group.getName(), true, server, world);
getPlugin().getApiProvider().fireEventAsync(new GroupAddEvent(new PermissionHolderLink(this), new GroupLink(group), server, world, 0L));
}
/**
@@ -161,6 +167,7 @@ public abstract class User extends PermissionHolder implements Identifiable<UUID
*/
public void addGroup(Group group, long expireAt) throws ObjectAlreadyHasException {
setPermission("group." + group.getName(), true, expireAt);
getPlugin().getApiProvider().fireEventAsync(new GroupAddEvent(new PermissionHolderLink(this), new GroupLink(group), null, null, expireAt));
}
/**
@@ -176,6 +183,7 @@ public abstract class User extends PermissionHolder implements Identifiable<UUID
}
setPermission("group." + group.getName(), true, server, expireAt);
getPlugin().getApiProvider().fireEventAsync(new GroupAddEvent(new PermissionHolderLink(this), new GroupLink(group), server, null, expireAt));
}
/**
@@ -192,6 +200,7 @@ public abstract class User extends PermissionHolder implements Identifiable<UUID
}
setPermission("group." + group.getName(), true, server, world, expireAt);
getPlugin().getApiProvider().fireEventAsync(new GroupAddEvent(new PermissionHolderLink(this), new GroupLink(group), server, world, expireAt));
}
/**
@@ -25,6 +25,7 @@ package me.lucko.luckperms.utils;
import lombok.AllArgsConstructor;
import me.lucko.luckperms.LuckPermsPlugin;
import me.lucko.luckperms.api.data.Callback;
import me.lucko.luckperms.api.event.events.UserFirstLoginEvent;
import me.lucko.luckperms.core.UuidCache;
import me.lucko.luckperms.users.User;
@@ -44,10 +45,16 @@ public class AbstractListener {
cache.addToCache(u, uuid);
} else {
// No previous data for this player
plugin.getApiProvider().fireEventAsync(new UserFirstLoginEvent(u, username));
cache.addToCache(u, u);
plugin.getDatastore().saveUUIDData(username, u, Callback.empty());
}
} else {
UUID uuid = plugin.getDatastore().getUUID(username);
if (uuid == null) {
plugin.getApiProvider().fireEventAsync(new UserFirstLoginEvent(u, username));
}
// Online mode, no cache needed. This is just for name -> uuid lookup.
plugin.getDatastore().saveUUIDData(username, u, Callback.empty());
}