package me.vaqxine.NetworkManager.tasks; import java.io.DataOutputStream; import java.io.File; import java.io.IOException; import java.util.HashSet; import org.arkhamnetwork.permissions.ArkhamPermissions; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import me.vaqxine.NetworkManager.NetworkManager; import me.vaqxine.NetworkManager.struct.QueryRequest; import me.vaqxine.NetworkManager.utils.LogUtils; import me.vaqxine.NetworkManager.utils.PacketUtils; import me.vaqxine.NetworkManager.utils.StatusUtils; import com.google.gson.Gson; public class PacketProcessQueue { private static volatile HashSet<String> download_queue = new HashSet<>(); private static volatile Gson gson = new Gson(); @SuppressWarnings("deprecation") public synchronized static void process(final QueryRequest querie, final NetworkManager plugin) { if (querie == null || querie.getSocket() == null) { return; } String[] data_iteration; // We will use @net_split@ in the future for cross-server communications to send multiple independent packets in 1 socket. if (querie.getQuery().length == 1 && querie.getQuery()[0].contains("@net_split@")) { data_iteration = querie.getQuery()[0].split("@net_split@"); } else { data_iteration = querie.getQuery(); } for (String data : data_iteration) { try { if (!data.startsWith("ARK-")) { // We don't care, wrong packet format. NetworkManager.log.debug("Bad packet format: '" + data + "'", PacketProcessQueue.class); continue; } String[] dataSplit = data.split("-", 3); if (dataSplit.length < 3) { NetworkManager.log.debug("Bad packet length: '" + data + "'", PacketProcessQueue.class); continue; } //Password validation. if (!dataSplit[1].equalsIgnoreCase(plugin.password)) { NetworkManager.log.debug("Invalid password supplied: '" + data + "'", PacketProcessQueue.class); continue; } data = dataSplit[2]; if (data == null) { continue; } if (data.startsWith("reloadpermissions")) { if(!Bukkit.getPluginManager().isPluginEnabled("ArkhamPermissions")) continue; // We can't do anything lol. data = data.replace("reloadpermissions", ""); data = data.replace("{", "").replace("}", ""); // struct; {uuid1,uuid2,uuid3} if(data.contains(",")){ for(String uuid : data.split(",")){ if(NetworkManager.async_player_map.containsKey(uuid)){ // Relevant to us, we should reload him! Player pl = NetworkManager.async_player_map.get(uuid); ArkhamPermissions.getInstance().getPermissionManager().reloadPlayer(pl); Bukkit.getLogger().info("Reloaded permissions for " + pl.getName() + "! (" + uuid + ")"); } } } else { String uuid = data; if(NetworkManager.async_player_map.containsKey(uuid)){ // Relevant to us, we should reload him! Player pl = NetworkManager.async_player_map.get(uuid); ArkhamPermissions.getInstance().getPermissionManager().reloadPlayer(pl); Bukkit.getLogger().info("Reloaded permissions for " + pl.getName() + "! (" + uuid + ")"); } } continue; } if (data.startsWith("runcmd->")) { data = data.replace("runcmd->", ""); plugin.getCommandSender().addCmd(data); continue; } if (data.startsWith("reboot")) { if (download_queue.size() > 0) { NetworkManager.log.debug("Ignoring reboot packet due to " + download_queue.size() + " active downloads.", PacketProcessQueue.class); continue; } plugin.getServer().getScheduler().runTaskTimer(plugin, new ServerRebootTask(false), 20L, 20L); continue; } if (data.startsWith("status")) { try (DataOutputStream out = new DataOutputStream(querie.getSocket().getOutputStream())) { out.writeBytes(StatusUtils.getStatus()); out.flush(); } continue; } if (data.startsWith("basicstatus")) { try (DataOutputStream out = new DataOutputStream(querie.getSocket().getOutputStream())) { out.writeBytes(StatusUtils.getBasicStatus()); out.flush(); } continue; } if (data.startsWith("consolelog")) { try (DataOutputStream out = new DataOutputStream(querie.getSocket().getOutputStream())) { out.writeBytes(LogUtils.getAndClearLogLines()); out.flush(); } continue; } if (data.startsWith("lastreboots")) { try (DataOutputStream out = new DataOutputStream(querie.getSocket().getOutputStream())) { out.writeBytes(gson.toJson(plugin.lastReboots)); out.flush(); } continue; } if (data.startsWith("forcereboot")) { plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new ServerRebootTask(true)); continue; } if (data.startsWith("download")) { // Download any file. data = data.replace("download@", ""); final String url = data.split("->")[0]; final String file = data.split("->")[1]; // Run a new thread to for file / network IO so we don't hold up other sockets. download_queue.add(url + "->" + file); new Thread() { @Override public void run() { new File(plugin.getServer().getWorldContainer() + file).delete(); try { PacketUtils.saveUrl(plugin.getServer().getWorldContainer() + file, url); } catch (IOException err) { err.printStackTrace(); } download_queue.remove(url + "->" + file); interrupt(); } }.start(); } } catch (Exception ex) { ex.printStackTrace(); } finally { try { if (querie != null && querie.getSocket() != null) { querie.getSocket().close(); } } catch (IOException ex) { ex.printStackTrace(); } } } } }