Begin work on the Plex API

This commit is contained in:
2026-05-19 12:32:56 -04:00
parent 64c691bb58
commit 9fa8d82217
142 changed files with 1960 additions and 566 deletions
@@ -0,0 +1,172 @@
package dev.plex.module;
import dev.plex.api.PlexApi;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
import org.apache.logging.log4j.Logger;
import org.bukkit.command.Command;
import org.bukkit.event.HandlerList;
import org.bukkit.event.Listener;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* Base class for Plex modules.
*
* <p>This class is part of the public module API. Modules use {@link #api()} for
* supported integration points.</p>
*/
public abstract class PlexModule
{
private final List<Command> commands = new ArrayList<>();
private final List<Listener> listeners = new ArrayList<>();
private PlexApi api;
private PlexModuleFile plexModuleFile;
private File dataFolder;
private Logger logger;
public PlexApi api()
{
return api;
}
public void load()
{
}
public void enable()
{
}
public void disable()
{
}
public void registerListener(Listener listener)
{
listeners.add(listener);
}
public void unregisterListener(Listener listener)
{
listeners.remove(listener);
HandlerList.unregisterAll(listener);
}
public void registerCommand(Command command)
{
commands.add(command);
}
public void unregisterCommand(Command command)
{
commands.remove(command);
}
@Nullable
public Command getCommand(String name)
{
return commands.stream()
.filter(command -> command.getName().equalsIgnoreCase(name) || command.getAliases().stream().map(String::toLowerCase).toList().contains(name.toLowerCase(Locale.ROOT)))
.findFirst()
.orElse(null);
}
public void addDefaultMessage(String message, Object initValue)
{
if (api.configuration().messages().getString(message) == null)
{
api.configuration().messages().set(message, initValue);
api.configuration().messages().save();
logger.debug("'{}' message added from {}", message, plexModuleFile.getName());
}
}
public void addDefaultMessage(String message, Object initValue, String... comments)
{
if (api.configuration().messages().getString(message) == null)
{
api.configuration().messages().set(message, initValue);
api.configuration().messages().save();
api.configuration().messages().setComments(message, Arrays.asList(comments));
api.configuration().messages().save();
logger.debug("'{}' message added from {}", message, plexModuleFile.getName());
}
}
@Nullable
public InputStream getResource(@NotNull String filename)
{
try
{
URL url = this.getClass().getClassLoader().getResource(filename);
if (url == null)
{
return null;
}
URLConnection connection = url.openConnection();
connection.setUseCaches(false);
return connection.getInputStream();
}
catch (IOException ex)
{
return null;
}
}
public List<Command> getCommands()
{
return commands;
}
public List<Listener> getListeners()
{
return listeners;
}
public PlexModuleFile getPlexModuleFile()
{
return plexModuleFile;
}
public File getDataFolder()
{
return dataFolder;
}
public Logger getLogger()
{
return logger;
}
public void setApi(PlexApi api)
{
this.api = api;
}
public void setPlexModuleFile(PlexModuleFile plexModuleFile)
{
this.plexModuleFile = plexModuleFile;
}
public void setDataFolder(File dataFolder)
{
this.dataFolder = dataFolder;
}
public void setLogger(Logger logger)
{
this.logger = logger;
}
}
@@ -0,0 +1,60 @@
package dev.plex.module;
import java.util.List;
/**
* Metadata read from a module's module.yml file.
*/
public final class PlexModuleFile
{
private final String name;
private final String main;
private final String description;
private final String version;
private final int apiCompatibility;
private List<String> libraries = List.of();
public PlexModuleFile(String name, String main, String description, String version, int apiCompatibility)
{
this.name = name;
this.main = main;
this.description = description;
this.version = version;
this.apiCompatibility = apiCompatibility;
}
public String getName()
{
return name;
}
public String getMain()
{
return main;
}
public String getDescription()
{
return description;
}
public String getVersion()
{
return version;
}
public int getApiCompatibility()
{
return apiCompatibility;
}
public List<String> getLibraries()
{
return libraries;
}
public void setLibraries(List<String> libraries)
{
this.libraries = List.copyOf(libraries);
}
}