From 30dd28547f42a0946c70753a40cfdbd515227f71 Mon Sep 17 00:00:00 2001 From: ME1312 Date: Tue, 25 Jun 2019 17:13:27 -0400 Subject: [PATCH] Add a post-start event --- .../Bungee/Event/SubStartedEvent.java | 34 +++++++++++++++ .../Host/External/ExternalSubCreator.java | 4 +- .../Host/External/ExternalSubServer.java | 7 +-- .../Host/Internal/InternalSubCreator.java | 4 +- .../Host/Internal/InternalSubServer.java | 6 ++- .../Bungee/Host/SubServerContainer.java | 5 ++- .../Bungee/Host/SubServerController.java | 10 ++++- .../Network/Packet/PacketLinkServer.java | 8 ++++ .../Network/Packet/PacketOutExRunEvent.java | 12 +++++- .../Client/Bukkit/Event/SubStartedEvent.java | 40 +++++++++++++++++ .../Network/Packet/PacketInExRunEvent.java | 9 ++++ .../Client/Sponge/Event/SubStartedEvent.java | 43 +++++++++++++++++++ .../Network/Packet/PacketInExRunEvent.java | 7 +++ .../Host/Event/SubStartedEvent.java | 31 +++++++++++++ .../Network/Packet/PacketInExRunEvent.java | 7 +++ .../Sync/Event/SubStartedEvent.java | 32 ++++++++++++++ .../Network/Packet/PacketInExRunEvent.java | 7 +++ pom.xml | 1 + 18 files changed, 253 insertions(+), 14 deletions(-) create mode 100644 SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Event/SubStartedEvent.java create mode 100644 SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Event/SubStartedEvent.java create mode 100644 SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubStartedEvent.java create mode 100644 SubServers.Host/src/net/ME1312/SubServers/Host/Event/SubStartedEvent.java create mode 100644 SubServers.Sync/src/net/ME1312/SubServers/Sync/Event/SubStartedEvent.java diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Event/SubStartedEvent.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Event/SubStartedEvent.java new file mode 100644 index 00000000..4ec87cef --- /dev/null +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Event/SubStartedEvent.java @@ -0,0 +1,34 @@ +package net.ME1312.SubServers.Bungee.Event; + +import net.ME1312.Galaxi.Library.Util; +import net.ME1312.SubServers.Bungee.Host.SubServer; +import net.ME1312.SubServers.Bungee.Library.SubEvent; +import net.md_5.bungee.api.plugin.Cancellable; +import net.md_5.bungee.api.plugin.Event; + +import java.util.UUID; + +/** + * Server Started Event + */ +public class SubStartedEvent extends Event implements SubEvent { + private SubServer server; + + /** + * Server Started Event
+ * This event can only be called when a SubData connection is made! + * + * @param server Server Starting + */ + public SubStartedEvent(SubServer server) { + if (Util.isNull(server)) throw new NullPointerException(); + this.server = server; + } + + /** + * Gets the Server Effected + * + * @return The Server Effected + */ + public SubServer getServer() { return server; } +} diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubCreator.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubCreator.java index aa1223fb..991f9935 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubCreator.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubCreator.java @@ -195,7 +195,7 @@ public boolean update(UUID player, SubServer server, Version version, Callback Util.reflect(SubServerContainer.class.getDeclaredField("lock"), server, true)); + Util.isException(() -> Util.reflect(SubServerContainer.class.getDeclaredField("updating"), server, true)); ExternalSubLogger logger = new ExternalSubLogger(this, prefix, log, null); thread.put(name.toLowerCase(), new NamedContainer<>(server.getAddress().getPort(), logger)); @@ -204,7 +204,7 @@ public boolean update(UUID player, SubServer server, Version version, Callback { - Util.isException(() -> Util.reflect(SubServerContainer.class.getDeclaredField("lock"), server, false)); + Util.isException(() -> Util.reflect(SubServerContainer.class.getDeclaredField("updating"), server, false)); try { if (data.getInt(0x0001) == 0) { Logger.get(prefix).info("Saving..."); diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubServer.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubServer.java index f5ca062a..e9c4deb9 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubServer.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubServer.java @@ -79,6 +79,7 @@ public boolean start(UUID player) { lock = false; if (!event.isCancelled()) { Logger.get("SubServers").info("Now starting " + getName()); + started = false; running = true; logger.start(); host.queue(new PacketExEditServer(this, PacketExEditServer.UpdateType.START, logger.getExternalAddress().toString())); @@ -105,12 +106,12 @@ public boolean stop(UUID player) { } else return false; } private void stopped(Boolean allowrestart) { - SubStoppedEvent event = new SubStoppedEvent(this); - host.plugin.getPluginManager().callEvent(event); - Logger.get("SubServers").info(getName() + " has stopped"); logger.stop(); history.clear(); running = false; + SubStoppedEvent event = new SubStoppedEvent(this); + host.plugin.getPluginManager().callEvent(event); + Logger.get("SubServers").info(getName() + " has stopped"); if (stopaction == StopAction.REMOVE_SERVER || stopaction == StopAction.RECYCLE_SERVER || stopaction == StopAction.DELETE_SERVER) { try { diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalSubCreator.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalSubCreator.java index c6af0830..cbd4b23b 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalSubCreator.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalSubCreator.java @@ -380,10 +380,10 @@ public boolean update(UUID player, SubServer server, Version version, Callback Util.reflect(SubServerContainer.class.getDeclaredField("lock"), server, true)); + Util.isException(() -> Util.reflect(SubServerContainer.class.getDeclaredField("updating"), server, true)); CreatorTask task = new CreatorTask(player, server, version, x -> { - Util.isException(() -> Util.reflect(SubServerContainer.class.getDeclaredField("lock"), server, false)); + Util.isException(() -> Util.reflect(SubServerContainer.class.getDeclaredField("updating"), server, false)); if (callback != null && x != null) try { callback.run(x); } catch (Throwable e) { diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalSubServer.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalSubServer.java index 66ba44d2..82c3f4d7 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalSubServer.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalSubServer.java @@ -119,6 +119,7 @@ public InternalSubServer(InternalHost host, String name, boolean enabled, int po private void run() { allowrestart = true; + started = false; try { ProcessBuilder pb = new ProcessBuilder().command(Executable.parse(host.getCreator().getBashDirectory(), executable)).directory(directory); pb.environment().put("name", getName()); @@ -142,13 +143,14 @@ private void run() { allowrestart = false; } - SubStoppedEvent event = new SubStoppedEvent(this); - host.plugin.getPluginManager().callEvent(event); Logger.get("SubServers").info(getName() + " has stopped"); process = null; command = null; history.clear(); + SubStoppedEvent event = new SubStoppedEvent(this); + host.plugin.getPluginManager().callEvent(event); + if (stopaction == StopAction.REMOVE_SERVER || stopaction == StopAction.RECYCLE_SERVER || stopaction == StopAction.DELETE_SERVER) { try { if (stopaction == StopAction.RECYCLE_SERVER) { diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubServerContainer.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubServerContainer.java index d21ee1df..85efc917 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubServerContainer.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubServerContainer.java @@ -16,7 +16,8 @@ public abstract class SubServerContainer extends ServerContainer implements SubServer { private List> incompatibilities = new ArrayList>(); private String template = null; - private boolean lock; + protected boolean started; + private boolean updating; /** * Creates a SubServer @@ -59,7 +60,7 @@ public int permaEdit(ObjectMap edit) { @Override public boolean isAvailable() { - return !lock && getHost().isAvailable(); + return !updating && getHost().isAvailable(); } @Override diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubServerController.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubServerController.java index f2e5b2e3..af60b46f 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubServerController.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubServerController.java @@ -25,12 +25,18 @@ public SubServerController(Host host, String name, int port, String motd, boolea control = new SubServerContainer(host, name, port, motd, hidden, restricted) { @Override public boolean start() { - return SubServerController.this.start(); + if (SubServerController.this.start()) { + started = false; + return true; + } else return false; } @Override public boolean start(UUID player) { - return SubServerController.this.start(player); + if (SubServerController.this.start(player)) { + started = false; + return true; + } else return false; } @Override diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketLinkServer.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketLinkServer.java index 08a68fd2..99a1331a 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketLinkServer.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketLinkServer.java @@ -3,6 +3,7 @@ import net.ME1312.SubData.Server.DataClient; import net.ME1312.SubData.Server.Protocol.Initial.InitialPacket; import net.ME1312.SubData.Server.SubDataClient; +import net.ME1312.SubServers.Bungee.Event.SubStartedEvent; import net.ME1312.SubServers.Bungee.Host.Server; import net.ME1312.SubServers.Bungee.Host.ServerContainer; import net.ME1312.SubServers.Bungee.Host.SubServer; @@ -10,8 +11,10 @@ import net.ME1312.Galaxi.Library.Util; import net.ME1312.SubData.Server.Protocol.PacketObjectIn; import net.ME1312.SubData.Server.Protocol.PacketObjectOut; +import net.ME1312.SubServers.Bungee.Host.SubServerContainer; import net.ME1312.SubServers.Bungee.Library.Compatibility.Logger; import net.ME1312.SubServers.Bungee.SubPlugin; +import net.md_5.bungee.api.ProxyServer; import java.net.InetSocketAddress; import java.util.HashMap; @@ -106,6 +109,11 @@ private void link(SubDataClient client, Server server, int channel) throws Throw Logger.get("SubServers").info("Sending shutdown signal to rogue SubServer: " + server.getName()); client.sendPacket(new PacketOutExReset("Rogue SubServer Detected")); } else { + if (server instanceof SubServer && !Util.getDespiteException(() -> Util.reflect(SubServerContainer.class.getDeclaredField("started"), server), true)) { + Util.isException(() -> Util.reflect(SubServerContainer.class.getDeclaredField("started"), server, true)); + SubStartedEvent event = new SubStartedEvent((SubServer) server); + ProxyServer.getInstance().getPluginManager().callEvent(event); + } client.sendPacket(new PacketLinkServer(server.getName(), 0, null)); } setReady(client, true); diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketOutExRunEvent.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketOutExRunEvent.java index 592341da..ab4e0a93 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketOutExRunEvent.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketOutExRunEvent.java @@ -114,6 +114,7 @@ public void event(SubCreateEvent event) { broadcast(new PacketOutExRunEvent(event.getClass(), args)); } } + @EventHandler(priority = Byte.MAX_VALUE) public void event(SubSendCommandEvent event) { if (!event.isCancelled()) { @@ -147,6 +148,14 @@ public void event(SubStartEvent event) { broadcast(new PacketOutExRunEvent(event.getClass(), args)); } } + @EventHandler(priority = Byte.MAX_VALUE) + public void event(SubStartedEvent event) { + ObjectMap args = new ObjectMap(); + args.set("server", event.getServer().getName()); + broadcast(event.getServer(), new PacketOutExRunEvent(event.getClass(), args)); + + } + @EventHandler(priority = Byte.MAX_VALUE) public void event(SubStopEvent event) { if (!event.isCancelled()) { @@ -162,9 +171,10 @@ public void event(SubStopEvent event) { public void event(SubStoppedEvent event) { ObjectMap args = new ObjectMap(); args.set("server", event.getServer().getName()); - broadcast(new PacketOutExRunEvent(event.getClass(), args)); + broadcast(event.getServer(), new PacketOutExRunEvent(event.getClass(), args)); } + @EventHandler(priority = Byte.MAX_VALUE) public void event(SubRemoveServerEvent event) { if (!event.isCancelled()) { diff --git a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Event/SubStartedEvent.java b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Event/SubStartedEvent.java new file mode 100644 index 00000000..c6731f14 --- /dev/null +++ b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Event/SubStartedEvent.java @@ -0,0 +1,40 @@ +package net.ME1312.SubServers.Client.Bukkit.Event; + +import net.ME1312.Galaxi.Library.Util; +import net.ME1312.SubServers.Client.Bukkit.Library.SubEvent; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +/** + * Server Started Event + */ +public class SubStartedEvent extends Event implements SubEvent { + private String server; + + /** + * Server Started Event
+ * This event can only be called when a SubData connection is made! + * + * @param server Server that Started + */ + public SubStartedEvent(String server) { + if (Util.isNull(server)) throw new NullPointerException(); + this.server = server; + } + + /** + * Gets the Server Effected + * + * @return The Server Effected + */ + public String getServer() { return server; } + + @Override + public HandlerList getHandlers() { + return handlers; + } + public static HandlerList getHandlerList() { + return handlers; + } + private static HandlerList handlers = new HandlerList(); +} diff --git a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/Packet/PacketInExRunEvent.java b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/Packet/PacketInExRunEvent.java index 8374201f..80fb748e 100644 --- a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/Packet/PacketInExRunEvent.java +++ b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/Packet/PacketInExRunEvent.java @@ -89,6 +89,15 @@ public void run(ObjectMap data) { } } }); + callback("SubStartedEvent", new Callback>() { + @Override + public void run(ObjectMap data) { + if (plugin.isEnabled()) { + Bukkit.getPluginManager().callEvent(new SubStartedEvent(data.getString("server"))); + callback("SubStartedEvent", this); + } + } + }); callback("SubStopEvent", new Callback>() { @Override public void run(ObjectMap data) { diff --git a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubStartedEvent.java b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubStartedEvent.java new file mode 100644 index 00000000..ae2165b3 --- /dev/null +++ b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubStartedEvent.java @@ -0,0 +1,43 @@ +package net.ME1312.SubServers.Client.Sponge.Event; + +import net.ME1312.Galaxi.Library.Util; +import net.ME1312.SubServers.Client.Sponge.Library.SubEvent; +import org.spongepowered.api.event.cause.Cause; +import org.spongepowered.api.event.impl.AbstractEvent; + +/** + * Server Started Event + */ +public class SubStartedEvent extends AbstractEvent implements SubEvent { + private String server; + + /** + * Server Started Event
+ * This event can only be called when a SubData connection is made! + * + * @param server Server that Started + */ + public SubStartedEvent(String server) { + if (Util.isNull(server)) throw new NullPointerException(); + this.server = server; + } + + /** + * Gets the Server Effected + * + * @return The Server Effected + */ + public String getServer() { return server; } + + /** + * Gets the cause of this Event + * + * @deprecated Use simplified methods where available + * @return An empty cause list + */ + @Override + @Deprecated + public Cause getCause() { + return Cause.builder().build(getContext()); + } +} diff --git a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Network/Packet/PacketInExRunEvent.java b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Network/Packet/PacketInExRunEvent.java index b5d455c2..1ad63b2f 100644 --- a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Network/Packet/PacketInExRunEvent.java +++ b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Network/Packet/PacketInExRunEvent.java @@ -75,6 +75,13 @@ public void run(ObjectMap data) { callback("SubStartEvent", this); } }); + callback("SubStartedEvent", new Callback>() { + @Override + public void run(ObjectMap data) { + Sponge.getEventManager().post(new SubStartedEvent(data.getString("server"))); + callback("SubStartedEvent", this); + } + }); callback("SubStopEvent", new Callback>() { @Override public void run(ObjectMap data) { diff --git a/SubServers.Host/src/net/ME1312/SubServers/Host/Event/SubStartedEvent.java b/SubServers.Host/src/net/ME1312/SubServers/Host/Event/SubStartedEvent.java new file mode 100644 index 00000000..3faeb8bd --- /dev/null +++ b/SubServers.Host/src/net/ME1312/SubServers/Host/Event/SubStartedEvent.java @@ -0,0 +1,31 @@ +package net.ME1312.SubServers.Host.Event; + +import net.ME1312.Galaxi.Library.Event.Event; +import net.ME1312.Galaxi.Library.Util; + +/** + * Server Started Event + */ +public class SubStartedEvent extends Event { + private String server; + + /** + * Server Started Event
+ * This event can only be called when a SubData connection is made! + * + * @param server Server that Started + */ + public SubStartedEvent(String server) { + if (Util.isNull(server)) throw new NullPointerException(); + this.server = server; + } + + /** + * Gets the Server Effected + * + * @return The Server Effected + */ + public String getServer() { + return server; + } +} diff --git a/SubServers.Host/src/net/ME1312/SubServers/Host/Network/Packet/PacketInExRunEvent.java b/SubServers.Host/src/net/ME1312/SubServers/Host/Network/Packet/PacketInExRunEvent.java index ef4db73c..d19993b4 100644 --- a/SubServers.Host/src/net/ME1312/SubServers/Host/Network/Packet/PacketInExRunEvent.java +++ b/SubServers.Host/src/net/ME1312/SubServers/Host/Network/Packet/PacketInExRunEvent.java @@ -73,6 +73,13 @@ public void run(ObjectMap data) { callback("SubStartEvent", this); } }); + callback("SubStartedEvent", new Callback>() { + @Override + public void run(ObjectMap data) { + GalaxiEngine.getInstance().getPluginManager().executeEvent(new SubStartedEvent(data.getRawString("server"))); + callback("SubStartedEvent", this); + } + }); callback("SubStopEvent", new Callback>() { @Override public void run(ObjectMap data) { diff --git a/SubServers.Sync/src/net/ME1312/SubServers/Sync/Event/SubStartedEvent.java b/SubServers.Sync/src/net/ME1312/SubServers/Sync/Event/SubStartedEvent.java new file mode 100644 index 00000000..aec5e61c --- /dev/null +++ b/SubServers.Sync/src/net/ME1312/SubServers/Sync/Event/SubStartedEvent.java @@ -0,0 +1,32 @@ +package net.ME1312.SubServers.Sync.Event; + +import net.ME1312.Galaxi.Library.Util; +import net.ME1312.SubServers.Sync.Library.SubEvent; +import net.md_5.bungee.api.plugin.Event; + +/** + * Server Started Event + */ +public class SubStartedEvent extends Event implements SubEvent { + private String server; + + /** + * Server Started Event
+ * This event can only be called when a SubData connection is made! + * + * @param server Server that Started + */ + public SubStartedEvent(String server) { + if (Util.isNull(server)) throw new NullPointerException(); + this.server = server; + } + + /** + * Gets the Server Effected + * + * @return The Server Effected + */ + public String getServer() { + return server; + } +} diff --git a/SubServers.Sync/src/net/ME1312/SubServers/Sync/Network/Packet/PacketInExRunEvent.java b/SubServers.Sync/src/net/ME1312/SubServers/Sync/Network/Packet/PacketInExRunEvent.java index fb4edfe2..453e28e5 100644 --- a/SubServers.Sync/src/net/ME1312/SubServers/Sync/Network/Packet/PacketInExRunEvent.java +++ b/SubServers.Sync/src/net/ME1312/SubServers/Sync/Network/Packet/PacketInExRunEvent.java @@ -75,6 +75,13 @@ public void run(ObjectMap data) { callback("SubStartEvent", this); } }); + callback("SubStartedEvent", new Callback>() { + @Override + public void run(ObjectMap data) { + ProxyServer.getInstance().getPluginManager().callEvent(new SubStartedEvent(data.getRawString("server"))); + callback("SubStartedEvent", this); + } + }); callback("SubNetworkConnectEvent", new Callback>() { @Override public void run(ObjectMap data) { diff --git a/pom.xml b/pom.xml index 4f9d8f94..469e58b6 100644 --- a/pom.xml +++ b/pom.xml @@ -13,5 +13,6 @@ SubServers.Console SubServers.Host SubServers.Sync + SubServers.Test \ No newline at end of file