Skip to content
Open

UI #2

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,26 @@
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabCompleter;
import org.bukkit.entity.Player;

import com.mathhulk.spectra.scripts.Script;
import com.mathhulk.spectra.scripts.ScriptManager;

import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class ScriptsCommand implements CommandExecutor, TabCompleter {
private final Spectra plugin;

private final String OPEN_BROWSER_CHANNEL = "spectra:open-browser";

public ScriptsCommand(Spectra plugin) {
this.plugin = plugin;

plugin.getServer().getMessenger().registerOutgoingPluginChannel(plugin, OPEN_BROWSER_CHANNEL);
}

@Override
Expand Down Expand Up @@ -148,13 +159,35 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
scriptManager.enable();
}

if (firstArgument.equals("open")) {
if (!(sender instanceof Player)) {
sender.sendMessage("This command can only be used by players.");

return true;
}

ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);

try {
dos.writeInt(0);
dos.flush();
} catch (IOException e) {
e.printStackTrace();
}

byte[] message = baos.toByteArray();

((Player) sender).sendPluginMessage(plugin, OPEN_BROWSER_CHANNEL, message);
}

return true;
}

@Override
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
if (args.length == 1) {
return List.of("start-watching", "stop-watching", "list", "enable", "disable", "remove", "add");
return List.of("start-watching", "stop-watching", "list", "enable", "disable", "remove", "add", "open");
}

