2016-12-24 05:55:17 +01:00
|
|
|
package net.ME1312.SubServers.Bungee.Host;
|
2016-12-05 04:21:04 +01:00
|
|
|
|
2017-04-24 18:28:16 +02:00
|
|
|
import net.ME1312.SubServers.Bungee.Library.Config.YAMLSection;
|
2016-12-24 05:55:17 +01:00
|
|
|
import net.ME1312.SubServers.Bungee.Library.Exception.InvalidServerException;
|
2017-07-21 22:45:41 +02:00
|
|
|
import net.ME1312.SubServers.Bungee.Library.NamedContainer;
|
2017-01-30 21:22:36 +01:00
|
|
|
import net.ME1312.SubServers.Bungee.Library.Util;
|
2017-07-21 22:45:41 +02:00
|
|
|
import net.ME1312.SubServers.Bungee.SubAPI;
|
2017-07-19 01:28:59 +02:00
|
|
|
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
2017-04-24 18:28:16 +02:00
|
|
|
import org.json.JSONObject;
|
2016-12-05 04:21:04 +01:00
|
|
|
|
2017-04-24 18:28:16 +02:00
|
|
|
import java.io.File;
|
2016-12-05 04:21:04 +01:00
|
|
|
import java.net.InetSocketAddress;
|
2017-07-21 22:45:41 +02:00
|
|
|
import java.util.*;
|
2016-12-05 04:21:04 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* SubServer Layout Class
|
|
|
|
*/
|
|
|
|
public abstract class SubServer extends Server {
|
2017-07-21 22:45:41 +02:00
|
|
|
private List<NamedContainer<String, String>> incompatibilities = new ArrayList<NamedContainer<String, String>>();
|
|
|
|
|
2017-01-21 17:49:37 +01:00
|
|
|
/**
|
|
|
|
* Command Storage Class
|
|
|
|
*/
|
|
|
|
public static class LoggedCommand {
|
|
|
|
private Date date;
|
|
|
|
private UUID sender;
|
|
|
|
private String command;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Store a Command
|
|
|
|
*
|
|
|
|
* @param command Command
|
|
|
|
*/
|
|
|
|
public LoggedCommand(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
|
|
|
this.date = Calendar.getInstance().getTime();
|
|
|
|
this.sender = null;
|
|
|
|
this.command = command;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Store a Command
|
|
|
|
*
|
|
|
|
* @param sender Command Sender (null for CONSOLE)
|
|
|
|
* @param command Command
|
|
|
|
*/
|
|
|
|
public LoggedCommand(UUID sender, 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
|
|
|
this.date = Calendar.getInstance().getTime();
|
|
|
|
this.sender = sender;
|
|
|
|
this.command = command;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Store a Command
|
|
|
|
*
|
|
|
|
* @param date Date
|
|
|
|
* @param sender Command Sender (null for CONSOLE)
|
|
|
|
* @param command Command
|
|
|
|
*/
|
|
|
|
public LoggedCommand(Date date, UUID sender, String command) {
|
2017-01-30 21:22:36 +01:00
|
|
|
if (Util.isNull(date, command)) throw new NullPointerException();
|
|
|
|
this.date = date;
|
2017-01-21 17:49:37 +01:00
|
|
|
this.sender = sender;
|
|
|
|
this.command = command;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get the date this command was logged
|
|
|
|
*
|
|
|
|
* @return Date
|
|
|
|
*/
|
|
|
|
public Date getDate() {
|
|
|
|
return date;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get the command sender
|
|
|
|
*
|
|
|
|
* @return Command Sender (null if CONSOLE)
|
|
|
|
*/
|
|
|
|
public UUID getSender() {
|
|
|
|
return sender;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get the command
|
|
|
|
*
|
|
|
|
* @return Command
|
|
|
|
*/
|
|
|
|
public String getCommand() {
|
|
|
|
return command;
|
|
|
|
}
|
|
|
|
}
|
2016-12-05 04:21:04 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Creates a SubServer
|
|
|
|
*
|
|
|
|
* @param host Host
|
|
|
|
* @param name Server Name
|
|
|
|
* @param port Port Number
|
|
|
|
* @param motd Server MOTD
|
2016-12-15 22:04:39 +01:00
|
|
|
* @param restricted Players will need a permission to join if true
|
2016-12-05 04:21:04 +01:00
|
|
|
* @throws InvalidServerException
|
|
|
|
*/
|
2016-12-19 01:38:02 +01:00
|
|
|
public SubServer(Host host, String name, int port, String motd, boolean hidden, boolean restricted) throws InvalidServerException {
|
2017-08-22 15:02:23 +02:00
|
|
|
super(name, new InetSocketAddress(host.getAddress().getHostAddress(), port), motd, hidden, restricted);
|
2016-12-05 04:21:04 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Starts the Server
|
|
|
|
*
|
|
|
|
* @param player Player who Started
|
2016-12-19 01:38:02 +01:00
|
|
|
* @return Success Status
|
2016-12-05 04:21:04 +01:00
|
|
|
*/
|
2016-12-19 01:38:02 +01:00
|
|
|
public abstract boolean start(UUID player);
|
2016-12-05 04:21:04 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Starts the Server
|
2016-12-19 01:38:02 +01:00
|
|
|
*
|
|
|
|
* @return Success Status
|
2016-12-05 04:21:04 +01:00
|
|
|
*/
|
2016-12-19 01:38:02 +01:00
|
|
|
public boolean start() {
|
|
|
|
return start(null);
|
2016-12-05 04:21:04 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Stops the Server
|
|
|
|
*
|
|
|
|
* @param player Player who Stopped
|
2016-12-19 01:38:02 +01:00
|
|
|
* @return Success Status
|
2016-12-05 04:21:04 +01:00
|
|
|
*/
|
2016-12-19 01:38:02 +01:00
|
|
|
public abstract boolean stop(UUID player);
|
2016-12-05 04:21:04 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Stops the Server
|
2016-12-19 01:38:02 +01:00
|
|
|
*
|
|
|
|
* @return Success Status
|
2016-12-05 04:21:04 +01:00
|
|
|
*/
|
2016-12-19 01:38:02 +01:00
|
|
|
public boolean stop() {
|
|
|
|
return stop(null);
|
2016-12-05 04:21:04 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Terminates the Server
|
|
|
|
*
|
|
|
|
* @param player Player who Terminated
|
2016-12-19 01:38:02 +01:00
|
|
|
* @return Success Status
|
2016-12-05 04:21:04 +01:00
|
|
|
*/
|
2016-12-19 01:38:02 +01:00
|
|
|
public abstract boolean terminate(UUID player);
|
2016-12-05 04:21:04 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Terminates the Server
|
2016-12-19 01:38:02 +01:00
|
|
|
*
|
|
|
|
* @return Success Status
|
2016-12-05 04:21:04 +01:00
|
|
|
*/
|
2016-12-19 01:38:02 +01:00
|
|
|
public boolean terminate() {
|
|
|
|
return terminate(null);
|
2016-12-05 04:21:04 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Commands the Server
|
|
|
|
*
|
|
|
|
* @param player Player who Commanded
|
|
|
|
* @param command Command to Send
|
2016-12-19 01:38:02 +01:00
|
|
|
* @return Success Status
|
2016-12-05 04:21:04 +01:00
|
|
|
*/
|
2016-12-19 01:38:02 +01:00
|
|
|
public abstract boolean command(UUID player, String command);
|
2016-12-05 04:21:04 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Commands the Server
|
|
|
|
*
|
|
|
|
* @param command Command to Send
|
2016-12-19 01:38:02 +01:00
|
|
|
* @return Success Status
|
2016-12-05 04:21:04 +01:00
|
|
|
*/
|
2016-12-19 01:38:02 +01:00
|
|
|
public boolean command(String command) {
|
|
|
|
return command(null, command);
|
2016-12-05 04:21:04 +01:00
|
|
|
}
|
|
|
|
|
2017-04-24 18:28:16 +02:00
|
|
|
/**
|
|
|
|
* Edits the Server
|
|
|
|
*
|
|
|
|
* @param player Player Editing
|
|
|
|
* @param edit Edits
|
|
|
|
* @return Success Status
|
|
|
|
*/
|
|
|
|
public abstract int edit(UUID player, YAMLSection edit);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Edits the Server
|
|
|
|
*
|
|
|
|
* @param edit Edits
|
|
|
|
* @return Success Status
|
|
|
|
*/
|
|
|
|
public int edit(YAMLSection edit) {
|
|
|
|
return edit(null, edit);
|
|
|
|
}
|
|
|
|
|
2016-12-05 04:21:04 +01:00
|
|
|
/**
|
|
|
|
* Waits for the Server to Stop
|
|
|
|
*
|
|
|
|
* @throws InterruptedException
|
|
|
|
*/
|
|
|
|
public abstract void waitFor() throws InterruptedException;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* If the Server is Running
|
|
|
|
*
|
|
|
|
* @return Running Status
|
|
|
|
*/
|
|
|
|
public abstract boolean isRunning();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Grabs the Host of the Server
|
|
|
|
*
|
|
|
|
* @return The Host
|
|
|
|
*/
|
|
|
|
public abstract Host getHost();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* If the Server is Enabled
|
|
|
|
*
|
|
|
|
* @return Enabled Status
|
|
|
|
*/
|
|
|
|
public abstract boolean isEnabled();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Set if the Server is Enabled
|
|
|
|
*
|
|
|
|
* @param value Value
|
|
|
|
*/
|
|
|
|
public abstract void setEnabled(boolean value);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* If the Server is Logging
|
|
|
|
*
|
|
|
|
* @return Logging Status
|
|
|
|
*/
|
|
|
|
public abstract boolean isLogging();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Set if the Server is Logging
|
|
|
|
*
|
|
|
|
* @param value Value
|
|
|
|
*/
|
|
|
|
public abstract void setLogging(boolean value);
|
|
|
|
|
2017-01-09 20:37:57 +01:00
|
|
|
/**
|
|
|
|
* Get Process Logger
|
|
|
|
*/
|
|
|
|
public abstract SubLogger getLogger();
|
2017-01-01 20:34:46 +01:00
|
|
|
|
2017-01-21 17:49:37 +01:00
|
|
|
/**
|
2017-07-21 22:45:41 +02:00
|
|
|
* Gets all the commands that were sent to this Server successfully
|
2017-01-21 17:49:37 +01:00
|
|
|
*
|
|
|
|
* @return Command History
|
|
|
|
*/
|
|
|
|
public abstract LinkedList<LoggedCommand> getCommandHistory();
|
|
|
|
|
2017-01-01 20:34:46 +01:00
|
|
|
/**
|
2017-04-24 18:28:16 +02:00
|
|
|
* Get the Server Directory Path
|
|
|
|
*
|
|
|
|
* @return Server Directory Path
|
|
|
|
*/
|
|
|
|
public abstract String getPath();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get the Full Server Directory Path
|
|
|
|
*
|
|
|
|
* @return Full Server Directory Path
|
|
|
|
*/
|
|
|
|
public String getFullPath() {
|
|
|
|
return new File(getHost().getPath(), getPath()).getPath();
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get the Server's Executable String
|
2017-01-01 20:34:46 +01:00
|
|
|
*
|
2017-04-24 18:28:16 +02:00
|
|
|
* @return Executable String
|
2017-01-01 20:34:46 +01:00
|
|
|
*/
|
2017-04-24 18:28:16 +02:00
|
|
|
public abstract Executable getExecutable();
|
2017-01-01 20:34:46 +01:00
|
|
|
|
2016-12-05 04:21:04 +01:00
|
|
|
/**
|
|
|
|
* Grab the Command to Stop the Server
|
|
|
|
*
|
|
|
|
* @return Stop Command
|
|
|
|
*/
|
|
|
|
public abstract String getStopCommand();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Set the Command that Stops the Server
|
|
|
|
*
|
|
|
|
* @param value Value
|
|
|
|
*/
|
|
|
|
public abstract void setStopCommand(String value);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* If the Server will Auto Restart on unexpected shutdowns
|
|
|
|
*
|
|
|
|
* @return Auto Restart Status
|
|
|
|
*/
|
|
|
|
public abstract boolean willAutoRestart();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Set if the Server will Auto Restart on unexpected shutdowns
|
|
|
|
*
|
|
|
|
* @param value Value
|
|
|
|
*/
|
|
|
|
public abstract void setAutoRestart(boolean value);
|
|
|
|
|
2017-07-21 22:45:41 +02:00
|
|
|
/**
|
|
|
|
* Toggles compatibility with other Servers
|
|
|
|
*
|
|
|
|
* @param server SubServers to toggle
|
|
|
|
*/
|
|
|
|
public void toggleCompatibility(SubServer... server) {
|
|
|
|
for (SubServer s : server) {
|
|
|
|
if (!equals(s)) {
|
|
|
|
NamedContainer<String, String> info = new NamedContainer<String, String>(s.getHost().getName(), s.getName());
|
|
|
|
if (isCompatible(s)) {
|
|
|
|
incompatibilities.add(info);
|
|
|
|
if (s.isCompatible(this)) toggleCompatibility(this);
|
|
|
|
} else {
|
|
|
|
incompatibilities.remove(info);
|
|
|
|
if (!s.isCompatible(this)) toggleCompatibility(this);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Checks if a Server is compatible
|
|
|
|
*
|
|
|
|
* @param server Server to check
|
|
|
|
* @return Compatible Status
|
|
|
|
*/
|
|
|
|
public boolean isCompatible(SubServer server) {
|
|
|
|
return !incompatibilities.contains(new NamedContainer<String, String>(server.getHost().getName(), server.getName()));
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get all listed incompatibilities for this Server
|
|
|
|
*
|
|
|
|
* @return Incompatibility List
|
|
|
|
*/
|
|
|
|
public List<SubServer> getIncompatibilities() {
|
|
|
|
List<SubServer> servers = new ArrayList<SubServer>();
|
|
|
|
List<NamedContainer<String, String>> temp = new ArrayList<NamedContainer<String, String>>();
|
|
|
|
temp.addAll(incompatibilities);
|
|
|
|
for (NamedContainer<String, String> info : temp) {
|
|
|
|
try {
|
|
|
|
SubServer server = SubAPI.getInstance().getHost(info.name()).getSubServer(info.get());
|
|
|
|
if (server == null) throw new NullPointerException();
|
|
|
|
servers.add(server);
|
|
|
|
} catch (Throwable e) {
|
|
|
|
incompatibilities.remove(info);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return servers;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get incompatibility issues this server currently has
|
|
|
|
*
|
|
|
|
* @return Current Incompatibility List
|
|
|
|
*/
|
|
|
|
public List<SubServer> getCurrentIncompatibilities() {
|
|
|
|
List<SubServer> servers = new ArrayList<SubServer>();
|
|
|
|
for (SubServer server : getIncompatibilities()) {
|
|
|
|
if (server.isRunning()) servers.add(server);
|
|
|
|
}
|
|
|
|
return servers;
|
|
|
|
}
|
|
|
|
|
2016-12-05 04:21:04 +01:00
|
|
|
/**
|
|
|
|
* If the Server is Temporary
|
|
|
|
*
|
|
|
|
* @return Temporary Status
|
|
|
|
*/
|
|
|
|
public abstract boolean isTemporary();
|
|
|
|
|
2017-01-21 17:49:37 +01:00
|
|
|
/**
|
|
|
|
* Set If the Server is Temporary (will start server if not running)
|
|
|
|
*
|
|
|
|
* @param value Value
|
|
|
|
*/
|
|
|
|
public abstract void setTemporary(boolean value);
|
2017-07-19 01:28:59 +02:00
|
|
|
|
|
|
|
@Override
|
|
|
|
public String toString() {
|
|
|
|
JSONObject sinfo = new JSONObject(super.toString());
|
|
|
|
sinfo.put("type", "SubServer");
|
|
|
|
sinfo.put("enabled", getHost().isEnabled() && isEnabled());
|
2017-08-26 07:19:59 +02:00
|
|
|
sinfo.put("host", getHost().getName());
|
2017-07-19 01:28:59 +02:00
|
|
|
sinfo.put("running", isRunning());
|
2017-08-22 15:02:23 +02:00
|
|
|
sinfo.put("log", isLogging());
|
2017-07-21 22:45:41 +02:00
|
|
|
List<String> incompatible = new ArrayList<String>();
|
|
|
|
for (SubServer server : getCurrentIncompatibilities()) incompatible.add(server.getName());
|
|
|
|
sinfo.put("incompatible", incompatible);
|
2017-07-19 01:28:59 +02:00
|
|
|
sinfo.put("temp", isTemporary());
|
|
|
|
return sinfo.toString();
|
|
|
|
}
|
2016-12-05 04:21:04 +01:00
|
|
|
}
|