package me.vaqxine.NetworkManager;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map.Entry;
import java.util.UUID;
import java.util.concurrent.CopyOnWriteArrayList;
import me.vaqxine.NetworkManager.lib.ServerMapper;
import me.vaqxine.NetworkManager.listeners.LoginListener;
import me.vaqxine.NetworkManager.tasks.CommandSenderTask;
import me.vaqxine.NetworkManager.tasks.NetworkListenerTask;
import me.vaqxine.NetworkManager.threads.SocketSenderThread;
import me.vaqxine.NetworkManager.utils.MessageUtils;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.Logger;
import org.apache.logging.log4j.message.Message;
import org.bukkit.Bukkit;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;
public class NetworkManager extends JavaPlugin {
public volatile NetworkAPI api;
public volatile CommandSenderTask cst;
public volatile SocketSenderThread sst;
public volatile static NetworkManager plugin;
public volatile int network_port = Bukkit.getPort() + 1000;
public volatile boolean rebooting = false;
public volatile static me.vaqxine.NetworkManager.Logger log = new me.vaqxine.NetworkManager.Logger();
public volatile static String restartMessage = null;
public volatile static String restartWarnMessage = null;
public volatile String password = null;
public volatile HashSet<String> loggedConsoleLines = new HashSet<>();
private volatile DateFormat df = new SimpleDateFormat("dd:MM:yy:HH:mm:ss");
public volatile List<String> lastReboots = new ArrayList<>();
private Thread networkListenerTask = null;
public static ServerMapper bungee_server_map = new ServerMapper();
// List of server prefixes and the IP/port's they point to.
// Contains player counts, max players, and status of every server.
public static volatile HashSet<String> crashed_servers = new HashSet<String>();
// List of all crashed servers, they will be ignored when getRandomServer() is fired.
public static volatile CopyOnWriteArrayList<String> socket_pool = new CopyOnWriteArrayList<String>();
// Packet data, address to send to
public static boolean verbose = true;
public static HashMap<String, Player> async_player_map = new HashMap<String, Player>();
@Override
public void onEnable() {
plugin = this;
getServer().getScheduler().cancelTasks(this);
saveDefaultConfig();
new File("plugins/NetworkManager/bungee-config.yml").delete();
saveResource("bungee-config.yml", "plugins/NetworkManager/bungee-config.yml");
loadBungeeConfig();
password = getConfig().getString("password");
restartMessage = MessageUtils.translateToColorCode(getConfig().getString("restartMessage"));
restartWarnMessage = MessageUtils.translateToColorCode(getConfig().getString("restartWarnMessage"));
api = new NetworkAPI(this);
cst = new CommandSenderTask(this);
sst = new SocketSenderThread(this);
sst.start();
getServer().getPluginManager().registerEvents(new LoginListener(this), this);
getServer().getScheduler().runTaskTimer(this, cst, 20L, 20L);
networkListenerTask = new NetworkListenerTask(this);
networkListenerTask.start();
((org.apache.logging.log4j.core.Logger) LogManager.getRootLogger()).addFilter(new Filter() {
@Override
public Result filter(LogEvent event) {
if (loggedConsoleLines.size() >= 500) {
loggedConsoleLines.clear();
}
loggedConsoleLines.add(df.format(new Date(event.getMillis())) + " " + event.getMessage().getFormattedMessage());
return Result.ACCEPT;
}
@Override
public Result getOnMatch() {
return Result.ACCEPT;
}
@Override
public Result getOnMismatch() {
return Result.ACCEPT;
}
@Override
public Filter.Result filter(Logger logger, Level level, Marker marker, String string, Object... os) {
return Result.ACCEPT;
}
@Override
public Filter.Result filter(Logger logger, Level level, Marker marker, Object o, Throwable thrwbl) {
return Result.ACCEPT;
}
@Override
public Filter.Result filter(Logger logger, Level level, Marker marker, Message msg, Throwable thrwbl) {
return Result.ACCEPT;
}
});
if (getConfig().getStringList("lastReboots") != null) {
lastReboots.addAll(getConfig().getStringList("lastReboots"));
}
lastReboots.add(String.valueOf(System.currentTimeMillis() / 1000L));
getConfig().set("lastReboots", lastReboots);
saveConfig();
}
@Override
public void onDisable() {
networkListenerTask.interrupt();
cst = null;
api = null;
getServer().getScheduler().cancelTasks(this);
}
public CommandSenderTask getCommandSender() {
return cst;
}
public NetworkAPI getAPI() {
return api;
}
public static NetworkManager getPlugin() {
return plugin;
}
public void loadBungeeConfig(){
// Load our bungee config.
FileConfiguration config = getConfig("bungee-config.yml");
for(Entry<String, Object> data : config.getValues(true).entrySet()){
String s = data.getKey();
if(s.startsWith("servers.") && s.endsWith(".address")){
// It's a server.
// servers.scb1.address=127.0.0.1:1000
String server_prefix = s.split("\\.")[1];
String ip_and_port = (String)data.getValue();
bungee_server_map.put(server_prefix, ip_and_port);
System.out.println(server_prefix + "=" + ip_and_port);
}
}
}
public FileConfiguration getConfig(String configName) {
return YamlConfiguration.loadConfiguration(new File(getDataFolder() + File.separator + configName));
}
public void saveResource(String resource_name, String output_path){
InputStream stream = NetworkManager.class.getResourceAsStream("/" + resource_name);
if (stream == null) {
//send your exception or warning
}
OutputStream resStreamOut = null;
int readBytes;
byte[] buffer = new byte[4096];
try {
resStreamOut = new FileOutputStream(new File(output_path));
while ((readBytes = stream.read(buffer)) > 0) {
resStreamOut.write(buffer, 0, readBytes);
}
} catch (IOException e1) {
e1.printStackTrace();
} finally {
try {
stream.close();
resStreamOut.close();
} catch (IOException e) {
// Hypothetically impossible.
e.printStackTrace();
}
}
}
}