mirror of
https://github.com/ME1312/SubServers-2.git
synced 2025-04-13 07:26:05 +02:00
Move autorun queue to a more appropriate location
This restores plugins' ability to listen for server start events
This commit is contained in:
parent
3dea3b67d0
commit
4e66461848
SubServers.Bungee/src/net/ME1312/SubServers/Bungee
@ -30,7 +30,6 @@ import java.util.*;
|
|||||||
public final class SubAPI implements BungeeAPI {
|
public final class SubAPI implements BungeeAPI {
|
||||||
LinkedList<Runnable> reloadListeners = new LinkedList<Runnable>();
|
LinkedList<Runnable> reloadListeners = new LinkedList<Runnable>();
|
||||||
private static HashMap<String, Object> knownSignatures = new HashMap<String, Object>();
|
private static HashMap<String, Object> knownSignatures = new HashMap<String, Object>();
|
||||||
boolean ready = false;
|
|
||||||
private final SubProxy plugin;
|
private final SubProxy plugin;
|
||||||
private static SubAPI api;
|
private static SubAPI api;
|
||||||
|
|
||||||
|
@ -45,6 +45,7 @@ import static net.ME1312.SubServers.Bungee.Library.Compatibility.Galaxi.GalaxiCo
|
|||||||
@SuppressWarnings("deprecation")
|
@SuppressWarnings("deprecation")
|
||||||
public final class SubCommand extends CommandX {
|
public final class SubCommand extends CommandX {
|
||||||
static HashMap<UUID, HashMap<ServerInfo, Pair<Long, Boolean>>> players = new HashMap<UUID, HashMap<ServerInfo, Pair<Long, Boolean>>>();
|
static HashMap<UUID, HashMap<ServerInfo, Pair<Long, Boolean>>> players = new HashMap<UUID, HashMap<ServerInfo, Pair<Long, Boolean>>>();
|
||||||
|
private static Thread reload;
|
||||||
private SubProxy plugin;
|
private SubProxy plugin;
|
||||||
private String label;
|
private String label;
|
||||||
|
|
||||||
@ -121,7 +122,7 @@ public final class SubCommand extends CommandX {
|
|||||||
} catch (Exception e) {}
|
} catch (Exception e) {}
|
||||||
}, "SubServers.Bungee::Update_Check").start();
|
}, "SubServers.Bungee::Update_Check").start();
|
||||||
} else if (args[0].equalsIgnoreCase("reload")) {
|
} else if (args[0].equalsIgnoreCase("reload")) {
|
||||||
new Thread(() -> {
|
if (reload == null || !reload.isAlive()) (reload = new Thread(() -> {
|
||||||
if (args.length > 1) {
|
if (args.length > 1) {
|
||||||
switch (args[1].toLowerCase()) {
|
switch (args[1].toLowerCase()) {
|
||||||
case "*":
|
case "*":
|
||||||
@ -141,7 +142,7 @@ public final class SubCommand extends CommandX {
|
|||||||
case "bungeecord":
|
case "bungeecord":
|
||||||
case "plugin":
|
case "plugin":
|
||||||
case "plugins":
|
case "plugins":
|
||||||
plugin.getPluginManager().dispatchCommand(sender, "greload");
|
plugin.getPluginManager().dispatchCommand(ConsoleCommandSender.getInstance(), "greload");
|
||||||
break;
|
break;
|
||||||
case "host":
|
case "host":
|
||||||
case "hosts":
|
case "hosts":
|
||||||
@ -178,7 +179,7 @@ public final class SubCommand extends CommandX {
|
|||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}, "SubServers.Bungee::Reload_Command_Handler").start();
|
}, "SubServers.Bungee::Reload_Command_Handler")).start();
|
||||||
} else if (args[0].equalsIgnoreCase("list")) {
|
} else if (args[0].equalsIgnoreCase("list")) {
|
||||||
String div = ChatColor.RESET + ", ";
|
String div = ChatColor.RESET + ", ";
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
@ -100,6 +100,7 @@ public final class SubProxy extends BungeeCommon implements Listener {
|
|||||||
private boolean running = false;
|
private boolean running = false;
|
||||||
private boolean reloading = false;
|
private boolean reloading = false;
|
||||||
private boolean posted = false;
|
private boolean posted = false;
|
||||||
|
private LinkedList<String> autorun = null;
|
||||||
private static BigInteger lastSignature = BigInteger.valueOf(-1);
|
private static BigInteger lastSignature = BigInteger.valueOf(-1);
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
@ -287,40 +288,11 @@ public final class SubProxy extends BungeeCommon implements Listener {
|
|||||||
if (isGalaxi) Util.reflect(GalaxiEventListener.class.getConstructor(SubProxy.class), this);
|
if (isGalaxi) Util.reflect(GalaxiEventListener.class.getConstructor(SubProxy.class), this);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Load SubServers before BungeeCord finishes
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public void startListeners() {
|
|
||||||
try {
|
|
||||||
if (posted || !api.ready) reload();
|
|
||||||
|
|
||||||
if (UPnP.isUPnPAvailable()) {
|
|
||||||
if (config.get().getMap("Settings").getMap("UPnP", new ObjectMap<String>()).getBoolean("Forward-Proxy", true)) for (ListenerInfo listener : getConfig().getListeners()) {
|
|
||||||
UPnP.openPortTCP(listener.getHost().getPort());
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
getLogger().warning("UPnP service is unavailable. SubServers can't port-forward for you from this device.");
|
|
||||||
}
|
|
||||||
|
|
||||||
super.startListeners();
|
|
||||||
|
|
||||||
if (!posted) {
|
|
||||||
posted = true;
|
|
||||||
post();
|
|
||||||
}
|
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Load data from the config (will attempt to merge with current configuration)
|
* Load data from the config (will attempt to merge with current configuration)
|
||||||
*
|
*
|
||||||
* @throws IOException
|
* @throws IOException
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public void reload() throws IOException {
|
public void reload() throws IOException {
|
||||||
List<String> ukeys = new ArrayList<String>();
|
List<String> ukeys = new ArrayList<String>();
|
||||||
long begin = Calendar.getInstance().getTime().getTime();
|
long begin = Calendar.getInstance().getTime().getTime();
|
||||||
@ -431,9 +403,7 @@ public final class SubProxy extends BungeeCommon implements Listener {
|
|||||||
|
|
||||||
int subservers = 0;
|
int subservers = 0;
|
||||||
Logger.get("SubServers").info(((status)?"Rel":"L")+"oading SubServers...");
|
Logger.get("SubServers").info(((status)?"Rel":"L")+"oading SubServers...");
|
||||||
if (!posted) Runtime.getRuntime().addShutdownHook(new Thread(this::shutdown, "SubServers.Bungee::System_Shutdown"));
|
autorun = new LinkedList<String>();
|
||||||
running = true;
|
|
||||||
List<String> autorun = new LinkedList<String>();
|
|
||||||
for (String name : this.servers.get().getMap("Servers").getKeys()) {
|
for (String name : this.servers.get().getMap("Servers").getKeys()) {
|
||||||
if (!ukeys.contains(name.toLowerCase())) try {
|
if (!ukeys.contains(name.toLowerCase())) try {
|
||||||
if (!this.hosts.keySet().contains(this.servers.get().getMap("Servers").getMap(name).getString("Host").toLowerCase())) throw new InvalidServerException("There is no host with this name: " + this.servers.get().getMap("Servers").getMap(name).getString("Host"));
|
if (!this.hosts.keySet().contains(this.servers.get().getMap("Servers").getMap(name).getString("Host").toLowerCase())) throw new InvalidServerException("There is no host with this name: " + this.servers.get().getMap("Servers").getMap(name).getString("Host"));
|
||||||
@ -534,7 +504,9 @@ public final class SubProxy extends BungeeCommon implements Listener {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
ukeys.clear();
|
ukeys.clear();
|
||||||
api.ready = true;
|
|
||||||
|
if (!posted) Runtime.getRuntime().addShutdownHook(new Thread(this::shutdown, "SubServers.Bungee::System_Shutdown"));
|
||||||
|
running = true;
|
||||||
legServers.clear();
|
legServers.clear();
|
||||||
|
|
||||||
// Initialize SubData
|
// Initialize SubData
|
||||||
@ -601,7 +573,7 @@ public final class SubProxy extends BungeeCommon implements Listener {
|
|||||||
if (status) {
|
if (status) {
|
||||||
List<Runnable> listeners = api.reloadListeners;
|
List<Runnable> listeners = api.reloadListeners;
|
||||||
if (listeners.size() > 0) {
|
if (listeners.size() > 0) {
|
||||||
Logger.get("SubServers").info(((status)?"Rel":"L")+"oading SubAPI Plugins...");
|
Logger.get("SubServers").info("Reloading SubAPI Plugins...");
|
||||||
for (Runnable obj : listeners) {
|
for (Runnable obj : listeners) {
|
||||||
try {
|
try {
|
||||||
obj.run();
|
obj.run();
|
||||||
@ -618,36 +590,64 @@ public final class SubProxy extends BungeeCommon implements Listener {
|
|||||||
|
|
||||||
reloading = false;
|
reloading = false;
|
||||||
Logger.get("SubServers").info(((plugins > 0)?plugins+" Plugin"+((plugins == 1)?"":"s")+", ":"") + hosts + " Host"+((hosts == 1)?"":"s")+", " + servers + " Server"+((servers == 1)?"":"s")+", and " + subservers + " SubServer"+((subservers == 1)?"":"s")+" "+((status)?"re":"")+"loaded in " + new DecimalFormat("0.000").format((Calendar.getInstance().getTime().getTime() - begin) / 1000D) + "s");
|
Logger.get("SubServers").info(((plugins > 0)?plugins+" Plugin"+((plugins == 1)?"":"s")+", ":"") + hosts + " Host"+((hosts == 1)?"":"s")+", " + servers + " Server"+((servers == 1)?"":"s")+", and " + subservers + " SubServer"+((subservers == 1)?"":"s")+" "+((status)?"re":"")+"loaded in " + new DecimalFormat("0.000").format((Calendar.getInstance().getTime().getTime() - begin) / 1000D) + "s");
|
||||||
|
}
|
||||||
|
|
||||||
long scd = TimeUnit.SECONDS.toMillis(this.servers.get().getMap("Settings").getLong("Run-On-Launch-Timeout", 0L));
|
@Override
|
||||||
if (autorun.size() > 0) for (Host host : api.getHosts().values()) {
|
public void startListeners() {
|
||||||
List<String> ar = new LinkedList<String>();
|
try {
|
||||||
for (String name : autorun) if (host.getSubServer(name) != null) ar.add(name);
|
if (posted || !running) reload();
|
||||||
if (ar.size() > 0) new Thread(() -> {
|
|
||||||
try {
|
if (UPnP.isUPnPAvailable()) {
|
||||||
while (running && begin == resetDate && !host.isAvailable()) {
|
if (config.get().getMap("Settings").getMap("UPnP", new ObjectMap<String>()).getBoolean("Forward-Proxy", true)) for (ListenerInfo listener : getConfig().getListeners()) {
|
||||||
Thread.sleep(250);
|
UPnP.openPortTCP(listener.getHost().getPort());
|
||||||
}
|
}
|
||||||
long init = Calendar.getInstance().getTime().getTime();
|
} else {
|
||||||
while (running && begin == resetDate && ar.size() > 0) {
|
getLogger().warning("UPnP service is unavailable. SubServers can't port-forward for you from this device.");
|
||||||
SubServer server = host.getSubServer(ar.get(0));
|
}
|
||||||
ar.remove(0);
|
|
||||||
if (server != null && !server.isRunning()) {
|
super.startListeners();
|
||||||
server.start();
|
|
||||||
if (ar.size() > 0 && scd > 0) {
|
if (autorun != null && autorun.size() > 0) {
|
||||||
long sleep = Calendar.getInstance().getTime().getTime();
|
final long begin = resetDate;
|
||||||
while (running && begin == resetDate && server.getSubData()[0] == null && Calendar.getInstance().getTime().getTime() - sleep < scd) {
|
final long scd = TimeUnit.SECONDS.toMillis(this.servers.get().getMap("Settings").getLong("Run-On-Launch-Timeout", 0L));
|
||||||
Thread.sleep(250);
|
for (Host host : api.getHosts().values()) {
|
||||||
|
List<String> ar = new LinkedList<String>();
|
||||||
|
for (String name : autorun) if (host.getSubServer(name) != null) ar.add(name);
|
||||||
|
if (ar.size() > 0) new Thread(() -> {
|
||||||
|
try {
|
||||||
|
while (running && begin == resetDate && !host.isAvailable()) {
|
||||||
|
Thread.sleep(250);
|
||||||
|
}
|
||||||
|
long init = Calendar.getInstance().getTime().getTime();
|
||||||
|
while (running && begin == resetDate && ar.size() > 0) {
|
||||||
|
SubServer server = host.getSubServer(ar.get(0));
|
||||||
|
ar.remove(0);
|
||||||
|
if (server != null && !server.isRunning()) {
|
||||||
|
server.start();
|
||||||
|
if (ar.size() > 0 && scd > 0) {
|
||||||
|
long sleep = Calendar.getInstance().getTime().getTime();
|
||||||
|
while (running && begin == resetDate && server.getSubData()[0] == null && Calendar.getInstance().getTime().getTime() - sleep < scd) {
|
||||||
|
Thread.sleep(250);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (running && begin == resetDate && Calendar.getInstance().getTime().getTime() - init >= 5000)
|
||||||
|
Logger.get("SubServers").info("The auto-start queue for " + host.getName() + " has been finished");
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}, "SubServers.Bungee::Automatic_Server_Starter(" + host.getName() + ")").start();
|
||||||
if (running && begin == resetDate && Calendar.getInstance().getTime().getTime() - init >= 5000)
|
|
||||||
Logger.get("SubServers").info("The auto-start queue for " + host.getName() + " has been finished");
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
}
|
||||||
}, "SubServers.Bungee::Automatic_Server_Starter(" + host.getName() + ")").start();
|
}
|
||||||
|
autorun = null;
|
||||||
|
|
||||||
|
if (!posted) {
|
||||||
|
posted = true;
|
||||||
|
post();
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -728,17 +728,9 @@ public final class SubProxy extends BungeeCommon implements Listener {
|
|||||||
}, TimeUnit.SECONDS.toMillis(rpec_s), TimeUnit.SECONDS.toMillis(rpec_i));
|
}, TimeUnit.SECONDS.toMillis(rpec_s), TimeUnit.SECONDS.toMillis(rpec_i));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Reset all changes made by startListeners
|
|
||||||
*
|
|
||||||
* @see SubProxy#startListeners()
|
|
||||||
*/
|
|
||||||
@Override
|
@Override
|
||||||
public void stopListeners() {
|
public void stopListeners() {
|
||||||
if (running) {
|
if (running) {
|
||||||
legServers.clear();
|
|
||||||
legServers.putAll(getServersCopy());
|
|
||||||
|
|
||||||
ListenerInfo[] listeners = getConfig().getListeners().toArray(new ListenerInfo[0]);
|
ListenerInfo[] listeners = getConfig().getListeners().toArray(new ListenerInfo[0]);
|
||||||
super.stopListeners();
|
super.stopListeners();
|
||||||
|
|
||||||
@ -748,18 +740,21 @@ public final class SubProxy extends BungeeCommon implements Listener {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} protected void shutdown() {
|
}
|
||||||
|
|
||||||
|
protected void shutdown() {
|
||||||
if (running) {
|
if (running) {
|
||||||
api.ready = false;
|
legServers.clear();
|
||||||
|
legServers.putAll(getServersCopy());
|
||||||
|
running = false;
|
||||||
|
|
||||||
Logger.get("SubServers").info("Stopping hosted servers");
|
Logger.get("SubServers").info("Stopping hosted servers");
|
||||||
String[] hosts = this.hosts.keySet().toArray(new String[0]);
|
String[] hosts = this.hosts.keySet().toArray(new String[0]);
|
||||||
|
|
||||||
for (String host : hosts) {
|
for (String host : hosts) {
|
||||||
api.forceRemoveHost(host);
|
api.forceRemoveHost(host);
|
||||||
}
|
}
|
||||||
|
|
||||||
Logger.get("SubServers").info("Removing dynamic data");
|
Logger.get("SubServers").info("Removing dynamic data");
|
||||||
running = false;
|
|
||||||
exServers.clear();
|
exServers.clear();
|
||||||
this.hosts.clear();
|
this.hosts.clear();
|
||||||
|
|
||||||
@ -768,7 +763,6 @@ public final class SubProxy extends BungeeCommon implements Listener {
|
|||||||
getPluginManager().callEvent(new SubRemoveProxyEvent(this.proxies.get(proxy)));
|
getPluginManager().callEvent(new SubRemoveProxyEvent(this.proxies.get(proxy)));
|
||||||
}
|
}
|
||||||
this.proxies.clear();
|
this.proxies.clear();
|
||||||
|
|
||||||
rPlayerLinkS.clear();
|
rPlayerLinkS.clear();
|
||||||
rPlayerLinkP.clear();
|
rPlayerLinkP.clear();
|
||||||
rPlayers.clear();
|
rPlayers.clear();
|
||||||
@ -833,7 +827,7 @@ public final class SubProxy extends BungeeCommon implements Listener {
|
|||||||
@Override
|
@Override
|
||||||
public Map<String, ServerInfo> getServersCopy() {
|
public Map<String, ServerInfo> getServersCopy() {
|
||||||
HashMap<String, ServerInfo> servers = new HashMap<String, ServerInfo>();
|
HashMap<String, ServerInfo> servers = new HashMap<String, ServerInfo>();
|
||||||
if (!api.ready) {
|
if (!running) {
|
||||||
servers.putAll(super.getServers());
|
servers.putAll(super.getServers());
|
||||||
servers.putAll(legServers);
|
servers.putAll(legServers);
|
||||||
} else {
|
} else {
|
||||||
|
Loading…
Reference in New Issue
Block a user