From 0cc182f93d7949eb028d06ccc0759d64c95c7e85 Mon Sep 17 00:00:00 2001 From: Dan Mulloy Date: Sat, 11 Apr 2015 16:47:07 -0400 Subject: [PATCH] Reimplement plugin incompatibility check, tweak some commands --- .../com/comphenix/protocol/CommandBase.java | 22 ++++++------ .../comphenix/protocol/CommandProtocol.java | 17 +++++++-- .../comphenix/protocol/ProtocolLibrary.java | 35 +++++++++++++++---- ProtocolLib/src/main/resources/plugin.yml | 2 +- 4 files changed, 54 insertions(+), 22 deletions(-) diff --git a/ProtocolLib/src/main/java/com/comphenix/protocol/CommandBase.java b/ProtocolLib/src/main/java/com/comphenix/protocol/CommandBase.java index fb700f25..9e772702 100644 --- a/ProtocolLib/src/main/java/com/comphenix/protocol/CommandBase.java +++ b/ProtocolLib/src/main/java/com/comphenix/protocol/CommandBase.java @@ -2,16 +2,16 @@ * ProtocolLib - Bukkit server library that allows access to the Minecraft protocol. * Copyright (C) 2012 Kristian S. Stangeland * - * This program is free software; you can redistribute it and/or modify it under the terms of the - * GNU General Public License as published by the Free Software Foundation; either version 2 of + * This program is free software; you can redistribute it and/or modify it under the terms of the + * GNU General Public License as published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with this program; - * if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * You should have received a copy of the GNU General Public License along with this program; + * if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307 USA */ @@ -66,6 +66,7 @@ abstract class CommandBase implements CommandExecutor { reporter.reportWarning(this, Report.newBuilder(REPORT_UNEXPECTED_COMMAND).messageParam(this)); return false; } + if (permission != null && !sender.hasPermission(permission)) { sender.sendMessage(ChatColor.RED + "You haven't got permission to run this command."); return true; @@ -75,13 +76,12 @@ abstract class CommandBase implements CommandExecutor { if (args != null && args.length >= minimumArgumentCount) { return handleCommand(sender, args); } else { - sender.sendMessage(ChatColor.RED + "Insufficient commands. You need at least " + minimumArgumentCount); + sender.sendMessage(ChatColor.RED + "Insufficient arguments. You need at least " + minimumArgumentCount); return false; } - - } catch (Exception e) { - reporter.reportDetailed(this, - Report.newBuilder(REPORT_COMMAND_ERROR).error(e).messageParam(name).callerParam(sender, label, args) + } catch (Throwable ex) { + reporter.reportDetailed(this, + Report.newBuilder(REPORT_COMMAND_ERROR).error(ex).messageParam(name).callerParam(sender, label, args) ); return true; } diff --git a/ProtocolLib/src/main/java/com/comphenix/protocol/CommandProtocol.java b/ProtocolLib/src/main/java/com/comphenix/protocol/CommandProtocol.java index c06f8248..a8255d7f 100644 --- a/ProtocolLib/src/main/java/com/comphenix/protocol/CommandProtocol.java +++ b/ProtocolLib/src/main/java/com/comphenix/protocol/CommandProtocol.java @@ -23,6 +23,7 @@ import java.io.IOException; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; import org.bukkit.plugin.Plugin; +import org.bukkit.plugin.PluginDescriptionFile; import com.comphenix.protocol.error.ErrorReporter; import com.comphenix.protocol.events.PacketListener; @@ -60,6 +61,8 @@ class CommandProtocol extends CommandBase { toggleTimings(sender, args); else if (subCommand.equalsIgnoreCase("listeners")) printListeners(sender); + else if (subCommand.equalsIgnoreCase("version")) + printVersion(sender); else return false; return true; @@ -69,13 +72,14 @@ class CommandProtocol extends CommandBase { private void printListeners(final CommandSender sender) { ProtocolManager manager = ProtocolLibrary.getProtocolManager(); + sender.sendMessage(ChatColor.GOLD + "Packet listeners:"); for (PacketListener listener : manager.getPacketListeners()) { - sender.sendMessage(ChatColor.GOLD + "Packet listeners:"); sender.sendMessage(ChatColor.GOLD + " " + listener); } + // Along with every asynchronous listener + sender.sendMessage(ChatColor.GOLD + "Asynchronous listeners:"); for (PacketListener listener : manager.getAsynchronousManager().getAsyncHandlers()) { - sender.sendMessage(ChatColor.GOLD + "Asynchronous listeners:"); sender.sendMessage(ChatColor.GOLD + " " + listener); } } @@ -123,12 +127,19 @@ class CommandProtocol extends CommandBase { // Print to a text file generator.saveTo(destination, manager); manager.clear(); - } catch (IOException e) { reporter.reportMinimal(plugin, "saveTimings()", e); } } + private void printVersion(CommandSender sender) { + PluginDescriptionFile desc = plugin.getDescription(); + + sender.sendMessage(ChatColor.GREEN + desc.getName() + ChatColor.WHITE + " v" + ChatColor.GREEN + desc.getVersion()); + sender.sendMessage("Authors: " + ChatColor.GREEN + "dmulloy2 " + ChatColor.WHITE + " and " + ChatColor.GREEN + "Comphenix"); + sender.sendMessage("Issues: " + ChatColor.GREEN + "https://github.com/dmulloy2/ProtocolLib/issues"); + } + /** * Prevent further automatic updates until the next delay. */ diff --git a/ProtocolLib/src/main/java/com/comphenix/protocol/ProtocolLibrary.java b/ProtocolLib/src/main/java/com/comphenix/protocol/ProtocolLibrary.java index 5f5655f7..5ac6cc47 100644 --- a/ProtocolLib/src/main/java/com/comphenix/protocol/ProtocolLibrary.java +++ b/ProtocolLib/src/main/java/com/comphenix/protocol/ProtocolLibrary.java @@ -30,6 +30,7 @@ import java.util.regex.Pattern; import org.bukkit.Server; import org.bukkit.command.CommandExecutor; import org.bukkit.command.PluginCommand; +import org.bukkit.plugin.Plugin; import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.java.JavaPlugin; @@ -371,6 +372,9 @@ public class ProtocolLibrary extends JavaPlugin { return; } + // Check for incompatible plugins + checkForIncompatibility(manager); + // Initialize background compiler if (backgroundCompiler == null && config.isBackgroundCompilerEnabled()) { backgroundCompiler = new BackgroundCompiler(getClassLoader(), reporter); @@ -392,7 +396,6 @@ public class ProtocolLibrary extends JavaPlugin { // Worker that ensures that async packets are eventually sent // It also performs the update check. createPacketTask(server); - } catch (OutOfMemoryError e) { throw e; } catch (ThreadDeath e) { @@ -419,6 +422,26 @@ public class ProtocolLibrary extends JavaPlugin { } } + private void checkForIncompatibility(PluginManager manager) { + // Plugin authors: Notify me to remove these + String[] incompatible = { }; + + for (String plugin : incompatible) { + if (manager.getPlugin(plugin) != null) { + // Check for versions, etc. + logger.severe("Detected incompatible plugin: " + plugin); + } + } + + // Special case for TagAPI and iTag + if (manager.getPlugin("TagAPI") != null) { + Plugin iTag = manager.getPlugin("iTag"); + if (iTag == null || iTag.getDescription().getVersion().startsWith("1.0")) { + logger.severe("Detected incompatible plugin: TagAPI"); + } + } + } + // Used to check Minecraft version private MinecraftVersion verifyMinecraftVersion() { MinecraftVersion minimum = new MinecraftVersion(MINIMUM_MINECRAFT_VERSION); @@ -435,8 +458,8 @@ public class ProtocolLibrary extends JavaPlugin { if (current.compareTo(maximum) > 0) logger.warning("Version " + current + " has not yet been tested! Proceed with caution."); } - return current; + return current; } catch (Exception e) { reporter.reportWarning(this, Report.newBuilder(REPORT_CANNOT_PARSE_MINECRAFT_VERSION).error(e).messageParam(maximum)); @@ -460,7 +483,6 @@ public class ProtocolLibrary extends JavaPlugin { for (File candidate : pluginFolder.listFiles()) { if (candidate.isFile() && !candidate.equals(loadedFile)) { Matcher match = ourPlugin.matcher(candidate.getName()); - if (match.matches()) { MinecraftVersion version = new MinecraftVersion(match.group(1)); @@ -473,7 +495,6 @@ public class ProtocolLibrary extends JavaPlugin { } } } - } catch (Exception e) { reporter.reportWarning(this, Report.newBuilder(REPORT_CANNOT_DETECT_CONFLICTING_PLUGINS).error(e)); } @@ -498,11 +519,11 @@ public class ProtocolLibrary extends JavaPlugin { PluginCommand command = getCommand(name); // Try to load the command - if (command != null) + if (command != null) { command.setExecutor(executor); - else + } else { throw new RuntimeException("plugin.yml might be corrupt."); - + } } catch (RuntimeException e) { reporter.reportWarning(this, Report.newBuilder(REPORT_CANNOT_REGISTER_COMMAND).messageParam(name, e.getMessage()).error(e)); } diff --git a/ProtocolLib/src/main/resources/plugin.yml b/ProtocolLib/src/main/resources/plugin.yml index 8c4ac679..6df02e42 100644 --- a/ProtocolLib/src/main/resources/plugin.yml +++ b/ProtocolLib/src/main/resources/plugin.yml @@ -10,7 +10,7 @@ database: false commands: protocol: description: Performs administrative tasks regarding ProtocolLib. - usage: / config|check|update + usage: / config|timings|listeners|version permission: protocol.admin permission-message: You don't have packet: