Files
2009scape/Management-Server/src/main/java/ms/Management.java
T
2021-07-26 07:33:07 -05:00

177 lines
5.3 KiB
Java

package ms;
import ms.classloader.ClassLoadServer;
import ms.net.NioReactor;
import ms.net.packet.WorldPacketRepository;
import ms.system.ShutdownSequence;
import ms.system.mysql.SQLManager;
import ms.system.util.Command;
import ms.system.util.ManagementConfigParser;
import ms.world.GameServer;
import ms.world.PlayerSession;
import ms.world.WorldDatabase;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;
/**
* The main class.
* @author Emperor
*
*/
public final class Management {
/**
* If the shutdown hook is active.
*/
public static boolean active = true;
/**
* The commands.
*/
private static final Command[] COMMANDS = {
new Command("-commands", "Print a list of all commands.") {
@Override
public void run(String...args) {
for (Command c : COMMANDS) {
System.out.println("Command " + c.getName() + ": " + c.getInfo());
}
}
},
new Command("-s", "Safely shuts down the server.") {
@Override
public void run(String...args) {
System.out.println("Shutting down Management server...");
ShutdownSequence.shutdown();
}
},
new Command("-debug", "Debug world info.") {
@Override
public void run(String...args) {
System.out.println("---------------------------------------------");
for (GameServer server : WorldDatabase.getWorlds()) {
if (server != null) {
System.out.println("World [id=" + server.getInfo().getWorldId() + ", IP=" + server.getInfo().getAddress() + ", country=" + server.getInfo().getCountry() + ", members=" + server.getInfo().isMembers() + ", players=" + server.getPlayers().size() + ", active=" + server.isActive() + "].");
}
}
}
},
new Command("-pinfo", "Debugs player information (usage: -pinfo emperor).") {
@Override
public void run(String...args) {
String name = args[1];
PlayerSession player = WorldDatabase.getPlayer(name);
if (player == null) {
System.out.println("Player " + name + " was not registered!");
return;
}
System.out.println("Player [name=" + name + ", world=" + player.getWorldId() + ", active=" + player.isActive() + "].");
}
},
new Command("-update", "Calls an update on all the game servers (-update -1 to cancel).") {
@Override
public void run(String...args) {
int ticks = Integer.parseInt(args[1]);
for (GameServer server : WorldDatabase.getWorlds()) {
if (server != null && server.isActive()) {
WorldPacketRepository.sendUpdate(server, ticks);
}
}
}
},
new Command("-reloadconfig", "Reloads the configurations of all worlds.") {
@Override
public void run(String... args) {
for (GameServer server : WorldDatabase.getWorlds()) {
if(server == null) {
continue;
}
WorldPacketRepository.sendConfigReload(server);
}
}
},
new Command("-rlcache", "Reloads launcher/client resource cache") {
@Override
public void run(String... args) {
ClassLoadServer.resetResourceCache();
System.out.println("Reloaded resource cache!");
}
},
new Command("-kick", "Kicks a player from the MS (not ingame).") {
@Override
public void run(String... args) {
String name = args[1];
PlayerSession player = WorldDatabase.getPlayer(name);
if (player == null) {
System.out.println("Player " + name + " was not registered!");
return;
}
player.getWorld().getPlayers().remove(name);
player.setWorldId(0);
System.out.println("Kicked player " + name + "!");
}
}
};
/**
* The main method.
* @param args The arguments cast on runtime.
* @throws Throwable When an exception occurs.
*/
public static void main(String...args) throws Throwable {
if (!isLocallyHosted(ServerConstants.HOST_ADDRESS)) {
System.err.println("WARNING: Configure host address in server constants!");
}
System.out.println("-------- 530 Management server --------");
System.out.println("Starting up...");
new ManagementConfigParser("managementprops" + File.separator + "properties.json");
SQLManager.init();
//NioReactor.configure(ServerConstants.PORT).start();
NioReactor.configure(5555).start();
new ClassLoadServer().start();
Runtime.getRuntime().addShutdownHook(new ShutdownSequence());
System.out.println("Status: ready.");
System.out.println("Use -commands for a list of commands!");
Scanner s = new Scanner(new InputStreamReader(System.in, StandardCharsets.UTF_8));
while (s.hasNext()) {
try {
String command = s.nextLine();
if (!command.startsWith("-")) {
continue;
}
String[] arguments = command.split(" ");
command = arguments[0];
for (Command c : COMMANDS) {
if (c.getName().equals(command)) {
System.out.println("Handling command \"" + command + "\"!");
c.run(arguments);
}
}
} catch (Throwable t) {
t.printStackTrace();
}
}
s.close();
}
/**
* Checks if the Management server is locally hosted.
* @return {@code True} if so.
* @throws IOException When an I/O exception occurs.
*/
private static boolean isLocallyHosted(String ip) throws IOException {
InetAddress address = InetAddress.getByName(ip);
if (address.isAnyLocalAddress() || address.isLoopbackAddress()) {
return true;
}
return NetworkInterface.getByInetAddress(address) != null;
}
}