From c526ba2a0711ed56a51cebc5a529637960ace568 Mon Sep 17 00:00:00 2001 From: daoge_cmd <3523206925@qq.com> Date: Tue, 7 Jan 2025 01:59:07 +0800 Subject: [PATCH] feat: introduce `Extension#afterServerStarted` method which will be called after the server is started --- CHANGELOG.md | 1 + .../src/main/java/org/allaymc/server/Allay.java | 2 +- .../main/java/org/allaymc/server/AllayServer.java | 3 ++- .../org/allaymc/server/extension/Extension.java | 4 ++++ .../server/extension/ExtensionManager.java | 15 ++++++++++----- .../java/org/allaymc/server/gui/Dashboard.java | 2 +- 6 files changed, 19 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2f10b0957..92457c14b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -36,6 +36,7 @@ Unless otherwise specified, any version comparison below is the comparison of se - Introduced [sentry](https://www.sentry.io) to capture exception and upload them to sentry server automatically, which helps us to track and fix bug more efficiently. Sentry is only enabled in non-dev version. - Server version will also be uploaded to bStats now. +- Introduced `Extension#afterServerStarted` method which will be called after the server is started. ### Changed diff --git a/server/src/main/java/org/allaymc/server/Allay.java b/server/src/main/java/org/allaymc/server/Allay.java index 03c2e368e..a200978d7 100644 --- a/server/src/main/java/org/allaymc/server/Allay.java +++ b/server/src/main/java/org/allaymc/server/Allay.java @@ -60,7 +60,7 @@ public final class Allay { public static final DynamicURLClassLoader EXTRA_RESOURCE_CLASS_LOADER = new DynamicURLClassLoader(Allay.class.getClassLoader()); - private static final ExtensionManager EXTENSION_MANAGER = new ExtensionManager(Path.of("extensions")); + public static final ExtensionManager EXTENSION_MANAGER = new ExtensionManager(Path.of("extensions")); public static Dashboard DASHBOARD; diff --git a/server/src/main/java/org/allaymc/server/AllayServer.java b/server/src/main/java/org/allaymc/server/AllayServer.java index 45244ab27..b8d60393c 100644 --- a/server/src/main/java/org/allaymc/server/AllayServer.java +++ b/server/src/main/java/org/allaymc/server/AllayServer.java @@ -218,8 +218,9 @@ public void start(long initialTime) { Metrics.AllayMetrics.startMetrics(); if (SETTINGS.genericSettings().enableGui()) { - Allay.DASHBOARD.serverStarted(); + Allay.DASHBOARD.afterServerStarted(); } + Allay.EXTENSION_MANAGER.afterServerStarted(); this.gameLoop.startLoop(); } diff --git a/server/src/main/java/org/allaymc/server/extension/Extension.java b/server/src/main/java/org/allaymc/server/extension/Extension.java index 92bfe7c10..1b60936d7 100644 --- a/server/src/main/java/org/allaymc/server/extension/Extension.java +++ b/server/src/main/java/org/allaymc/server/extension/Extension.java @@ -5,4 +5,8 @@ */ public abstract class Extension { public abstract void main(String[] args); + + public void afterServerStarted() { + // noop + } } diff --git a/server/src/main/java/org/allaymc/server/extension/ExtensionManager.java b/server/src/main/java/org/allaymc/server/extension/ExtensionManager.java index f4e4cc2f3..c5a036491 100644 --- a/server/src/main/java/org/allaymc/server/extension/ExtensionManager.java +++ b/server/src/main/java/org/allaymc/server/extension/ExtensionManager.java @@ -24,6 +24,7 @@ public final class ExtensionManager { private static final PathMatcher PATH_MATCHER = FileSystems.getDefault().getPathMatcher("glob:**.jar"); private final Path source; + private final List extensionInstances = new ArrayList<>(); public ExtensionManager(Path source) { this.source = source; @@ -35,16 +36,19 @@ public void loadExtensions(String[] args) { Files.createDirectory(source); } - List entrances = new ArrayList<>(); try (var stream = Files.walk(source)) { stream.filter(path -> PATH_MATCHER.matches(path) && Files.isRegularFile(path)) - .forEach(extensionPath -> loadExtension(extensionPath, args, entrances)); + .forEach(extensionPath -> loadExtension(extensionPath, args)); } - entrances.forEach(Runnable::run); + this.extensionInstances.forEach(extension -> extension.main(args)); } - private void loadExtension(Path extensionPath, String[] args, List entrances) { + public void afterServerStarted() { + this.extensionInstances.forEach(Extension::afterServerStarted); + } + + private void loadExtension(Path extensionPath, String[] args) { log.info(I18n.get().tr(TrKeys.A_EXTENSION_LOADING, extensionPath)); Allay.EXTRA_RESOURCE_CLASS_LOADER.addJar(extensionPath); @@ -62,11 +66,12 @@ private void loadExtension(Path extensionPath, String[] args, List ent Extension extensionInstance; try { extensionInstance = (Extension) mainClass.getConstructor().newInstance(); + extensionInstance.main(args); } catch (Exception e) { throw new ExtensionException(I18n.get().tr(TrKeys.A_EXTENSION_CONSTRUCT_INSTANCE_ERROR, extensionPath, e)); } - entrances.add(() -> extensionInstance.main(args)); + extensionInstances.add(extensionInstance); } @SneakyThrows diff --git a/server/src/main/java/org/allaymc/server/gui/Dashboard.java b/server/src/main/java/org/allaymc/server/gui/Dashboard.java index 190f3a370..465fd9e46 100644 --- a/server/src/main/java/org/allaymc/server/gui/Dashboard.java +++ b/server/src/main/java/org/allaymc/server/gui/Dashboard.java @@ -248,7 +248,7 @@ public void write(byte @NonNull [] b) throws IOException { }; } - public void serverStarted() { + public void afterServerStarted() { Runnable guiUpdateTask = () -> { // Update ram graph final long freeMemory = Runtime.getRuntime().freeMemory();