2016-12-24 05:55:17 +01:00
|
|
|
package net.ME1312.SubServers.Bungee.Host.Internal;
|
2016-12-05 04:21:04 +01:00
|
|
|
|
2016-12-24 05:55:17 +01:00
|
|
|
import net.ME1312.SubServers.Bungee.Event.*;
|
2017-08-22 15:02:23 +02:00
|
|
|
import net.ME1312.SubServers.Bungee.Host.*;
|
2017-01-31 04:04:37 +01:00
|
|
|
import net.ME1312.SubServers.Bungee.Library.Config.YAMLSection;
|
2017-04-24 18:28:16 +02:00
|
|
|
import net.ME1312.SubServers.Bungee.Library.Config.YAMLValue;
|
2016-12-24 05:55:17 +01:00
|
|
|
import net.ME1312.SubServers.Bungee.Library.Container;
|
|
|
|
import net.ME1312.SubServers.Bungee.Library.Exception.InvalidServerException;
|
2017-01-21 17:49:37 +01:00
|
|
|
import net.ME1312.SubServers.Bungee.Library.NamedContainer;
|
2017-01-31 04:04:37 +01:00
|
|
|
import net.ME1312.SubServers.Bungee.Library.UniversalFile;
|
2017-01-30 21:22:36 +01:00
|
|
|
import net.ME1312.SubServers.Bungee.Library.Util;
|
2017-01-31 04:04:37 +01:00
|
|
|
import net.ME1312.SubServers.Bungee.Library.Version.Version;
|
2017-08-26 07:19:59 +02:00
|
|
|
import net.ME1312.SubServers.Bungee.SubAPI;
|
2017-01-31 04:04:37 +01:00
|
|
|
import net.ME1312.SubServers.Bungee.SubPlugin;
|
2017-04-24 18:28:16 +02:00
|
|
|
import org.json.JSONObject;
|
2016-12-05 04:21:04 +01:00
|
|
|
|
2017-01-31 04:04:37 +01:00
|
|
|
import java.io.*;
|
2017-08-22 15:02:23 +02:00
|
|
|
import java.lang.reflect.Field;
|
2017-07-21 22:45:41 +02:00
|
|
|
import java.util.ArrayList;
|
2017-01-21 17:49:37 +01:00
|
|
|
import java.util.LinkedList;
|
2017-07-21 22:45:41 +02:00
|
|
|
import java.util.List;
|
2016-12-05 04:21:04 +01:00
|
|
|
import java.util.UUID;
|
2017-01-31 04:04:37 +01:00
|
|
|
import java.util.jar.JarFile;
|
2016-12-05 04:21:04 +01:00
|
|
|
|
2017-01-07 20:06:54 +01:00
|
|
|
/**
|
|
|
|
* Internal SubServer Class
|
|
|
|
*/
|
2017-08-27 20:37:25 +02:00
|
|
|
public class InternalSubServer extends SubServerContainer {
|
2016-12-05 04:21:04 +01:00
|
|
|
private InternalHost host;
|
|
|
|
private boolean enabled;
|
2017-12-07 23:51:06 +01:00
|
|
|
private boolean editable;
|
2016-12-05 04:21:04 +01:00
|
|
|
private Container<Boolean> log;
|
2017-01-01 20:34:46 +01:00
|
|
|
private String dir;
|
2016-12-05 04:21:04 +01:00
|
|
|
private File directory;
|
|
|
|
private Executable executable;
|
|
|
|
private String stopcmd;
|
2017-01-21 17:49:37 +01:00
|
|
|
private LinkedList<LoggedCommand> history;
|
2016-12-05 04:21:04 +01:00
|
|
|
private Process process;
|
2017-01-09 20:37:57 +01:00
|
|
|
private InternalSubLogger logger;
|
2016-12-20 00:31:01 +01:00
|
|
|
private Thread thread;
|
2016-12-15 22:04:39 +01:00
|
|
|
private BufferedWriter command;
|
2016-12-05 04:21:04 +01:00
|
|
|
private boolean restart;
|
2016-12-15 22:04:39 +01:00
|
|
|
private boolean allowrestart;
|
2016-12-05 04:21:04 +01:00
|
|
|
private boolean temporary;
|
|
|
|
|
2017-01-07 20:06:54 +01:00
|
|
|
/**
|
|
|
|
* Creates an Internal SubServer
|
|
|
|
*
|
|
|
|
* @param host Host
|
|
|
|
* @param name Name
|
|
|
|
* @param enabled Enabled Status
|
|
|
|
* @param port Port Number
|
|
|
|
* @param motd MOTD
|
|
|
|
* @param log Logging Status
|
|
|
|
* @param directory Directory
|
|
|
|
* @param executable Executable String
|
|
|
|
* @param stopcmd Stop Command
|
|
|
|
* @param start Auto-Start
|
|
|
|
* @param restart Auto-Restart
|
|
|
|
* @param hidden Hidden Status
|
|
|
|
* @param restricted Restricted Status
|
|
|
|
* @param temporary Temporary Status
|
|
|
|
* @throws InvalidServerException
|
|
|
|
*/
|
|
|
|
public InternalSubServer(InternalHost host, String name, boolean enabled, int port, String motd, boolean log, String directory, Executable executable, String stopcmd, boolean start, boolean restart, boolean hidden, boolean restricted, boolean temporary) throws InvalidServerException {
|
2016-12-19 01:38:02 +01:00
|
|
|
super(host, name, port, motd, hidden, restricted);
|
2017-01-30 21:22:36 +01:00
|
|
|
if (Util.isNull(host, name, enabled, port, motd, log, directory, executable, stopcmd, start, restart, hidden, restricted, temporary)) throw new NullPointerException();
|
2017-01-07 20:06:54 +01:00
|
|
|
this.host = host;
|
2016-12-05 04:21:04 +01:00
|
|
|
this.enabled = enabled;
|
2017-12-07 23:51:06 +01:00
|
|
|
this.editable = false;
|
2016-12-05 04:21:04 +01:00
|
|
|
this.log = new Container<Boolean>(log);
|
2017-01-01 20:34:46 +01:00
|
|
|
this.dir = directory;
|
2017-04-24 18:28:16 +02:00
|
|
|
this.directory = new File(host.getPath(), directory);
|
2016-12-05 04:21:04 +01:00
|
|
|
this.executable = executable;
|
|
|
|
this.stopcmd = stopcmd;
|
2017-01-21 17:49:37 +01:00
|
|
|
this.history = new LinkedList<LoggedCommand>();
|
2016-12-05 04:21:04 +01:00
|
|
|
this.process = null;
|
2017-01-11 04:23:29 +01:00
|
|
|
this.logger = new InternalSubLogger(null, this, getName(), this.log, null);
|
2016-12-20 00:31:01 +01:00
|
|
|
this.thread = null;
|
2016-12-15 22:04:39 +01:00
|
|
|
this.command = null;
|
2016-12-05 04:21:04 +01:00
|
|
|
this.restart = restart;
|
2017-01-31 04:04:37 +01:00
|
|
|
|
|
|
|
if (new UniversalFile(this.directory, "plugins:SubServers.Client.jar").exists()) {
|
|
|
|
try {
|
|
|
|
JarFile jar = new JarFile(new UniversalFile(this.directory, "plugins:SubServers.Client.jar"));
|
|
|
|
YAMLSection plugin = new YAMLSection(Util.readAll(new InputStreamReader(jar.getInputStream(jar.getJarEntry("plugin.yml")))));
|
2017-05-29 07:00:02 +02:00
|
|
|
YAMLSection bplugin = new YAMLSection(Util.readAll(new InputStreamReader(SubPlugin.class.getResourceAsStream("/net/ME1312/SubServers/Bungee/Library/Files/Client/spigot.yml"))));
|
2017-01-31 04:04:37 +01:00
|
|
|
if (new Version(plugin.getString("version")).compareTo(new Version(bplugin.getString("version"))) < 0) {
|
|
|
|
new UniversalFile(this.directory, "plugins:SubServers.Client.jar").delete();
|
2017-05-29 07:00:02 +02:00
|
|
|
Util.copyFromJar(SubPlugin.class.getClassLoader(), "net/ME1312/SubServers/Bungee/Library/Files/Client/spigot.jar", new UniversalFile(this.directory, "plugins:SubServers.Client.jar").getPath());
|
2017-01-31 04:04:37 +01:00
|
|
|
}
|
|
|
|
} catch (Throwable e) {
|
|
|
|
System.out.println("Couldn't auto-update SubServers.Client.jar");
|
|
|
|
e.printStackTrace();
|
|
|
|
}
|
|
|
|
}
|
2017-01-21 17:49:37 +01:00
|
|
|
this.temporary = !((start || temporary) && !start()) && temporary;
|
2016-12-05 04:21:04 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
private void run() {
|
2017-01-06 21:44:34 +01:00
|
|
|
allowrestart = true;
|
|
|
|
try {
|
|
|
|
process = Runtime.getRuntime().exec(executable.toString(), null, directory);
|
|
|
|
System.out.println("SubServers > Now starting " + getName());
|
2017-01-09 20:37:57 +01:00
|
|
|
logger.process = process;
|
|
|
|
logger.start();
|
2017-01-06 21:44:34 +01:00
|
|
|
command = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
|
2017-01-21 17:49:37 +01:00
|
|
|
for (LoggedCommand command : history) if (process.isAlive()) {
|
|
|
|
this.command.write(command.getCommand());
|
|
|
|
this.command.newLine();
|
|
|
|
this.command.flush();
|
|
|
|
}
|
2016-12-05 04:21:04 +01:00
|
|
|
|
2017-01-21 17:49:37 +01:00
|
|
|
if (process.isAlive()) process.waitFor();
|
2017-01-06 21:44:34 +01:00
|
|
|
} catch (IOException | InterruptedException e) {
|
|
|
|
e.printStackTrace();
|
|
|
|
allowrestart = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
SubStoppedEvent event = new SubStoppedEvent(this);
|
|
|
|
host.plugin.getPluginManager().callEvent(event);
|
|
|
|
System.out.println("SubServers > " + getName() + " has stopped");
|
|
|
|
process = null;
|
|
|
|
command = null;
|
2017-01-21 17:49:37 +01:00
|
|
|
history.clear();
|
2016-12-05 04:21:04 +01:00
|
|
|
|
2017-01-06 21:44:34 +01:00
|
|
|
if (isTemporary()) {
|
|
|
|
try {
|
|
|
|
host.removeSubServer(getName());
|
|
|
|
} catch (InterruptedException e) {
|
|
|
|
e.printStackTrace();
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (willAutoRestart() && allowrestart) {
|
2017-01-26 23:19:48 +01:00
|
|
|
new Thread(() -> {
|
|
|
|
try {
|
|
|
|
while (thread != null && thread.isAlive()) {
|
|
|
|
Thread.sleep(250);
|
|
|
|
}
|
|
|
|
start();
|
|
|
|
} catch (InterruptedException e) {
|
|
|
|
e.printStackTrace();
|
|
|
|
}
|
|
|
|
}).start();
|
2016-12-05 04:21:04 +01:00
|
|
|
}
|
2017-01-06 21:44:34 +01:00
|
|
|
}
|
2016-12-05 04:21:04 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2016-12-19 01:38:02 +01:00
|
|
|
public boolean start(UUID player) {
|
2017-07-21 22:45:41 +02:00
|
|
|
if (isEnabled() && !(thread != null && thread.isAlive()) && getCurrentIncompatibilities().size() == 0) {
|
2016-12-15 22:04:39 +01:00
|
|
|
SubStartEvent event = new SubStartEvent(player, this);
|
2016-12-05 04:21:04 +01:00
|
|
|
host.plugin.getPluginManager().callEvent(event);
|
|
|
|
if (!event.isCancelled()) {
|
2017-01-21 17:49:37 +01:00
|
|
|
(thread = new Thread(this::run)).start();
|
2016-12-19 01:38:02 +01:00
|
|
|
return true;
|
|
|
|
} else return false;
|
|
|
|
} else return false;
|
2016-12-05 04:21:04 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2016-12-19 01:38:02 +01:00
|
|
|
public boolean stop(UUID player) {
|
2017-01-21 17:49:37 +01:00
|
|
|
if (thread != null && thread.isAlive()) {
|
2016-12-15 22:04:39 +01:00
|
|
|
SubStopEvent event = new SubStopEvent(player, this, false);
|
2016-12-05 04:21:04 +01:00
|
|
|
host.plugin.getPluginManager().callEvent(event);
|
|
|
|
if (!event.isCancelled()) {
|
2016-12-15 22:04:39 +01:00
|
|
|
try {
|
2016-12-19 01:38:02 +01:00
|
|
|
allowrestart = false;
|
2017-01-21 17:49:37 +01:00
|
|
|
history.add(new LoggedCommand(player, stopcmd));
|
|
|
|
if (process != null && process.isAlive()) {
|
|
|
|
command.write(stopcmd);
|
|
|
|
command.newLine();
|
|
|
|
command.flush();
|
|
|
|
}
|
2016-12-19 01:38:02 +01:00
|
|
|
return true;
|
2016-12-15 22:04:39 +01:00
|
|
|
} catch (IOException e) {
|
|
|
|
e.printStackTrace();
|
2016-12-19 01:38:02 +01:00
|
|
|
return false;
|
2016-12-15 22:04:39 +01:00
|
|
|
}
|
2016-12-19 01:38:02 +01:00
|
|
|
} else return false;
|
|
|
|
} else return false;
|
2016-12-05 04:21:04 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2016-12-19 01:38:02 +01:00
|
|
|
public boolean terminate(UUID player) {
|
2017-01-21 17:49:37 +01:00
|
|
|
if (thread != null && thread.isAlive()) {
|
2016-12-15 22:04:39 +01:00
|
|
|
SubStopEvent event = new SubStopEvent(player, this, true);
|
2016-12-05 04:21:04 +01:00
|
|
|
host.plugin.getPluginManager().callEvent(event);
|
|
|
|
if (!event.isCancelled()) {
|
2016-12-19 01:38:02 +01:00
|
|
|
allowrestart = false;
|
2017-01-21 17:49:37 +01:00
|
|
|
if (process != null && process.isAlive()) process.destroyForcibly();
|
2016-12-19 01:38:02 +01:00
|
|
|
return true;
|
|
|
|
} else return false;
|
|
|
|
} else return false;
|
2016-12-05 04:21:04 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2016-12-19 01:38:02 +01:00
|
|
|
public boolean command(UUID player, String command) {
|
2017-01-30 21:22:36 +01:00
|
|
|
if (Util.isNull(command)) throw new NullPointerException();
|
2017-01-21 17:49:37 +01:00
|
|
|
if (thread != null && thread.isAlive()) {
|
2016-12-15 22:04:39 +01:00
|
|
|
SubSendCommandEvent event = new SubSendCommandEvent(player, this, command);
|
2016-12-05 04:21:04 +01:00
|
|
|
host.plugin.getPluginManager().callEvent(event);
|
|
|
|
if (!event.isCancelled()) {
|
2016-12-15 22:04:39 +01:00
|
|
|
try {
|
2016-12-19 01:38:02 +01:00
|
|
|
if (event.getCommand().equalsIgnoreCase(stopcmd)) allowrestart = false;
|
2017-01-21 17:49:37 +01:00
|
|
|
history.add(new LoggedCommand(player, event.getCommand()));
|
|
|
|
if (process != null && process.isAlive()) {
|
|
|
|
this.command.write(event.getCommand());
|
|
|
|
this.command.newLine();
|
|
|
|
this.command.flush();
|
|
|
|
}
|
2016-12-19 01:38:02 +01:00
|
|
|
return true;
|
2016-12-15 22:04:39 +01:00
|
|
|
} catch (IOException e) {
|
|
|
|
e.printStackTrace();
|
2016-12-19 01:38:02 +01:00
|
|
|
return false;
|
2016-12-15 22:04:39 +01:00
|
|
|
}
|
2016-12-19 01:38:02 +01:00
|
|
|
} else return false;
|
|
|
|
} else return false;
|
2016-12-15 22:04:39 +01:00
|
|
|
}
|
|
|
|
|
2017-08-26 07:19:59 +02:00
|
|
|
@SuppressWarnings("deprecation")
|
2017-04-24 18:28:16 +02:00
|
|
|
public int edit(UUID player, YAMLSection edit) {
|
|
|
|
int c = 0;
|
|
|
|
boolean state = isRunning();
|
|
|
|
SubServer forward = null;
|
|
|
|
YAMLSection pending = edit.clone();
|
2017-12-07 23:51:06 +01:00
|
|
|
if (editable) for (String key : edit.getKeys()) {
|
2017-04-24 18:28:16 +02:00
|
|
|
pending.remove(key);
|
|
|
|
YAMLValue value = edit.get(key);
|
2017-08-22 15:02:23 +02:00
|
|
|
SubEditServerEvent event = new SubEditServerEvent(player, this, new NamedContainer<String, YAMLValue>(key, value), true);
|
2017-04-24 18:28:16 +02:00
|
|
|
host.plugin.getPluginManager().callEvent(event);
|
|
|
|
if (!event.isCancelled()) {
|
|
|
|
try {
|
|
|
|
switch (key) {
|
|
|
|
case "name":
|
|
|
|
if (value.isString() && host.removeSubServer(player, getName())) {
|
|
|
|
SubServer server = host.addSubServer(player, value.asRawString(), isEnabled(), getAddress().getPort(), getMotd(), isLogging(), getPath(), getExecutable(), getStopCommand(), false, willAutoRestart(), isHidden(), isRestricted(), isTemporary());
|
|
|
|
if (server != null) {
|
|
|
|
if (this.host.plugin.config.get().getSection("Servers").getKeys().contains(getName())) {
|
|
|
|
YAMLSection config = this.host.plugin.config.get().getSection("Servers").getSection(getName());
|
|
|
|
this.host.plugin.config.get().getSection("Servers").remove(getName());
|
|
|
|
this.host.plugin.config.get().getSection("Servers").set(server.getName(), config);
|
|
|
|
this.host.plugin.config.save();
|
|
|
|
}
|
|
|
|
forward = server;
|
|
|
|
c++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case "display":
|
|
|
|
if (value.isString()) {
|
2017-08-27 20:37:25 +02:00
|
|
|
Field f = ServerContainer.class.getDeclaredField("nick");
|
2017-08-22 15:02:23 +02:00
|
|
|
f.setAccessible(true);
|
|
|
|
if (value == null || value.asString().length() == 0 || getName().equals(value)) {
|
|
|
|
f.set(this, null);
|
|
|
|
} else {
|
|
|
|
f.set(this, value.asString());
|
|
|
|
}
|
|
|
|
f.setAccessible(false);
|
2017-12-09 09:43:29 +01:00
|
|
|
logger.name = getDisplayName();
|
2017-04-24 18:28:16 +02:00
|
|
|
if (this.host.plugin.config.get().getSection("Servers").getKeys().contains(getName())) {
|
|
|
|
if (getName().equals(getDisplayName())) {
|
2017-12-09 09:43:29 +01:00
|
|
|
this.host.plugin.config.get().getSection("Servers").getSection(getName()).remove("Display");
|
2017-04-24 18:28:16 +02:00
|
|
|
} else {
|
2017-12-09 09:43:29 +01:00
|
|
|
this.host.plugin.config.get().getSection("Servers").getSection(getName()).set("Display", getDisplayName());
|
2017-04-24 18:28:16 +02:00
|
|
|
}
|
|
|
|
this.host.plugin.config.save();
|
|
|
|
}
|
|
|
|
c++;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case "enabled":
|
|
|
|
if (value.isBoolean()) {
|
2017-08-22 15:02:23 +02:00
|
|
|
enabled = value.asBoolean();
|
2017-04-24 18:28:16 +02:00
|
|
|
if (this.host.plugin.config.get().getSection("Servers").getKeys().contains(getName())) {
|
|
|
|
this.host.plugin.config.get().getSection("Servers").getSection(getName()).set("Enabled", isEnabled());
|
|
|
|
this.host.plugin.config.save();
|
|
|
|
}
|
|
|
|
c++;
|
|
|
|
}
|
|
|
|
break;
|
2017-08-26 07:19:59 +02:00
|
|
|
case "group":
|
|
|
|
if (value.isList()) {
|
2017-12-09 09:43:29 +01:00
|
|
|
Field f = ServerContainer.class.getDeclaredField("groups");
|
|
|
|
f.setAccessible(true);
|
|
|
|
f.set(this, value.asStringList());
|
|
|
|
f.setAccessible(false);
|
2017-08-26 07:19:59 +02:00
|
|
|
if (this.host.plugin.config.get().getSection("Servers").getKeys().contains(getName())) {
|
|
|
|
this.host.plugin.config.get().getSection("Servers").getSection(getName()).set("Group", value.asStringList());
|
|
|
|
this.host.plugin.config.save();
|
|
|
|
}
|
|
|
|
c++;
|
|
|
|
}
|
|
|
|
break;
|
2017-04-24 18:28:16 +02:00
|
|
|
case "host":
|
|
|
|
if (value.isString() && host.removeSubServer(player, getName())) {
|
|
|
|
SubServer server = this.host.plugin.api.getHost(value.asRawString()).addSubServer(player, getName(), isEnabled(), getAddress().getPort(), getMotd(), isLogging(), getPath(), getExecutable(), getStopCommand(), false, willAutoRestart(), isHidden(), isRestricted(), isTemporary());
|
|
|
|
if (server != null) {
|
|
|
|
if (this.host.plugin.config.get().getSection("Servers").getKeys().contains(getName())) {
|
|
|
|
this.host.plugin.config.get().getSection("Servers").getSection(getName()).set("Host", server.getHost().getName());
|
|
|
|
this.host.plugin.config.save();
|
|
|
|
}
|
|
|
|
forward = server;
|
|
|
|
c++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case "port":
|
|
|
|
if (value.isInt() && host.removeSubServer(player, getName())) {
|
|
|
|
SubServer server = host.addSubServer(player, getName(), isEnabled(), value.asInt(), getMotd(), isLogging(), getPath(), getExecutable(), getStopCommand(), false, willAutoRestart(), isHidden(), isRestricted(), isTemporary());
|
|
|
|
if (server != null) {
|
|
|
|
if (this.host.plugin.config.get().getSection("Servers").getKeys().contains(getName())) {
|
|
|
|
this.host.plugin.config.get().getSection("Servers").getSection(getName()).set("Port", server.getAddress().getPort());
|
|
|
|
this.host.plugin.config.save();
|
|
|
|
}
|
|
|
|
forward = server;
|
|
|
|
c++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case "motd":
|
|
|
|
if (value.isString()) {
|
2017-08-27 20:37:25 +02:00
|
|
|
Field f = ServerContainer.class.getDeclaredField("motd");
|
2017-08-22 15:02:23 +02:00
|
|
|
f.setAccessible(true);
|
|
|
|
f.set(this, value.asColoredString('&'));
|
|
|
|
f.setAccessible(false);
|
2017-04-24 18:28:16 +02:00
|
|
|
if (this.host.plugin.config.get().getSection("Servers").getKeys().contains(getName())) {
|
|
|
|
this.host.plugin.config.get().getSection("Servers").getSection(getName()).set("Motd", value.asString());
|
|
|
|
this.host.plugin.config.save();
|
|
|
|
}
|
|
|
|
c++;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case "log":
|
|
|
|
if (value.isBoolean()) {
|
2017-08-22 15:02:23 +02:00
|
|
|
log.set(value.asBoolean());
|
2017-04-24 18:28:16 +02:00
|
|
|
if (this.host.plugin.config.get().getSection("Servers").getKeys().contains(getName())) {
|
|
|
|
this.host.plugin.config.get().getSection("Servers").getSection(getName()).set("Log", isLogging());
|
|
|
|
this.host.plugin.config.save();
|
|
|
|
}
|
|
|
|
c++;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case "dir":
|
|
|
|
if (value.isString()) {
|
|
|
|
if (isRunning()) {
|
|
|
|
stop(player);
|
|
|
|
waitFor();
|
|
|
|
}
|
|
|
|
dir = value.asString();
|
|
|
|
directory = new File(getHost().getPath(), value.asRawString());
|
|
|
|
if (this.host.plugin.config.get().getSection("Servers").getKeys().contains(getName())) {
|
|
|
|
this.host.plugin.config.get().getSection("Servers").getSection(getName()).set("Directory", getPath());
|
|
|
|
this.host.plugin.config.save();
|
|
|
|
}
|
|
|
|
c++;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case "exec":
|
|
|
|
if (value.isString()) {
|
|
|
|
if (isRunning()) {
|
|
|
|
stop(player);
|
|
|
|
waitFor();
|
|
|
|
}
|
|
|
|
executable = new Executable(value.asRawString());
|
|
|
|
if (this.host.plugin.config.get().getSection("Servers").getKeys().contains(getName())) {
|
|
|
|
this.host.plugin.config.get().getSection("Servers").getSection(getName()).set("Executable", value.asRawString());
|
|
|
|
this.host.plugin.config.save();
|
|
|
|
}
|
|
|
|
c++;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case "stop-cmd":
|
|
|
|
if (value.isString()) {
|
2017-08-22 15:02:23 +02:00
|
|
|
stopcmd = value.asRawString();
|
2017-04-24 18:28:16 +02:00
|
|
|
if (this.host.plugin.config.get().getSection("Servers").getKeys().contains(getName())) {
|
|
|
|
this.host.plugin.config.get().getSection("Servers").getSection(getName()).set("Stop-Command", getStopCommand());
|
|
|
|
this.host.plugin.config.save();
|
|
|
|
}
|
|
|
|
c++;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case "state":
|
|
|
|
if (value.isBoolean()) {
|
|
|
|
state = value.asBoolean();
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case "auto-run":
|
|
|
|
if (value.isBoolean()) {
|
|
|
|
if (this.host.plugin.config.get().getSection("Servers").getKeys().contains(getName())) {
|
|
|
|
this.host.plugin.config.get().getSection("Servers").getSection(getName()).set("Run-On-Launch", value.asBoolean());
|
|
|
|
this.host.plugin.config.save();
|
|
|
|
}
|
|
|
|
c++;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case "auto-restart":
|
|
|
|
if (value.isBoolean()) {
|
2017-08-22 15:02:23 +02:00
|
|
|
restart = value.asBoolean();
|
2017-04-24 18:28:16 +02:00
|
|
|
if (this.host.plugin.config.get().getSection("Servers").getKeys().contains(getName())) {
|
|
|
|
this.host.plugin.config.get().getSection("Servers").getSection(getName()).set("Auto-Restart", willAutoRestart());
|
|
|
|
this.host.plugin.config.save();
|
|
|
|
}
|
|
|
|
c++;
|
|
|
|
}
|
|
|
|
break;
|
2017-12-09 09:43:29 +01:00
|
|
|
case "incompatible":
|
|
|
|
if (value.isList()) {
|
|
|
|
for (String oname : value.asStringList()) {
|
|
|
|
SubServer oserver = host.plugin.api.getSubServer(oname);
|
|
|
|
if (oserver != null && isCompatible(oserver)) toggleCompatibility(oserver);
|
|
|
|
}
|
|
|
|
if (this.host.plugin.config.get().getSection("Servers").getKeys().contains(getName())) {
|
|
|
|
this.host.plugin.config.get().getSection("Servers").getSection(getName()).set("Incompatible", value.asStringList());
|
|
|
|
this.host.plugin.config.save();
|
|
|
|
}
|
|
|
|
c++;
|
|
|
|
}
|
|
|
|
break;
|
2017-04-24 18:28:16 +02:00
|
|
|
case "restricted":
|
|
|
|
if (value.isBoolean()) {
|
2017-08-27 20:37:25 +02:00
|
|
|
Field f = ServerContainer.class.getDeclaredField("restricted");
|
2017-08-22 15:02:23 +02:00
|
|
|
f.setAccessible(true);
|
|
|
|
f.set(this, value.asBoolean());
|
|
|
|
f.setAccessible(false);
|
2017-04-24 18:28:16 +02:00
|
|
|
if (this.host.plugin.config.get().getSection("Servers").getKeys().contains(getName())) {
|
|
|
|
this.host.plugin.config.get().getSection("Servers").getSection(getName()).set("Restricted", isRestricted());
|
|
|
|
this.host.plugin.config.save();
|
|
|
|
}
|
|
|
|
c++;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case "hidden":
|
|
|
|
if (value.isBoolean()) {
|
2017-08-27 20:37:25 +02:00
|
|
|
Field f = ServerContainer.class.getDeclaredField("hidden");
|
2017-08-22 15:02:23 +02:00
|
|
|
f.setAccessible(true);
|
|
|
|
f.set(this, value.asBoolean());
|
|
|
|
f.setAccessible(false);
|
2017-04-24 18:28:16 +02:00
|
|
|
if (this.host.plugin.config.get().getSection("Servers").getKeys().contains(getName())) {
|
|
|
|
this.host.plugin.config.get().getSection("Servers").getSection(getName()).set("Hidden", isHidden());
|
|
|
|
this.host.plugin.config.save();
|
|
|
|
}
|
|
|
|
c++;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (forward != null) {
|
2017-12-09 09:43:29 +01:00
|
|
|
if (!getName().equals(getDisplayName())) forward.setDisplayName(getDisplayName());
|
|
|
|
List<String> groups = new ArrayList<String>();
|
|
|
|
groups.addAll(getGroups());
|
|
|
|
for (String group : groups) {
|
|
|
|
removeGroup(group);
|
|
|
|
forward.addGroup(group);
|
|
|
|
}
|
|
|
|
for (SubServer server : getIncompatibilities()) {
|
|
|
|
toggleCompatibility(server);
|
|
|
|
forward.toggleCompatibility(server);
|
|
|
|
}
|
|
|
|
for (String extra : getExtra().getKeys()) forward.addExtra(extra, getExtra(extra));
|
|
|
|
|
|
|
|
forward.setEditable(true);
|
2017-04-24 18:28:16 +02:00
|
|
|
if (state) pending.set("state", true);
|
|
|
|
c += forward.edit(player, pending);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
} catch (Exception e) {
|
|
|
|
e.printStackTrace();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!isRunning() && forward == null && state) start(player);
|
|
|
|
return c;
|
|
|
|
}
|
|
|
|
|
2016-12-05 04:21:04 +01:00
|
|
|
@Override
|
|
|
|
public void waitFor() throws InterruptedException {
|
2016-12-20 00:31:01 +01:00
|
|
|
while (thread != null && thread.isAlive()) {
|
|
|
|
Thread.sleep(250);
|
2016-12-05 04:21:04 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean isRunning() {
|
|
|
|
return process != null && process.isAlive();
|
|
|
|
}
|
|
|
|
|
2017-01-26 23:19:48 +01:00
|
|
|
@Override
|
|
|
|
public void setDisplayName(String value) {
|
|
|
|
super.setDisplayName(value);
|
|
|
|
logger.name = getDisplayName();
|
|
|
|
}
|
|
|
|
|
2016-12-05 04:21:04 +01:00
|
|
|
@Override
|
|
|
|
public Host getHost() {
|
|
|
|
return host;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean isEnabled() {
|
|
|
|
return enabled;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void setEnabled(boolean value) {
|
2017-01-30 21:22:36 +01:00
|
|
|
if (Util.isNull(value)) throw new NullPointerException();
|
2017-08-22 15:02:23 +02:00
|
|
|
new SubEditServerEvent(null, this, new NamedContainer<String, Object>("enabled", value), false);
|
2016-12-05 04:21:04 +01:00
|
|
|
enabled = value;
|
|
|
|
}
|
|
|
|
|
2017-12-07 23:51:06 +01:00
|
|
|
@Override
|
|
|
|
public boolean isEditable() {
|
|
|
|
return editable;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void setEditable(boolean value) {
|
|
|
|
editable = value;
|
|
|
|
}
|
|
|
|
|
2016-12-05 04:21:04 +01:00
|
|
|
@Override
|
|
|
|
public boolean isLogging() {
|
|
|
|
return log.get();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void setLogging(boolean value) {
|
2017-01-30 21:22:36 +01:00
|
|
|
if (Util.isNull(value)) throw new NullPointerException();
|
2017-08-22 15:02:23 +02:00
|
|
|
new SubEditServerEvent(null, this, new NamedContainer<String, Object>("log", value), false);
|
2016-12-05 04:21:04 +01:00
|
|
|
log.set(value);
|
|
|
|
}
|
|
|
|
|
2017-01-09 20:37:57 +01:00
|
|
|
@Override
|
|
|
|
public SubLogger getLogger() {
|
|
|
|
return logger;
|
|
|
|
}
|
|
|
|
|
2017-01-21 17:49:37 +01:00
|
|
|
@Override
|
|
|
|
public LinkedList<LoggedCommand> getCommandHistory() {
|
|
|
|
return new LinkedList<LoggedCommand>(history);
|
|
|
|
}
|
|
|
|
|
2017-01-01 20:34:46 +01:00
|
|
|
@Override
|
2017-04-24 18:28:16 +02:00
|
|
|
public String getPath() {
|
2017-01-01 20:34:46 +01:00
|
|
|
return dir;
|
|
|
|
}
|
|
|
|
|
2017-04-24 18:28:16 +02:00
|
|
|
@Override
|
|
|
|
public Executable getExecutable() {
|
|
|
|
return executable;
|
|
|
|
}
|
|
|
|
|
2016-12-05 04:21:04 +01:00
|
|
|
@Override
|
|
|
|
public String getStopCommand() {
|
|
|
|
return stopcmd;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void setStopCommand(String value) {
|
2017-01-30 21:22:36 +01:00
|
|
|
if (Util.isNull(value)) throw new NullPointerException();
|
2017-08-22 15:02:23 +02:00
|
|
|
new SubEditServerEvent(null, this, new NamedContainer<String, Object>("stop-cmd", value), false);
|
2016-12-05 04:21:04 +01:00
|
|
|
stopcmd = value;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean willAutoRestart() {
|
|
|
|
return restart;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void setAutoRestart(boolean value) {
|
2017-01-30 21:22:36 +01:00
|
|
|
if (Util.isNull(value)) throw new NullPointerException();
|
2017-08-22 15:02:23 +02:00
|
|
|
new SubEditServerEvent(null, this, new NamedContainer<String, Object>("auto-restart", value), false);
|
2016-12-05 04:21:04 +01:00
|
|
|
restart = value;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean isTemporary() {
|
|
|
|
return temporary;
|
|
|
|
}
|
2017-01-21 17:49:37 +01:00
|
|
|
|
|
|
|
@Override
|
|
|
|
public void setTemporary(boolean value) {
|
2017-01-30 21:22:36 +01:00
|
|
|
if (Util.isNull(value)) throw new NullPointerException();
|
2017-08-22 15:02:23 +02:00
|
|
|
new SubEditServerEvent(null, this, new NamedContainer<String, Object>("temp", value), false);
|
2017-01-21 17:49:37 +01:00
|
|
|
temporary = !(value && !isRunning() && !start()) && value;
|
|
|
|
}
|
2016-12-05 04:21:04 +01:00
|
|
|
}
|