From 84c5b818b8858af70aaeeee49bed25d2f94871c8 Mon Sep 17 00:00:00 2001 From: Luck Date: Sat, 27 Feb 2021 18:24:39 +0000 Subject: [PATCH] Add cancellable UserUnloadEvent --- .../api/event/user/UserUnloadEvent.java | 50 +++++++++++++++++++ .../common/event/EventDispatcher.java | 6 +++ .../model/manager/user/UserHousekeeper.java | 10 ++++ 3 files changed, 66 insertions(+) create mode 100644 api/src/main/java/net/luckperms/api/event/user/UserUnloadEvent.java diff --git a/api/src/main/java/net/luckperms/api/event/user/UserUnloadEvent.java b/api/src/main/java/net/luckperms/api/event/user/UserUnloadEvent.java new file mode 100644 index 000000000..21b2ad5dc --- /dev/null +++ b/api/src/main/java/net/luckperms/api/event/user/UserUnloadEvent.java @@ -0,0 +1,50 @@ +/* + * This file is part of LuckPerms, licensed under the MIT License. + * + * Copyright (c) lucko (Luck) + * Copyright (c) contributors + * + * 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 net.luckperms.api.event.user; + +import net.luckperms.api.event.LuckPermsEvent; +import net.luckperms.api.event.type.Cancellable; +import net.luckperms.api.event.util.Param; +import net.luckperms.api.model.user.User; + +import org.checkerframework.checker.nullness.qual.NonNull; + +/** + * Called when a user is about to be unloaded from memory. + * + * @since 5.3 + */ +public interface UserUnloadEvent extends LuckPermsEvent, Cancellable { + + /** + * Gets the user that is being unloaded + * + * @return the user that is being unloaded + */ + @Param(0) + @NonNull User getUser(); + +} diff --git a/common/src/main/java/me/lucko/luckperms/common/event/EventDispatcher.java b/common/src/main/java/me/lucko/luckperms/common/event/EventDispatcher.java index 4be30ac17..272794236 100644 --- a/common/src/main/java/me/lucko/luckperms/common/event/EventDispatcher.java +++ b/common/src/main/java/me/lucko/luckperms/common/event/EventDispatcher.java @@ -88,6 +88,7 @@ import net.luckperms.api.event.user.UserCacheLoadEvent; import net.luckperms.api.event.user.UserDataRecalculateEvent; import net.luckperms.api.event.user.UserFirstLoginEvent; import net.luckperms.api.event.user.UserLoadEvent; +import net.luckperms.api.event.user.UserUnloadEvent; import net.luckperms.api.event.user.track.UserDemoteEvent; import net.luckperms.api.event.user.track.UserPromoteEvent; import net.luckperms.api.extension.Extension; @@ -365,6 +366,10 @@ public final class EventDispatcher { postAsync(UserLoadEvent.class, user.getApiProxy()); } + public boolean dispatchUserUnload(User user) { + return postCancellable(UserUnloadEvent.class, false, user.getApiProxy()); + } + public void dispatchUserDemote(User user, Track track, String from, String to, @Nullable Sender sender) { Source source = sender == null ? UnknownSource.INSTANCE : new EntitySourceImpl(new SenderPlatformEntity(sender)); postAsync(UserDemoteEvent.class, source, track.getApiProxy(), user.getApiProxy(), Optional.ofNullable(from), Optional.ofNullable(to)); @@ -424,6 +429,7 @@ public final class EventDispatcher { UserDataRecalculateEvent.class, UserFirstLoginEvent.class, UserLoadEvent.class, + UserUnloadEvent.class, UserDemoteEvent.class, UserPromoteEvent.class ); diff --git a/common/src/main/java/me/lucko/luckperms/common/model/manager/user/UserHousekeeper.java b/common/src/main/java/me/lucko/luckperms/common/model/manager/user/UserHousekeeper.java index 25f72d622..f1ae13665 100644 --- a/common/src/main/java/me/lucko/luckperms/common/model/manager/user/UserHousekeeper.java +++ b/common/src/main/java/me/lucko/luckperms/common/model/manager/user/UserHousekeeper.java @@ -26,6 +26,7 @@ package me.lucko.luckperms.common.model.manager.user; import me.lucko.luckperms.common.config.ConfigKeys; +import me.lucko.luckperms.common.model.User; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; import me.lucko.luckperms.common.util.ExpiringSet; @@ -78,6 +79,15 @@ public class UserHousekeeper implements Runnable { return; } + User user = this.userManager.getIfLoaded(uuid); + if (user == null) { + return; + } + + if (this.plugin.getEventDispatcher().dispatchUserUnload(user)) { + return; + } + // unload them if (this.plugin.getConfiguration().get(ConfigKeys.DEBUG_LOGINS)) { this.plugin.getLogger().info("User Housekeeper: unloading user data for " + uuid);