2017-04-01 07:37:48 +02:00
|
|
|
package net.ME1312.SubServers.Bungee.Host.External;
|
|
|
|
|
|
|
|
import net.ME1312.SubServers.Bungee.Event.SubAddServerEvent;
|
|
|
|
import net.ME1312.SubServers.Bungee.Event.SubRemoveServerEvent;
|
|
|
|
import net.ME1312.SubServers.Bungee.Host.Executable;
|
|
|
|
import net.ME1312.SubServers.Bungee.Host.Host;
|
|
|
|
import net.ME1312.SubServers.Bungee.Host.SubCreator;
|
|
|
|
import net.ME1312.SubServers.Bungee.Host.SubServer;
|
2018-04-15 03:53:51 +02:00
|
|
|
import net.ME1312.SubServers.Bungee.Library.Callback;
|
2017-04-24 18:28:16 +02:00
|
|
|
import net.ME1312.SubServers.Bungee.Library.Config.YAMLSection;
|
2017-04-01 07:37:48 +02:00
|
|
|
import net.ME1312.SubServers.Bungee.Library.Exception.InvalidServerException;
|
|
|
|
import net.ME1312.SubServers.Bungee.Library.NamedContainer;
|
|
|
|
import net.ME1312.SubServers.Bungee.Library.Util;
|
|
|
|
import net.ME1312.SubServers.Bungee.Network.Client;
|
|
|
|
import net.ME1312.SubServers.Bungee.Network.ClientHandler;
|
|
|
|
import net.ME1312.SubServers.Bungee.Network.Packet.PacketExAddServer;
|
2017-04-01 18:50:09 +02:00
|
|
|
import net.ME1312.SubServers.Bungee.Network.Packet.PacketExDeleteServer;
|
2017-04-01 07:37:48 +02:00
|
|
|
import net.ME1312.SubServers.Bungee.Network.Packet.PacketExRemoveServer;
|
2017-04-01 22:31:57 +02:00
|
|
|
import net.ME1312.SubServers.Bungee.Network.Packet.PacketOutReset;
|
2017-04-01 07:37:48 +02:00
|
|
|
import net.ME1312.SubServers.Bungee.Network.PacketOut;
|
|
|
|
import net.ME1312.SubServers.Bungee.SubPlugin;
|
|
|
|
|
|
|
|
import java.net.InetAddress;
|
|
|
|
import java.util.*;
|
|
|
|
|
2017-04-16 19:02:14 +02:00
|
|
|
/**
|
|
|
|
* External Host Class
|
|
|
|
*/
|
2017-04-01 07:37:48 +02:00
|
|
|
public class ExternalHost extends Host implements ClientHandler {
|
|
|
|
private HashMap<String, SubServer> servers = new HashMap<String, SubServer>();
|
|
|
|
private String name;
|
|
|
|
private boolean enabled;
|
|
|
|
private InetAddress address;
|
|
|
|
private SubCreator creator;
|
|
|
|
private String directory;
|
2017-07-25 21:27:40 +02:00
|
|
|
protected NamedContainer<Boolean, Client> client;
|
2017-04-01 07:37:48 +02:00
|
|
|
private LinkedList<PacketOut> queue;
|
2017-04-01 22:31:57 +02:00
|
|
|
private boolean clean;
|
2017-04-01 07:37:48 +02:00
|
|
|
protected SubPlugin plugin;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Creates an External Host
|
|
|
|
*
|
|
|
|
* @param plugin Plugin
|
|
|
|
* @param name Name
|
|
|
|
* @param enabled Enabled Status
|
|
|
|
* @param address Address
|
|
|
|
* @param directory Directory
|
|
|
|
* @param gitBash Git Bash Location
|
|
|
|
*/
|
|
|
|
public ExternalHost(SubPlugin plugin, String name, Boolean enabled, InetAddress address, String directory, String gitBash) {
|
|
|
|
super(plugin, name, enabled, address, directory, gitBash);
|
|
|
|
if (Util.isNull(plugin, name, enabled, address, directory, gitBash)) throw new NullPointerException();
|
|
|
|
this.plugin = plugin;
|
|
|
|
this.name = name;
|
|
|
|
this.enabled = enabled;
|
|
|
|
this.address = address;
|
2017-08-17 01:29:02 +02:00
|
|
|
this.client = new NamedContainer<Boolean, Client>(false, null);
|
2017-04-01 07:37:48 +02:00
|
|
|
this.creator = new ExternalSubCreator(this, gitBash);
|
|
|
|
this.directory = directory;
|
|
|
|
this.queue = new LinkedList<PacketOut>();
|
2017-04-01 22:31:57 +02:00
|
|
|
this.clean = false;
|
2017-04-01 07:37:48 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2017-06-30 15:36:16 +02:00
|
|
|
public Client getSubData() {
|
2017-04-01 07:37:48 +02:00
|
|
|
return client.get();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2017-06-30 15:36:16 +02:00
|
|
|
public void setSubData(Client client) {
|
|
|
|
this.client = new NamedContainer<Boolean, Client>(false, client);
|
2017-07-21 22:45:41 +02:00
|
|
|
if (client != null && (client.getHandler() == null || !equals(client.getHandler()))) client.setHandler(this);
|
2017-04-01 07:37:48 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
protected void queue(PacketOut... packet) {
|
|
|
|
for (PacketOut p : packet) if (client.get() == null || client.name() == false) {
|
|
|
|
queue.add(p);
|
|
|
|
} else {
|
|
|
|
client.get().sendPacket(p);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
private void requeue() {
|
2017-04-01 22:31:57 +02:00
|
|
|
if (!clean) {
|
|
|
|
client.get().sendPacket(new PacketOutReset("Prevent Desync"));
|
|
|
|
clean = true;
|
|
|
|
}
|
2017-04-01 07:37:48 +02:00
|
|
|
for (SubServer server : servers.values()) {
|
2017-04-24 18:28:16 +02:00
|
|
|
client.get().sendPacket(new PacketExAddServer(server.getName(), server.isEnabled(), server.isLogging(), server.getPath(), ((ExternalSubServer) server).exec, server.getStopCommand(), (server.isRunning())?((ExternalSubLogger) server.getLogger()).getExternalAddress():null));
|
2017-04-01 07:37:48 +02:00
|
|
|
}
|
|
|
|
while (queue.size() != 0) {
|
|
|
|
client.get().sendPacket(queue.get(0));
|
|
|
|
queue.remove(0);
|
|
|
|
}
|
|
|
|
client.rename(true);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean isEnabled() {
|
2017-08-18 11:58:06 +02:00
|
|
|
return enabled && this.client.name();
|
2017-04-01 07:37:48 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void setEnabled(boolean value) {
|
|
|
|
this.enabled = value;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public InetAddress getAddress() {
|
|
|
|
return address;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2017-04-24 18:28:16 +02:00
|
|
|
public String getPath() {
|
2017-04-01 07:37:48 +02:00
|
|
|
return directory;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public String getName() {
|
|
|
|
return name;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public SubCreator getCreator() {
|
|
|
|
return creator;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public Map<String, ? extends SubServer> getSubServers() {
|
|
|
|
return new TreeMap<String, SubServer>(servers);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public SubServer getSubServer(String name) {
|
|
|
|
if (Util.isNull(name)) throw new NullPointerException();
|
|
|
|
return getSubServers().get(name.toLowerCase());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2018-01-29 07:04:36 +01:00
|
|
|
public SubServer addSubServer(UUID player, String name, boolean enabled, int port, String motd, boolean log, String directory, Executable executable, String stopcmd, boolean hidden, boolean restricted, boolean temporary) throws InvalidServerException {
|
2017-04-01 07:37:48 +02:00
|
|
|
if (plugin.api.getServers().keySet().contains(name.toLowerCase())) throw new InvalidServerException("A Server already exists with this name!");
|
2018-01-29 07:04:36 +01:00
|
|
|
SubServer server = new ExternalSubServer(this, name, enabled, port, motd, log, directory, executable, stopcmd, hidden, restricted);
|
2017-04-01 07:37:48 +02:00
|
|
|
SubAddServerEvent event = new SubAddServerEvent(player, this, server);
|
|
|
|
plugin.getPluginManager().callEvent(event);
|
|
|
|
if (!event.isCancelled()) {
|
2018-04-15 03:53:51 +02:00
|
|
|
queue(new PacketExAddServer(name, enabled, log, directory, executable, stopcmd, (server.isRunning())?((ExternalSubLogger) server.getLogger()).getExternalAddress():null, data -> {
|
|
|
|
if (data.getInt("r") == 0) {
|
2018-01-29 07:04:36 +01:00
|
|
|
if (temporary && server.start()) server.setTemporary(true);
|
2017-04-01 07:37:48 +02:00
|
|
|
}
|
|
|
|
}));
|
2017-08-22 15:02:23 +02:00
|
|
|
servers.put(name.toLowerCase(), server);
|
2017-04-01 07:37:48 +02:00
|
|
|
return server;
|
|
|
|
} else {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean removeSubServer(UUID player, String name) throws InterruptedException {
|
|
|
|
if (Util.isNull(name)) throw new NullPointerException();
|
|
|
|
SubRemoveServerEvent event = new SubRemoveServerEvent(player, this, getSubServer(name));
|
|
|
|
plugin.getPluginManager().callEvent(event);
|
|
|
|
if (!event.isCancelled()) {
|
|
|
|
if (getSubServer(name).isRunning()) {
|
|
|
|
getSubServer(name).stop();
|
|
|
|
getSubServer(name).waitFor();
|
|
|
|
}
|
2018-04-15 03:53:51 +02:00
|
|
|
queue(new PacketExRemoveServer(name, data -> {
|
|
|
|
if (data.getInt("r") == 0) {
|
2017-12-11 18:52:35 +01:00
|
|
|
List<String> groups = new ArrayList<String>();
|
|
|
|
groups.addAll(getSubServer(name).getGroups());
|
|
|
|
for (String group : groups) getSubServer(name).removeGroup(group);
|
2017-08-26 07:19:59 +02:00
|
|
|
servers.remove(name.toLowerCase());
|
|
|
|
}
|
2017-04-01 07:37:48 +02:00
|
|
|
}));
|
|
|
|
return true;
|
|
|
|
} else return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean forceRemoveSubServer(UUID player, String name) {
|
|
|
|
if (Util.isNull(name)) throw new NullPointerException();
|
|
|
|
SubRemoveServerEvent event = new SubRemoveServerEvent(player, this, getSubServer(name));
|
|
|
|
plugin.getPluginManager().callEvent(event);
|
2017-04-24 18:28:16 +02:00
|
|
|
if (getSubServer(name).isRunning()) {
|
|
|
|
getSubServer(name).terminate();
|
|
|
|
}
|
2018-04-15 03:53:51 +02:00
|
|
|
queue(new PacketExRemoveServer(name, data -> {
|
|
|
|
if (data.getInt("r") == 0) {
|
2017-08-26 07:19:59 +02:00
|
|
|
for (String group : getSubServer(name).getGroups()) getSubServer(name).removeGroup(group);
|
|
|
|
servers.remove(name.toLowerCase());
|
|
|
|
}
|
2017-04-24 18:28:16 +02:00
|
|
|
}));
|
|
|
|
return true;
|
2017-04-01 07:37:48 +02:00
|
|
|
}
|
2017-04-01 18:50:09 +02:00
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean deleteSubServer(UUID player, String name) throws InterruptedException {
|
|
|
|
if (Util.isNull(name)) throw new NullPointerException();
|
2017-04-14 04:39:51 +02:00
|
|
|
String server = servers.get(name.toLowerCase()).getName();
|
2017-04-01 18:50:09 +02:00
|
|
|
|
2017-04-14 04:39:51 +02:00
|
|
|
SubRemoveServerEvent event = new SubRemoveServerEvent(player, this, getSubServer(server));
|
2017-04-01 18:50:09 +02:00
|
|
|
plugin.getPluginManager().callEvent(event);
|
|
|
|
if (!event.isCancelled()) {
|
2017-04-14 04:39:51 +02:00
|
|
|
if (getSubServer(server).isRunning()) {
|
|
|
|
getSubServer(server).stop();
|
|
|
|
getSubServer(server).waitFor();
|
2017-04-01 18:50:09 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
System.out.println("SubServers > Saving...");
|
2018-04-15 03:53:51 +02:00
|
|
|
YAMLSection info = (plugin.config.get().getSection("Servers").getKeys().contains(server))?plugin.config.get().getSection("Servers").getSection(server).clone():new YAMLSection();
|
|
|
|
info.set("Name", server);
|
|
|
|
info.set("Timestamp", Calendar.getInstance().getTime().getTime());
|
2017-04-01 18:50:09 +02:00
|
|
|
try {
|
2017-04-14 04:39:51 +02:00
|
|
|
if (plugin.config.get().getSection("Servers").getKeys().contains(server)) {
|
|
|
|
plugin.config.get().getSection("Servers").remove(server);
|
2017-04-01 18:50:09 +02:00
|
|
|
plugin.config.save();
|
|
|
|
}
|
|
|
|
} catch (Exception e) {
|
|
|
|
e.printStackTrace();
|
|
|
|
}
|
|
|
|
|
|
|
|
System.out.println("SubServers > Removing Files...");
|
2018-04-15 03:53:51 +02:00
|
|
|
queue(new PacketExDeleteServer(server, info, data -> {
|
|
|
|
if (data.getInt("r") == 0) {
|
2017-08-26 07:19:59 +02:00
|
|
|
for (String group : getSubServer(name).getGroups()) getSubServer(name).removeGroup(group);
|
2017-04-14 04:39:51 +02:00
|
|
|
servers.remove(server.toLowerCase());
|
2017-04-01 18:50:09 +02:00
|
|
|
System.out.println("SubServers > Done!");
|
|
|
|
} else {
|
|
|
|
System.out.println("SubServers > Couldn't remove server from memory. See " + getName() + " console for more details");
|
|
|
|
}
|
|
|
|
}));
|
|
|
|
return true;
|
|
|
|
} else return false;
|
|
|
|
}
|
2017-04-24 18:28:16 +02:00
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean forceDeleteSubServer(UUID player, String name) throws InterruptedException {
|
|
|
|
if (Util.isNull(name)) throw new NullPointerException();
|
|
|
|
String server = servers.get(name.toLowerCase()).getName();
|
|
|
|
|
|
|
|
SubRemoveServerEvent event = new SubRemoveServerEvent(player, this, getSubServer(server));
|
|
|
|
plugin.getPluginManager().callEvent(event);
|
|
|
|
if (getSubServer(server).isRunning()) {
|
|
|
|
getSubServer(server).terminate();
|
|
|
|
}
|
|
|
|
|
|
|
|
System.out.println("SubServers > Saving...");
|
2018-04-15 03:53:51 +02:00
|
|
|
YAMLSection info = (plugin.config.get().getSection("Servers").getKeys().contains(server))?plugin.config.get().getSection("Servers").getSection(server).clone():new YAMLSection();
|
|
|
|
info.set("Name", server);
|
|
|
|
info.set("Timestamp", Calendar.getInstance().getTime().getTime());
|
2017-04-24 18:28:16 +02:00
|
|
|
try {
|
|
|
|
if (plugin.config.get().getSection("Servers").getKeys().contains(server)) {
|
|
|
|
plugin.config.get().getSection("Servers").remove(server);
|
|
|
|
plugin.config.save();
|
|
|
|
}
|
|
|
|
} catch (Exception e) {
|
|
|
|
e.printStackTrace();
|
|
|
|
}
|
|
|
|
|
|
|
|
System.out.println("SubServers > Removing Files...");
|
2018-04-15 03:53:51 +02:00
|
|
|
queue(new PacketExDeleteServer(server, info, data -> {
|
|
|
|
if (data.getInt("r") == 0) {
|
2017-08-26 07:19:59 +02:00
|
|
|
for (String group : getSubServer(name).getGroups()) getSubServer(name).removeGroup(group);
|
2017-04-24 18:28:16 +02:00
|
|
|
servers.remove(server.toLowerCase());
|
|
|
|
System.out.println("SubServers > Done!");
|
|
|
|
} else {
|
|
|
|
System.out.println("SubServers > Couldn't remove server from memory. See " + getName() + " console for more details");
|
|
|
|
}
|
|
|
|
}));
|
|
|
|
return true;
|
|
|
|
}
|
2017-04-01 07:37:48 +02:00
|
|
|
}
|