177 lines
5.3 KiB
Java
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;
|
|
}
|
|
} |