diff --git a/pom.xml b/pom.xml index 6d722b3..a349527 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ me.SuperRonanCraft BetterRTP jar - 4.0.0-DEVBUILD + 3.6.3 1.8 diff --git a/src/main/java/me/SuperRonanCraft/BetterRTP/BetterRTP.java b/src/main/java/me/SuperRonanCraft/BetterRTP/BetterRTP.java index 00d4186..6245a8c 100644 --- a/src/main/java/me/SuperRonanCraft/BetterRTP/BetterRTP.java +++ b/src/main/java/me/SuperRonanCraft/BetterRTP/BetterRTP.java @@ -6,6 +6,7 @@ import me.SuperRonanCraft.BetterRTP.player.commands.Commands; import me.SuperRonanCraft.BetterRTP.player.events.EventListener; import me.SuperRonanCraft.BetterRTP.player.rtp.RTP; import me.SuperRonanCraft.BetterRTP.references.Permissions; +import me.SuperRonanCraft.BetterRTP.references.RTPLogger; import me.SuperRonanCraft.BetterRTP.references.WarningHandler; import me.SuperRonanCraft.BetterRTP.references.database.DatabaseHandler; import me.SuperRonanCraft.BetterRTP.references.depends.DepEconomy; @@ -26,6 +27,7 @@ import org.bukkit.command.CommandSender; import org.bukkit.plugin.java.JavaPlugin; import java.util.List; +import java.util.logging.Level; public class BetterRTP extends JavaPlugin { private final Permissions perms = new Permissions(); @@ -45,6 +47,7 @@ public class BetterRTP extends JavaPlugin { @Getter private final WarningHandler warningHandler = new WarningHandler(); //@Getter private BukkitAudiences adventure; @Getter private boolean PlaceholderAPI; + @Getter private final RTPLogger rtpLogger = new RTPLogger(); @Override public void onEnable() { @@ -141,6 +144,7 @@ public class BetterRTP extends JavaPlugin { databaseHandler.load(); files.loadAll(); settings.load(); + rtpLogger.setup(this); invs.load(); cooldowns.load(); rtp.load(); @@ -152,7 +156,6 @@ public class BetterRTP extends JavaPlugin { } public static void debug(String str) { - if (getInstance().getSettings().isDebug()) - getInstance().getLogger().info(str); + getInstance().getLogger().info(str); } } diff --git a/src/main/java/me/SuperRonanCraft/BetterRTP/player/commands/RTPCommandType.java b/src/main/java/me/SuperRonanCraft/BetterRTP/player/commands/RTPCommandType.java index 5bd7bd5..0d30bc5 100644 --- a/src/main/java/me/SuperRonanCraft/BetterRTP/player/commands/RTPCommandType.java +++ b/src/main/java/me/SuperRonanCraft/BetterRTP/player/commands/RTPCommandType.java @@ -15,7 +15,9 @@ public enum RTPCommandType { TEST(new CmdTest(), true), VERSION(new CmdVersion()), WORLD(new CmdWorld()), - DEV(new CmdDeveloper(), true); + DEV(new CmdDeveloper(), true), + LOGGER(new CmdLogger(), true), + ; private final RTPCommand cmd; private boolean debugOnly = false; diff --git a/src/main/java/me/SuperRonanCraft/BetterRTP/player/commands/types/CmdInfo.java b/src/main/java/me/SuperRonanCraft/BetterRTP/player/commands/types/CmdInfo.java index 9cdd34d..0420bfa 100644 --- a/src/main/java/me/SuperRonanCraft/BetterRTP/player/commands/types/CmdInfo.java +++ b/src/main/java/me/SuperRonanCraft/BetterRTP/player/commands/types/CmdInfo.java @@ -1,28 +1,42 @@ package me.SuperRonanCraft.BetterRTP.player.commands.types; import me.SuperRonanCraft.BetterRTP.BetterRTP; +import me.SuperRonanCraft.BetterRTP.player.commands.RTPCommand; import me.SuperRonanCraft.BetterRTP.player.commands.RTPCommandHelpable; import me.SuperRonanCraft.BetterRTP.player.commands.RTP_SETUP_TYPE; -import me.SuperRonanCraft.BetterRTP.player.rtp.effects.RTPEffect_Particles; import me.SuperRonanCraft.BetterRTP.player.rtp.RTPSetupInformation; +import me.SuperRonanCraft.BetterRTP.player.rtp.effects.RTPEffect_Particles; import me.SuperRonanCraft.BetterRTP.references.PermissionNode; import me.SuperRonanCraft.BetterRTP.references.helpers.HelperRTP; import me.SuperRonanCraft.BetterRTP.references.messages.Message; +import me.SuperRonanCraft.BetterRTP.references.messages.Message_RTP; import me.SuperRonanCraft.BetterRTP.references.messages.MessagesCore; import me.SuperRonanCraft.BetterRTP.references.messages.MessagesHelp; import me.SuperRonanCraft.BetterRTP.references.rtpinfo.QueueHandler; import me.SuperRonanCraft.BetterRTP.references.rtpinfo.worlds.WorldDefault; import me.SuperRonanCraft.BetterRTP.references.rtpinfo.worlds.WorldPlayer; -import me.SuperRonanCraft.BetterRTP.player.commands.RTPCommand; +import me.SuperRonanCraft.BetterRTP.references.web.LogUploader; +import net.md_5.bungee.api.chat.ClickEvent; +import net.md_5.bungee.api.chat.ComponentBuilder; +import net.md_5.bungee.api.chat.HoverEvent; +import net.md_5.bungee.api.chat.TextComponent; import org.bukkit.Bukkit; +import org.bukkit.ChatColor; import org.bukkit.World; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.potion.PotionEffectType; +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; +import org.json.simple.parser.ParseException; +import scala.concurrent.impl.FutureConvertersImpl; import xyz.xenondevs.particle.ParticleEffect; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; import java.util.List; +import java.util.concurrent.CompletableFuture; public class CmdInfo implements RTPCommand, RTPCommandHelpable { @@ -39,14 +53,26 @@ public class CmdInfo implements RTPCommand, RTPCommandHelpable { else if (args[1].equalsIgnoreCase(CmdInfoSub.POTION_EFFECTS.name())) infoEffects(sendi); else if (args[1].equalsIgnoreCase(CmdInfoSub.WORLD.name())) { - if (args.length > 2 && Bukkit.getWorld(args[2]) != null) { - sendInfoWorld(sendi, infoGetWorld(sendi, Bukkit.getWorld(args[2]), null, null)); - } else if (sendi instanceof Player) { //Personalize with permission groups - Player player = (Player) sendi; - World world = player.getWorld(); - sendInfoWorld(sendi, infoGetWorld(sendi, world, player, null)); - } else - infoWorld(sendi); + World world = null; + Player player = null; + if (args.length > 2) { + world = Bukkit.getWorld(args[2]); + if (world == null) { + MessagesCore.DISABLED_WORLD.send(sendi, args[2]); + return; + } + } else { + MessagesCore.DISABLED_WORLD.send(sendi, "NULL"); + return; + } + if (args.length > 3) { + player = Bukkit.getPlayer(args[3]); + if (player == null) { + MessagesCore.NOTONLINE.send(sendi, args[2]); + return; + } + } + sendInfoWorld(sendi, infoGetWorld(sendi, world, player, null), label, args); } else if (args[1].equalsIgnoreCase(CmdInfoSub.PLAYER.name())) { World world = null; Player player = null; @@ -61,10 +87,10 @@ public class CmdInfo implements RTPCommand, RTPCommandHelpable { } if (world == null) world = player.getWorld(); - sendInfoWorld(sendi, infoGetWorld(sendi, world, player, null)); + sendInfoWorld(sendi, infoGetWorld(sendi, world, player, null), label, args); } } else - infoWorld(sendi); + infoWorld(sendi, label, args); } @Override @@ -110,18 +136,46 @@ public class CmdInfo implements RTPCommand, RTPCommandHelpable { } //World - public static void sendInfoWorld(CommandSender sendi, List list) { //Send info + public static void sendInfoWorld(CommandSender sendi, List list, String label, String[] args) { //Send info + boolean upload = Arrays.asList(args).contains("_UPLOAD_"); list.add(0, "&e&m-----&6 BetterRTP &8| Info &e&m-----"); - list.forEach(str -> - list.set(list.indexOf(str), Message.color(str))); - sendi.sendMessage(list.toArray(new String[0])); + list.forEach(str -> list.set(list.indexOf(str), Message.color(str))); + + String cmd = "/" + label + " " + String.join(" ", args); + if (!upload) { + sendi.sendMessage(list.toArray(new String[0])); + if (sendi instanceof Player) { + TextComponent component = new TextComponent(Message.color("&7- &7Click to upload command log to &flogs.ronanplugins.com")); + component.setClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, cmd + " _UPLOAD_")); + component.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder(Message.color("&6Suggested command&f: &7" + "/betterrtp " + String.join(" ", args) + " _UPLOAD_")).create())); + ((Player) sendi).spigot().sendMessage(component); + } else { + sendi.sendMessage("Execute `" + cmd + " _UPLOAD_`" + " to upload command log to https://logs.ronanplugins.com"); + } + } else { + list.add(0, "Command: " + cmd); + list.forEach(str -> list.set(list.indexOf(str), ChatColor.stripColor(str))); + CompletableFuture.runAsync(() -> { + String key = LogUploader.post(list); + if (key == null) { + Message.sms(sendi, new ArrayList<>(Collections.singletonList("&cAn error occured attempting to upload log!")), null); + } else { + try { + JSONObject json = (JSONObject) new JSONParser().parse(key); + Message.sms(sendi, Arrays.asList(" ", Message.getPrefix(Message_RTP.msg) + "&aLog uploaded! &fView&7: &6https://logs.ronanplugins.com/" + json.get("key")), null); + } catch (ParseException e) { + throw new RuntimeException(e); + } + } + }); + } } - private void infoWorld(CommandSender sendi) { //All worlds + private void infoWorld(CommandSender sendi, String label, String[] args) { //All worlds List info = new ArrayList<>(); for (World w : Bukkit.getWorlds()) info.addAll(infoGetWorld(sendi, w, null, null)); - sendInfoWorld(sendi, info); + sendInfoWorld(sendi, info, label, args); } public static List infoGetWorld(CommandSender sendi, World world, Player player, WorldPlayer _rtpworld) { //Specific world @@ -212,13 +266,21 @@ public class CmdInfo implements RTPCommand, RTPCommandHelpable { info.add(cmd.name().toLowerCase()); } else if (args.length == 3) { if (CmdInfoSub.WORLD.name().toLowerCase().startsWith(args[1].toLowerCase())) { + for (World world : Bukkit.getWorlds()) + if (world.getName().toLowerCase().startsWith(args[2].toLowerCase())) + info.add(world.getName()); + } else if (CmdInfoSub.PLAYER.name().toLowerCase().startsWith(args[1].toLowerCase())) { for (Player p : Bukkit.getOnlinePlayers()) { if (p.getName().toLowerCase().startsWith(args[2].toLowerCase())) info.add(p.getName()); } - for (World world : Bukkit.getWorlds()) - if (world.getName().toLowerCase().startsWith(args[2].toLowerCase())) - info.add(world.getName()); + } + } else if (args.length == 4) { + if (CmdInfoSub.WORLD.name().toLowerCase().startsWith(args[1].toLowerCase())) { + for (Player p : Bukkit.getOnlinePlayers()) { + if (p.getName().toLowerCase().startsWith(args[3].toLowerCase())) + info.add(p.getName()); + } } } return info; diff --git a/src/main/java/me/SuperRonanCraft/BetterRTP/player/commands/types/CmdLogger.java b/src/main/java/me/SuperRonanCraft/BetterRTP/player/commands/types/CmdLogger.java new file mode 100644 index 0000000..ad034b7 --- /dev/null +++ b/src/main/java/me/SuperRonanCraft/BetterRTP/player/commands/types/CmdLogger.java @@ -0,0 +1,38 @@ +package me.SuperRonanCraft.BetterRTP.player.commands.types; + +import me.SuperRonanCraft.BetterRTP.BetterRTP; +import me.SuperRonanCraft.BetterRTP.player.commands.RTPCommand; +import me.SuperRonanCraft.BetterRTP.player.commands.RTPCommandHelpable; +import me.SuperRonanCraft.BetterRTP.player.commands.RTPCommandType; +import me.SuperRonanCraft.BetterRTP.references.PermissionNode; +import me.SuperRonanCraft.BetterRTP.references.helpers.HelperRTP_Info; +import me.SuperRonanCraft.BetterRTP.references.messages.MessagesCore; +import me.SuperRonanCraft.BetterRTP.references.messages.MessagesHelp; +import me.SuperRonanCraft.BetterRTP.references.messages.MessagesUsage; +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.bukkit.command.CommandSender; + +import java.util.ArrayList; +import java.util.List; + +public class CmdLogger implements RTPCommand { + + public String getName() { + return "logger"; + } + public void execute(CommandSender sendi, String label, String[] args) { + + } + + public List tabComplete(CommandSender sendi, String[] args) { + return null; + } + + public boolean permission(CommandSender sendi) { + return PermissionNode.ADMIN.check(sendi); + } + + public void usage(CommandSender sendi, String label) { + } +} diff --git a/src/main/java/me/SuperRonanCraft/BetterRTP/player/commands/types/CmdQueue.java b/src/main/java/me/SuperRonanCraft/BetterRTP/player/commands/types/CmdQueue.java index 4280153..ba14abd 100644 --- a/src/main/java/me/SuperRonanCraft/BetterRTP/player/commands/types/CmdQueue.java +++ b/src/main/java/me/SuperRonanCraft/BetterRTP/player/commands/types/CmdQueue.java @@ -7,17 +7,30 @@ import me.SuperRonanCraft.BetterRTP.references.PermissionNode; import me.SuperRonanCraft.BetterRTP.references.database.DatabaseHandler; import me.SuperRonanCraft.BetterRTP.references.helpers.HelperRTP; import me.SuperRonanCraft.BetterRTP.references.messages.Message; +import me.SuperRonanCraft.BetterRTP.references.messages.Message_RTP; import me.SuperRonanCraft.BetterRTP.references.rtpinfo.QueueData; import me.SuperRonanCraft.BetterRTP.references.rtpinfo.QueueHandler; import me.SuperRonanCraft.BetterRTP.references.rtpinfo.worlds.WorldPlayer; +import me.SuperRonanCraft.BetterRTP.references.web.LogUploader; +import net.md_5.bungee.api.chat.ClickEvent; +import net.md_5.bungee.api.chat.ComponentBuilder; +import net.md_5.bungee.api.chat.HoverEvent; +import net.md_5.bungee.api.chat.TextComponent; import org.bukkit.Bukkit; +import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; +import org.json.simple.parser.ParseException; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; import java.util.List; +import java.util.concurrent.CompletableFuture; public class CmdQueue implements RTPCommand { @@ -31,21 +44,48 @@ public class CmdQueue implements RTPCommand { World world = args.length > 1 ? Bukkit.getWorld(args[1]) : null; Bukkit.getScheduler().runTaskAsynchronously(BetterRTP.getInstance(), () -> { if (world != null) { - sendInfo(sendi, queueGetWorld(p, world)); + sendInfo(sendi, queueGetWorld(p, world), label, args); } else - queueWorlds(p); + queueWorlds(p, label, args); }); } //World - public static void sendInfo(CommandSender sendi, List list) { //Send info + public static void sendInfo(CommandSender sendi, List list, String label, String[] args) { //Send info + boolean upload = Arrays.asList(args).contains("_UPLOAD_"); list.add(0, "&e&m-----&6 BetterRTP &8| Queue &e&m-----"); - list.forEach(str -> - list.set(list.indexOf(str), Message.color(str))); - sendi.sendMessage(list.toArray(new String[0])); + list.forEach(str -> list.set(list.indexOf(str), Message.color(str))); + String cmd = "/" + label + " " + String.join(" ", args); + if (!upload) { + sendi.sendMessage(list.toArray(new String[0])); + if (sendi instanceof Player) { + TextComponent component = new TextComponent(Message.color("&7- &7Click to upload command log to &flogs.ronanplugins.com")); + component.setClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, cmd + " _UPLOAD_")); + component.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder(Message.color("&6Suggested command&f: &7" + "/betterrtp " + String.join(" ", args) + " _UPLOAD_")).create())); + ((Player) sendi).spigot().sendMessage(component); + } else { + sendi.sendMessage("Execute `" + cmd + " _UPLOAD_`" + " to upload command log to https://logs.ronanplugins.com"); + } + } else { + list.add(0, "Command: " + cmd); + list.forEach(str -> list.set(list.indexOf(str), ChatColor.stripColor(str))); + CompletableFuture.runAsync(() -> { + String key = LogUploader.post(list); + if (key == null) { + Message.sms(sendi, new ArrayList<>(Collections.singletonList("&cAn error occured attempting to upload log!")), null); + } else { + try { + JSONObject json = (JSONObject) new JSONParser().parse(key); + Message.sms(sendi, Arrays.asList(" ", Message.getPrefix(Message_RTP.msg) + "&aLog uploaded! &fView&7: &6https://logs.ronanplugins.com/" + json.get("key")), null); + } catch (ParseException e) { + throw new RuntimeException(e); + } + } + }); + } } - private void queueWorlds(Player p) { //All worlds + private void queueWorlds(Player p, String label, String[] args) { //All worlds List info = new ArrayList<>(); int locs = 0; for (World w : Bukkit.getWorlds()) { @@ -54,7 +94,7 @@ public class CmdQueue implements RTPCommand { locs += list.size(); } info.add("&eTotal of &a%amount% &egenerated locations".replace("%amount%", String.valueOf(locs))); - sendInfo(p, info); + sendInfo(p, info, label, args); } private static List queueGetWorld(Player player, World world) { //Specific world diff --git a/src/main/java/me/SuperRonanCraft/BetterRTP/player/rtp/effects/RTPEffect_Particles.java b/src/main/java/me/SuperRonanCraft/BetterRTP/player/rtp/effects/RTPEffect_Particles.java index f5155d9..0390721 100644 --- a/src/main/java/me/SuperRonanCraft/BetterRTP/player/rtp/effects/RTPEffect_Particles.java +++ b/src/main/java/me/SuperRonanCraft/BetterRTP/player/rtp/effects/RTPEffect_Particles.java @@ -55,7 +55,7 @@ public class RTPEffect_Particles { effects.add(ParticleEffect.ASH); getPl().getLogger().severe("The particle '" + typeTrying + "' doesn't exist! Default particle enabled... " + "Try using '/rtp info particles' to get a list of available particles"); - } catch (ExceptionInInitializerError e2) { + } catch (ExceptionInInitializerError | NoClassDefFoundError e2) { effects.clear(); getPl().getLogger().severe("The particle '" + typeTrying + "' created a fatal error when loading particles! Your MC version isn't supported!"); enabled = false; @@ -63,7 +63,7 @@ public class RTPEffect_Particles { shape = config.getString("Particles.Shape").toUpperCase(); if (!Arrays.asList(shapeTypes).contains(shape)) { getPl().getLogger().severe("The particle shape '" + shape + "' doesn't exist! Default particle shape enabled..."); - getPl().getLogger().severe("Try using '/rtp info shapes' to get a list of shapes, or: " + Arrays.asList(shapeTypes).toString()); + getPl().getLogger().severe("Try using '/rtp info shapes' to get a list of shapes, or: " + Arrays.asList(shapeTypes)); shape = shapeTypes[0]; } } diff --git a/src/main/java/me/SuperRonanCraft/BetterRTP/references/RTPLogger.java b/src/main/java/me/SuperRonanCraft/BetterRTP/references/RTPLogger.java new file mode 100644 index 0000000..735df3b --- /dev/null +++ b/src/main/java/me/SuperRonanCraft/BetterRTP/references/RTPLogger.java @@ -0,0 +1,30 @@ +package me.SuperRonanCraft.BetterRTP.references; + +import me.SuperRonanCraft.BetterRTP.BetterRTP; + +import java.io.File; +import java.io.IOException; +import java.util.logging.*; + +public class RTPLogger { + + static Handler fileHandler = null; + private Logger LOGGER; + + public void setup(BetterRTP plugin) { + this.LOGGER = plugin.getLogger(); + if (plugin.getSettings().isDebug()) + LOGGER.setLevel(Level.ALL); + else + LOGGER.setLevel(Level.WARNING); + try { + fileHandler = new FileHandler(plugin.getDataFolder().getAbsoluteFile() + File.separator + "data.log"); + SimpleFormatter simple = new SimpleFormatter(); + fileHandler.setFormatter(simple); + LOGGER.addHandler(fileHandler);//adding Handler for file + } catch (IOException e) { + // TODO Auto-generated catch block + } + } + +} diff --git a/src/main/java/me/SuperRonanCraft/BetterRTP/references/web/LogUploader.java b/src/main/java/me/SuperRonanCraft/BetterRTP/references/web/LogUploader.java index 5d04ceb..64db763 100644 --- a/src/main/java/me/SuperRonanCraft/BetterRTP/references/web/LogUploader.java +++ b/src/main/java/me/SuperRonanCraft/BetterRTP/references/web/LogUploader.java @@ -1,5 +1,6 @@ package me.SuperRonanCraft.BetterRTP.references.web; +import me.SuperRonanCraft.BetterRTP.references.file.FileOther; import org.bukkit.configuration.file.FileConfiguration; import java.io.BufferedReader; @@ -10,39 +11,46 @@ import java.net.HttpURLConnection; import java.net.URL; import java.nio.charset.StandardCharsets; import java.util.Arrays; +import java.util.List; public class LogUploader { + private static final String UPLOAD_URL = "https://logs.ronanplugins.com/documents"; + public static final String KEY_URL = "https://logs.ronanplugins.com/"; - public static void main(String[] requestBody) throws IOException { - URL url = new URL(UPLOAD_URL); - HttpURLConnection connection = (HttpURLConnection) url.openConnection(); - connection.setRequestMethod("POST"); - connection.setRequestProperty("Content-Type", "text/plain"); - connection.setDoOutput(true); + public static String post(List requestBody) { + try { + URL url = new URL(UPLOAD_URL); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("POST"); + connection.setRequestProperty("Content-Type", "text/plain"); + connection.setDoOutput(true); - //String requestBody = "This is the raw body of text."; + //String requestBody = "This is the raw body of text."; - try (OutputStream outputStream = connection.getOutputStream()) { - for (String str : requestBody) { - byte[] input = str.getBytes(StandardCharsets.UTF_8); - outputStream.write(input, 0, input.length); + try (OutputStream outputStream = connection.getOutputStream()) { + for (String str : requestBody) { + byte[] input = (str + System.lineSeparator()).getBytes(StandardCharsets.UTF_8); + outputStream.write(input, 0, input.length); + } } - } - StringBuilder response = new StringBuilder(); - try (BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()))) { - String line; - while ((line = reader.readLine()) != null) { - response.append(line); + StringBuilder response = new StringBuilder(); + try (BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()))) { + String line; + while ((line = reader.readLine()) != null) { + response.append(line); + } } - } - System.out.println(response); + return response.toString(); + } catch (IOException e) { + return null; + } } - public void sendConfigAsPostRequest() throws IOException { - FileConfiguration config = getConfig(); + public static String sendConfigAsPostRequest(FileOther.FILETYPE file) throws IOException { + FileConfiguration config = file.getConfig(); // Convert the config file to a YAML string String requestBody = config.saveToString(); @@ -67,6 +75,7 @@ public class LogUploader { } } + return response.toString(); //getLogger().log(Level.INFO, "Response: " + response.toString()); } }