Skip to content

Commit

Permalink
Rework SubServers.Bungee's app lifecycle
Browse files Browse the repository at this point in the history
SubServers.Bungee now puts code in 2 new places to better load/unload it's data.

When supported, this should give it better compatabilty with ordanary plugins. Also, it no longer has to 'shutdown' to handle /greload. Isn't that neat?
  • Loading branch information
ME1312 committed Feb 7, 2021
1 parent 25fff82 commit 3dea3b6
Show file tree
Hide file tree
Showing 20 changed files with 226 additions and 265 deletions.
4 changes: 2 additions & 2 deletions SubServers.Bungee/common/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -30,13 +30,13 @@
<dependency>
<groupId>net.ME1312.Galaxi</groupId>
<artifactId>GalaxiUtil</artifactId>
<version>21w04a</version>
<version>21w06a</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>net.ME1312.Galaxi</groupId>
<artifactId>GalaxiEngine</artifactId>
<version>21w04a</version>
<version>21w06a</version>
<scope>provided</scope>
</dependency>
</dependencies>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,6 @@ static BungeeAPI getInstance() {
return ((BungeeCommon) ProxyServer.getInstance()).api.run();
}

/**
* Adds a SubAPI Listener
*
* @param enable An Event that will be called when SubAPI is ready
* @param disable An Event that will be called before SubAPI is disabled (your plugin should reset it's values in case this is a hard-reset instead of a shutdown)
*/
void addListener(Runnable enable, Runnable disable);