if (args.length == 2 && List.of("enable", "disable", "remove", "add").contains(args[0])) {
Expand Down
110 changes: 51 additions & 59 deletions apps/bukkit/src/main/java/com/mathhulk/spectra/Spectra.java
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
package com.mathhulk.spectra;

import java.io.File;

import org.bukkit.command.PluginCommand;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.PluginManager;
import org.bukkit.generator.BiomeProvider;
import org.bukkit.generator.ChunkGenerator;
import org.bukkit.plugin.java.JavaPlugin;

import com.mathhulk.spectra.plugin.ScriptPlugin;
import com.mathhulk.spectra.plugin.ScriptPluginLoader;
import com.mathhulk.spectra.plugins.ScriptPluginManager;
import com.mathhulk.spectra.scripts.ScriptManager;
import com.mathhulk.spectra.ui.VerifiedPlayerManager;

public class Spectra extends JavaPlugin {
private ScriptManager scriptManager;
private ScriptPluginLoader pluginLoader;
private ScriptPluginManager scriptPluginManager;
private VerifiedPlayerManager verifiedPlayerManager;

public static Spectra instance;

Expand All @@ -21,56 +21,20 @@ public void onLoad() {
// Register ScriptPluginLoader
instance = this;

PluginManager pluginManager = getServer().getPluginManager();
pluginManager.registerInterface(ScriptPluginLoader.class);

// Load Spectra plugins
getLogger().info("Loading Spectra plugins...");

File[] plugins = getDataFolder().getParentFile().listFiles();

if (plugins == null)
return;

for (File file : plugins) {
if (!ScriptPluginLoader.isSpectraPluginFile(file.getName()))
continue;

try {
Plugin loadedPlugin = pluginManager.loadPlugin(file);

if (loadedPlugin == null) {
getLogger().severe("Failed to load " + file.getName());

continue;
}
} catch (Exception e) {
e.printStackTrace();
}
}
verifiedPlayerManager = new VerifiedPlayerManager(this);

// Store the ScriptPluginLoader instance
for (Plugin plugin : pluginManager.getPlugins()) {
getLogger().info("Checking " + plugin.getName());

if (!(plugin instanceof ScriptPlugin))
continue;

pluginLoader = (ScriptPluginLoader) plugin.getPluginLoader();

break;
}
// TODO: Add a flag to disable script plugins
scriptPluginManager = new ScriptPluginManager(this);
scriptPluginManager.load();

// TODO: Add a flag to disable the script manager
scriptManager = new ScriptManager(this);

// TODO: Add a flag to disable watching by default
scriptManager.load(true);
}

@Override
public void onEnable() {
// Register the command
PluginCommand command = getCommand("scripts");

if (command == null) {
Expand All @@ -83,28 +47,56 @@ public void onEnable() {
command.setExecutor(scriptsCommand);
command.setTabCompleter(scriptsCommand);

// Log the number of Spectra plugins loaded
int totalPlugins = pluginLoader == null ? 0 : pluginLoader.getPlugins().size();

getLogger().info(totalPlugins == 0 ? "No Spectra plugins loaded"
: totalPlugins == 1 ? "Loaded 1 Spectra plugin" : "Loaded " + totalPlugins + " Spectra plugins");

// Enable scripts
if (scriptManager == null)
return;
if (scriptManager != null) {
scriptManager.enable();
}

scriptManager.enable();
if (verifiedPlayerManager != null) {
verifiedPlayerManager.enable();
}
}

@Override
public void onDisable() {
if (scriptManager == null)
return;
// Disable scripts
if (scriptManager != null) {
scriptManager.disable();
}

scriptManager.disable();
if (verifiedPlayerManager != null) {
verifiedPlayerManager.disable();
}
}

public ScriptManager getScriptManager() {
return scriptManager;
}

public ScriptPluginManager getScriptPluginManager() {
return scriptPluginManager;
}

@Override
public BiomeProvider getDefaultBiomeProvider(String worldName, String id) {
BiomeProvider biomeProvider = scriptManager.getDefaultBiomeProvider(worldName,
id);

if (biomeProvider != null) {
return biomeProvider;
}

return super.getDefaultBiomeProvider(worldName, id);
}

@Override
public ChunkGenerator getDefaultWorldGenerator(String worldName, String id) {
ChunkGenerator chunkGenerator = scriptManager.getDefaultWorldGenerator(worldName, id);

if (chunkGenerator != null) {
return chunkGenerator;
}

return super.getDefaultWorldGenerator(worldName, id);
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.mathhulk.spectra.plugin;
package com.mathhulk.spectra.plugins;

import java.io.File;
import java.io.InputStream;
Expand All @@ -13,9 +13,12 @@
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.PluginDescriptionFile;
import org.bukkit.plugin.PluginLogger;
import org.graalvm.polyglot.Value;

import com.mathhulk.spectra.Script;
import com.mathhulk.spectra.Spectra;
import com.mathhulk.spectra.scripts.Script;
import com.mathhulk.spectra.scripts.wrappers.BiomeProviderWrapper;
import com.mathhulk.spectra.scripts.wrappers.ChunkGeneratorWrapper;

public class ScriptPlugin implements Plugin {
private Script script;
Expand Down Expand Up @@ -59,8 +62,7 @@ public String getName() {

@Override
public void onLoad() {
// TODO: Implement
script.enable();
script.load();
}

@Override
Expand Down Expand Up @@ -122,12 +124,48 @@ public void saveConfig() {

@Override
public BiomeProvider getDefaultBiomeProvider(String worldName, String id) {
return Spectra.instance.getDefaultBiomeProvider(worldName, id);
synchronized (script.getContext()) {
Value member = script.getMember("getDefaultBiomeProvider");

if (!member.canExecute()) {
return null;
}

try {
Value value = member.execute(worldName, id);

if (!value.hasMembers()) {
return null;
}

return new BiomeProviderWrapper(script.getContext(), value);
} catch (Exception e) {
return null;
}
}
}

@Override
public ChunkGenerator getDefaultWorldGenerator(String worldName, String id) {
return Spectra.instance.getDefaultWorldGenerator(worldName, id);
synchronized (script.getContext()) {
Value member = script.getMember("getDefaultWorldGenerator");

if (!member.canExecute()) {
return null;
}

try {
Value value = member.execute(worldName, id);

if (!value.hasMembers()) {
return null;
}

return new ChunkGeneratorWrapper(script.getContext(), value);
} catch (Exception e) {
return null;
}
}
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.mathhulk.spectra.plugin;
package com.mathhulk.spectra.plugins;

import java.io.File;
import java.util.ArrayList;
Expand All @@ -14,8 +14,8 @@
import org.bukkit.plugin.PluginLoader;
import org.bukkit.plugin.RegisteredListener;

import com.mathhulk.spectra.Script;
import com.mathhulk.spectra.Spectra;
import com.mathhulk.spectra.scripts.Script;

public class ScriptPluginLoader implements PluginLoader {
private static final Pattern[] pluginFileFilters = new Pattern[] {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
package com.mathhulk.spectra.plugins;

import java.io.File;
import java.util.HashSet;

import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.PluginManager;

import com.mathhulk.spectra.Spectra;

public class ScriptPluginManager {
private ScriptPluginLoader pluginLoader;
private HashSet<ScriptPlugin> plugins = new HashSet<>();

private final Spectra plugin;

public ScriptPluginManager(Spectra plugin) {
this.plugin = plugin;
}

public Spectra getPlugin() {
return plugin;
}

public ScriptPluginLoader getPluginLoader() {
return pluginLoader;
}

public HashSet<ScriptPlugin> getPlugins() {
return plugins;
}

public void load() {
// Register a custom plugin loader for Spectra plugins
PluginManager pluginManager = plugin.getServer().getPluginManager();
pluginManager.registerInterface(ScriptPluginLoader.class);

plugin.getLogger().info("Loading Spectra plugins...");

File[] files = plugin.getDataFolder().getParentFile().listFiles();

if (files == null)
return;

for (File file : files) {
if (!ScriptPluginLoader.isSpectraPluginFile(file.getName()))
continue;

try {
// Attempt to load Spectra plugins
Plugin loadedPlugin = pluginManager.loadPlugin(file);

if (loadedPlugin == null) {
plugin.getLogger().severe("Failed to load Spectra plugin: " + file.getName());

continue;
}

plugins.add((ScriptPlugin) loadedPlugin);

plugin.getLogger().info("Loaded Spectra plugin: " + loadedPlugin.getName());

// Store the ScriptPluginLoader instance
if (pluginLoader != null) {
continue;
}

pluginLoader = (ScriptPluginLoader) loadedPlugin.getPluginLoader();
} catch (Exception e) {
plugin.getLogger().severe("Failed to load Spectra plugin: " + file.getName());

e.printStackTrace();
}
}
}
}
Loading