diff --git a/build.gradle.kts b/build.gradle.kts index 4191cbd..7a22b31 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -32,6 +32,9 @@ subprojects { compileOnly("org.slf4j:slf4j-api:2.0.17") compileOnly("org.graalvm.js:js:22.0.0.2") + // plugins + implementation("org.pf4j:pf4j:3.6.0") + // storage compileOnly("dev.neovoxel.nsapi:NeoStorageAPI:1.1.0") compileOnly("com.zaxxer:HikariCP:4.0.3") diff --git a/bukkit/src/main/java/dev/neovoxel/neobot/NeoBotBukkit.java b/bukkit/src/main/java/dev/neovoxel/neobot/NeoBotBukkit.java index 2c891de..b0e7914 100644 --- a/bukkit/src/main/java/dev/neovoxel/neobot/NeoBotBukkit.java +++ b/bukkit/src/main/java/dev/neovoxel/neobot/NeoBotBukkit.java @@ -11,6 +11,8 @@ import dev.neovoxel.neobot.config.ScriptConfig; import dev.neovoxel.neobot.event.BukkitEventManager; import dev.neovoxel.neobot.game.GameEventListener; +import dev.neovoxel.neobot.misc.EventListener; +import dev.neovoxel.neobot.extension.BukkitExtensionsManager; import dev.neovoxel.neobot.scheduler.ScheduledTask; import dev.neovoxel.neobot.script.ScriptProvider; import dev.neovoxel.neobot.script.ScriptScheduler; @@ -24,6 +26,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.Map; @Getter public class NeoBotBukkit extends JavaPlugin implements NeoBot { @@ -35,6 +38,10 @@ public class NeoBotBukkit extends JavaPlugin implements NeoBot { @Setter private ScriptProvider scriptProvider; + @Getter + @Setter + private BukkitExtensionsManager extensionsManager; + @Getter(onMethod_ = {@HostAccess.Export}) @Setter private StorageProvider storageProvider; @@ -68,12 +75,32 @@ public NeoLogger getNeoLogger() { return new BukkitLogger(getLogger()); } + public void initExtensionsManager() { + extensionsManager = new BukkitExtensionsManager(); + } + @Override public void setGameEventListener(GameEventListener listener) { Bukkit.getPluginManager().registerEvents(new BukkitEventManager(this), this); this.gameEventListener = listener; } + @Override + public Map getListenerMap(){ + return extensionsManager.getListenerMap(); + } + + @Override + public void loadExtensions(NeoBot plugin) { + extensionsManager.loadExtensions(plugin); + } + + @Override + public void unloadExtensions() { + extensionsManager.unloadExtensions(); + } + + @Override public ScheduledTask submit(Runnable task) { return new BukkitScheduledTask(Bukkit.getScheduler().runTask(this, task)); diff --git a/bukkit/src/main/java/dev/neovoxel/neobot/extension/BukkitExtensionsManager.java b/bukkit/src/main/java/dev/neovoxel/neobot/extension/BukkitExtensionsManager.java new file mode 100644 index 0000000..6980b1d --- /dev/null +++ b/bukkit/src/main/java/dev/neovoxel/neobot/extension/BukkitExtensionsManager.java @@ -0,0 +1,10 @@ +package dev.neovoxel.neobot.extension; + +import dev.neovoxel.neobot.NeoBot; + +public class BukkitExtensionsManager extends ExtensionsManager { + @Override + public void loadExtensions(NeoBot plugin) { + super.loadExtensions(plugin); + } +} diff --git a/common/src/main/java/dev/neovoxel/neobot/NeoBot.java b/common/src/main/java/dev/neovoxel/neobot/NeoBot.java index e69ef8b..9e44774 100644 --- a/common/src/main/java/dev/neovoxel/neobot/NeoBot.java +++ b/common/src/main/java/dev/neovoxel/neobot/NeoBot.java @@ -9,6 +9,7 @@ import dev.neovoxel.neobot.game.GameEventListener; import dev.neovoxel.neobot.game.GameProvider; import dev.neovoxel.neobot.library.LibraryProvider; +import dev.neovoxel.neobot.extension.ExtensionsProvider; import dev.neovoxel.neobot.scheduler.SchedulerProvider; import dev.neovoxel.neobot.script.ScriptProvider; import dev.neovoxel.neobot.script.ScriptScheduler; @@ -17,7 +18,7 @@ import java.io.File; -public interface NeoBot extends ConfigProvider, GameProvider, LibraryProvider, SchedulerProvider { +public interface NeoBot extends ExtensionsProvider, ConfigProvider, GameProvider, LibraryProvider, SchedulerProvider { default void enable() { try { getNeoLogger().info("Loading libraries..."); @@ -35,6 +36,9 @@ default void enable() { BotProvider botProvider = new BotProvider(this); setBotProvider(botProvider); getBotProvider().loadBot(this); + getNeoLogger().info("Loading extensions..."); + this.initExtensionsManager(); + loadExtensions(this); getNeoLogger().info("Loading script system..."); submitAsync(() -> { try { @@ -61,6 +65,8 @@ default void disable() { getScriptProvider().unloadScript(); getBotProvider().getBotListener().reset(); getGameEventListener().reset(); + getNeoLogger().info("Unloading all extensions..."); + unloadExtensions(); getNeoLogger().info("Cancelling all the tasks..."); cancelAllTasks(); getScriptScheduler().clear(); @@ -85,6 +91,12 @@ default void reload(CommandSender sender) { getGameEventListener().reset(); getNeoLogger().info("Reloading scripts..."); getScriptProvider().unloadScript(); + + getNeoLogger().info("Reloading extensions..."); + unloadExtensions(); + this.initExtensionsManager(); + loadExtensions(this); + getScriptProvider().loadScript(this); getGameEventListener().onPluginReloaded(); } catch (Throwable e) { @@ -101,6 +113,8 @@ default void reload(CommandSender sender) { File getDataFolder(); + void initExtensionsManager(); + void setGameEventListener(GameEventListener listener); GameEventListener getGameEventListener(); diff --git a/common/src/main/java/dev/neovoxel/neobot/bot/BotListener.java b/common/src/main/java/dev/neovoxel/neobot/bot/BotListener.java index 644fef9..af03f29 100644 --- a/common/src/main/java/dev/neovoxel/neobot/bot/BotListener.java +++ b/common/src/main/java/dev/neovoxel/neobot/bot/BotListener.java @@ -13,6 +13,7 @@ import dev.neovoxel.nbapi.listener.NBotEventHandler; import dev.neovoxel.nbapi.listener.NBotListener; import dev.neovoxel.neobot.NeoBot; +import dev.neovoxel.neobot.misc.EventListener; import org.graalvm.polyglot.HostAccess; import org.graalvm.polyglot.Value; import org.json.JSONArray; @@ -22,39 +23,24 @@ import java.util.List; import java.util.Map; -public class BotListener implements NBotListener { - private final NeoBot plugin; - - private final Map map = new LinkedHashMap<>(); +public class BotListener extends EventListener implements NBotListener { public BotListener(NeoBot plugin) { - this.plugin = plugin; + super(plugin); } @HostAccess.Export public void sendGroupMessage(long groupId, String message) { - plugin.getBotProvider().getBot().forEach(client -> { + getPlugin().getBotProvider().getBot().forEach(client -> { if (client.isConnected()) { client.action(new SendGroupMessage(groupId, new JSONArray(message))); } }); } - public void clearUuidContext(String uuid) { - List toRemove = new ArrayList<>(); - for (Map.Entry entry : map.entrySet()) { - if (entry.getKey().getContext().getBindings("js").getMember("__uuid__").asString().equals(uuid)) { - toRemove.add(entry.getKey()); - } - } - for (Value value : toRemove) { - map.remove(value); - } - } - @HostAccess.Export public void sendPrivateMessage(long userId, String message) { - plugin.getBotProvider().getBot().forEach(client -> { + getPlugin().getBotProvider().getBot().forEach(client -> { if (client.isConnected()) { client.action(new SendPrivateMessage(userId, new JSONArray(message))); } @@ -63,7 +49,7 @@ public void sendPrivateMessage(long userId, String message) { @HostAccess.Export public void renameGroupMember(long groupId, long userId, String name) { - plugin.getBotProvider().getBot().forEach(client -> { + getPlugin().getBotProvider().getBot().forEach(client -> { if (client.isConnected()) { client.action(new SetGroupCard(groupId, userId, name)); } @@ -72,7 +58,7 @@ public void renameGroupMember(long groupId, long userId, String name) { @HostAccess.Export public void muteGroupMember(long groupId, long userId, int duration) { - plugin.getBotProvider().getBot().forEach(client -> { + getPlugin().getBotProvider().getBot().forEach(client -> { if (client.isConnected()) { client.action(new SetGroupBan(groupId, userId, duration)); } @@ -81,7 +67,7 @@ public void muteGroupMember(long groupId, long userId, int duration) { @HostAccess.Export public void muteAllGroupMember(long groupId) { - plugin.getBotProvider().getBot().forEach(client -> { + getPlugin().getBotProvider().getBot().forEach(client -> { if (client.isConnected()) { client.action(new SetGroupWholeBan(groupId, true)); } @@ -90,7 +76,7 @@ public void muteAllGroupMember(long groupId) { @HostAccess.Export public void unMuteAllGroupMember(long groupId) { - plugin.getBotProvider().getBot().forEach(client -> { + getPlugin().getBotProvider().getBot().forEach(client -> { if (client.isConnected()) { client.action(new SetGroupWholeBan(groupId, false)); } @@ -99,7 +85,7 @@ public void unMuteAllGroupMember(long groupId) { @HostAccess.Export public void kickGroupMember(long groupId, long userId) { - plugin.getBotProvider().getBot().forEach(client -> { + getPlugin().getBotProvider().getBot().forEach(client -> { if (client.isConnected()) { client.action(new SetGroupKick(groupId, userId)); } @@ -108,7 +94,7 @@ public void kickGroupMember(long groupId, long userId) { @HostAccess.Export public void approveGroupRequest(String flag, String type) { - plugin.getBotProvider().getBot().forEach(client -> { + getPlugin().getBotProvider().getBot().forEach(client -> { if (client.isConnected()) { client.action(new SetGroupAddRequest(flag, GroupRequestType.from(type))); } @@ -117,7 +103,7 @@ public void approveGroupRequest(String flag, String type) { @HostAccess.Export public void rejectGroupRequest(String flag, String type) { - plugin.getBotProvider().getBot().forEach(client -> { + getPlugin().getBotProvider().getBot().forEach(client -> { if (client.isConnected()) { client.action(new SetGroupAddRequest(flag, GroupRequestType.from(type), false)); } @@ -126,7 +112,7 @@ public void rejectGroupRequest(String flag, String type) { @HostAccess.Export public void approveFriendRequest(String flag) { - plugin.getBotProvider().getBot().forEach(client -> { + getPlugin().getBotProvider().getBot().forEach(client -> { if (client.isConnected()) { client.action(new SetFriendAddRequest(flag)); } @@ -135,7 +121,7 @@ public void approveFriendRequest(String flag) { @HostAccess.Export public void rejectFriendRequest(String flag) { - plugin.getBotProvider().getBot().forEach(client -> { + getPlugin().getBotProvider().getBot().forEach(client -> { if (client.isConnected()) { client.action(new SetFriendAddRequest(flag, false)); } @@ -144,7 +130,7 @@ public void rejectFriendRequest(String flag) { @HostAccess.Export public void setGroupSpecialTitle(long groupId, long userId, String title, long duration) { - plugin.getBotProvider().getBot().forEach(client -> { + getPlugin().getBotProvider().getBot().forEach(client -> { if (client.isConnected()) { client.action(new SetGroupSpecialTitle(groupId, userId, title, duration)); } @@ -153,7 +139,7 @@ public void setGroupSpecialTitle(long groupId, long userId, String title, long d @HostAccess.Export public void setGroupWholeBan(long groupId, boolean enable) { - plugin.getBotProvider().getBot().forEach(client -> { + getPlugin().getBotProvider().getBot().forEach(client -> { if (client.isConnected()) { client.action(new SetGroupWholeBan(groupId, enable)); } @@ -162,7 +148,7 @@ public void setGroupWholeBan(long groupId, boolean enable) { @HostAccess.Export public void recallMessage(long messageId) { - plugin.getBotProvider().getBot().forEach(client -> { + getPlugin().getBotProvider().getBot().forEach(client -> { if (client.isConnected()) { client.action(new DeleteMessage(messageId)); } @@ -172,7 +158,7 @@ public void recallMessage(long messageId) { @HostAccess.Export public void getGroupMemberInfo(long groupId, long userId, Value method) { if (method.canExecute()) { - plugin.getBotProvider().getBot().forEach(client -> { + getPlugin().getBotProvider().getBot().forEach(client -> { if (client.isConnected()) { client.action(new GetGroupMemberInfo(groupId, userId), method::execute); } else { @@ -185,7 +171,7 @@ public void getGroupMemberInfo(long groupId, long userId, Value method) { @HostAccess.Export public void getGroupMemberList(long groupId, Value method) { if (method.canExecute()) { - plugin.getBotProvider().getBot().forEach(client -> { + getPlugin().getBotProvider().getBot().forEach(client -> { if (client.isConnected()) { client.action(new GetGroupMemberList(groupId), method::execute); } else method.execute(new ArrayList<>()); @@ -196,7 +182,7 @@ public void getGroupMemberList(long groupId, Value method) { @HostAccess.Export public void getFriendList(Value method) { if (method.canExecute()) { - plugin.getBotProvider().getBot().forEach(client -> { + getPlugin().getBotProvider().getBot().forEach(client -> { if (client.isConnected()) { client.action(new GetFriendList(), method::execute); } else method.execute(new ArrayList<>()); @@ -207,7 +193,7 @@ public void getFriendList(Value method) { @HostAccess.Export public void getGroupList(Value method) { if (method.canExecute()) { - plugin.getBotProvider().getBot().forEach(client -> { + getPlugin().getBotProvider().getBot().forEach(client -> { if (client.isConnected()) { client.action(new GetGroupList(), method::execute); } else method.execute(new ArrayList<>()); @@ -218,30 +204,13 @@ public void getGroupList(Value method) { @HostAccess.Export public void getGroupInfo(long groupId, Value method) { if (method.canExecute()) { - plugin.getBotProvider().getBot().forEach(client -> { + getPlugin().getBotProvider().getBot().forEach(client -> { if (client.isConnected()) { client.action(new GetGroupInfo(groupId), method::execute); } else method.execute(new ArrayList<>()); }); } } - - @HostAccess.Export - public void register(String eventName, Value method) { - if (method.canExecute()) map.put(method, eventName); - } - - public void reset() { - map.clear(); - } - - private void fireEvent(String eventName, NEvent event) { - for (Map.Entry entry : map.entrySet()) { - if (entry.getValue().equals(eventName)) { - entry.getKey().execute(event); - } - } - } @NBotEventHandler private void onGroupMessage(GroupMessageEvent event) { diff --git a/common/src/main/java/dev/neovoxel/neobot/extension/ExtensionsManager.java b/common/src/main/java/dev/neovoxel/neobot/extension/ExtensionsManager.java new file mode 100644 index 0000000..d9e04a3 --- /dev/null +++ b/common/src/main/java/dev/neovoxel/neobot/extension/ExtensionsManager.java @@ -0,0 +1,69 @@ +package dev.neovoxel.neobot.extension; + +import dev.neovoxel.neobot.NeoBot; +import dev.neovoxel.neobot.misc.EventListener; +import lombok.Getter; +import org.pf4j.DefaultPluginManager; +import org.pf4j.PluginManager; + + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +public class ExtensionsManager { + PluginManager pluginManager; + @Getter + Map listenerMap = new HashMap<>(); + public void loadExtensions(NeoBot plugin){ + // 初始化插件管理器 + Path path = Paths.get(plugin.getDataFolder().getAbsolutePath(),"extensions"); + try { + if (!Files.exists(path)) { + Files.createDirectory(path); + } + }catch(IOException e){ + plugin.getNeoLogger().error("创建目录失败: " + e.getMessage()); + } + pluginManager = new DefaultPluginManager(path); + pluginManager.loadPlugins(); + + // 启动插件 + pluginManager.startPlugins(); + + // 获取所有实现了 ListenerProvider 的扩展 + List extensions = pluginManager.getExtensions(ListenerProvider.class); + for (ListenerProvider ext : extensions) { + org.pf4j.PluginWrapper wrapper = pluginManager.whichPlugin(ext.getClass()); + if (wrapper == null){ + continue; + } + org.pf4j.PluginDescriptor descriptor = wrapper.getDescriptor(); + String pluginId = descriptor.getPluginId(); + String version = descriptor.getVersion(); + String provider = descriptor.getProvider(); + if(!Objects.equals(ext.getRequiredPlatform(), "Common") && !Objects.equals(ext.getRequiredPlatform(), plugin.getPlatform())){ + plugin.getNeoLogger().warn(String.format("扩展[%s]要求在[%s]上加载! 当前环境[%s]已自动跳过.", + pluginId, ext.getRequiredPlatform(), plugin.getPlatform())); + continue; + } + plugin.getNeoLogger().info(String.format("加载扩展: %s | 版本: %s | 作者:%s ", + pluginId, version, provider)); + + listenerMap.put(pluginId,ext.getListener(plugin)); + } + } + + public void unloadExtensions(){ + for(Map.Entry entry : listenerMap.entrySet()){ + entry.getValue().reset(); + } + pluginManager.stopPlugins(); + } + +} diff --git a/common/src/main/java/dev/neovoxel/neobot/extension/ExtensionsProvider.java b/common/src/main/java/dev/neovoxel/neobot/extension/ExtensionsProvider.java new file mode 100644 index 0000000..331301b --- /dev/null +++ b/common/src/main/java/dev/neovoxel/neobot/extension/ExtensionsProvider.java @@ -0,0 +1,12 @@ +package dev.neovoxel.neobot.extension; + +import dev.neovoxel.neobot.NeoBot; +import dev.neovoxel.neobot.misc.EventListener; + +import java.util.Map; + +public interface ExtensionsProvider { + Map getListenerMap(); + void loadExtensions(NeoBot plugin); + void unloadExtensions(); +} diff --git a/common/src/main/java/dev/neovoxel/neobot/extension/ListenerProvider.java b/common/src/main/java/dev/neovoxel/neobot/extension/ListenerProvider.java new file mode 100644 index 0000000..43017c4 --- /dev/null +++ b/common/src/main/java/dev/neovoxel/neobot/extension/ListenerProvider.java @@ -0,0 +1,12 @@ +package dev.neovoxel.neobot.extension; + +import dev.neovoxel.neobot.NeoBot; +import dev.neovoxel.neobot.misc.EventListener; +import org.pf4j.ExtensionPoint; + +public interface ListenerProvider extends ExtensionPoint { + EventListener getListener(NeoBot plugin); + default String getRequiredPlatform() { + return "Common"; + } +} diff --git a/common/src/main/java/dev/neovoxel/neobot/game/GameEventListener.java b/common/src/main/java/dev/neovoxel/neobot/game/GameEventListener.java index 49982e0..387166b 100644 --- a/common/src/main/java/dev/neovoxel/neobot/game/GameEventListener.java +++ b/common/src/main/java/dev/neovoxel/neobot/game/GameEventListener.java @@ -4,53 +4,13 @@ import dev.neovoxel.neobot.game.event.ChatEvent; import dev.neovoxel.neobot.game.event.DeathEvent; import dev.neovoxel.neobot.game.event.LoginEvent; -import dev.neovoxel.neobot.adapter.Player; import dev.neovoxel.neobot.game.event.PlayerEvent; -import org.graalvm.polyglot.HostAccess; -import org.graalvm.polyglot.Value; - -import java.util.ArrayList; -import java.util.IdentityHashMap; -import java.util.List; -import java.util.Map; - -public class GameEventListener { - - private final NeoBot plugin; - - private final Map map = new IdentityHashMap<>(); +import dev.neovoxel.neobot.adapter.Player; +import dev.neovoxel.neobot.misc.EventListener; +public class GameEventListener extends EventListener { public GameEventListener(NeoBot plugin) { - this.plugin = plugin; - } - - public void reset() { - map.clear(); - } - - @HostAccess.Export - public void register(String eventName, Value method) { - if (method.canExecute()) map.put(method, eventName); - } - - public void clearUuidContext(String uuid) { - List toRemove = new ArrayList<>(); - for (Map.Entry entry : map.entrySet()) { - if (entry.getKey().getContext().getBindings("js").getMember("__uuid__").asString().equals(uuid)) { - toRemove.add(entry.getKey()); - } - } - for (Value value : toRemove) { - map.remove(value); - } - } - - private void fireEvent(String eventName, Object... args) { - for (Map.Entry entry : map.entrySet()) { - if (entry.getValue().equals(eventName)) { - entry.getKey().execute(args); - } - } + super(plugin); } public void onLogin(LoginEvent event) { diff --git a/common/src/main/java/dev/neovoxel/neobot/misc/EventListener.java b/common/src/main/java/dev/neovoxel/neobot/misc/EventListener.java new file mode 100644 index 0000000..ce95ab0 --- /dev/null +++ b/common/src/main/java/dev/neovoxel/neobot/misc/EventListener.java @@ -0,0 +1,50 @@ +package dev.neovoxel.neobot.misc; + +import dev.neovoxel.neobot.NeoBot; +import lombok.Getter; +import org.graalvm.polyglot.HostAccess; +import org.graalvm.polyglot.Value; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +public class EventListener { + @Getter + private final NeoBot plugin; + + private final Map map = new LinkedHashMap<>(); + + public EventListener(NeoBot plugin) { + this.plugin = plugin; + } + @HostAccess.Export + public void register(String eventName, Value method) { + if (method.canExecute()) map.put(method, eventName); + } + + public void reset() { + map.clear(); + } + + protected void fireEvent(String eventName, Object... args) { + for (Map.Entry entry : map.entrySet()) { + if (entry.getValue().equals(eventName)) { + entry.getKey().execute(args); + } + } + } + + public void clearUuidContext(String uuid) { + List toRemove = new ArrayList<>(); + for (Map.Entry entry : map.entrySet()) { + if (entry.getKey().getContext().getBindings("js").getMember("__uuid__").asString().equals(uuid)) { + toRemove.add(entry.getKey()); + } + } + for (Value value : toRemove) { + map.remove(value); + } + } +} diff --git a/common/src/main/java/dev/neovoxel/neobot/script/ScriptProvider.java b/common/src/main/java/dev/neovoxel/neobot/script/ScriptProvider.java index 085a5c1..73465a5 100644 --- a/common/src/main/java/dev/neovoxel/neobot/script/ScriptProvider.java +++ b/common/src/main/java/dev/neovoxel/neobot/script/ScriptProvider.java @@ -2,6 +2,7 @@ import dev.neovoxel.jarflow.JarFlow; import dev.neovoxel.neobot.NeoBot; +import dev.neovoxel.neobot.misc.EventListener; import dev.neovoxel.neobot.util.ValueWithScript; import dev.neovoxel.neobot.util.http.HttpBuilder; import dev.neovoxel.neobot.util.ws.ExternalWSUtil; @@ -247,6 +248,10 @@ public void loadScript(NeoBot plugin, Script script) throws Throwable { context.getBindings("js").putMember("qq", plugin.getBotProvider().getBotListener()); context.getBindings("js").putMember("plugin", plugin); context.getBindings("js").putMember("gameEvent", plugin.getGameEventListener()); + for(Map.Entry entry : plugin.getListenerMap().entrySet()){ + context.getBindings("js").putMember(entry.getKey(), entry.getValue()); +// System.out.println(entry.getKey()); + } context.getBindings("js").putMember("gameCommand", plugin.getCommandProvider()); context.getBindings("js").putMember("messageConfig", plugin.getMessageConfig()); context.getBindings("js").putMember("generalConfig", plugin.getScriptConfig()); diff --git a/velocity/src/main/java/dev/neovoxel/neobot/NeoBotVelocity.java b/velocity/src/main/java/dev/neovoxel/neobot/NeoBotVelocity.java index 0bcd1f4..39f92c5 100644 --- a/velocity/src/main/java/dev/neovoxel/neobot/NeoBotVelocity.java +++ b/velocity/src/main/java/dev/neovoxel/neobot/NeoBotVelocity.java @@ -16,13 +16,14 @@ import dev.neovoxel.neobot.event.VelocityEventManager; import dev.neovoxel.neobot.game.GameEventListener; import dev.neovoxel.neobot.loader.VelocityLibraryLoader; +import dev.neovoxel.neobot.misc.EventListener; +import dev.neovoxel.neobot.extension.VelocityExtensionsManager; import dev.neovoxel.neobot.scheduler.ScheduledTask; import dev.neovoxel.neobot.script.ScriptProvider; import dev.neovoxel.neobot.script.ScriptScheduler; import dev.neovoxel.neobot.storage.StorageProvider; import lombok.Getter; import lombok.Setter; -import net.kyori.adventure.text.Component; import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import org.graalvm.polyglot.HostAccess; import org.slf4j.Logger; @@ -30,6 +31,7 @@ import java.io.File; import java.nio.file.Path; import java.time.Duration; +import java.util.Map; @Plugin(id = "neobot", name = "NeoBot", version = "0.1", authors = {"NeoVoxelDev Team"}, description = "A bot plugin that connects Minecraft with QQ, Kook, Discord, etc.") public class NeoBotVelocity implements NeoBot { @@ -46,6 +48,9 @@ public class NeoBotVelocity implements NeoBot { @Setter private BotProvider botProvider; + @Getter + private VelocityExtensionsManager pluginsManager; + @Getter @Setter private ScriptProvider scriptProvider; @@ -102,6 +107,29 @@ public File getDataFolder() { return dataDirectory.toFile(); } + public void initExtensionsManager() { + pluginsManager = new VelocityExtensionsManager(); + } + + @Override + public Map getListenerMap(){ + return pluginsManager.getListenerMap(); + } + + @Override + public void loadExtensions(NeoBot plugin) { + pluginsManager.loadExtensions(plugin); + } + + @Override + public void unloadExtensions() { + pluginsManager.unloadExtensions(); + } + + void initPluginsProvider(){ + pluginsManager = new VelocityExtensionsManager(); + } + @Override public void setGameEventListener(GameEventListener listener) { proxyServer.getEventManager().register(this, new VelocityEventManager(this)); diff --git a/velocity/src/main/java/dev/neovoxel/neobot/extension/VelocityExtensionsManager.java b/velocity/src/main/java/dev/neovoxel/neobot/extension/VelocityExtensionsManager.java new file mode 100644 index 0000000..78385c7 --- /dev/null +++ b/velocity/src/main/java/dev/neovoxel/neobot/extension/VelocityExtensionsManager.java @@ -0,0 +1,10 @@ +package dev.neovoxel.neobot.extension; + +import dev.neovoxel.neobot.NeoBot; + +public class VelocityExtensionsManager extends ExtensionsManager { + @Override + public void loadExtensions(NeoBot plugin) { + super.loadExtensions(plugin); + } +}