/**
* Get the number of players on this network across all known proxies
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ public class Logger {
* @param prefix Prefix
* @return Logger
*/
@SuppressWarnings("deprecation")
public static java.util.logging.Logger get(String prefix) {
if (!existing.keySet().contains(prefix)) {
java.util.logging.Logger log = Util.getDespiteException(() -> Util.reflect(Class.forName("net.ME1312.Galaxi.Library.Log.Logger").getDeclaredMethod("toPrimitive"),
Expand All @@ -29,23 +28,14 @@ public static java.util.logging.Logger get(String prefix) {
log = java.util.logging.Logger.getAnonymousLogger();
log.setUseParentHandlers(false);
log.addHandler(new Handler() {
private boolean open = true;

@Override
public void publish(LogRecord record) {
if (open)
BungeeCommon.getInstance().getLogger().log(record.getLevel(), prefix + " > " + record.getMessage(), record.getParameters());
}

@Override
public void flush() {

BungeeCommon.getInstance().getLogger().log(record.getLevel(), prefix + " > " + record.getMessage(), record.getParameters());
}

@Override
public void close() throws SecurityException {
open = false;
}
public void flush() {}
public void close() {}
});
}
existing.put(prefix, log);
Expand Down
4 changes: 2 additions & 2 deletions SubServers.Bungee/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -30,14 +30,14 @@
<dependency>
<groupId>net.ME1312.Galaxi</groupId>
<artifactId>GalaxiUtil</artifactId>
<version>21w04a</version>
<version>21w06a</version>
<scope>compile</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>net.ME1312.Galaxi</groupId>
<artifactId>GalaxiEngine</artifactId>
<version>21w04a</version>
<version>21w06a</version>
<scope>provided</scope>
</dependency>
<dependency>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -465,13 +465,11 @@ public boolean forceDeleteSubServer(UUID player, String name) throws Interrupted
*/
public boolean destroy() {
try {
List<String> subservers = new ArrayList<String>();
subservers.addAll(getSubServers().keySet());
String[] subservers = getSubServers().keySet().toArray(new String[0]);

for (String server : subservers) {
forceRemoveSubServer(server);
}
subservers.clear();
getCreator().terminate();
getCreator().waitFor();
return true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -124,9 +124,9 @@ protected boolean removeSubServer(UUID player, String name, boolean forced) thro
server.stop();
server.waitFor();
}
servers.remove(name.toLowerCase());
if (UPnP.isUPnPAvailable() && UPnP.isMappedTCP(server.getAddress().getPort()))
UPnP.closePortTCP(server.getAddress().getPort());
servers.remove(name.toLowerCase());
return true;
} else return false;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,23 @@
package net.ME1312.SubServers.Bungee.Library.Compatibility;

import net.ME1312.Galaxi.Library.Callback.ExceptionRunnable;
import net.ME1312.Galaxi.Library.Util;

import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.plugin.PluginDescription;

import java.io.File;
import java.io.IOException;

public final class Plugin extends net.md_5.bungee.api.plugin.Plugin {
private static final PluginDescription description = new PluginDescription();
private final boolean invalid;
private final ExceptionRunnable enable;
private final Runnable disable;

@Deprecated
public Plugin() {
this.invalid = true;
enable = null;
disable = null;
}

private static PluginDescription describe() {
Expand All @@ -25,16 +29,28 @@ private static PluginDescription describe() {
return description;
}

public Plugin(ProxyServer proxy) {
public Plugin(ProxyServer proxy, ExceptionRunnable enable, Runnable disable) {
super(proxy, describe());
this.invalid = false;
this.enable = enable;
this.disable = disable;

// 2020 BungeeCord builds don't run init(), but future builds may uncomment that line. We wouldn't want to repeat ourselves.
if (getDescription() == null) Util.isException(() -> Util.reflect(net.md_5.bungee.api.plugin.Plugin.class.getDeclaredMethod("init", ProxyServer.class, PluginDescription.class), this, proxy, description));
}

@Override
public void onEnable() {
if (invalid) throw new IllegalStateException("SubServers.Bungee does not run as a plugin, but a wrapper. For more information on how to install, please visit this page: https://github.com/ME1312/SubServers-2/wiki/Install");
if (enable == null) {
throw new IllegalStateException("SubServers.Bungee does not run as a plugin, but a wrapper. For more information on how to install, please visit this page: https://github.com/ME1312/SubServers-2/wiki/Install");
} else try {
enable.run();
} catch (Throwable e) {
e.printStackTrace();
}
}

@Override
public void onDisable() {
if (disable != null) disable.run();
}
}
20 changes: 2 additions & 18 deletions SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubAPI.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,7 @@
* SubAPI Class
*/
public final class SubAPI implements BungeeAPI {
LinkedList<Runnable> enableListeners = new LinkedList<Runnable>();
LinkedList<Runnable> reloadListeners = new LinkedList<Runnable>();
LinkedList<Runnable> disableListeners = new LinkedList<Runnable>();
private static HashMap<String, Object> knownSignatures = new HashMap<String, Object>();
boolean ready = false;
private final SubProxy plugin;
Expand Down Expand Up @@ -63,25 +61,11 @@ public SubProxy getInternals() {
}

/**
* Adds a SubAPI Listener
* Adds a SubAPI Reload Listener
*
* @param enable An Event that will be called when SubAPI is ready
* @param disable An Event that will be called before SubAPI is disabled (your plugin should reset it's values in case this is a hard-reset instead of a shutdown)
*/
public void addListener(Runnable enable, Runnable disable) {
if (enable != null) enableListeners.add(enable);
if (disable != null) disableListeners.add(disable);
}

/**
* Adds a SubAPI Listener
*
* @param enable An Event that will be called when SubAPI is ready
* @param reload An Event that will be called after SubAPI is soft-reloaded
* @param disable An Event that will be called before SubAPI is disabled (your plugin should reset it's values in case this is a hard-reset instead of a shutdown)
*/
public void addListener(Runnable enable, Runnable reload, Runnable disable) {
addListener(enable, disable);
public void addListener(Runnable reload) {
if (reload != null) reloadListeners.add(reload);
}

Expand Down
108 changes: 60 additions & 48 deletions SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -121,52 +121,64 @@ public void execute(CommandSender sender, String[] args) {
} catch (Exception e) {}
}, "SubServers.Bungee::Update_Check").start();
} else if (args[0].equalsIgnoreCase("reload")) {
if (args.length > 1) {
switch (args[1].toLowerCase()) {
case "*":
case "all":
case "system":
case "bungee":
case "bungeecord":
case "subdata":
case "network":
plugin.getPluginManager().dispatchCommand(ConsoleCommandSender.getInstance(), "greload");
break;
case "host":
case "hosts":
case "server":
case "servers":
case "subserver":
case "subservers":
case "config":
case "configs":
try {
plugin.reload();
} catch (IOException e) {
e.printStackTrace();
}
break;
case "creator":
case "creators":
case "subcreator":
case "subcreators":
case "template":
case "templates":
for (Host host : plugin.api.getHosts().values()) {
host.getCreator().reload();
}
sender.sendMessage("SubServers > SubCreator instances reloaded");
break;
default:
sender.sendMessage("SubServers > Unknown reload type: " + args[1]);
}
} else {
try {
plugin.reload();
} catch (IOException e) {
e.printStackTrace();
new Thread(() -> {
if (args.length > 1) {
switch (args[1].toLowerCase()) {
case "*":
case "all":
case "hard":
case "system":
case "subdata":
case "network":
plugin.stopListeners();
plugin.getLogger().info("Closing player connections");
for (ProxiedPlayer player : plugin.getPlayers()) {
Util.isException(() -> player.disconnect(plugin.getTranslation("restart")));
}
plugin.shutdown();
case "soft":
case "bungee":
case "bungeecord":
case "plugin":
case "plugins":
plugin.getPluginManager().dispatchCommand(sender, "greload");
break;
case "host":
case "hosts":
case "server":
case "servers":
case "subserver":
case "subservers":
case "config":
case "configs":
try {
plugin.reload();
} catch (IOException e) {
e.printStackTrace();
}
break;
case "creator":
case "creators":
case "subcreator":
case "subcreators":
case "template":
case "templates":
for (Host host : plugin.api.getHosts().values()) {
host.getCreator().reload();
}
sender.sendMessage("SubServers > SubCreator instances reloaded");
break;
default:
sender.sendMessage("SubServers > Unknown reload type: " + args[1]);
}
} else {
try {
plugin.reload();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}, "SubServers.Bungee::Reload_Command_Handler").start();
} else if (args[0].equalsIgnoreCase("list")) {
String div = ChatColor.RESET + ", ";
int i = 0;
Expand Down Expand Up @@ -830,7 +842,7 @@ private String[] printHelp() {
" Help: /sub help",
" List: /sub list",
" Version: /sub version",
" Reload: /sub reload [all|config|templates]",
" Reload: /sub reload [hard|bungee|servers|templates]",
" Info: /sub info [proxy|host|group|server|player] <Name>",
" Start Server: /sub start <Subservers>",
" Restart Server: /sub restart <Subservers>",
Expand Down Expand Up @@ -987,12 +999,12 @@ public Pair<String, List<String>> suggestArguments(CommandSender sender, String[
} else if (!(sender instanceof ProxiedPlayer) && (args[0].equals("reload") || args[0].equals("restore"))) {
if (args[0].equals("reload")) {
List<String> list = new ArrayList<String>(),
completes = Arrays.asList("all", "config", "templates");
completes = Arrays.asList("hard", "bungee", "servers", "templates");
if (args.length == 2) {
for (String complete : completes) {
if (complete.toLowerCase().startsWith(last)) list.add(Last + complete.substring(last.length()));
}
return new ContainedPair<>((list.size() <= 0)?plugin.api.getLang("SubServers", "Command.Generic.Unknown").replace("$str$", args[0]):null, list);
return new ContainedPair<>(null, list);
} else {
return new ContainedPair<>(null, Collections.emptyList());
}
Expand Down
Loading

0 comments on commit 3dea3b6

Please sign in to comment.