use a better event system
This commit is contained in:
@ -3,6 +3,7 @@ package cc.fascinated;
|
||||
import cc.fascinated.account.AccountManager;
|
||||
import cc.fascinated.chat.ChatManager;
|
||||
import cc.fascinated.command.CommandManager;
|
||||
import cc.fascinated.event.EventManager;
|
||||
import cc.fascinated.metrics.MetricManager;
|
||||
import cc.fascinated.misc.PlayerVersionWarning;
|
||||
import cc.fascinated.motd.MotdManager;
|
||||
@ -38,6 +39,7 @@ public class Aetheria extends JavaPlugin {
|
||||
|
||||
new AccountManager();
|
||||
|
||||
new EventManager();
|
||||
new CommandManager();
|
||||
new WorldSizeManager();
|
||||
new PlaceholderManager();
|
||||
|
@ -23,6 +23,11 @@ import java.util.UUID;
|
||||
@Getter @Log4j2
|
||||
public class Account {
|
||||
|
||||
/**
|
||||
* Profile keys.
|
||||
*/
|
||||
private static final String playerColorProfileId = "playerColorProfile";
|
||||
|
||||
/**
|
||||
* The UUID of the player.
|
||||
*/
|
||||
@ -78,26 +83,6 @@ public class Account {
|
||||
this.lastLogin = System.currentTimeMillis();
|
||||
this.save(false); // Save default values
|
||||
log.info("Created new account for " + this.uuid);
|
||||
|
||||
Bukkit.broadcast(Style.getMiniMessage().deserialize(Lang.FIRST_JOIN_MESSAGE.getAsString()
|
||||
.replace("%player%", player.getName())
|
||||
));
|
||||
|
||||
Aetheria.EXECUTOR.execute(() -> {
|
||||
// todo: re-code this it's so ugly
|
||||
DiscordWebhook discordWebhook = new DiscordWebhook(Config.DISCORD_LOG_WEBHOOK.getAsString());
|
||||
DiscordWebhook.EmbedObject embed = new DiscordWebhook.EmbedObject();
|
||||
embed.setTitle("New Player Joined");
|
||||
embed.addField("Name", player.getName(), true);
|
||||
embed.addField("UUID", uuid.toString(), true);
|
||||
|
||||
discordWebhook.addEmbed(embed);
|
||||
try {
|
||||
discordWebhook.execute();
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
this.firstJoin = config.getLong("firstJoin");
|
||||
@ -106,7 +91,7 @@ public class Account {
|
||||
this.lastLogin = System.currentTimeMillis(); // Update last login
|
||||
|
||||
// Load profiles
|
||||
this.playerColorProfile = new PlayerColor(this, this.getProfileSection("playerColor"));
|
||||
this.playerColorProfile = new PlayerColor(this, this.getProfileSection(playerColorProfileId));
|
||||
|
||||
//log.info("Loaded account for " + this.uuid);
|
||||
}
|
||||
@ -163,16 +148,11 @@ public class Account {
|
||||
* @param key the key to save the profile under
|
||||
*/
|
||||
private void saveProfile(Profile profile, String key) {
|
||||
key = this.getProfileId(key); // append "Profile" to the key to signify it's a profile
|
||||
profile.save(config.getConfigurationSection(key) == null ? config.createSection(key) : config.getConfigurationSection(key));
|
||||
}
|
||||
|
||||
private ConfigurationSection getProfileSection(String key) {
|
||||
return this.config.getConfigurationSection(this.getProfileId(key));
|
||||
}
|
||||
|
||||
private String getProfileId(String key) {
|
||||
return key + "Profile"; // append "Profile" to the key to signify it's a profile
|
||||
return this.config.getConfigurationSection(key);
|
||||
}
|
||||
|
||||
@SneakyThrows
|
||||
@ -181,7 +161,7 @@ public class Account {
|
||||
this.config.set("lastLogin", this.lastLogin);
|
||||
|
||||
if (saveProfiles) {
|
||||
this.saveProfile(this.playerColorProfile, "playerColor");
|
||||
this.saveProfile(this.playerColorProfile, playerColorProfileId);
|
||||
}
|
||||
|
||||
this.config.save(this.file);
|
||||
|
@ -1,15 +1,19 @@
|
||||
package cc.fascinated.account;
|
||||
|
||||
import cc.fascinated.Aetheria;
|
||||
import cc.fascinated.config.Config;
|
||||
import cc.fascinated.config.Lang;
|
||||
import cc.fascinated.utils.DiscordWebhook;
|
||||
import cc.fascinated.utils.Manager;
|
||||
import cc.fascinated.utils.Style;
|
||||
import lombok.extern.log4j.Log4j2;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.player.PlayerJoinEvent;
|
||||
import org.bukkit.event.player.PlayerLoginEvent;
|
||||
import org.bukkit.event.player.PlayerQuitEvent;
|
||||
import org.bukkit.event.server.PluginDisableEvent;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
@ -23,7 +27,7 @@ public class AccountManager extends Manager {
|
||||
|
||||
public AccountManager() {
|
||||
for (Player player : Bukkit.getOnlinePlayers()) {
|
||||
registerAccount(player);
|
||||
loadAccount(player);
|
||||
}
|
||||
|
||||
Bukkit.getAsyncScheduler().runAtFixedRate(Aetheria.INSTANCE, (task) -> {
|
||||
@ -40,7 +44,7 @@ public class AccountManager extends Manager {
|
||||
public static Account getAccount(Player player) {
|
||||
UUID uuid = player.getUniqueId();
|
||||
if (!ACCOUNTS.containsKey(uuid)) {
|
||||
return registerAccount(player);
|
||||
return loadAccount(player);
|
||||
}
|
||||
return ACCOUNTS.get(uuid);
|
||||
}
|
||||
@ -51,7 +55,7 @@ public class AccountManager extends Manager {
|
||||
* @param player the player
|
||||
* @return true if the account is already registered, false otherwise
|
||||
*/
|
||||
private boolean accountRegistered(Player player) {
|
||||
private boolean isAccountLoaded(Player player) {
|
||||
return ACCOUNTS.containsKey(player.getUniqueId());
|
||||
}
|
||||
|
||||
@ -60,7 +64,7 @@ public class AccountManager extends Manager {
|
||||
*
|
||||
* @param player the player
|
||||
*/
|
||||
private static Account registerAccount(Player player) {
|
||||
private static Account loadAccount(Player player) {
|
||||
UUID uuid = player.getUniqueId();
|
||||
Account account = new Account(player);
|
||||
ACCOUNTS.put(uuid, account);
|
||||
@ -79,30 +83,53 @@ public class AccountManager extends Manager {
|
||||
log.info("Saved {} accounts. ({}ms)", ACCOUNTS.size(), System.currentTimeMillis() - before);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onJoin(PlayerJoinEvent event) {
|
||||
@Override
|
||||
public void onPlayerJoin(Account account, PlayerJoinEvent event) {
|
||||
Player player = event.getPlayer();
|
||||
if (accountRegistered(player)) { // Account already registered
|
||||
if (player.hasPlayedBefore()) {
|
||||
return;
|
||||
}
|
||||
registerAccount(player);
|
||||
|
||||
event.joinMessage(null); // Remove the join message so we can send our own
|
||||
Bukkit.broadcast(Style.getMiniMessage().deserialize(Lang.FIRST_JOIN_MESSAGE.getAsString()
|
||||
.replace("%player%", player.getName())
|
||||
));
|
||||
|
||||
Aetheria.EXECUTOR.execute(() -> {
|
||||
// todo: re-code this it's so ugly
|
||||
DiscordWebhook discordWebhook = new DiscordWebhook(Config.DISCORD_LOG_WEBHOOK.getAsString());
|
||||
DiscordWebhook.EmbedObject embed = new DiscordWebhook.EmbedObject();
|
||||
embed.setTitle("New Player Joined");
|
||||
embed.addField("Name", player.getName(), true);
|
||||
embed.addField("UUID", player.getUniqueId().toString(), true);
|
||||
|
||||
discordWebhook.addEmbed(embed);
|
||||
try {
|
||||
discordWebhook.execute();
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onQuit(PlayerQuitEvent event) {
|
||||
@Override
|
||||
public void onPlayerLogin(Account account, PlayerLoginEvent event) {
|
||||
Player player = event.getPlayer();
|
||||
Account account = getAccount(player);
|
||||
if (isAccountLoaded(player)) { // Account already loaded
|
||||
return;
|
||||
}
|
||||
loadAccount(player);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPlayerQuit(Account account, PlayerQuitEvent event) {
|
||||
account.save(true);
|
||||
|
||||
ACCOUNTS.remove(player.getUniqueId());
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPluginDisable(PluginDisableEvent event) {
|
||||
if (event.getPlugin() != Aetheria.INSTANCE) {
|
||||
return;
|
||||
ACCOUNTS.remove(account.getUuid());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAetheriaDisable() {
|
||||
this.saveAccounts(); // Save the accounts to disk
|
||||
ACCOUNTS.clear(); // Remove the accounts from the cache
|
||||
}
|
||||
|
@ -1,7 +1,6 @@
|
||||
package cc.fascinated.chat;
|
||||
|
||||
import cc.fascinated.account.Account;
|
||||
import cc.fascinated.account.AccountManager;
|
||||
import cc.fascinated.config.Lang;
|
||||
import cc.fascinated.utils.Manager;
|
||||
import cc.fascinated.utils.MessageUtils;
|
||||
@ -12,8 +11,6 @@ import lombok.RequiredArgsConstructor;
|
||||
import net.kyori.adventure.text.TextComponent;
|
||||
import net.kyori.adventure.text.format.NamedTextColor;
|
||||
import net.kyori.adventure.text.minimessage.MiniMessage;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.regex.Pattern;
|
||||
@ -33,10 +30,8 @@ public class ChatManager extends Manager {
|
||||
private final Pattern domainPattern = Pattern.compile("^((?!-)[A-Za-z0-9-]{1,63}(?<!-)\\.)+[A-Za-z]{2,8}$");
|
||||
private final Pattern ipPattern = Pattern.compile("\\b(?:\\d{1,3}\\.){3}\\d{1,3}\\b");
|
||||
|
||||
@EventHandler
|
||||
public void onChat(AsyncChatEvent event) {
|
||||
Player player = event.getPlayer();
|
||||
Account account = AccountManager.getAccount(player);
|
||||
@Override
|
||||
public void onAsyncChat(Account account, AsyncChatEvent event) {
|
||||
NamedTextColor color = account.getPlayerColorProfile().getColor();
|
||||
BlockReason blockReason = null;
|
||||
|
||||
|
23
src/main/java/cc/fascinated/event/EventListener.java
Normal file
23
src/main/java/cc/fascinated/event/EventListener.java
Normal file
@ -0,0 +1,23 @@
|
||||
package cc.fascinated.event;
|
||||
|
||||
import cc.fascinated.account.Account;
|
||||
import cc.fascinated.utils.Priority;
|
||||
import io.papermc.paper.event.player.AsyncChatEvent;
|
||||
import org.bukkit.event.player.PlayerJoinEvent;
|
||||
import org.bukkit.event.player.PlayerLoginEvent;
|
||||
import org.bukkit.event.player.PlayerQuitEvent;
|
||||
import org.bukkit.event.server.ServerListPingEvent;
|
||||
|
||||
public interface EventListener {
|
||||
|
||||
default Priority getPriority() {
|
||||
return Priority.NORMAL;
|
||||
}
|
||||
|
||||
default void onAetheriaDisable() {}
|
||||
default void onPlayerJoin(Account account, PlayerJoinEvent event) {}
|
||||
default void onPlayerLogin(Account account, PlayerLoginEvent event) {}
|
||||
default void onPlayerQuit(Account account, PlayerQuitEvent event) {}
|
||||
default void onAsyncChat(Account account, AsyncChatEvent event) {}
|
||||
default void onServerListPing(ServerListPingEvent event) {}
|
||||
}
|
96
src/main/java/cc/fascinated/event/EventManager.java
Normal file
96
src/main/java/cc/fascinated/event/EventManager.java
Normal file
@ -0,0 +1,96 @@
|
||||
package cc.fascinated.event;
|
||||
|
||||
import cc.fascinated.Aetheria;
|
||||
import cc.fascinated.account.Account;
|
||||
import cc.fascinated.account.AccountManager;
|
||||
import io.papermc.paper.event.player.AsyncChatEvent;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.player.PlayerJoinEvent;
|
||||
import org.bukkit.event.player.PlayerLoginEvent;
|
||||
import org.bukkit.event.player.PlayerQuitEvent;
|
||||
import org.bukkit.event.server.PluginDisableEvent;
|
||||
import org.bukkit.event.server.ServerListPingEvent;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
||||
public class EventManager implements Listener {
|
||||
|
||||
/**
|
||||
* All registered listeners.
|
||||
*/
|
||||
private static final List<EventListener> LISTENERS = Collections.synchronizedList(new LinkedList<>());
|
||||
|
||||
public EventManager() {
|
||||
Aetheria.INSTANCE.getServer().getPluginManager().registerEvents(this, Aetheria.INSTANCE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers a new listener.
|
||||
*
|
||||
* @param listener the listener to register
|
||||
*/
|
||||
public static void registerListener(EventListener listener) {
|
||||
LISTENERS.add(listener);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPluginDisable(PluginDisableEvent event) {
|
||||
if (event.getPlugin() != Aetheria.INSTANCE) {
|
||||
return;
|
||||
}
|
||||
for (EventListener listener : LISTENERS) {
|
||||
listener.onAetheriaDisable();
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerJoin(PlayerJoinEvent event) {
|
||||
Player player = event.getPlayer();
|
||||
Account account = AccountManager.getAccount(player);
|
||||
|
||||
for (EventListener listener : LISTENERS) {
|
||||
listener.onPlayerJoin(account, event);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerLogin(PlayerLoginEvent event) {
|
||||
Player player = event.getPlayer();
|
||||
Account account = AccountManager.getAccount(player);
|
||||
|
||||
for (EventListener listener : LISTENERS) {
|
||||
listener.onPlayerLogin(account, event);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerQuit(PlayerQuitEvent event) {
|
||||
Player player = event.getPlayer();
|
||||
Account account = AccountManager.getAccount(player);
|
||||
|
||||
for (EventListener listener : LISTENERS) {
|
||||
listener.onPlayerQuit(account, event);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onAsyncChat(AsyncChatEvent event) {
|
||||
Player player = event.getPlayer();
|
||||
Account account = AccountManager.getAccount(player);
|
||||
|
||||
for (EventListener listener : LISTENERS) {
|
||||
listener.onAsyncChat(account, event);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onServerListPing(ServerListPingEvent event) {
|
||||
for (EventListener listener : LISTENERS) {
|
||||
listener.onServerListPing(event);
|
||||
}
|
||||
}
|
||||
}
|
@ -5,6 +5,7 @@ import cc.fascinated.config.Config;
|
||||
import cc.fascinated.metrics.impl.server.*;
|
||||
import cc.fascinated.metrics.impl.system.CpuUsageMetric;
|
||||
import cc.fascinated.metrics.impl.world.WorldSizeMetric;
|
||||
import cc.fascinated.utils.Manager;
|
||||
import com.influxdb.client.InfluxDBClient;
|
||||
import com.influxdb.client.InfluxDBClientFactory;
|
||||
import com.influxdb.client.InfluxDBClientOptions;
|
||||
@ -15,16 +16,13 @@ import com.influxdb.client.write.Point;
|
||||
import com.influxdb.client.write.WriteParameters;
|
||||
import lombok.extern.log4j.Log4j2;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.server.PluginDisableEvent;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
|
||||
@Log4j2
|
||||
public class MetricManager implements Listener {
|
||||
public class MetricManager extends Manager {
|
||||
|
||||
private InfluxDBClient influxDB;
|
||||
private WriteApiBlocking writeApi;
|
||||
@ -112,11 +110,8 @@ public class MetricManager implements Listener {
|
||||
metrics.add(metric);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPluginDisable(PluginDisableEvent event) {
|
||||
if (event.getPlugin() != Aetheria.INSTANCE) {
|
||||
return;
|
||||
}
|
||||
@Override
|
||||
public void onAetheriaDisable() {
|
||||
influxDB.close(); // close the connection
|
||||
}
|
||||
}
|
||||
|
@ -1,21 +1,19 @@
|
||||
package cc.fascinated.misc;
|
||||
|
||||
import cc.fascinated.account.Account;
|
||||
import cc.fascinated.config.Config;
|
||||
import cc.fascinated.utils.Manager;
|
||||
import cc.fascinated.utils.Style;
|
||||
import com.viaversion.viaversion.api.Via;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.player.PlayerJoinEvent;
|
||||
|
||||
public class PlayerVersionWarning extends Manager {
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerJoin(PlayerJoinEvent event) {
|
||||
Player player = event.getPlayer();
|
||||
int version = Via.getAPI().getPlayerVersion(player.getUniqueId());
|
||||
@Override
|
||||
public void onPlayerJoin(Account account, PlayerJoinEvent event) {
|
||||
int version = Via.getAPI().getPlayerVersion(account.getUuid());
|
||||
if (version < Config.VERSION_WARNING_VERSION.getAsInt()) {
|
||||
player.sendMessage(Style.getMiniMessage().deserialize(Config.VERSION_WARNING_MESSAGE.getAsString()));
|
||||
account.sendMessage(Style.getMiniMessage().deserialize(Config.VERSION_WARNING_MESSAGE.getAsString()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -3,7 +3,6 @@ package cc.fascinated.motd;
|
||||
import cc.fascinated.config.Config;
|
||||
import cc.fascinated.utils.Manager;
|
||||
import net.kyori.adventure.text.minimessage.MiniMessage;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.server.ServerListPingEvent;
|
||||
|
||||
import java.util.List;
|
||||
@ -18,8 +17,8 @@ public class MotdManager extends Manager {
|
||||
motds = Config.MOTD_LIST.getAsStringList();
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onServerPing(ServerListPingEvent event) {
|
||||
@Override
|
||||
public void onServerListPing(ServerListPingEvent event) {
|
||||
MiniMessage miniMessage = MiniMessage.miniMessage();
|
||||
String motd = motds.get((int) (Math.random() * motds.size()));
|
||||
|
||||
|
@ -1,15 +1,12 @@
|
||||
package cc.fascinated.playercolor;
|
||||
|
||||
import cc.fascinated.account.Account;
|
||||
import cc.fascinated.account.AccountManager;
|
||||
import cc.fascinated.playercolor.command.PlayerColorCommand;
|
||||
import cc.fascinated.utils.Manager;
|
||||
import lombok.Getter;
|
||||
import net.kyori.adventure.text.format.NamedTextColor;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.player.PlayerLoginEvent;
|
||||
import org.bukkit.event.player.PlayerJoinEvent;
|
||||
import org.bukkit.event.player.PlayerQuitEvent;
|
||||
import org.bukkit.scoreboard.Scoreboard;
|
||||
import org.bukkit.scoreboard.Team;
|
||||
@ -80,23 +77,19 @@ public class PlayerColorManager extends Manager {
|
||||
return team;
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onLogin(PlayerLoginEvent event) {
|
||||
Player player = event.getPlayer();
|
||||
Account account = AccountManager.getAccount(player);
|
||||
@Override
|
||||
public void onPlayerJoin(Account account, PlayerJoinEvent event) {
|
||||
PlayerColor playerColor = account.getPlayerColorProfile();
|
||||
|
||||
Team team = PlayerColorManager.getScoreboardTeam(playerColor.getColor());
|
||||
team.addEntry(player.getName());
|
||||
team.addEntry(account.getName());
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onQuit(PlayerQuitEvent event) {
|
||||
Player player = event.getPlayer();
|
||||
Account account = AccountManager.getAccount(player);
|
||||
@Override
|
||||
public void onPlayerQuit(Account account, PlayerQuitEvent event) {
|
||||
PlayerColor playerColor = account.getPlayerColorProfile();
|
||||
|
||||
Team team = PlayerColorManager.getScoreboardTeam(playerColor.getColor());
|
||||
team.removeEntry(player.getName());
|
||||
team.removeEntry(account.getName());
|
||||
}
|
||||
}
|
||||
|
@ -1,14 +1,14 @@
|
||||
package cc.fascinated.utils;
|
||||
|
||||
import cc.fascinated.Aetheria;
|
||||
import cc.fascinated.command.Command;
|
||||
import cc.fascinated.command.CommandManager;
|
||||
import org.bukkit.event.Listener;
|
||||
import cc.fascinated.event.EventListener;
|
||||
import cc.fascinated.event.EventManager;
|
||||
|
||||
public class Manager implements Listener {
|
||||
public class Manager implements EventListener {
|
||||
|
||||
public Manager() {
|
||||
Aetheria.INSTANCE.getServer().getPluginManager().registerEvents(this, Aetheria.INSTANCE);
|
||||
EventManager.registerListener(this);
|
||||
}
|
||||
|
||||
/**
|
||||
|
29
src/main/java/cc/fascinated/utils/Priority.java
Normal file
29
src/main/java/cc/fascinated/utils/Priority.java
Normal file
@ -0,0 +1,29 @@
|
||||
package cc.fascinated.utils;
|
||||
|
||||
public enum Priority {
|
||||
|
||||
/**
|
||||
* The lowest priority, this will be called first.
|
||||
*/
|
||||
LOWEST,
|
||||
|
||||
/**
|
||||
* The low priority, this will be called second.
|
||||
*/
|
||||
LOW,
|
||||
|
||||
/**
|
||||
* The normal priority, this has no effect.
|
||||
*/
|
||||
NORMAL,
|
||||
|
||||
/**
|
||||
* The high priority, this will be called second to last.
|
||||
*/
|
||||
HIGH,
|
||||
|
||||
/**
|
||||
* The highest priority, this will be called last.
|
||||
*/
|
||||
HIGHEST
|
||||
}
|
Reference in New Issue
Block a user