Events rewrite, remove most deprecated API methods (v3.0)

This commit is contained in:
Luck
2017-02-19 14:57:06 +00:00
Unverified
parent 89ff3b169b
commit 6798fb21b2
148 changed files with 2955 additions and 1948 deletions
@@ -22,13 +22,10 @@
package me.lucko.luckperms.common.api;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NonNull;
import com.google.common.eventbus.EventBus;
import me.lucko.luckperms.api.Contexts;
import me.lucko.luckperms.api.Datastore;
import me.lucko.luckperms.api.Group;
import me.lucko.luckperms.api.LPConfiguration;
import me.lucko.luckperms.api.Logger;
@@ -41,21 +38,14 @@ import me.lucko.luckperms.api.Storage;
import me.lucko.luckperms.api.Track;
import me.lucko.luckperms.api.User;
import me.lucko.luckperms.api.UuidCache;
import me.lucko.luckperms.api.context.ContextListener;
import me.lucko.luckperms.api.context.ContextCalculator;
import me.lucko.luckperms.api.context.ContextSet;
import me.lucko.luckperms.api.context.IContextCalculator;
import me.lucko.luckperms.api.event.LPEvent;
import me.lucko.luckperms.api.event.LPListener;
import me.lucko.luckperms.common.api.delegate.DatastoreDelegate;
import me.lucko.luckperms.common.api.delegate.GroupDelegate;
import me.lucko.luckperms.common.api.delegate.LPConfigurationDelegate;
import me.lucko.luckperms.common.api.delegate.NodeFactoryDelegate;
import me.lucko.luckperms.common.api.delegate.StorageDelegate;
import me.lucko.luckperms.common.api.delegate.TrackDelegate;
import me.lucko.luckperms.common.api.delegate.UserDelegate;
import me.lucko.luckperms.common.api.delegate.UuidCacheDelegate;
import me.lucko.luckperms.common.api.delegates.NodeFactoryDelegate;
import me.lucko.luckperms.common.api.delegates.UserDelegate;
import me.lucko.luckperms.common.core.NodeBuilder;
import me.lucko.luckperms.common.core.UserIdentifier;
import me.lucko.luckperms.common.event.EventFactory;
import me.lucko.luckperms.common.event.LuckPermsEventBus;
import me.lucko.luckperms.common.plugin.LuckPermsPlugin;
import java.util.Optional;
@@ -66,23 +56,19 @@ import java.util.stream.Collectors;
/**
* Implements the LuckPerms API using the plugin instance
*/
@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));
}
@Getter
private final LuckPermsEventBus eventBus;
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();
}
@Getter
private final EventFactory eventFactory;
public ApiProvider(LuckPermsPlugin plugin) {
this.plugin = plugin;
this.eventBus = new LuckPermsEventBus(plugin);
this.eventFactory = new EventFactory(eventBus);
}
@Override
@@ -92,7 +78,7 @@ public class ApiProvider implements LuckPermsApi {
@Override
public double getApiVersion() {
return 2.17;
return 3.0;
}
@Override
@@ -105,30 +91,14 @@ public class ApiProvider implements LuckPermsApi {
return plugin.getServerType();
}
@Override
public void registerListener(@NonNull LPListener listener) {
eventBus.register(listener);
}
@Override
public void unregisterListener(@NonNull LPListener listener) {
eventBus.unregister(listener);
}
@Override
public LPConfiguration getConfiguration() {
return new LPConfigurationDelegate(plugin.getConfiguration());
return plugin.getConfiguration().getDelegate();
}
@Override
public Storage getStorage() {
return new StorageDelegate(plugin, plugin.getStorage());
}
@SuppressWarnings("deprecation")
@Override
public Datastore getDatastore() {
return new DatastoreDelegate(plugin, plugin.getStorage());
return plugin.getStorage().getDelegate();
}
@Override
@@ -138,7 +108,7 @@ public class ApiProvider implements LuckPermsApi {
@Override
public UuidCache getUuidCache() {
return new UuidCacheDelegate(plugin.getUuidCache());
return plugin.getUuidCache().getDelegate();
}
@Override
@@ -149,7 +119,7 @@ public class ApiProvider implements LuckPermsApi {
@Override
public User getUser(@NonNull UUID uuid) {
final me.lucko.luckperms.common.core.model.User user = plugin.getUserManager().get(uuid);
return user == null ? null : new UserDelegate(user);
return user == null ? null : user.getDelegate();
}
@Override
@@ -160,7 +130,7 @@ public class ApiProvider implements LuckPermsApi {
@Override
public User getUser(@NonNull String name) {
final me.lucko.luckperms.common.core.model.User user = plugin.getUserManager().getByUsername(name);
return user == null ? null : new UserDelegate(user);
return user == null ? null : user.getDelegate();
}
@Override
@@ -170,7 +140,7 @@ public class ApiProvider implements LuckPermsApi {
@Override
public Set<User> getUsers() {
return plugin.getUserManager().getAll().values().stream().map(UserDelegate::new).collect(Collectors.toSet());
return plugin.getUserManager().getAll().values().stream().map(u -> u.getDelegate()).collect(Collectors.toSet());
}
@Override
@@ -187,7 +157,7 @@ public class ApiProvider implements LuckPermsApi {
@Override
public Group getGroup(@NonNull String name) {
final me.lucko.luckperms.common.core.model.Group group = plugin.getGroupManager().getIfLoaded(name);
return group == null ? null : new GroupDelegate(group);
return group == null ? null : group.getDelegate();
}
@Override
@@ -197,7 +167,7 @@ public class ApiProvider implements LuckPermsApi {
@Override
public Set<Group> getGroups() {
return plugin.getGroupManager().getAll().values().stream().map(GroupDelegate::new).collect(Collectors.toSet());
return plugin.getGroupManager().getAll().values().stream().map(g -> g.getDelegate()).collect(Collectors.toSet());
}
@Override
@@ -208,7 +178,7 @@ public class ApiProvider implements LuckPermsApi {
@Override
public Track getTrack(@NonNull String name) {
final me.lucko.luckperms.common.core.model.Track track = plugin.getTrackManager().getIfLoaded(name);
return track == null ? null : new TrackDelegate(track);
return track == null ? null : track.getDelegate();
}
@Override
@@ -218,7 +188,7 @@ public class ApiProvider implements LuckPermsApi {
@Override
public Set<Track> getTracks() {
return plugin.getTrackManager().getAll().values().stream().map(TrackDelegate::new).collect(Collectors.toSet());
return plugin.getTrackManager().getAll().values().stream().map(t -> t.getDelegate()).collect(Collectors.toSet());
}
@Override
@@ -238,16 +208,10 @@ public class ApiProvider implements LuckPermsApi {
@SuppressWarnings("unchecked")
@Override
public void registerContextCalculator(IContextCalculator<?> contextCalculator) {
public void registerContextCalculator(ContextCalculator<?> contextCalculator) {
plugin.getContextManager().registerCalculator(contextCalculator);
}
@SuppressWarnings("unchecked")
@Override
public void registerContextListener(ContextListener<?> contextListener) {
plugin.getContextManager().registerListener(contextListener);
}
@Override
public Optional<Contexts> getContextForUser(User user) {
ApiUtils.checkUser(user);
@@ -29,9 +29,9 @@ import com.google.common.base.Preconditions;
import me.lucko.luckperms.api.Group;
import me.lucko.luckperms.api.Track;
import me.lucko.luckperms.api.User;
import me.lucko.luckperms.common.api.delegate.GroupDelegate;
import me.lucko.luckperms.common.api.delegate.TrackDelegate;
import me.lucko.luckperms.common.api.delegate.UserDelegate;
import me.lucko.luckperms.common.api.delegates.GroupDelegate;
import me.lucko.luckperms.common.api.delegates.TrackDelegate;
import me.lucko.luckperms.common.api.delegates.UserDelegate;
import me.lucko.luckperms.common.utils.ArgumentChecker;
@UtilityClass
@@ -1,440 +0,0 @@
/*
* Copyright (c) 2016 Lucko (Luck) <luck@lucko.me>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package me.lucko.luckperms.common.api.delegate;
import lombok.AllArgsConstructor;
import lombok.NonNull;
import me.lucko.luckperms.api.Datastore;
import me.lucko.luckperms.api.Group;
import me.lucko.luckperms.api.Log;
import me.lucko.luckperms.api.LogEntry;
import me.lucko.luckperms.api.Track;
import me.lucko.luckperms.api.User;
import me.lucko.luckperms.api.data.Callback;
import me.lucko.luckperms.common.config.ConfigKeys;
import me.lucko.luckperms.common.plugin.LuckPermsPlugin;
import me.lucko.luckperms.common.storage.Storage;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
import static me.lucko.luckperms.common.api.ApiUtils.checkGroup;
import static me.lucko.luckperms.common.api.ApiUtils.checkName;
import static me.lucko.luckperms.common.api.ApiUtils.checkTrack;
import static me.lucko.luckperms.common.api.ApiUtils.checkUser;
import static me.lucko.luckperms.common.api.ApiUtils.checkUsername;
@SuppressWarnings("deprecation")
public class DatastoreDelegate implements Datastore {
private final LuckPermsPlugin plugin;
private final Storage master;
private final Async async;
private final Sync sync;
private final Future future;
public DatastoreDelegate(@NonNull LuckPermsPlugin plugin, @NonNull Storage master) {
this.plugin = plugin;
this.master = master;
this.async = new Async(master);
this.sync = new Sync(master);
this.future = new Future(master);
}
private <T> void registerCallback(CompletableFuture<T> fut, Callback<T> c) {
if (c != null) {
fut.thenAcceptAsync(Callback.convertToConsumer(c), plugin.getScheduler().getSyncExecutor());
}
}
@Override
public String getName() {
return master.getName();
}
@Override
public boolean isAcceptingLogins() {
return master.isAcceptingLogins();
}
@Override
public Datastore.Async async() {
return async;
}
@Override
public Datastore.Sync sync() {
return sync;
}
@Override
public Datastore.Future future() {
return future;
}
@AllArgsConstructor
public class Async implements Datastore.Async {
private final me.lucko.luckperms.common.storage.Storage master;
@Override
public void logAction(@NonNull LogEntry entry, Callback<Boolean> callback) {
registerCallback(master.force().logAction(entry), callback);
}
@Override
public void getLog(@NonNull Callback<Log> callback) {
master.force().getLog().thenAcceptAsync(log -> callback.onComplete(new LogDelegate(log)), plugin.getScheduler().getSyncExecutor());
}
@Override
public void loadOrCreateUser(@NonNull UUID uuid, @NonNull String username, Callback<Boolean> callback) {
registerCallback(master.force().loadUser(uuid, checkUsername(username)), callback);
}
@Override
public void loadUser(@NonNull UUID uuid, Callback<Boolean> callback) {
registerCallback(master.force().loadUser(uuid, "null"), callback);
}
@Override
public void loadUser(@NonNull UUID uuid, @NonNull String username, Callback<Boolean> callback) {
registerCallback(master.force().loadUser(uuid, checkUsername(username)), callback);
}
@Override
public void saveUser(@NonNull User user, Callback<Boolean> callback) {
checkUser(user);
registerCallback(master.force().saveUser(((UserDelegate) user).getMaster()), callback);
}
@Override
public void cleanupUsers(Callback<Boolean> callback) {
registerCallback(master.force().cleanupUsers(), callback);
}
@Override
public void getUniqueUsers(Callback<Set<UUID>> callback) {
registerCallback(master.force().getUniqueUsers(), callback);
}
@Override
public void createAndLoadGroup(@NonNull String name, Callback<Boolean> callback) {
registerCallback(master.force().createAndLoadGroup(checkName(name)), callback);
}
@Override
public void loadGroup(@NonNull String name, Callback<Boolean> callback) {
registerCallback(master.force().loadGroup(checkName(name)), callback);
}
@Override
public void loadAllGroups(Callback<Boolean> callback) {
registerCallback(master.force().loadAllGroups(), callback);
}
@Override
public void saveGroup(@NonNull Group group, Callback<Boolean> callback) {
checkGroup(group);
registerCallback(master.force().saveGroup(((GroupDelegate) group).getMaster()), callback);
}
@Override
public void deleteGroup(@NonNull Group group, Callback<Boolean> callback) {
checkGroup(group);
if (group.getName().equalsIgnoreCase(plugin.getConfiguration().get(ConfigKeys.DEFAULT_GROUP_NAME))) {
throw new IllegalArgumentException("Cannot delete the default group.");
}
registerCallback(master.force().deleteGroup(((GroupDelegate) group).getMaster()), callback);
}
@Override
public void createAndLoadTrack(@NonNull String name, Callback<Boolean> callback) {
registerCallback(master.force().createAndLoadTrack(checkName(name)), callback);
}
@Override
public void loadTrack(@NonNull String name, Callback<Boolean> callback) {
registerCallback(master.force().loadTrack(checkName(name)), callback);
}
@Override
public void loadAllTracks(Callback<Boolean> callback) {
registerCallback(master.force().loadAllTracks(), callback);
}
@Override
public void saveTrack(@NonNull Track track, Callback<Boolean> callback) {
checkTrack(track);
registerCallback(master.force().saveTrack(((TrackDelegate) track).getMaster()), callback);
}
@Override
public void deleteTrack(@NonNull Track track, Callback<Boolean> callback) {
checkTrack(track);
registerCallback(master.force().deleteTrack(((TrackDelegate) track).getMaster()), callback);
}
@Override
public void saveUUIDData(@NonNull String username, @NonNull UUID uuid, Callback<Boolean> callback) {
registerCallback(master.force().saveUUIDData(checkUsername(username), uuid), callback);
}
@Override
public void getUUID(@NonNull String username, Callback<UUID> callback) {
registerCallback(master.force().getUUID(checkUsername(username)), callback);
}
}
@AllArgsConstructor
public class Sync implements Datastore.Sync {
private final Storage master;
@Override
public boolean logAction(@NonNull LogEntry entry) {
return master.force().logAction(entry).join();
}
@Override
public Log getLog() {
me.lucko.luckperms.common.data.Log log = master.force().getLog().join();
if (log == null) {
return null;
}
return new LogDelegate(log);
}
@Override
public boolean loadOrCreateUser(@NonNull UUID uuid, @NonNull String username) {
return master.force().loadUser(uuid, checkUsername(username)).join();
}
@Override
public boolean loadUser(@NonNull UUID uuid) {
return master.force().loadUser(uuid, "null").join();
}
@Override
public boolean loadUser(@NonNull UUID uuid, @NonNull String username) {
return master.force().loadUser(uuid, checkUsername(username)).join();
}
@Override
public boolean saveUser(@NonNull User user) {
checkUser(user);
return master.force().saveUser(((UserDelegate) user).getMaster()).join();
}
@Override
public boolean cleanupUsers() {
return master.force().cleanupUsers().join();
}
@Override
public Set<UUID> getUniqueUsers() {
return master.force().getUniqueUsers().join();
}
@Override
public boolean createAndLoadGroup(@NonNull String name) {
return master.force().createAndLoadGroup(checkName(name)).join();
}
@Override
public boolean loadGroup(@NonNull String name) {
return master.force().loadGroup(checkName(name)).join();
}
@Override
public boolean loadAllGroups() {
return master.force().loadAllGroups().join();
}
@Override
public boolean saveGroup(@NonNull Group group) {
checkGroup(group);
return master.force().saveGroup(((GroupDelegate) group).getMaster()).join();
}
@Override
public boolean deleteGroup(@NonNull Group group) {
checkGroup(group);
if (group.getName().equalsIgnoreCase(plugin.getConfiguration().get(ConfigKeys.DEFAULT_GROUP_NAME))) {
throw new IllegalArgumentException("Cannot delete the default group.");
}
return master.force().deleteGroup(((GroupDelegate) group).getMaster()).join();
}
@Override
public boolean createAndLoadTrack(@NonNull String name) {
return master.force().createAndLoadTrack(checkName(name)).join();
}
@Override
public boolean loadTrack(@NonNull String name) {
return master.force().loadTrack(checkName(name)).join();
}
@Override
public boolean loadAllTracks() {
return master.force().loadAllTracks().join();
}
@Override
public boolean saveTrack(@NonNull Track track) {
checkTrack(track);
return master.force().saveTrack(((TrackDelegate) track).getMaster()).join();
}
@Override
public boolean deleteTrack(@NonNull Track track) {
checkTrack(track);
return master.force().deleteTrack(((TrackDelegate) track).getMaster()).join();
}
@Override
public boolean saveUUIDData(@NonNull String username, @NonNull UUID uuid) {
return master.force().saveUUIDData(checkUsername(username), uuid).join();
}
@Override
public UUID getUUID(@NonNull String username) {
return master.force().getUUID(checkUsername(username)).join();
}
}
@AllArgsConstructor
public class Future implements Datastore.Future {
private final Storage master;
@Override
public java.util.concurrent.Future<Boolean> logAction(@NonNull LogEntry entry) {
return master.force().logAction(entry);
}
@Override
public java.util.concurrent.Future<Log> getLog() {
return master.force().getLog().thenApply(log -> log == null ? null : new LogDelegate(log));
}
@Override
public java.util.concurrent.Future<Boolean> loadOrCreateUser(@NonNull UUID uuid, @NonNull String username) {
return master.force().loadUser(uuid, checkUsername(username));
}
@Override
public java.util.concurrent.Future<Boolean> loadUser(@NonNull UUID uuid) {
return master.force().loadUser(uuid, "null");
}
@Override
public java.util.concurrent.Future<Boolean> loadUser(@NonNull UUID uuid, @NonNull String username) {
return master.force().loadUser(uuid, checkUsername(username));
}
@Override
public java.util.concurrent.Future<Boolean> saveUser(@NonNull User user) {
checkUser(user);
return master.force().saveUser(((UserDelegate) user).getMaster());
}
@Override
public java.util.concurrent.Future<Boolean> cleanupUsers() {
return master.force().cleanupUsers();
}
@Override
public java.util.concurrent.Future<Set<UUID>> getUniqueUsers() {
return master.force().getUniqueUsers();
}
@Override
public java.util.concurrent.Future<Boolean> createAndLoadGroup(@NonNull String name) {
return master.force().createAndLoadGroup(checkName(name));
}
@Override
public java.util.concurrent.Future<Boolean> loadGroup(@NonNull String name) {
return master.force().loadGroup(checkName(name));
}
@Override
public java.util.concurrent.Future<Boolean> loadAllGroups() {
return master.force().loadAllGroups();
}
@Override
public java.util.concurrent.Future<Boolean> saveGroup(@NonNull Group group) {
checkGroup(group);
return master.force().saveGroup(((GroupDelegate) group).getMaster());
}
@Override
public java.util.concurrent.Future<Boolean> deleteGroup(@NonNull Group group) {
checkGroup(group);
if (group.getName().equalsIgnoreCase(plugin.getConfiguration().get(ConfigKeys.DEFAULT_GROUP_NAME))) {
throw new IllegalArgumentException("Cannot delete the default group.");
}
return master.force().deleteGroup(((GroupDelegate) group).getMaster());
}
@Override
public java.util.concurrent.Future<Boolean> createAndLoadTrack(@NonNull String name) {
return master.force().createAndLoadTrack(checkName(name));
}
@Override
public java.util.concurrent.Future<Boolean> loadTrack(@NonNull String name) {
return master.force().loadTrack(checkName(name));
}
@Override
public java.util.concurrent.Future<Boolean> loadAllTracks() {
return master.force().loadAllTracks();
}
@Override
public java.util.concurrent.Future<Boolean> saveTrack(@NonNull Track track) {
checkTrack(track);
return master.force().saveTrack(((TrackDelegate) track).getMaster());
}
@Override
public java.util.concurrent.Future<Boolean> deleteTrack(@NonNull Track track) {
checkTrack(track);
return master.force().deleteTrack(((TrackDelegate) track).getMaster());
}
@Override
public java.util.concurrent.Future<Boolean> saveUUIDData(@NonNull String username, @NonNull UUID uuid) {
return master.force().saveUUIDData(checkUsername(username), uuid);
}
@Override
public java.util.concurrent.Future<UUID> getUUID(@NonNull String username) {
return master.force().getUUID(checkUsername(username));
}
}
}
@@ -20,7 +20,7 @@
* SOFTWARE.
*/
package me.lucko.luckperms.common.api.delegate;
package me.lucko.luckperms.common.api.delegates;
import lombok.AccessLevel;
import lombok.EqualsAndHashCode;
@@ -20,13 +20,12 @@
* SOFTWARE.
*/
package me.lucko.luckperms.common.api.delegate;
package me.lucko.luckperms.common.api.delegates;
import lombok.AllArgsConstructor;
import me.lucko.luckperms.api.LPConfiguration;
import me.lucko.luckperms.api.data.DatastoreConfiguration;
import me.lucko.luckperms.api.data.MySQLConfiguration;
import me.lucko.luckperms.common.config.ConfigKeys;
import me.lucko.luckperms.common.config.LuckPermsConfiguration;
@@ -49,16 +48,6 @@ public class LPConfigurationDelegate implements LPConfiguration {
return master.get(ConfigKeys.SYNC_TIME);
}
@Override
public String getDefaultGroupNode() {
return master.get(ConfigKeys.DEFAULT_GROUP_NODE);
}
@Override
public String getDefaultGroupName() {
return master.get(ConfigKeys.DEFAULT_GROUP_NAME);
}
@Override
public boolean getIncludeGlobalPerms() {
return master.get(ConfigKeys.INCLUDING_GLOBAL_PERMS);
@@ -104,11 +93,6 @@ public class LPConfigurationDelegate implements LPConfiguration {
return master.get(ConfigKeys.LOG_NOTIFY);
}
@Override
public boolean getDebugPermissionChecks() {
return false;
}
@Override
public boolean getEnableOps() {
return master.get(ConfigKeys.OPS_ENABLED);
@@ -134,12 +118,6 @@ public class LPConfigurationDelegate implements LPConfiguration {
return master.get(ConfigKeys.VAULT_INCLUDING_GLOBAL);
}
@SuppressWarnings("deprecation")
@Override
public MySQLConfiguration getDatabaseValues() {
return getDatastoreConfig();
}
@Override
public DatastoreConfiguration getDatastoreConfig() {
return master.get(ConfigKeys.DATABASE_VALUES);
@@ -20,7 +20,7 @@
* SOFTWARE.
*/
package me.lucko.luckperms.common.api.delegate;
package me.lucko.luckperms.common.api.delegates;
import lombok.AllArgsConstructor;
import lombok.NonNull;
@@ -20,7 +20,7 @@
* SOFTWARE.
*/
package me.lucko.luckperms.common.api.delegate;
package me.lucko.luckperms.common.api.delegates;
import lombok.NonNull;
@@ -20,12 +20,11 @@
* SOFTWARE.
*/
package me.lucko.luckperms.common.api.delegate;
package me.lucko.luckperms.common.api.delegates;
import lombok.AllArgsConstructor;
import lombok.NonNull;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableSortedSet;
@@ -34,22 +33,18 @@ import me.lucko.luckperms.api.LocalizedNode;
import me.lucko.luckperms.api.Node;
import me.lucko.luckperms.api.PermissionHolder;
import me.lucko.luckperms.api.Tristate;
import me.lucko.luckperms.api.context.ContextSet;
import me.lucko.luckperms.common.utils.ExtractedContexts;
import me.lucko.luckperms.exceptions.ObjectAlreadyHasException;
import me.lucko.luckperms.exceptions.ObjectLacksException;
import java.util.AbstractMap;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
import static me.lucko.luckperms.common.api.ApiUtils.checkTime;
import static me.lucko.luckperms.common.core.model.PermissionHolder.exportToLegacy;
/**
* Provides a link between {@link PermissionHolder} and {@link me.lucko.luckperms.common.core.model.PermissionHolder}
@@ -79,11 +74,6 @@ public class PermissionHolderDelegate implements PermissionHolder {
return ImmutableSet.copyOf(master.getTransientNodes());
}
@Override
public Set<Node> getAllNodes() {
return ImmutableSet.copyOf(master.getAllNodes(null, ExtractedContexts.generate(Contexts.allowAll())));
}
@Override
public SortedSet<LocalizedNode> getAllNodes(@NonNull Contexts contexts) {
return new TreeSet<>(master.getAllNodes(null, ExtractedContexts.generate(contexts)));
@@ -99,11 +89,6 @@ public class PermissionHolderDelegate implements PermissionHolder {
return new HashMap<>(master.exportNodes(contexts, lowerCase));
}
@Override
public Map<String, Boolean> getNodes() {
return ImmutableMap.copyOf(exportToLegacy(master.getNodes()));
}
@Override
public Tristate hasPermission(@NonNull Node node) {
return master.hasPermission(node, false);
@@ -314,75 +299,11 @@ public class PermissionHolderDelegate implements PermissionHolder {
master.clearTransientNodes();
}
@Override
public Map<String, Boolean> getLocalPermissions(String server, String world, List<String> excludedGroups, List<String> possibleNodes) {
Map<String, String> context = new HashMap<>();
if (server != null && !server.equals("")) {
context.put("server", server);
}
if (world != null && !world.equals("")) {
context.put("world", world);
}
return master.exportNodes(new Contexts(ContextSet.fromMap(context), true, true, true, true, true, false), false);
}
@Override
public Map<String, Boolean> getLocalPermissions(String server, String world, List<String> excludedGroups) {
Map<String, String> context = new HashMap<>();
if (server != null && !server.equals("")) {
context.put("server", server);
}
if (world != null && !world.equals("")) {
context.put("world", world);
}
return master.exportNodes(new Contexts(ContextSet.fromMap(context), true, true, true, true, true, false), false);
}
@Override
public Map<String, Boolean> getLocalPermissions(String server, List<String> excludedGroups, List<String> possibleNodes) {
return getLocalPermissions(server, null, excludedGroups, possibleNodes);
}
@Override
public Map<String, Boolean> getLocalPermissions(String server, List<String> excludedGroups) {
return getLocalPermissions(server, null, excludedGroups, null);
}
@Override
public Map<String, Boolean> getPermissions(String server, String world, Map<String, String> extraContext, boolean includeGlobal, List<String> possibleNodes, boolean applyGroups) {
if (extraContext == null) {
extraContext = new HashMap<>();
}
if (server != null && !server.equals("")) {
extraContext.put("server", server);
}
if (world != null && !world.equals("")) {
extraContext.put("world", world);
}
return master.exportNodes(new Contexts(ContextSet.fromMap(extraContext), includeGlobal, includeGlobal, applyGroups, true, true, false), false);
}
@Override
public Map<Map.Entry<String, Boolean>, Long> getTemporaryNodes() {
Map<Map.Entry<String, Boolean>, Long> m = new HashMap<>();
for (Node node : master.getTemporaryNodes()) {
m.put(new AbstractMap.SimpleEntry<>(node.getKey(), node.getValue()), node.getExpiryUnixTime());
}
return m;
}
@Override
public Set<Node> getTemporaryPermissionNodes() {
return master.getTemporaryNodes();
}
@Override
public Map<String, Boolean> getPermanentNodes() {
return exportToLegacy(master.getPermanentNodes());
}
@Override
public Set<Node> getPermanentPermissionNodes() {
return master.getPermanentNodes();
@@ -20,7 +20,7 @@
* SOFTWARE.
*/
package me.lucko.luckperms.common.api.delegate;
package me.lucko.luckperms.common.api.delegates;
import lombok.AllArgsConstructor;
import lombok.NonNull;
@@ -32,6 +32,8 @@ import me.lucko.luckperms.api.LogEntry;
import me.lucko.luckperms.api.Storage;
import me.lucko.luckperms.api.Track;
import me.lucko.luckperms.api.User;
import me.lucko.luckperms.api.event.cause.CreationCause;
import me.lucko.luckperms.api.event.cause.DeletionCause;
import me.lucko.luckperms.common.config.ConfigKeys;
import me.lucko.luckperms.common.plugin.LuckPermsPlugin;
@@ -113,7 +115,7 @@ public class StorageDelegate implements Storage {
@Override
public CompletableFuture<Boolean> createAndLoadGroup(String name) {
return master.force().createAndLoadGroup(checkName(name));
return master.force().createAndLoadGroup(checkName(name), CreationCause.API);
}
@Override
@@ -138,7 +140,7 @@ public class StorageDelegate implements Storage {
if (group.getName().equalsIgnoreCase(plugin.getConfiguration().get(ConfigKeys.DEFAULT_GROUP_NAME))) {
throw new IllegalArgumentException("Cannot delete the default group.");
}
return master.force().deleteGroup(((GroupDelegate) group).getMaster());
return master.force().deleteGroup(((GroupDelegate) group).getMaster(), DeletionCause.API);
}
@Override
@@ -148,7 +150,7 @@ public class StorageDelegate implements Storage {
@Override
public CompletableFuture<Boolean> createAndLoadTrack(String name) {
return master.force().createAndLoadTrack(checkName(name));
return master.force().createAndLoadTrack(checkName(name), CreationCause.API);
}
@Override
@@ -170,7 +172,7 @@ public class StorageDelegate implements Storage {
@Override
public CompletableFuture<Boolean> deleteTrack(Track track) {
checkTrack(track);
return master.force().deleteTrack(((TrackDelegate) track).getMaster());
return master.force().deleteTrack(((TrackDelegate) track).getMaster(), DeletionCause.API);
}
@Override
@@ -20,7 +20,7 @@
* SOFTWARE.
*/
package me.lucko.luckperms.common.api.delegate;
package me.lucko.luckperms.common.api.delegates;
import lombok.AccessLevel;
import lombok.EqualsAndHashCode;
@@ -40,7 +40,6 @@ import static me.lucko.luckperms.common.api.ApiUtils.checkGroup;
* Provides a link between {@link Track} and {@link me.lucko.luckperms.common.core.model.Track}
*/
@EqualsAndHashCode(of = {"name"})
@SuppressWarnings("unused")
public class TrackDelegate implements Track {
@Getter(AccessLevel.PACKAGE)
@@ -20,7 +20,7 @@
* SOFTWARE.
*/
package me.lucko.luckperms.common.api.delegate;
package me.lucko.luckperms.common.api.delegates;
import lombok.EqualsAndHashCode;
import lombok.Getter;
@@ -43,7 +43,6 @@ import static me.lucko.luckperms.common.api.ApiUtils.checkTime;
* Provides a link between {@link User} and {@link me.lucko.luckperms.common.core.model.User}
*/
@EqualsAndHashCode(of = {"uuid"}, callSuper = false)
@SuppressWarnings("unused")
public class UserDelegate extends PermissionHolderDelegate implements User {
@Getter
@@ -20,7 +20,7 @@
* SOFTWARE.
*/
package me.lucko.luckperms.common.api.delegate;
package me.lucko.luckperms.common.api.delegates;
import lombok.AllArgsConstructor;
import lombok.NonNull;
@@ -22,9 +22,6 @@
package me.lucko.luckperms.common.commands.generic.parent;
import me.lucko.luckperms.api.event.events.GroupAddEvent;
import me.lucko.luckperms.common.api.delegate.GroupDelegate;
import me.lucko.luckperms.common.api.delegate.PermissionHolderDelegate;
import me.lucko.luckperms.common.commands.Arg;
import me.lucko.luckperms.common.commands.CommandException;
import me.lucko.luckperms.common.commands.CommandResult;
@@ -93,21 +90,18 @@ public class ParentAddTemp extends SharedSubCommand {
Message.SET_TEMP_INHERIT_SUCCESS.send(sender, holder.getFriendlyName(), group.getDisplayName(),
DateUtil.formatDateDiff(duration)
);
plugin.getApiProvider().fireEventAsync(new GroupAddEvent(new PermissionHolderDelegate(holder), new GroupDelegate(group), null, null, duration));
break;
case SERVER:
duration = holder.setPermission(new NodeBuilder("group." + group.getName()).setValue(true).setServer(server).setExpiry(duration).build(), modifier).getExpiryUnixTime();
Message.SET_TEMP_INHERIT_SERVER_SUCCESS.send(sender, holder.getFriendlyName(), group.getDisplayName(),
server, DateUtil.formatDateDiff(duration)
);
plugin.getApiProvider().fireEventAsync(new GroupAddEvent(new PermissionHolderDelegate(holder), new GroupDelegate(group), server, null, duration));
break;
case SERVER_AND_WORLD:
duration = holder.setPermission(new NodeBuilder("group." + group.getName()).setValue(true).setServer(server).setWorld(world).setExpiry(duration).build(), modifier).getExpiryUnixTime();
Message.SET_TEMP_INHERIT_SERVER_WORLD_SUCCESS.send(sender, holder.getFriendlyName(), group.getDisplayName(),
server, world, DateUtil.formatDateDiff(duration)
);
plugin.getApiProvider().fireEventAsync(new GroupAddEvent(new PermissionHolderDelegate(holder), new GroupDelegate(group), server, world, duration));
break;
}
@@ -22,6 +22,7 @@
package me.lucko.luckperms.common.commands.group;
import me.lucko.luckperms.api.event.cause.CreationCause;
import me.lucko.luckperms.common.commands.Arg;
import me.lucko.luckperms.common.commands.CommandResult;
import me.lucko.luckperms.common.commands.SingleCommand;
@@ -62,7 +63,7 @@ public class CreateGroup extends SingleCommand {
return CommandResult.INVALID_ARGS;
}
if (!plugin.getStorage().createAndLoadGroup(groupName).join()) {
if (!plugin.getStorage().createAndLoadGroup(groupName, CreationCause.COMMAND).join()) {
Message.CREATE_GROUP_ERROR.send(sender);
return CommandResult.FAILURE;
}
@@ -22,6 +22,7 @@
package me.lucko.luckperms.common.commands.group;
import me.lucko.luckperms.api.event.cause.DeletionCause;
import me.lucko.luckperms.common.commands.Arg;
import me.lucko.luckperms.common.commands.CommandResult;
import me.lucko.luckperms.common.commands.SingleCommand;
@@ -73,7 +74,7 @@ public class DeleteGroup extends SingleCommand {
return CommandResult.LOADING_ERROR;
}
if (!plugin.getStorage().deleteGroup(group).join()) {
if (!plugin.getStorage().deleteGroup(group, DeletionCause.COMMAND).join()) {
Message.DELETE_GROUP_ERROR.send(sender);
return CommandResult.FAILURE;
}
@@ -22,6 +22,7 @@
package me.lucko.luckperms.common.commands.group;
import me.lucko.luckperms.api.event.cause.CreationCause;
import me.lucko.luckperms.common.commands.Arg;
import me.lucko.luckperms.common.commands.CommandException;
import me.lucko.luckperms.common.commands.CommandResult;
@@ -57,7 +58,7 @@ public class GroupClone extends SubCommand<Group> {
return CommandResult.INVALID_ARGS;
}
if (!plugin.getStorage().createAndLoadGroup(newGroupName).join()) {
if (!plugin.getStorage().createAndLoadGroup(newGroupName, CreationCause.COMMAND).join()) {
Message.CREATE_GROUP_ERROR.send(sender);
return CommandResult.FAILURE;
}
@@ -22,6 +22,8 @@
package me.lucko.luckperms.common.commands.group;
import me.lucko.luckperms.api.event.cause.CreationCause;
import me.lucko.luckperms.api.event.cause.DeletionCause;
import me.lucko.luckperms.common.commands.Arg;
import me.lucko.luckperms.common.commands.CommandException;
import me.lucko.luckperms.common.commands.CommandResult;
@@ -57,7 +59,7 @@ public class GroupRename extends SubCommand<Group> {
return CommandResult.INVALID_ARGS;
}
if (!plugin.getStorage().createAndLoadGroup(newGroupName).join()) {
if (!plugin.getStorage().createAndLoadGroup(newGroupName, CreationCause.COMMAND).join()) {
Message.CREATE_GROUP_ERROR.send(sender);
return CommandResult.FAILURE;
}
@@ -68,7 +70,7 @@ public class GroupRename extends SubCommand<Group> {
return CommandResult.LOADING_ERROR;
}
if (!plugin.getStorage().deleteGroup(group).join()) {
if (!plugin.getStorage().deleteGroup(group, DeletionCause.COMMAND).join()) {
Message.DELETE_GROUP_ERROR.send(sender);
return CommandResult.FAILURE;
}
@@ -22,6 +22,7 @@
package me.lucko.luckperms.common.commands.track;
import me.lucko.luckperms.api.event.cause.CreationCause;
import me.lucko.luckperms.common.commands.Arg;
import me.lucko.luckperms.common.commands.CommandResult;
import me.lucko.luckperms.common.commands.SingleCommand;
@@ -62,7 +63,7 @@ public class CreateTrack extends SingleCommand {
return CommandResult.INVALID_ARGS;
}
if (!plugin.getStorage().createAndLoadTrack(trackName).join()) {
if (!plugin.getStorage().createAndLoadTrack(trackName, CreationCause.COMMAND).join()) {
Message.CREATE_TRACK_ERROR.send(sender);
return CommandResult.FAILURE;
}
@@ -22,6 +22,7 @@
package me.lucko.luckperms.common.commands.track;
import me.lucko.luckperms.api.event.cause.DeletionCause;
import me.lucko.luckperms.common.commands.Arg;
import me.lucko.luckperms.common.commands.CommandResult;
import me.lucko.luckperms.common.commands.SingleCommand;
@@ -66,7 +67,7 @@ public class DeleteTrack extends SingleCommand {
return CommandResult.LOADING_ERROR;
}
if (!plugin.getStorage().deleteTrack(track).join()) {
if (!plugin.getStorage().deleteTrack(track, DeletionCause.COMMAND).join()) {
Message.DELETE_TRACK_ERROR.send(sender);
return CommandResult.FAILURE;
}
@@ -22,6 +22,7 @@
package me.lucko.luckperms.common.commands.track;
import me.lucko.luckperms.api.event.cause.CreationCause;
import me.lucko.luckperms.common.commands.Arg;
import me.lucko.luckperms.common.commands.CommandException;
import me.lucko.luckperms.common.commands.CommandResult;
@@ -57,7 +58,7 @@ public class TrackClone extends SubCommand<Track> {
return CommandResult.INVALID_ARGS;
}
if (!plugin.getStorage().createAndLoadTrack(newTrackName).join()) {
if (!plugin.getStorage().createAndLoadTrack(newTrackName, CreationCause.INTERNAL).join()) {
Message.CREATE_TRACK_ERROR.send(sender);
return CommandResult.FAILURE;
}
@@ -22,6 +22,8 @@
package me.lucko.luckperms.common.commands.track;
import me.lucko.luckperms.api.event.cause.CreationCause;
import me.lucko.luckperms.api.event.cause.DeletionCause;
import me.lucko.luckperms.common.commands.Arg;
import me.lucko.luckperms.common.commands.CommandException;
import me.lucko.luckperms.common.commands.CommandResult;
@@ -57,7 +59,7 @@ public class TrackRename extends SubCommand<Track> {
return CommandResult.INVALID_ARGS;
}
if (!plugin.getStorage().createAndLoadTrack(newTrackName).join()) {
if (!plugin.getStorage().createAndLoadTrack(newTrackName, CreationCause.COMMAND).join()) {
Message.CREATE_TRACK_ERROR.send(sender);
return CommandResult.FAILURE;
}
@@ -68,7 +70,7 @@ public class TrackRename extends SubCommand<Track> {
return CommandResult.LOADING_ERROR;
}
if (!plugin.getStorage().deleteTrack(track).join()) {
if (!plugin.getStorage().deleteTrack(track, DeletionCause.COMMAND).join()) {
Message.DELETE_TRACK_ERROR.send(sender);
return CommandResult.FAILURE;
}
@@ -25,9 +25,6 @@ package me.lucko.luckperms.common.commands.user;
import com.google.common.base.Objects;
import me.lucko.luckperms.api.Node;
import me.lucko.luckperms.api.event.events.UserDemoteEvent;
import me.lucko.luckperms.common.api.delegate.TrackDelegate;
import me.lucko.luckperms.common.api.delegate.UserDelegate;
import me.lucko.luckperms.common.commands.Arg;
import me.lucko.luckperms.common.commands.CommandException;
import me.lucko.luckperms.common.commands.CommandResult;
@@ -150,7 +147,7 @@ public class UserDemote extends SubCommand<User> {
.action("demote " + args.stream().collect(Collectors.joining(" ")))
.build().submit(plugin, sender);
save(user, sender, plugin);
plugin.getApiProvider().fireEventAsync(new UserDemoteEvent(new TrackDelegate(track), new UserDelegate(user), old, null));
plugin.getApiProvider().getEventFactory().handleUserDemote(user, track, old, null);
return CommandResult.SUCCESS;
}
@@ -194,7 +191,7 @@ public class UserDemote extends SubCommand<User> {
.action("demote " + args.stream().collect(Collectors.joining(" ")))
.build().submit(plugin, sender);
save(user, sender, plugin);
plugin.getApiProvider().fireEventAsync(new UserDemoteEvent(new TrackDelegate(track), new UserDelegate(user), old, previousGroup.getName()));
plugin.getApiProvider().getEventFactory().handleUserDemote(user, track, old, previousGroup.getName());
return CommandResult.SUCCESS;
}
@@ -25,9 +25,6 @@ package me.lucko.luckperms.common.commands.user;
import com.google.common.base.Objects;
import me.lucko.luckperms.api.Node;
import me.lucko.luckperms.api.event.events.UserPromoteEvent;
import me.lucko.luckperms.common.api.delegate.TrackDelegate;
import me.lucko.luckperms.common.api.delegate.UserDelegate;
import me.lucko.luckperms.common.commands.Arg;
import me.lucko.luckperms.common.commands.CommandException;
import me.lucko.luckperms.common.commands.CommandResult;
@@ -147,7 +144,7 @@ public class UserPromote extends SubCommand<User> {
.action("promote " + args.stream().collect(Collectors.joining(" ")))
.build().submit(plugin, sender);
save(user, sender, plugin);
plugin.getApiProvider().fireEventAsync(new UserPromoteEvent(new TrackDelegate(track), new UserDelegate(user), null, first));
plugin.getApiProvider().getEventFactory().handleUserPromote(user, track, null, first);
return CommandResult.SUCCESS;
}
@@ -211,7 +208,7 @@ public class UserPromote extends SubCommand<User> {
.action("promote " + args.stream().collect(Collectors.joining(" ")))
.build().submit(plugin, sender);
save(user, sender, plugin);
plugin.getApiProvider().fireEventAsync(new UserPromoteEvent(new TrackDelegate(track), new UserDelegate(user), old, nextGroup.getName()));
plugin.getApiProvider().getEventFactory().handleUserPromote(user, track, old, nextGroup.getName());
return CommandResult.SUCCESS;
}
@@ -22,10 +22,13 @@
package me.lucko.luckperms.common.config;
import lombok.Getter;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import me.lucko.luckperms.common.api.delegates.LPConfigurationDelegate;
import me.lucko.luckperms.common.config.keys.EnduringKey;
import java.util.Optional;
@@ -42,6 +45,9 @@ public abstract class AbstractConfiguration implements LuckPermsConfiguration {
}
});
@Getter
private final LPConfigurationDelegate delegate = new LPConfigurationDelegate(this);
@Override
public <T> T get(ConfigKey<T> key) {
return (T) cache.getUnchecked(key).orElse(null);
@@ -60,5 +66,7 @@ public abstract class AbstractConfiguration implements LuckPermsConfiguration {
cache.invalidateAll(toInvalidate);
loadAll();
getPlugin().getApiProvider().getEventFactory().handleConfigReload();
}
}
@@ -22,6 +22,7 @@
package me.lucko.luckperms.common.config;
import me.lucko.luckperms.common.api.delegates.LPConfigurationDelegate;
import me.lucko.luckperms.common.plugin.LuckPermsPlugin;
import java.util.List;
@@ -29,6 +30,8 @@ import java.util.Map;
public interface LuckPermsConfiguration {
LPConfigurationDelegate getDelegate();
LuckPermsPlugin getPlugin();
void init();
@@ -26,9 +26,8 @@ import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import me.lucko.luckperms.api.context.ContextListener;
import me.lucko.luckperms.api.context.ContextCalculator;
import me.lucko.luckperms.api.context.ContextSet;
import me.lucko.luckperms.api.context.IContextCalculator;
import me.lucko.luckperms.api.context.MutableContextSet;
import java.util.List;
@@ -37,8 +36,7 @@ import java.util.concurrent.TimeUnit;
public class ContextManager<T> {
private final List<IContextCalculator<T>> calculators = new CopyOnWriteArrayList<>();
private final List<ContextListener<T>> listeners = new CopyOnWriteArrayList<>();
private final List<ContextCalculator<T>> calculators = new CopyOnWriteArrayList<>();
private final LoadingCache<T, ContextSet> cache = CacheBuilder.newBuilder()
.weakKeys()
@@ -51,7 +49,7 @@ public class ContextManager<T> {
});
private MutableContextSet calculateApplicableContext(T subject, MutableContextSet accumulator) {
for (IContextCalculator<T> calculator : calculators) {
for (ContextCalculator<T> calculator : calculators) {
calculator.giveApplicableContext(subject, accumulator);
}
return accumulator;
@@ -61,19 +59,10 @@ public class ContextManager<T> {
return cache.getUnchecked(subject);
}
public void registerCalculator(IContextCalculator<T> calculator) {
listeners.forEach(calculator::addListener);
public void registerCalculator(ContextCalculator<T> calculator) {
calculators.add(calculator);
}
public void registerListener(ContextListener<T> listener) {
for (IContextCalculator<T> calculator : calculators) {
calculator.addListener(listener);
}
listeners.add(listener);
}
public int getCalculatorsSize() {
return calculators.size();
}
@@ -34,7 +34,7 @@ import me.lucko.luckperms.common.config.LuckPermsConfiguration;
import java.util.Map;
@AllArgsConstructor
public class ServerCalculator<T> extends ContextCalculator<T> {
public class ServerCalculator<T> implements ContextCalculator<T> {
private final LuckPermsConfiguration config;
@Override
@@ -22,12 +22,14 @@
package me.lucko.luckperms.common.core;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;
import com.google.common.collect.Maps;
import me.lucko.luckperms.common.api.delegates.UuidCacheDelegate;
import me.lucko.luckperms.common.config.ConfigKeys;
import me.lucko.luckperms.common.plugin.LuckPermsPlugin;
@@ -43,6 +45,9 @@ public class UuidCache {
// External UUID --> Internal UUID
private final BiMap<UUID, UUID> cache = Maps.synchronizedBiMap(HashBiMap.create());
@Getter
private final UuidCacheDelegate delegate = new UuidCacheDelegate(this);
public UUID getUUID(UUID external) {
return plugin.getConfiguration().get(ConfigKeys.ONLINE_MODE) ? external : cache.getOrDefault(external, external);
}
@@ -26,6 +26,7 @@ import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.ToString;
import me.lucko.luckperms.common.api.delegates.GroupDelegate;
import me.lucko.luckperms.common.caching.handlers.GroupReference;
import me.lucko.luckperms.common.caching.handlers.HolderReference;
import me.lucko.luckperms.common.config.ConfigKeys;
@@ -42,6 +43,9 @@ public class Group extends PermissionHolder implements Identifiable<String> {
@Getter
private final String name;
@Getter
private final GroupDelegate delegate = new GroupDelegate(this);
public Group(String name, LuckPermsPlugin plugin) {
super(name, plugin);
this.name = name;
@@ -39,13 +39,7 @@ import me.lucko.luckperms.api.Contexts;
import me.lucko.luckperms.api.LocalizedNode;
import me.lucko.luckperms.api.Node;
import me.lucko.luckperms.api.Tristate;
import me.lucko.luckperms.api.event.events.GroupAddEvent;
import me.lucko.luckperms.api.event.events.GroupRemoveEvent;
import me.lucko.luckperms.api.event.events.PermissionNodeExpireEvent;
import me.lucko.luckperms.api.event.events.PermissionNodeSetEvent;
import me.lucko.luckperms.api.event.events.PermissionNodeUnsetEvent;
import me.lucko.luckperms.common.api.delegate.GroupDelegate;
import me.lucko.luckperms.common.api.delegate.PermissionHolderDelegate;
import me.lucko.luckperms.common.api.delegates.PermissionHolderDelegate;
import me.lucko.luckperms.common.caching.MetaHolder;
import me.lucko.luckperms.common.caching.handlers.CachedStateManager;
import me.lucko.luckperms.common.caching.handlers.GroupReference;
@@ -384,6 +378,7 @@ public abstract class PermissionHolder {
public abstract String getFriendlyName();
public abstract HolderReference<?> toReference();
public abstract PermissionHolderDelegate getDelegate();
public Set<Node> getNodes() {
return enduringCache.get();
@@ -549,6 +544,8 @@ public abstract class PermissionHolder {
boolean work = false;
Set<Node> removed = new HashSet<>();
ImmutableSet<Node> before = ImmutableSet.copyOf(getPermissions(true));
synchronized (nodes) {
Iterator<Node> it = nodes.iterator();
while (it.hasNext()) {
@@ -586,9 +583,10 @@ public abstract class PermissionHolder {
return false;
}
PermissionHolderDelegate link = new PermissionHolderDelegate(this);
ImmutableSet<Node> after = ImmutableSet.copyOf(getPermissions(true));
for (Node r : removed) {
plugin.getApiProvider().fireEventAsync(new PermissionNodeExpireEvent(link, r));
plugin.getApiProvider().getEventFactory().handleNodeRemove(r, this, before, after);
}
return true;
@@ -704,12 +702,16 @@ public abstract class PermissionHolder {
throw new ObjectAlreadyHasException();
}
ImmutableSet<Node> before = ImmutableSet.copyOf(getNodes());
synchronized (nodes) {
nodes.add(node);
}
invalidateCache(true);
plugin.getApiProvider().fireEventAsync(new PermissionNodeSetEvent(new PermissionHolderDelegate(this), node));
ImmutableSet<Node> after = ImmutableSet.copyOf(getNodes());
plugin.getApiProvider().getEventFactory().handleNodeAdd(node, this, before, after);
}
/**
@@ -733,6 +735,8 @@ public abstract class PermissionHolder {
// Create a new node with the same properties, but add the expiry dates together
Node newNode = NodeFactory.builderFromExisting(node).setExpiry(previous.getExpiryUnixTime() + node.getSecondsTilExpiry()).build();
ImmutableSet<Node> before = ImmutableSet.copyOf(getNodes());
// Remove the old node & add the new one.
synchronized (nodes) {
nodes.remove(previous);
@@ -740,8 +744,8 @@ public abstract class PermissionHolder {
}
invalidateCache(true);
plugin.getApiProvider().fireEventAsync(new PermissionNodeUnsetEvent(new PermissionHolderDelegate(this), previous));
plugin.getApiProvider().fireEventAsync(new PermissionNodeSetEvent(new PermissionHolderDelegate(this), newNode));
ImmutableSet<Node> after = ImmutableSet.copyOf(getNodes());
plugin.getApiProvider().getEventFactory().handleNodeAdd(newNode, this, before, after);
return newNode;
}
@@ -756,14 +760,16 @@ public abstract class PermissionHolder {
// Only replace if the new expiry time is greater than the old one.
if (node.getExpiryUnixTime() > previous.getExpiryUnixTime()) {
ImmutableSet<Node> before = ImmutableSet.copyOf(getNodes());
synchronized (nodes) {
nodes.remove(previous);
nodes.add(node);
}
invalidateCache(true);
plugin.getApiProvider().fireEventAsync(new PermissionNodeUnsetEvent(new PermissionHolderDelegate(this), previous));
plugin.getApiProvider().fireEventAsync(new PermissionNodeSetEvent(new PermissionHolderDelegate(this), node));
ImmutableSet<Node> after = ImmutableSet.copyOf(getNodes());
plugin.getApiProvider().getEventFactory().handleNodeAdd(node, this, before, after);
return node;
}
}
@@ -788,12 +794,16 @@ public abstract class PermissionHolder {
throw new ObjectAlreadyHasException();
}
ImmutableSet<Node> before = ImmutableSet.copyOf(getTransientNodes());
synchronized (transientNodes) {
transientNodes.add(node);
}
invalidateCache(false);
plugin.getApiProvider().fireEventAsync(new PermissionNodeSetEvent(new PermissionHolderDelegate(this), node));
ImmutableSet<Node> after = ImmutableSet.copyOf(getTransientNodes());
plugin.getApiProvider().getEventFactory().handleNodeAdd(node, this, before, after);
}
public void setPermission(String node, boolean value) throws ObjectAlreadyHasException {
@@ -831,17 +841,15 @@ public abstract class PermissionHolder {
throw new ObjectLacksException();
}
ImmutableSet<Node> before = ImmutableSet.copyOf(getNodes());
synchronized (nodes) {
nodes.removeIf(e -> e.almostEquals(node));
}
invalidateCache(true);
if (node.isGroupNode()) {
plugin.getApiProvider().fireEventAsync(new GroupRemoveEvent(new PermissionHolderDelegate(this),
node.getGroupName(), node.getServer().orElse(null), node.getWorld().orElse(null), node.isTemporary()));
} else {
plugin.getApiProvider().fireEventAsync(new PermissionNodeUnsetEvent(new PermissionHolderDelegate(this), node));
}
ImmutableSet<Node> after = ImmutableSet.copyOf(getNodes());
plugin.getApiProvider().getEventFactory().handleNodeRemove(node, this, before, after);
}
/**
@@ -855,17 +863,15 @@ public abstract class PermissionHolder {
throw new ObjectLacksException();
}
ImmutableSet<Node> before = ImmutableSet.copyOf(getTransientNodes());
synchronized (transientNodes) {
transientNodes.removeIf(e -> e.almostEquals(node));
}
invalidateCache(false);
if (node.isGroupNode()) {
plugin.getApiProvider().fireEventAsync(new GroupRemoveEvent(new PermissionHolderDelegate(this),
node.getGroupName(), node.getServer().orElse(null), node.getWorld().orElse(null), node.isTemporary()));
} else {
plugin.getApiProvider().fireEventAsync(new PermissionNodeUnsetEvent(new PermissionHolderDelegate(this), node));
}
ImmutableSet<Node> after = ImmutableSet.copyOf(getTransientNodes());
plugin.getApiProvider().getEventFactory().handleNodeRemove(node, this, before, after);
}
public void unsetPermission(String node, boolean temporary) throws ObjectLacksException {
@@ -910,7 +916,6 @@ public abstract class PermissionHolder {
}
setPermission("group." + group.getName(), true);
getPlugin().getApiProvider().fireEventAsync(new GroupAddEvent(new PermissionHolderDelegate(this), new GroupDelegate(group), null, null, 0L));
}
public void setInheritGroup(Group group, String server) throws ObjectAlreadyHasException {
@@ -919,7 +924,6 @@ public abstract class PermissionHolder {
}
setPermission("group." + group.getName(), true, server);
getPlugin().getApiProvider().fireEventAsync(new GroupAddEvent(new PermissionHolderDelegate(this), new GroupDelegate(group), server, null, 0L));
}
public void setInheritGroup(Group group, String server, String world) throws ObjectAlreadyHasException {
@@ -928,7 +932,6 @@ public abstract class PermissionHolder {
}
setPermission("group." + group.getName(), true, server, world);
getPlugin().getApiProvider().fireEventAsync(new GroupAddEvent(new PermissionHolderDelegate(this), new GroupDelegate(group), server, world, 0L));
}
public void setInheritGroup(Group group, long expireAt) throws ObjectAlreadyHasException {
@@ -937,7 +940,6 @@ public abstract class PermissionHolder {
}
setPermission("group." + group.getName(), true, expireAt);
getPlugin().getApiProvider().fireEventAsync(new GroupAddEvent(new PermissionHolderDelegate(this), new GroupDelegate(group), null, null, expireAt));
}
public void setInheritGroup(Group group, String server, long expireAt) throws ObjectAlreadyHasException {
@@ -946,7 +948,6 @@ public abstract class PermissionHolder {
}
setPermission("group." + group.getName(), true, server, expireAt);
getPlugin().getApiProvider().fireEventAsync(new GroupAddEvent(new PermissionHolderDelegate(this), new GroupDelegate(group), server, null, expireAt));
}
public void setInheritGroup(Group group, String server, String world, long expireAt) throws ObjectAlreadyHasException {
@@ -955,7 +956,6 @@ public abstract class PermissionHolder {
}
setPermission("group." + group.getName(), true, server, world, expireAt);
getPlugin().getApiProvider().fireEventAsync(new GroupAddEvent(new PermissionHolderDelegate(this), new GroupDelegate(group), server, world, expireAt));
}
public void unsetInheritGroup(Group group) throws ObjectLacksException {
@@ -986,27 +986,34 @@ public abstract class PermissionHolder {
* Clear all of the holders permission nodes
*/
public void clearNodes() {
ImmutableSet<Node> before = ImmutableSet.copyOf(getNodes());
synchronized (nodes) {
nodes.clear();
}
invalidateCache(true);
ImmutableSet<Node> after = ImmutableSet.copyOf(getNodes());
plugin.getApiProvider().getEventFactory().handleNodeClear(this, before, after);
}
public void clearNodes(String server) {
String finalServer = Optional.ofNullable(server).orElse("global");
ImmutableSet<Node> before = ImmutableSet.copyOf(getNodes());
synchronized (nodes) {
if (!nodes.removeIf(n -> n.getServer().orElse("global").equalsIgnoreCase(finalServer))) {
return;
}
}
invalidateCache(true);
ImmutableSet<Node> after = ImmutableSet.copyOf(getNodes());
plugin.getApiProvider().getEventFactory().handleNodeClear(this, before, after);
}
public void clearNodes(String server, String world) {
String finalServer = Optional.ofNullable(server).orElse("global");
String finalWorld = Optional.ofNullable(world).orElse("null");
ImmutableSet<Node> before = ImmutableSet.copyOf(getNodes());
synchronized (nodes) {
boolean b = nodes.removeIf(n ->
n.getServer().orElse("global").equalsIgnoreCase(finalServer) &&
@@ -1016,9 +1023,13 @@ public abstract class PermissionHolder {
}
}
invalidateCache(true);
ImmutableSet<Node> after = ImmutableSet.copyOf(getNodes());
plugin.getApiProvider().getEventFactory().handleNodeClear(this, before, after);
}
public void clearParents() {
ImmutableSet<Node> before = ImmutableSet.copyOf(getNodes());
synchronized (nodes) {
boolean b = nodes.removeIf(Node::isGroupNode);
if (!b) {
@@ -1029,11 +1040,14 @@ public abstract class PermissionHolder {
plugin.getUserManager().giveDefaultIfNeeded((User) this, false);
}
invalidateCache(true);
ImmutableSet<Node> after = ImmutableSet.copyOf(getNodes());
plugin.getApiProvider().getEventFactory().handleNodeClear(this, before, after);
}
public void clearParents(String server) {
String finalServer = Optional.ofNullable(server).orElse("global");
ImmutableSet<Node> before = ImmutableSet.copyOf(getNodes());
synchronized (nodes) {
boolean b = nodes.removeIf(n ->
n.isGroupNode() && n.getServer().orElse("global").equalsIgnoreCase(finalServer)
@@ -1046,12 +1060,15 @@ public abstract class PermissionHolder {
plugin.getUserManager().giveDefaultIfNeeded((User) this, false);
}
invalidateCache(true);
ImmutableSet<Node> after = ImmutableSet.copyOf(getNodes());
plugin.getApiProvider().getEventFactory().handleNodeClear(this, before, after);
}
public void clearParents(String server, String world) {
String finalServer = Optional.ofNullable(server).orElse("global");
String finalWorld = Optional.ofNullable(world).orElse("null");
ImmutableSet<Node> before = ImmutableSet.copyOf(getNodes());
synchronized (nodes) {
boolean b = nodes.removeIf(n ->
n.isGroupNode() &&
@@ -1066,20 +1083,27 @@ public abstract class PermissionHolder {
plugin.getUserManager().giveDefaultIfNeeded((User) this, false);
}
invalidateCache(true);
ImmutableSet<Node> after = ImmutableSet.copyOf(getNodes());
plugin.getApiProvider().getEventFactory().handleNodeClear(this, before, after);
}
public void clearMeta() {
ImmutableSet<Node> before = ImmutableSet.copyOf(getNodes());
synchronized (nodes) {
if (!nodes.removeIf(n -> n.isMeta() || n.isPrefix() || n.isSuffix())) {
return;
}
}
invalidateCache(true);
ImmutableSet<Node> after = ImmutableSet.copyOf(getNodes());
plugin.getApiProvider().getEventFactory().handleNodeClear(this, before, after);
}
public void clearMeta(String server) {
String finalServer = Optional.ofNullable(server).orElse("global");
ImmutableSet<Node> before = ImmutableSet.copyOf(getNodes());
synchronized (nodes) {
boolean b = nodes.removeIf(n ->
(n.isMeta() || n.isPrefix() || n.isSuffix()) &&
@@ -1090,12 +1114,15 @@ public abstract class PermissionHolder {
}
}
invalidateCache(true);
ImmutableSet<Node> after = ImmutableSet.copyOf(getNodes());
plugin.getApiProvider().getEventFactory().handleNodeClear(this, before, after);
}
public void clearMeta(String server, String world) {
String finalServer = Optional.ofNullable(server).orElse("global");
String finalWorld = Optional.ofNullable(world).orElse("null");
ImmutableSet<Node> before = ImmutableSet.copyOf(getNodes());
synchronized (nodes) {
boolean b = nodes.removeIf(n ->
(n.isMeta() || n.isPrefix() || n.isSuffix()) && (
@@ -1108,12 +1135,15 @@ public abstract class PermissionHolder {
}
}
invalidateCache(true);
ImmutableSet<Node> after = ImmutableSet.copyOf(getNodes());
plugin.getApiProvider().getEventFactory().handleNodeClear(this, before, after);
}
public void clearMetaKeys(String key, String server, String world, boolean temp) {
String finalServer = Optional.ofNullable(server).orElse("global");
String finalWorld = Optional.ofNullable(world).orElse("null");
ImmutableSet<Node> before = ImmutableSet.copyOf(getNodes());
synchronized (nodes) {
boolean b = nodes.removeIf(n ->
n.isMeta() && (n.isTemporary() == temp) && n.getMeta().getKey().equalsIgnoreCase(key) &&
@@ -1125,13 +1155,19 @@ public abstract class PermissionHolder {
}
}
invalidateCache(true);
ImmutableSet<Node> after = ImmutableSet.copyOf(getNodes());
plugin.getApiProvider().getEventFactory().handleNodeClear(this, before, after);
}
public void clearTransientNodes() {
ImmutableSet<Node> before = ImmutableSet.copyOf(getTransientNodes());
synchronized (transientNodes) {
transientNodes.clear();
}
invalidateCache(false);
ImmutableSet<Node> after = ImmutableSet.copyOf(getTransientNodes());
plugin.getApiProvider().getEventFactory().handleNodeClear(this, before, after);
}
/**
@@ -29,6 +29,8 @@ import lombok.ToString;
import com.google.common.collect.ImmutableList;
import me.lucko.luckperms.common.api.delegates.TrackDelegate;
import me.lucko.luckperms.common.plugin.LuckPermsPlugin;
import me.lucko.luckperms.common.utils.Identifiable;
import me.lucko.luckperms.exceptions.ObjectAlreadyHasException;
import me.lucko.luckperms.exceptions.ObjectLacksException;
@@ -49,13 +51,20 @@ public class Track implements Identifiable<String> {
*/
@Getter
private final String name;
private final LuckPermsPlugin plugin;
@Getter
private final Lock ioLock = new ReentrantLock();
/**
* The groups within this track
*/
private List<String> groups = Collections.synchronizedList(new ArrayList<>());
@Getter
private final TrackDelegate delegate = new TrackDelegate(this);
@Override
public String getId() {
return name.toLowerCase();
@@ -147,8 +156,13 @@ public class Track implements Identifiable<String> {
* @throws ObjectAlreadyHasException if the group is already on this track somewhere
*/
public void appendGroup(Group group) throws ObjectAlreadyHasException {
List<String> before = ImmutableList.copyOf(groups);
assertNotContains(group);
groups.add(group.getName());
List<String> after = ImmutableList.copyOf(groups);
plugin.getApiProvider().getEventFactory().handleTrackAddGroup(this, group.getName(), before, after);
}
/**
@@ -160,8 +174,13 @@ public class Track implements Identifiable<String> {
* @throws IndexOutOfBoundsException if the position is less than 0 or greater than the size of the track
*/
public void insertGroup(Group group, int position) throws ObjectAlreadyHasException, IndexOutOfBoundsException {
List<String> before = ImmutableList.copyOf(groups);
assertNotContains(group);
groups.add(position, group.getName());
List<String> after = ImmutableList.copyOf(groups);
plugin.getApiProvider().getEventFactory().handleTrackAddGroup(this, group.getName(), before, after);
}
/**
@@ -181,8 +200,12 @@ public class Track implements Identifiable<String> {
* @throws ObjectLacksException if the group is not on this track
*/
public void removeGroup(String group) throws ObjectLacksException {
List<String> before = ImmutableList.copyOf(groups);
assertContains(group);
groups.remove(group);
List<String> after = ImmutableList.copyOf(groups);
plugin.getApiProvider().getEventFactory().handleTrackRemoveGroup(this, group, before, after);
}
/**
@@ -209,7 +232,9 @@ public class Track implements Identifiable<String> {
* Clear all of the groups within this track
*/
public void clearGroups() {
List<String> before = ImmutableList.copyOf(groups);
groups.clear();
plugin.getApiProvider().getEventFactory().handleTrackClear(this, before);
}
private void assertNotContains(Group g) throws ObjectAlreadyHasException {
@@ -28,8 +28,7 @@ import lombok.Setter;
import lombok.ToString;
import me.lucko.luckperms.api.caching.UserData;
import me.lucko.luckperms.api.event.events.UserPermissionRefreshEvent;
import me.lucko.luckperms.common.api.delegate.UserDelegate;
import me.lucko.luckperms.common.api.delegates.UserDelegate;
import me.lucko.luckperms.common.caching.UserCache;
import me.lucko.luckperms.common.caching.handlers.HolderReference;
import me.lucko.luckperms.common.caching.handlers.UserReference;
@@ -79,6 +78,9 @@ public class User extends PermissionHolder implements Identifiable<UserIdentifie
}
};
@Getter
private final UserDelegate delegate = new UserDelegate(this);
public User(UUID uuid, LuckPermsPlugin plugin) {
super(uuid.toString(), plugin);
this.uuid = uuid;
@@ -117,6 +119,8 @@ public class User extends PermissionHolder implements Identifiable<UserIdentifie
userData = new UserCache(this, getPlugin().getCalculatorFactory());
userData.preCalculate(getPlugin().getPreProcessContexts(op));
getPlugin().getApiProvider().getEventFactory().handleUserCacheLoad(this, userData);
getPlugin().onUserRefresh(this);
}
@@ -139,7 +143,7 @@ public class User extends PermissionHolder implements Identifiable<UserIdentifie
ud.recalculatePermissions();
ud.recalculateMeta();
getPlugin().getApiProvider().fireEventAsync(new UserPermissionRefreshEvent(new UserDelegate(this)));
getPlugin().getApiProvider().getEventFactory().handleUserDataRecalculate(this, userData);
getPlugin().onUserRefresh(this);
}
@@ -22,7 +22,6 @@
package me.lucko.luckperms.common.data;
import me.lucko.luckperms.api.event.events.LogNotifyEvent;
import me.lucko.luckperms.common.commands.sender.Sender;
import me.lucko.luckperms.common.config.ConfigKeys;
import me.lucko.luckperms.common.constants.Message;
@@ -49,12 +48,13 @@ public class LogEntry extends me.lucko.luckperms.api.LogEntry {
}
public void submit(LuckPermsPlugin plugin, Sender sender) {
plugin.getStorage().logAction(this);
if (!plugin.getApiProvider().getEventFactory().handleLogPublish(false, this)) {
plugin.getStorage().logAction(this);
}
LogNotifyEvent event = new LogNotifyEvent(this);
event.setCancelled(!plugin.getConfiguration().get(ConfigKeys.LOG_NOTIFY));
plugin.getApiProvider().fireEvent(event);
if (event.isCancelled()) return;
if (plugin.getApiProvider().getEventFactory().handleLogBroadcast(!plugin.getConfiguration().get(ConfigKeys.LOG_NOTIFY), this)) {
return;
}
final String msg = super.getFormatted();
@@ -0,0 +1,37 @@
/*
* Copyright (c) 2016 Lucko (Luck) <luck@lucko.me>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package me.lucko.luckperms.common.event;
import lombok.Getter;
import lombok.Setter;
import me.lucko.luckperms.api.LuckPermsApi;
import me.lucko.luckperms.api.event.LuckPermsEvent;
public abstract class AbstractEvent implements LuckPermsEvent {
@Getter
@Setter
private LuckPermsApi api = null;
}
@@ -0,0 +1,218 @@
/*
* Copyright (c) 2016 Lucko (Luck) <luck@lucko.me>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package me.lucko.luckperms.common.event;
import lombok.RequiredArgsConstructor;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import me.lucko.luckperms.api.LogEntry;
import me.lucko.luckperms.api.Node;
import me.lucko.luckperms.api.caching.UserData;
import me.lucko.luckperms.api.event.LuckPermsEvent;
import me.lucko.luckperms.api.event.cause.CreationCause;
import me.lucko.luckperms.api.event.cause.DeletionCause;
import me.lucko.luckperms.common.core.model.Group;
import me.lucko.luckperms.common.core.model.PermissionHolder;
import me.lucko.luckperms.common.core.model.Track;
import me.lucko.luckperms.common.core.model.User;
import me.lucko.luckperms.common.event.impl.EventConfigReload;
import me.lucko.luckperms.common.event.impl.EventGroupCreate;
import me.lucko.luckperms.common.event.impl.EventGroupDelete;
import me.lucko.luckperms.common.event.impl.EventGroupLoad;
import me.lucko.luckperms.common.event.impl.EventGroupLoadAll;
import me.lucko.luckperms.common.event.impl.EventLogBroadcast;
import me.lucko.luckperms.common.event.impl.EventLogPublish;
import me.lucko.luckperms.common.event.impl.EventNodeAdd;
import me.lucko.luckperms.common.event.impl.EventNodeClear;
import me.lucko.luckperms.common.event.impl.EventNodeRemove;
import me.lucko.luckperms.common.event.impl.EventPostSync;
import me.lucko.luckperms.common.event.impl.EventPreNetworkSync;
import me.lucko.luckperms.common.event.impl.EventPreSync;
import me.lucko.luckperms.common.event.impl.EventTrackAddGroup;
import me.lucko.luckperms.common.event.impl.EventTrackClear;
import me.lucko.luckperms.common.event.impl.EventTrackCreate;
import me.lucko.luckperms.common.event.impl.EventTrackDelete;
import me.lucko.luckperms.common.event.impl.EventTrackLoad;
import me.lucko.luckperms.common.event.impl.EventTrackLoadAll;
import me.lucko.luckperms.common.event.impl.EventTrackRemoveGroup;
import me.lucko.luckperms.common.event.impl.EventUserCacheLoad;
import me.lucko.luckperms.common.event.impl.EventUserDataRecalculate;
import me.lucko.luckperms.common.event.impl.EventUserDemote;
import me.lucko.luckperms.common.event.impl.EventUserFirstLogin;
import me.lucko.luckperms.common.event.impl.EventUserLoad;
import me.lucko.luckperms.common.event.impl.EventUserPromote;
import java.util.List;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicBoolean;
@RequiredArgsConstructor
public final class EventFactory {
private final LuckPermsEventBus eventBus;
private void fireEvent(LuckPermsEvent event) {
eventBus.fireEventAsync(event);
}
public void handleGroupCreate(Group group, CreationCause cause) {
EventGroupCreate event = new EventGroupCreate(group.getDelegate(), cause);
fireEvent(event);
}
public void handleGroupDelete(Group group, DeletionCause cause) {
EventGroupDelete event = new EventGroupDelete(group.getName(), ImmutableSet.copyOf(group.getNodes()), cause);
fireEvent(event);
}
public void handleGroupLoadAll() {
EventGroupLoadAll event = new EventGroupLoadAll();
fireEvent(event);
}
public void handleGroupLoad(Group group) {
EventGroupLoad event = new EventGroupLoad(group.getDelegate());
fireEvent(event);
}
public boolean handleLogBroadcast(boolean initialState, LogEntry entry) {
AtomicBoolean cancel = new AtomicBoolean(initialState);
EventLogBroadcast event = new EventLogBroadcast(cancel, entry);
eventBus.fireEvent(event);
return cancel.get();
}
public boolean handleLogPublish(boolean initialState, LogEntry entry) {
AtomicBoolean cancel = new AtomicBoolean(initialState);
EventLogPublish event = new EventLogPublish(cancel, entry);
eventBus.fireEvent(event);
return cancel.get();
}
public void handleNodeAdd(Node node, PermissionHolder target, Set<Node> before, Set<Node> after) {
EventNodeAdd event = new EventNodeAdd(node, target.getDelegate(), ImmutableSet.copyOf(before), ImmutableSet.copyOf(after));
fireEvent(event);
}
public void handleNodeClear(PermissionHolder target, Set<Node> before, Set<Node> after) {
EventNodeClear event = new EventNodeClear(target.getDelegate(), ImmutableSet.copyOf(before), ImmutableSet.copyOf(after));
fireEvent(event);
}
public void handleNodeRemove(Node node, PermissionHolder target, Set<Node> before, Set<Node> after) {
EventNodeRemove event = new EventNodeRemove(node, target.getDelegate(), ImmutableSet.copyOf(before), ImmutableSet.copyOf(after));
fireEvent(event);
}
public void handleConfigReload() {
EventConfigReload event = new EventConfigReload();
fireEvent(event);
}
public void handlePostSync() {
EventPostSync event = new EventPostSync();
fireEvent(event);
}
public boolean handleNetworkPreSync(boolean initialState, UUID id) {
AtomicBoolean cancel = new AtomicBoolean(initialState);
EventPreNetworkSync event = new EventPreNetworkSync(cancel, id);
eventBus.fireEvent(event);
return cancel.get();
}
public boolean handlePreSync(boolean initialState) {
AtomicBoolean cancel = new AtomicBoolean(initialState);
EventPreSync event = new EventPreSync(cancel);
eventBus.fireEvent(event);
return cancel.get();
}
public void handleTrackCreate(Track track, CreationCause cause) {
EventTrackCreate event = new EventTrackCreate(track.getDelegate(), cause);
fireEvent(event);
}
public void handleTrackDelete(Track track, DeletionCause cause) {
EventTrackDelete event = new EventTrackDelete(track.getName(), ImmutableList.copyOf(track.getGroups()), cause);
fireEvent(event);
}
public void handleTrackLoadAll() {
EventTrackLoadAll event = new EventTrackLoadAll();
fireEvent(event);
}
public void handleTrackLoad(Track track) {
EventTrackLoad event = new EventTrackLoad(track.getDelegate());
fireEvent(event);
}
public void handleTrackAddGroup(Track track, String group, List<String> before, List<String> after) {
EventTrackAddGroup event = new EventTrackAddGroup(group, track.getDelegate(), ImmutableList.copyOf(before), ImmutableList.copyOf(after));
fireEvent(event);
}
public void handleTrackClear(Track track, List<String> before) {
EventTrackClear event = new EventTrackClear(track.getDelegate(), ImmutableList.copyOf(before), ImmutableList.of());
fireEvent(event);
}
public void handleTrackRemoveGroup(Track track, String group, List<String> before, List<String> after) {
EventTrackRemoveGroup event = new EventTrackRemoveGroup(group, track.getDelegate(), ImmutableList.copyOf(before), ImmutableList.copyOf(after));
fireEvent(event);
}
public void handleUserCacheLoad(User user, UserData data) {
EventUserCacheLoad event = new EventUserCacheLoad(user.getDelegate(), data);
fireEvent(event);
}
public void handleUserDataRecalculate(User user, UserData data) {
EventUserDataRecalculate event = new EventUserDataRecalculate(user.getDelegate(), data);
fireEvent(event);
}
public void handleUserFirstLogin(UUID uuid, String username) {
EventUserFirstLogin event = new EventUserFirstLogin(uuid, username);
fireEvent(event);
}
public void handleUserLoad(User user) {
EventUserLoad event = new EventUserLoad(user.getDelegate());
fireEvent(event);
}
public void handleUserDemote(User user, Track track, String from, String to) {
EventUserDemote event = new EventUserDemote(track.getDelegate(), user.getDelegate(), from, to);
fireEvent(event);
}
public void handleUserPromote(User user, Track track, String from, String to) {
EventUserPromote event = new EventUserPromote(track.getDelegate(), user.getDelegate(), from, to);
fireEvent(event);
}
}
@@ -0,0 +1,109 @@
/*
* Copyright (c) 2016 Lucko (Luck) <luck@lucko.me>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package me.lucko.luckperms.common.event;
import lombok.Getter;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import com.google.common.collect.ImmutableSet;
import me.lucko.luckperms.api.event.Cancellable;
import me.lucko.luckperms.api.event.EventBus;
import me.lucko.luckperms.api.event.EventHandler;
import me.lucko.luckperms.api.event.LuckPermsEvent;
import me.lucko.luckperms.common.plugin.LuckPermsPlugin;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Consumer;
@RequiredArgsConstructor
public class LuckPermsEventBus implements EventBus {
@Getter
private final LuckPermsPlugin plugin;
private final Map<Class<? extends LuckPermsEvent>, Set<LuckPermsEventHandler<?>>> handlerMap = new ConcurrentHashMap<>();
@Override
public <T extends LuckPermsEvent> EventHandler<T> subscribe(@NonNull Class<T> eventClass, @NonNull Consumer<T> handler) {
if (!eventClass.isInterface()) {
throw new IllegalArgumentException("class " + eventClass + " is not an interface");
}
if (!LuckPermsEvent.class.isAssignableFrom(eventClass)) {
throw new IllegalArgumentException("class " + eventClass.getName() + " does not implement LuckPermsEvent");
}
Set<LuckPermsEventHandler<?>> handlers = handlerMap.computeIfAbsent(eventClass, c -> ConcurrentHashMap.newKeySet());
LuckPermsEventHandler<T> eventHandler = new LuckPermsEventHandler<>(this, eventClass, handler);
handlers.add(eventHandler);
return eventHandler;
}
@SuppressWarnings("unchecked")
@Override
public <T extends LuckPermsEvent> Set<EventHandler<T>> getHandlers(Class<T> eventClass) {
Set<LuckPermsEventHandler<?>> handlers = handlerMap.get(eventClass);
if (handlers == null) {
return ImmutableSet.of();
} else {
ImmutableSet.Builder<EventHandler<T>> ret = ImmutableSet.builder();
for (LuckPermsEventHandler<?> handler : handlers) {
ret.add((EventHandler<T>) handler);
}
return ret.build();
}
}
public void unregisterHandler(LuckPermsEventHandler<?> handler) {
Set<LuckPermsEventHandler<?>> handlers = handlerMap.get(handler.getEventClass());
if (handlers != null) {
handlers.remove(handler);
}
}
public void fireEvent(LuckPermsEvent event) {
if (event instanceof AbstractEvent) {
((AbstractEvent) event).setApi(plugin.getApiProvider());
}
for (Map.Entry<Class<? extends LuckPermsEvent>, Set<LuckPermsEventHandler<?>>> ent : handlerMap.entrySet()) {
if (!ent.getKey().isAssignableFrom(event.getClass())) {
continue;
}
ent.getValue().forEach(h -> h.handle(event));
}
}
public void fireEventAsync(LuckPermsEvent event) {
if (event instanceof Cancellable) {
throw new IllegalArgumentException("cannot call Cancellable event async");
}
plugin.doAsync(() -> fireEvent(event));
}
}
@@ -0,0 +1,79 @@
/*
* Copyright (c) 2016 Lucko (Luck) <luck@lucko.me>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package me.lucko.luckperms.common.event;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import me.lucko.luckperms.api.event.EventHandler;
import me.lucko.luckperms.api.event.LuckPermsEvent;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Consumer;
@RequiredArgsConstructor
public class LuckPermsEventHandler<T extends LuckPermsEvent> implements EventHandler<T> {
private final LuckPermsEventBus eventBus;
@Getter
private final Class<T> eventClass;
@Getter
private final Consumer<T> consumer;
private final AtomicBoolean active = new AtomicBoolean(true);
private final AtomicInteger callCount = new AtomicInteger(0);
@Override
public boolean isActive() {
return active.get();
}
@Override
public boolean unregister() {
// already unregistered
if (!active.getAndSet(false)) {
return false;
}
eventBus.unregisterHandler(this);
return true;
}
@Override
public int getCallCount() {
return callCount.get();
}
void handle(LuckPermsEvent event) {
try {
T t = (T) event;
consumer.accept(t);
callCount.incrementAndGet();
} catch (Throwable t) {
eventBus.getPlugin().getLog().warn("Unable to pass event " + event.getClass().getSimpleName() + " to handler " + consumer.getClass().getName());
t.printStackTrace();
}
}
}
@@ -0,0 +1,33 @@
/*
* Copyright (c) 2016 Lucko (Luck) <luck@lucko.me>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package me.lucko.luckperms.common.event.impl;
import lombok.ToString;
import me.lucko.luckperms.api.event.sync.ConfigReloadEvent;
import me.lucko.luckperms.common.event.AbstractEvent;
@ToString
public class EventConfigReload extends AbstractEvent implements ConfigReloadEvent {
}
@@ -0,0 +1,42 @@
/*
* Copyright (c) 2016 Lucko (Luck) <luck@lucko.me>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package me.lucko.luckperms.common.event.impl;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.ToString;
import me.lucko.luckperms.api.Group;
import me.lucko.luckperms.api.event.cause.CreationCause;
import me.lucko.luckperms.api.event.group.GroupCreateEvent;
import me.lucko.luckperms.common.event.AbstractEvent;
@Getter
@ToString
@AllArgsConstructor
public class EventGroupCreate extends AbstractEvent implements GroupCreateEvent {
private final Group group;
private final CreationCause cause;
}
@@ -0,0 +1,45 @@
/*
* Copyright (c) 2016 Lucko (Luck) <luck@lucko.me>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package me.lucko.luckperms.common.event.impl;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.ToString;
import me.lucko.luckperms.api.Node;
import me.lucko.luckperms.api.event.cause.DeletionCause;
import me.lucko.luckperms.api.event.group.GroupDeleteEvent;
import me.lucko.luckperms.common.event.AbstractEvent;
import java.util.Set;
@Getter
@ToString
@AllArgsConstructor
public class EventGroupDelete extends AbstractEvent implements GroupDeleteEvent {
private final String groupName;
private final Set<Node> existingData;
private final DeletionCause cause;
}
@@ -0,0 +1,40 @@
/*
* Copyright (c) 2016 Lucko (Luck) <luck@lucko.me>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package me.lucko.luckperms.common.event.impl;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.ToString;
import me.lucko.luckperms.api.Group;
import me.lucko.luckperms.api.event.group.GroupLoadEvent;
import me.lucko.luckperms.common.event.AbstractEvent;
@Getter
@ToString
@AllArgsConstructor
public class EventGroupLoad extends AbstractEvent implements GroupLoadEvent {
private final Group group;
}
@@ -0,0 +1,33 @@
/*
* Copyright (c) 2016 Lucko (Luck) <luck@lucko.me>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package me.lucko.luckperms.common.event.impl;
import lombok.ToString;
import me.lucko.luckperms.api.event.group.GroupLoadAllEvent;
import me.lucko.luckperms.common.event.AbstractEvent;
@ToString
public class EventGroupLoadAll extends AbstractEvent implements GroupLoadAllEvent {
}
@@ -0,0 +1,43 @@
/*
* Copyright (c) 2016 Lucko (Luck) <luck@lucko.me>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package me.lucko.luckperms.common.event.impl;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.ToString;
import me.lucko.luckperms.api.LogEntry;
import me.lucko.luckperms.api.event.log.LogBroadcastEvent;
import me.lucko.luckperms.common.event.AbstractEvent;
import java.util.concurrent.atomic.AtomicBoolean;
@Getter
@ToString
@AllArgsConstructor
public class EventLogBroadcast extends AbstractEvent implements LogBroadcastEvent {
private final AtomicBoolean cancellationState;
private final LogEntry entry;
}
@@ -0,0 +1,43 @@
/*
* Copyright (c) 2016 Lucko (Luck) <luck@lucko.me>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package me.lucko.luckperms.common.event.impl;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.ToString;
import me.lucko.luckperms.api.LogEntry;
import me.lucko.luckperms.api.event.log.LogPublishEvent;
import me.lucko.luckperms.common.event.AbstractEvent;
import java.util.concurrent.atomic.AtomicBoolean;
@Getter
@ToString
@AllArgsConstructor
public class EventLogPublish extends AbstractEvent implements LogPublishEvent {
private final AtomicBoolean cancellationState;
private final LogEntry entry;
}
@@ -0,0 +1,57 @@
/*
* Copyright (c) 2016 Lucko (Luck) <luck@lucko.me>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package me.lucko.luckperms.common.event.impl;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.ToString;
import me.lucko.luckperms.api.Group;
import me.lucko.luckperms.api.Node;
import me.lucko.luckperms.api.PermissionHolder;
import me.lucko.luckperms.api.User;
import me.lucko.luckperms.api.event.node.NodeAddEvent;
import me.lucko.luckperms.common.event.AbstractEvent;
import java.util.Set;
@Getter
@ToString
@AllArgsConstructor
public class EventNodeAdd extends AbstractEvent implements NodeAddEvent {
private final Node node;
private final PermissionHolder target;
private final Set<Node> dataBefore;
private final Set<Node> dataAfter;
@Override
public boolean isUser() {
return target instanceof User;
}
@Override
public boolean isGroup() {
return target instanceof Group;
}
}
@@ -0,0 +1,57 @@
/*
* Copyright (c) 2016 Lucko (Luck) <luck@lucko.me>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package me.lucko.luckperms.common.event.impl;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.ToString;
import me.lucko.luckperms.api.Group;
import me.lucko.luckperms.api.Node;
import me.lucko.luckperms.api.PermissionHolder;
import me.lucko.luckperms.api.User;
import me.lucko.luckperms.api.event.node.NodeClearEvent;
import me.lucko.luckperms.common.event.AbstractEvent;
import java.util.Set;
@Getter
@ToString
@AllArgsConstructor
public class EventNodeClear extends AbstractEvent implements NodeClearEvent {
private final PermissionHolder target;
private final Set<Node> dataBefore;
private final Set<Node> dataAfter;
@Override
public boolean isUser() {
return target instanceof User;
}
@Override
public boolean isGroup() {
return target instanceof Group;
}
}
@@ -0,0 +1,58 @@
/*
* Copyright (c) 2016 Lucko (Luck) <luck@lucko.me>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package me.lucko.luckperms.common.event.impl;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.ToString;
import me.lucko.luckperms.api.Group;
import me.lucko.luckperms.api.Node;
import me.lucko.luckperms.api.PermissionHolder;
import me.lucko.luckperms.api.User;
import me.lucko.luckperms.api.event.node.NodeRemoveEvent;
import me.lucko.luckperms.common.event.AbstractEvent;
import java.util.Set;
@Getter
@ToString
@AllArgsConstructor
public class EventNodeRemove extends AbstractEvent implements NodeRemoveEvent {
private final Node node;
private final PermissionHolder target;
private final Set<Node> dataBefore;
private final Set<Node> dataAfter;
@Override
public boolean isUser() {
return target instanceof User;
}
@Override
public boolean isGroup() {
return target instanceof Group;
}
}
@@ -0,0 +1,33 @@
/*
* Copyright (c) 2016 Lucko (Luck) <luck@lucko.me>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package me.lucko.luckperms.common.event.impl;
import lombok.ToString;
import me.lucko.luckperms.api.event.sync.PostSyncEvent;
import me.lucko.luckperms.common.event.AbstractEvent;
@ToString
public class EventPostSync extends AbstractEvent implements PostSyncEvent {
}
@@ -0,0 +1,43 @@
/*
* Copyright (c) 2016 Lucko (Luck) <luck@lucko.me>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package me.lucko.luckperms.common.event.impl;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.ToString;
import me.lucko.luckperms.api.event.sync.PreNetworkSyncEvent;
import me.lucko.luckperms.common.event.AbstractEvent;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicBoolean;
@Getter
@ToString
@AllArgsConstructor
public class EventPreNetworkSync extends AbstractEvent implements PreNetworkSyncEvent {
private final AtomicBoolean cancellationState;
private final UUID syncId;
}
@@ -0,0 +1,41 @@
/*
* Copyright (c) 2016 Lucko (Luck) <luck@lucko.me>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package me.lucko.luckperms.common.event.impl;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.ToString;
import me.lucko.luckperms.api.event.sync.PreSyncEvent;
import me.lucko.luckperms.common.event.AbstractEvent;
import java.util.concurrent.atomic.AtomicBoolean;
@Getter
@ToString
@AllArgsConstructor
public class EventPreSync extends AbstractEvent implements PreSyncEvent {
private final AtomicBoolean cancellationState;
}
@@ -0,0 +1,45 @@
/*
* Copyright (c) 2016 Lucko (Luck) <luck@lucko.me>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package me.lucko.luckperms.common.event.impl;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.ToString;
import me.lucko.luckperms.api.Track;
import me.lucko.luckperms.api.event.track.mutate.TrackAddGroupEvent;
import me.lucko.luckperms.common.event.AbstractEvent;
import java.util.List;
@Getter
@ToString
@AllArgsConstructor
public class EventTrackAddGroup extends AbstractEvent implements TrackAddGroupEvent {
private final String group;
private final Track track;
private final List<String> dataBefore;
private final List<String> dataAfter;
}
@@ -0,0 +1,44 @@
/*
* Copyright (c) 2016 Lucko (Luck) <luck@lucko.me>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package me.lucko.luckperms.common.event.impl;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.ToString;
import me.lucko.luckperms.api.Track;
import me.lucko.luckperms.api.event.track.mutate.TrackClearEvent;
import me.lucko.luckperms.common.event.AbstractEvent;
import java.util.List;
@Getter
@ToString
@AllArgsConstructor
public class EventTrackClear extends AbstractEvent implements TrackClearEvent {
private final Track track;
private final List<String> dataBefore;
private final List<String> dataAfter;
}
@@ -0,0 +1,42 @@
/*
* Copyright (c) 2016 Lucko (Luck) <luck@lucko.me>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package me.lucko.luckperms.common.event.impl;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.ToString;
import me.lucko.luckperms.api.Track;
import me.lucko.luckperms.api.event.cause.CreationCause;
import me.lucko.luckperms.api.event.track.TrackCreateEvent;
import me.lucko.luckperms.common.event.AbstractEvent;
@Getter
@ToString
@AllArgsConstructor
public class EventTrackCreate extends AbstractEvent implements TrackCreateEvent {
private final Track track;
private final CreationCause cause;
}
@@ -0,0 +1,44 @@
/*
* Copyright (c) 2016 Lucko (Luck) <luck@lucko.me>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package me.lucko.luckperms.common.event.impl;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.ToString;
import me.lucko.luckperms.api.event.cause.DeletionCause;
import me.lucko.luckperms.api.event.track.TrackDeleteEvent;
import me.lucko.luckperms.common.event.AbstractEvent;
import java.util.List;
@Getter
@ToString
@AllArgsConstructor
public class EventTrackDelete extends AbstractEvent implements TrackDeleteEvent {
private final String trackName;
private final List<String> existingData;
private final DeletionCause cause;
}
@@ -0,0 +1,40 @@
/*
* Copyright (c) 2016 Lucko (Luck) <luck@lucko.me>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package me.lucko.luckperms.common.event.impl;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.ToString;
import me.lucko.luckperms.api.Track;
import me.lucko.luckperms.api.event.track.TrackLoadEvent;
import me.lucko.luckperms.common.event.AbstractEvent;
@Getter
@ToString
@AllArgsConstructor
public class EventTrackLoad extends AbstractEvent implements TrackLoadEvent {
private final Track track;
}
@@ -0,0 +1,33 @@
/*
* Copyright (c) 2016 Lucko (Luck) <luck@lucko.me>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package me.lucko.luckperms.common.event.impl;
import lombok.ToString;
import me.lucko.luckperms.api.event.track.TrackLoadAllEvent;
import me.lucko.luckperms.common.event.AbstractEvent;
@ToString
public class EventTrackLoadAll extends AbstractEvent implements TrackLoadAllEvent {
}
@@ -0,0 +1,45 @@
/*
* Copyright (c) 2016 Lucko (Luck) <luck@lucko.me>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package me.lucko.luckperms.common.event.impl;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.ToString;
import me.lucko.luckperms.api.Track;
import me.lucko.luckperms.api.event.track.mutate.TrackRemoveGroupEvent;
import me.lucko.luckperms.common.event.AbstractEvent;
import java.util.List;
@Getter
@ToString
@AllArgsConstructor
public class EventTrackRemoveGroup extends AbstractEvent implements TrackRemoveGroupEvent {
private final String group;
private final Track track;
private final List<String> dataBefore;
private final List<String> dataAfter;
}
@@ -0,0 +1,42 @@
/*
* Copyright (c) 2016 Lucko (Luck) <luck@lucko.me>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package me.lucko.luckperms.common.event.impl;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.ToString;
import me.lucko.luckperms.api.User;
import me.lucko.luckperms.api.caching.UserData;
import me.lucko.luckperms.api.event.user.UserCacheLoadEvent;
import me.lucko.luckperms.common.event.AbstractEvent;
@Getter
@ToString
@AllArgsConstructor
public class EventUserCacheLoad extends AbstractEvent implements UserCacheLoadEvent {
private final User user;
private final UserData loadedData;
}
@@ -0,0 +1,42 @@
/*
* Copyright (c) 2016 Lucko (Luck) <luck@lucko.me>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package me.lucko.luckperms.common.event.impl;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.ToString;
import me.lucko.luckperms.api.User;
import me.lucko.luckperms.api.caching.UserData;
import me.lucko.luckperms.api.event.user.UserDataRecalculateEvent;
import me.lucko.luckperms.common.event.AbstractEvent;
@Getter
@ToString
@AllArgsConstructor
public class EventUserDataRecalculate extends AbstractEvent implements UserDataRecalculateEvent {
private final User user;
private final UserData data;
}
@@ -0,0 +1,64 @@
/*
* Copyright (c) 2016 Lucko (Luck) <luck@lucko.me>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package me.lucko.luckperms.common.event.impl;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.ToString;
import me.lucko.luckperms.api.Track;
import me.lucko.luckperms.api.User;
import me.lucko.luckperms.api.event.user.track.TrackAction;
import me.lucko.luckperms.api.event.user.track.UserDemoteEvent;
import me.lucko.luckperms.common.event.AbstractEvent;
import java.util.Optional;
@ToString
@AllArgsConstructor
public class EventUserDemote extends AbstractEvent implements UserDemoteEvent {
@Getter
private final Track track;
@Getter
private final User user;
private final String groupFrom;
private final String groupTo;
@Override
public TrackAction getAction() {
return TrackAction.DEMOTION;
}
@Override
public Optional<String> getGroupFrom() {
return Optional.ofNullable(groupFrom);
}
@Override
public Optional<String> getGroupTo() {
return Optional.ofNullable(groupTo);
}
}
@@ -0,0 +1,42 @@
/*
* Copyright (c) 2016 Lucko (Luck) <luck@lucko.me>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package me.lucko.luckperms.common.event.impl;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.ToString;
import me.lucko.luckperms.api.event.user.UserFirstLoginEvent;
import me.lucko.luckperms.common.event.AbstractEvent;
import java.util.UUID;
@Getter
@ToString
@AllArgsConstructor
public class EventUserFirstLogin extends AbstractEvent implements UserFirstLoginEvent {
private final UUID uuid;
private final String username;
}
@@ -0,0 +1,40 @@
/*
* Copyright (c) 2016 Lucko (Luck) <luck@lucko.me>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package me.lucko.luckperms.common.event.impl;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.ToString;
import me.lucko.luckperms.api.User;
import me.lucko.luckperms.api.event.user.UserLoadEvent;
import me.lucko.luckperms.common.event.AbstractEvent;
@Getter
@ToString
@AllArgsConstructor
public class EventUserLoad extends AbstractEvent implements UserLoadEvent {
private final User user;
}
@@ -0,0 +1,64 @@
/*
* Copyright (c) 2016 Lucko (Luck) <luck@lucko.me>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package me.lucko.luckperms.common.event.impl;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.ToString;
import me.lucko.luckperms.api.Track;
import me.lucko.luckperms.api.User;
import me.lucko.luckperms.api.event.user.track.TrackAction;
import me.lucko.luckperms.api.event.user.track.UserPromoteEvent;
import me.lucko.luckperms.common.event.AbstractEvent;
import java.util.Optional;
@ToString
@AllArgsConstructor
public class EventUserPromote extends AbstractEvent implements UserPromoteEvent {
@Getter
private final Track track;
@Getter
private final User user;
private final String groupFrom;
private final String groupTo;
@Override
public TrackAction getAction() {
return TrackAction.PROMOTION;
}
@Override
public Optional<String> getGroupFrom() {
return Optional.ofNullable(groupFrom);
}
@Override
public Optional<String> getGroupTo() {
return Optional.ofNullable(groupTo);
}
}
@@ -22,15 +22,20 @@
package me.lucko.luckperms.common.managers.impl;
import lombok.AllArgsConstructor;
import me.lucko.luckperms.common.core.model.Track;
import me.lucko.luckperms.common.managers.AbstractManager;
import me.lucko.luckperms.common.managers.TrackManager;
import me.lucko.luckperms.common.plugin.LuckPermsPlugin;
@AllArgsConstructor
public class GenericTrackManager extends AbstractManager<String, Track> implements TrackManager {
private final LuckPermsPlugin plugin;
@Override
public Track apply(String name) {
return new Track(name);
return new Track(name, plugin);
}
}
@@ -64,6 +64,11 @@ public abstract class AbstractMessagingService implements InternalMessagingServi
}
plugin.getLog().info("[" + name + " Messaging] Received update ping with id: " + uuid.toString());
if (plugin.getApiProvider().getEventFactory().handleNetworkPreSync(false, uuid)) {
return;
}
plugin.getUpdateTaskBuffer().request();
if (callback != null) {
@@ -23,11 +23,15 @@
package me.lucko.luckperms.common.storage;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.experimental.Delegate;
import me.lucko.luckperms.api.HeldPermission;
import me.lucko.luckperms.api.LogEntry;
import me.lucko.luckperms.api.event.cause.CreationCause;
import me.lucko.luckperms.api.event.cause.DeletionCause;
import me.lucko.luckperms.common.api.delegates.StorageDelegate;
import me.lucko.luckperms.common.core.model.Group;
import me.lucko.luckperms.common.core.model.Track;
import me.lucko.luckperms.common.core.model.User;
@@ -49,14 +53,25 @@ import java.util.function.Supplier;
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
public class AbstractStorage implements Storage {
public static Storage wrap(LuckPermsPlugin plugin, AbstractBacking backing) {
BufferedOutputStorage bufferedDs = BufferedOutputStorage.wrap(TolerantStorage.wrap(new AbstractStorage(backing)), 1000L);
BufferedOutputStorage bufferedDs = BufferedOutputStorage.wrap(TolerantStorage.wrap(new AbstractStorage(plugin, backing)), 1000L);
plugin.getScheduler().doAsyncRepeating(bufferedDs, 10L);
return bufferedDs;
}
private final LuckPermsPlugin plugin;
@Delegate(types = Delegated.class)
private final AbstractBacking backing;
@Getter
private final StorageDelegate delegate;
private AbstractStorage(LuckPermsPlugin plugin, AbstractBacking backing) {
this.plugin = plugin;
this.backing = backing;
this.delegate = new StorageDelegate(plugin, this);
}
private <T> CompletableFuture<T> makeFuture(Supplier<T> supplier) {
return CompletableFuture.supplyAsync(supplier, backing.getPlugin().getScheduler().getAsyncExecutor());
}
@@ -78,7 +93,13 @@ public class AbstractStorage implements Storage {
@Override
public CompletableFuture<Boolean> loadUser(UUID uuid, String username) {
return makeFuture(() -> backing.loadUser(uuid, username));
return makeFuture(() -> {
if (backing.loadUser(uuid, username)) {
plugin.getApiProvider().getEventFactory().handleUserLoad(plugin.getUserManager().get(uuid));
return true;
}
return false;
});
}
@Override
@@ -102,18 +123,36 @@ public class AbstractStorage implements Storage {
}
@Override
public CompletableFuture<Boolean> createAndLoadGroup(String name) {
return makeFuture(() -> backing.createAndLoadGroup(name));
public CompletableFuture<Boolean> createAndLoadGroup(String name, CreationCause cause) {
return makeFuture(() -> {
if (backing.createAndLoadGroup(name)) {
plugin.getApiProvider().getEventFactory().handleGroupCreate(plugin.getGroupManager().getIfLoaded(name), cause);
return true;
}
return false;
});
}
@Override
public CompletableFuture<Boolean> loadGroup(String name) {
return makeFuture(() -> backing.loadGroup(name));
return makeFuture(() -> {
if (backing.loadGroup(name)) {
plugin.getApiProvider().getEventFactory().handleGroupLoad(plugin.getGroupManager().getIfLoaded(name));
return true;
}
return false;
});
}
@Override
public CompletableFuture<Boolean> loadAllGroups() {
return makeFuture(backing::loadAllGroups);
return makeFuture(() -> {
if (backing.loadAllGroups()) {
plugin.getApiProvider().getEventFactory().handleGroupLoadAll();
return true;
}
return false;
});
}
@Override
@@ -122,8 +161,14 @@ public class AbstractStorage implements Storage {
}
@Override
public CompletableFuture<Boolean> deleteGroup(Group group) {
return makeFuture(() -> backing.deleteGroup(group));
public CompletableFuture<Boolean> deleteGroup(Group group, DeletionCause cause) {
return makeFuture(() -> {
if (backing.deleteGroup(group)) {
plugin.getApiProvider().getEventFactory().handleGroupDelete(group, cause);
return true;
}
return false;
});
}
@Override
@@ -132,18 +177,36 @@ public class AbstractStorage implements Storage {
}
@Override
public CompletableFuture<Boolean> createAndLoadTrack(String name) {
return makeFuture(() -> backing.createAndLoadTrack(name));
public CompletableFuture<Boolean> createAndLoadTrack(String name, CreationCause cause) {
return makeFuture(() -> {
if (backing.createAndLoadTrack(name)) {
plugin.getApiProvider().getEventFactory().handleTrackCreate(plugin.getTrackManager().getIfLoaded(name), cause);
return true;
}
return false;
});
}
@Override
public CompletableFuture<Boolean> loadTrack(String name) {
return makeFuture(() -> backing.loadTrack(name));
return makeFuture(() -> {
if (backing.loadTrack(name)) {
plugin.getApiProvider().getEventFactory().handleTrackLoad(plugin.getTrackManager().getIfLoaded(name));
return true;
}
return false;
});
}
@Override
public CompletableFuture<Boolean> loadAllTracks() {
return makeFuture(backing::loadAllTracks);
return makeFuture(() -> {
if (backing.loadAllTracks()) {
plugin.getApiProvider().getEventFactory().handleTrackLoadAll();
return true;
}
return false;
});
}
@Override
@@ -152,8 +215,14 @@ public class AbstractStorage implements Storage {
}
@Override
public CompletableFuture<Boolean> deleteTrack(Track track) {
return makeFuture(() -> backing.deleteTrack(track));
public CompletableFuture<Boolean> deleteTrack(Track track, DeletionCause cause) {
return makeFuture(() -> {
if (backing.deleteTrack(track)) {
plugin.getApiProvider().getEventFactory().handleTrackDelete(track, cause);
return true;
}
return false;
});
}
@Override
@@ -24,6 +24,9 @@ package me.lucko.luckperms.common.storage;
import me.lucko.luckperms.api.HeldPermission;
import me.lucko.luckperms.api.LogEntry;
import me.lucko.luckperms.api.event.cause.CreationCause;
import me.lucko.luckperms.api.event.cause.DeletionCause;
import me.lucko.luckperms.common.api.delegates.StorageDelegate;
import me.lucko.luckperms.common.core.model.Group;
import me.lucko.luckperms.common.core.model.Track;
import me.lucko.luckperms.common.core.model.User;
@@ -39,6 +42,8 @@ import java.util.concurrent.CompletableFuture;
*/
public interface Storage {
StorageDelegate getDelegate();
String getName();
boolean isAcceptingLogins();
@@ -65,7 +70,7 @@ public interface Storage {
CompletableFuture<List<HeldPermission<UUID>>> getUsersWithPermission(String permission);
CompletableFuture<Boolean> createAndLoadGroup(String name);
CompletableFuture<Boolean> createAndLoadGroup(String name, CreationCause cause);
CompletableFuture<Boolean> loadGroup(String name);
@@ -73,11 +78,11 @@ public interface Storage {
CompletableFuture<Boolean> saveGroup(Group group);
CompletableFuture<Boolean> deleteGroup(Group group);
CompletableFuture<Boolean> deleteGroup(Group group, DeletionCause cause);
CompletableFuture<List<HeldPermission<String>>> getGroupsWithPermission(String permission);
CompletableFuture<Boolean> createAndLoadTrack(String name);
CompletableFuture<Boolean> createAndLoadTrack(String name, CreationCause cause);
CompletableFuture<Boolean> loadTrack(String name);
@@ -85,7 +90,7 @@ public interface Storage {
CompletableFuture<Boolean> saveTrack(Track track);
CompletableFuture<Boolean> deleteTrack(Track track);
CompletableFuture<Boolean> deleteTrack(Track track, DeletionCause cause);
CompletableFuture<Boolean> saveUUIDData(String username, UUID uuid);
@@ -28,6 +28,9 @@ import lombok.experimental.Delegate;
import me.lucko.luckperms.api.HeldPermission;
import me.lucko.luckperms.api.LogEntry;
import me.lucko.luckperms.api.event.cause.CreationCause;
import me.lucko.luckperms.api.event.cause.DeletionCause;
import me.lucko.luckperms.common.api.delegates.StorageDelegate;
import me.lucko.luckperms.common.core.model.Group;
import me.lucko.luckperms.common.core.model.Track;
import me.lucko.luckperms.common.core.model.User;
@@ -144,10 +147,10 @@ public class TolerantStorage implements Storage {
}
@Override
public CompletableFuture<Boolean> createAndLoadGroup(String name) {
public CompletableFuture<Boolean> createAndLoadGroup(String name, CreationCause cause) {
phaser.register();
try {
return backing.createAndLoadGroup(name);
return backing.createAndLoadGroup(name, cause);
} finally {
phaser.arriveAndDeregister();
}
@@ -184,10 +187,10 @@ public class TolerantStorage implements Storage {
}
@Override
public CompletableFuture<Boolean> deleteGroup(Group group) {
public CompletableFuture<Boolean> deleteGroup(Group group, DeletionCause cause) {
phaser.register();
try {
return backing.deleteGroup(group);
return backing.deleteGroup(group, cause);
} finally {
phaser.arriveAndDeregister();
}
@@ -204,10 +207,10 @@ public class TolerantStorage implements Storage {
}
@Override
public CompletableFuture<Boolean> createAndLoadTrack(String name) {
public CompletableFuture<Boolean> createAndLoadTrack(String name, CreationCause cause) {
phaser.register();
try {
return backing.createAndLoadTrack(name);
return backing.createAndLoadTrack(name, cause);
} finally {
phaser.arriveAndDeregister();
}
@@ -244,10 +247,10 @@ public class TolerantStorage implements Storage {
}
@Override
public CompletableFuture<Boolean> deleteTrack(Track track) {
public CompletableFuture<Boolean> deleteTrack(Track track, DeletionCause cause) {
phaser.register();
try {
return backing.deleteTrack(track);
return backing.deleteTrack(track, cause);
} finally {
phaser.arriveAndDeregister();
}
@@ -284,6 +287,7 @@ public class TolerantStorage implements Storage {
}
private interface Delegated {
StorageDelegate getDelegate();
String getName();
boolean isAcceptingLogins();
void setAcceptingLogins(boolean b);
@@ -24,8 +24,7 @@ package me.lucko.luckperms.common.tasks;
import lombok.AllArgsConstructor;
import me.lucko.luckperms.api.event.events.PostSyncEvent;
import me.lucko.luckperms.api.event.events.PreSyncEvent;
import me.lucko.luckperms.api.event.cause.CreationCause;
import me.lucko.luckperms.common.config.ConfigKeys;
import me.lucko.luckperms.common.plugin.LuckPermsPlugin;
@@ -38,15 +37,15 @@ public class UpdateTask implements Runnable {
*/
@Override
public void run() {
PreSyncEvent event = new PreSyncEvent();
plugin.getApiProvider().fireEvent(event);
if (event.isCancelled()) return;
if (plugin.getApiProvider().getEventFactory().handlePreSync(false)) {
return;
}
// Reload all groups
plugin.getStorage().loadAllGroups().join();
String defaultGroup = plugin.getConfiguration().get(ConfigKeys.DEFAULT_GROUP_NAME);
if (!plugin.getGroupManager().isLoaded(defaultGroup)) {
plugin.getStorage().createAndLoadGroup(defaultGroup).join();
plugin.getStorage().createAndLoadGroup(defaultGroup, CreationCause.INTERNAL).join();
}
// Reload all tracks
@@ -57,6 +56,6 @@ public class UpdateTask implements Runnable {
plugin.onPostUpdate();
plugin.getApiProvider().fireEvent(new PostSyncEvent());
plugin.getApiProvider().getEventFactory().handlePostSync();
}
}
@@ -24,7 +24,6 @@ package me.lucko.luckperms.common.utils;
import lombok.AllArgsConstructor;
import me.lucko.luckperms.api.event.events.UserFirstLoginEvent;
import me.lucko.luckperms.common.config.ConfigKeys;
import me.lucko.luckperms.common.core.UuidCache;
import me.lucko.luckperms.common.core.model.User;
@@ -50,14 +49,14 @@ public class AbstractListener {
cache.addToCache(u, uuid);
} else {
// No previous data for this player
plugin.getApiProvider().fireEventAsync(new UserFirstLoginEvent(u, username));
plugin.getApiProvider().getEventFactory().handleUserFirstLogin(u, username);
cache.addToCache(u, u);
plugin.getStorage().force().saveUUIDData(username, u);
}
} else {
String name = plugin.getStorage().force().getName(u).join();
if (name == null) {
plugin.getApiProvider().fireEventAsync(new UserFirstLoginEvent(u, username));
plugin.getApiProvider().getEventFactory().handleUserFirstLogin(u, username);
}
// Online mode, no cache needed. This is just for name -> uuid lookup.