From ba8423aeddf7ca75970c0a3ceee695f05b961c91 Mon Sep 17 00:00:00 2001 From: Liam Date: Mon, 1 Apr 2024 12:34:28 +0100 Subject: [PATCH] use a better event system --- src/main/java/cc/fascinated/Aetheria.java | 2 + .../java/cc/fascinated/account/Account.java | 36 ++----- .../cc/fascinated/account/AccountManager.java | 67 +++++++++---- .../java/cc/fascinated/chat/ChatManager.java | 15 +-- .../cc/fascinated/event/EventListener.java | 23 +++++ .../cc/fascinated/event/EventManager.java | 96 +++++++++++++++++++ .../cc/fascinated/metrics/MetricManager.java | 13 +-- .../fascinated/misc/PlayerVersionWarning.java | 12 +-- .../java/cc/fascinated/motd/MotdManager.java | 5 +- .../playercolor/PlayerColorManager.java | 21 ++-- .../java/cc/fascinated/utils/Manager.java | 8 +- .../java/cc/fascinated/utils/Priority.java | 29 ++++++ 12 files changed, 232 insertions(+), 95 deletions(-) create mode 100644 src/main/java/cc/fascinated/event/EventListener.java create mode 100644 src/main/java/cc/fascinated/event/EventManager.java create mode 100644 src/main/java/cc/fascinated/utils/Priority.java diff --git a/src/main/java/cc/fascinated/Aetheria.java b/src/main/java/cc/fascinated/Aetheria.java index 22a92c3..0b6065b 100644 --- a/src/main/java/cc/fascinated/Aetheria.java +++ b/src/main/java/cc/fascinated/Aetheria.java @@ -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(); diff --git a/src/main/java/cc/fascinated/account/Account.java b/src/main/java/cc/fascinated/account/Account.java index 0c0082b..e8c6f71 100644 --- a/src/main/java/cc/fascinated/account/Account.java +++ b/src/main/java/cc/fascinated/account/Account.java @@ -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); diff --git a/src/main/java/cc/fascinated/account/AccountManager.java b/src/main/java/cc/fascinated/account/AccountManager.java index 19f8629..f090178 100644 --- a/src/main/java/cc/fascinated/account/AccountManager.java +++ b/src/main/java/cc/fascinated/account/AccountManager.java @@ -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()); + ACCOUNTS.remove(account.getUuid()); } - @EventHandler - public void onPluginDisable(PluginDisableEvent event) { - if (event.getPlugin() != Aetheria.INSTANCE) { - return; - } - + @Override + public void onAetheriaDisable() { this.saveAccounts(); // Save the accounts to disk ACCOUNTS.clear(); // Remove the accounts from the cache } diff --git a/src/main/java/cc/fascinated/chat/ChatManager.java b/src/main/java/cc/fascinated/chat/ChatManager.java index 8c5a5b9..5295f7e 100644 --- a/src/main/java/cc/fascinated/chat/ChatManager.java +++ b/src/main/java/cc/fascinated/chat/ChatManager.java @@ -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}(? { MiniMessage miniMessage = Style.getMiniMessage(); return miniMessage.deserialize(Lang.CHAT_FORMAT.getAsString() - .replace("%chatcolor%", color.toString()) - .replace("%name%", account.getName()) - .replace("%message%", miniMessage.stripTags(messageContent)) + .replace("%chatcolor%", color.toString()) + .replace("%name%", account.getName()) + .replace("%message%", miniMessage.stripTags(messageContent)) ); }); lastMessage.put(account, messageContent); diff --git a/src/main/java/cc/fascinated/event/EventListener.java b/src/main/java/cc/fascinated/event/EventListener.java new file mode 100644 index 0000000..1e44db6 --- /dev/null +++ b/src/main/java/cc/fascinated/event/EventListener.java @@ -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) {} +} diff --git a/src/main/java/cc/fascinated/event/EventManager.java b/src/main/java/cc/fascinated/event/EventManager.java new file mode 100644 index 0000000..e51d3e9 --- /dev/null +++ b/src/main/java/cc/fascinated/event/EventManager.java @@ -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 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); + } + } +} diff --git a/src/main/java/cc/fascinated/metrics/MetricManager.java b/src/main/java/cc/fascinated/metrics/MetricManager.java index c3d3030..6a226b4 100644 --- a/src/main/java/cc/fascinated/metrics/MetricManager.java +++ b/src/main/java/cc/fascinated/metrics/MetricManager.java @@ -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 } } diff --git a/src/main/java/cc/fascinated/misc/PlayerVersionWarning.java b/src/main/java/cc/fascinated/misc/PlayerVersionWarning.java index 7b508ac..883cd24 100644 --- a/src/main/java/cc/fascinated/misc/PlayerVersionWarning.java +++ b/src/main/java/cc/fascinated/misc/PlayerVersionWarning.java @@ -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())); } } } diff --git a/src/main/java/cc/fascinated/motd/MotdManager.java b/src/main/java/cc/fascinated/motd/MotdManager.java index d3dbf87..14362fe 100644 --- a/src/main/java/cc/fascinated/motd/MotdManager.java +++ b/src/main/java/cc/fascinated/motd/MotdManager.java @@ -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())); diff --git a/src/main/java/cc/fascinated/playercolor/PlayerColorManager.java b/src/main/java/cc/fascinated/playercolor/PlayerColorManager.java index 8e2f682..9102577 100644 --- a/src/main/java/cc/fascinated/playercolor/PlayerColorManager.java +++ b/src/main/java/cc/fascinated/playercolor/PlayerColorManager.java @@ -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()); } } diff --git a/src/main/java/cc/fascinated/utils/Manager.java b/src/main/java/cc/fascinated/utils/Manager.java index 3c49592..7df6342 100644 --- a/src/main/java/cc/fascinated/utils/Manager.java +++ b/src/main/java/cc/fascinated/utils/Manager.java @@ -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); } /** diff --git a/src/main/java/cc/fascinated/utils/Priority.java b/src/main/java/cc/fascinated/utils/Priority.java new file mode 100644 index 0000000..18a0292 --- /dev/null +++ b/src/main/java/cc/fascinated/utils/Priority.java @@ -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 +}