diff --git a/api/src/main/java/com/viaversion/viaversion/api/ViaAPI.java b/api/src/main/java/com/viaversion/viaversion/api/ViaAPI.java index 9c8b3ad52..6e62100b0 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/ViaAPI.java +++ b/api/src/main/java/com/viaversion/viaversion/api/ViaAPI.java @@ -64,7 +64,7 @@ public interface ViaAPI { * @return API version incremented with meaningful API changes */ default int apiVersion() { - return 9; + return 10; } /** diff --git a/api/src/main/java/com/viaversion/viaversion/api/ViaManager.java b/api/src/main/java/com/viaversion/viaversion/api/ViaManager.java index 94ec17694..800ba3c12 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/ViaManager.java +++ b/api/src/main/java/com/viaversion/viaversion/api/ViaManager.java @@ -24,6 +24,7 @@ package com.viaversion.viaversion.api; import com.viaversion.viaversion.api.command.ViaVersionCommand; import com.viaversion.viaversion.api.connection.ConnectionManager; +import com.viaversion.viaversion.api.debug.DebugHandler; import com.viaversion.viaversion.api.platform.ViaInjector; import com.viaversion.viaversion.api.platform.ViaPlatform; import com.viaversion.viaversion.api.platform.ViaPlatformLoader; @@ -88,14 +89,27 @@ public interface ViaManager { * * @return true if enabled */ - boolean isDebug(); + @Deprecated + default boolean isDebug() { + return debugHandler().enabled(); + } /** * Sets the debug mode. If enabled, packets and other otherwise suppressed warnings will be logged. * * @param debug whether debug should be enabled */ - void setDebug(boolean debug); + @Deprecated + default void setDebug(boolean debug) { + debugHandler().setEnabled(debug); + } + + /** + * Returns the debug handler. + * + * @return debug handler + */ + DebugHandler debugHandler(); /** * Returns a mutable set of self-added subplatform version strings. diff --git a/api/src/main/java/com/viaversion/viaversion/api/debug/DebugHandler.java b/api/src/main/java/com/viaversion/viaversion/api/debug/DebugHandler.java new file mode 100644 index 000000000..362da6800 --- /dev/null +++ b/api/src/main/java/com/viaversion/viaversion/api/debug/DebugHandler.java @@ -0,0 +1,85 @@ +/* + * This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion + * Copyright (C) 2016-2021 ViaVersion and contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.viaversion.viaversion.api.debug; + +import com.viaversion.viaversion.api.protocol.packet.PacketWrapper; + +public interface DebugHandler { + + /** + * Returns whether debug mode is enabled. + * + * @return whether debug mode is enabled + */ + boolean enabled(); + + /** + * Sets debug mode. + * + * @param enabled whether debug should be enabled + */ + void setEnabled(boolean enabled); + + /** + * Adds a packet type name to the list of packet types to log. + * + * @param packetTypeName packet type name + */ + void addPacketTypeNameToLog(String packetTypeName); + + /** + * Removes a packet type name from the list of packet types to log. + * + * @param packetTypeName packet type name + */ + boolean removePacketTypeNameToLog(String packetTypeName); + + /** + * Resets packet type filters. + */ + void clearPacketTypesToLog(); + + /** + * Returns whether packets should be logged after being transformed. + * Set to true by default. + * + * @return whether packets should be logged after being transformed + */ + boolean logPostPacketTransform(); + + /** + * Sets whether packets should be logged after being transformed. + * + * @param logPostPacketTransform whether packets should be logged after being transformed + */ + void setLogPostPacketTransform(boolean logPostPacketTransform); + + /** + * Returns whether the given packet should be logged. + * If no specific packet type has been added, all packet types will be logged. + * + * @param wrapper packet wrapper + * @return whether the packet should be logged + */ + boolean shouldLog(PacketWrapper wrapper); +} diff --git a/common/src/main/java/com/viaversion/viaversion/ViaManagerImpl.java b/common/src/main/java/com/viaversion/viaversion/ViaManagerImpl.java index d21a6184a..d6d588939 100644 --- a/common/src/main/java/com/viaversion/viaversion/ViaManagerImpl.java +++ b/common/src/main/java/com/viaversion/viaversion/ViaManagerImpl.java @@ -20,6 +20,7 @@ package com.viaversion.viaversion; import com.viaversion.viaversion.api.Via; import com.viaversion.viaversion.api.ViaManager; import com.viaversion.viaversion.api.connection.ConnectionManager; +import com.viaversion.viaversion.api.debug.DebugHandler; import com.viaversion.viaversion.api.platform.PlatformTask; import com.viaversion.viaversion.api.platform.UnsupportedSoftware; import com.viaversion.viaversion.api.platform.ViaInjector; @@ -31,6 +32,7 @@ import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; import com.viaversion.viaversion.api.protocol.version.ServerProtocolVersion; import com.viaversion.viaversion.commands.ViaCommandHandler; import com.viaversion.viaversion.connection.ConnectionManagerImpl; +import com.viaversion.viaversion.debug.DebugHandlerImpl; import com.viaversion.viaversion.protocol.ProtocolManagerImpl; import com.viaversion.viaversion.protocol.ServerProtocolVersionRange; import com.viaversion.viaversion.protocol.ServerProtocolVersionSingleton; @@ -50,6 +52,7 @@ import java.util.regex.Pattern; public class ViaManagerImpl implements ViaManager { private final ProtocolManagerImpl protocolManager = new ProtocolManagerImpl(); private final ConnectionManager connectionManager = new ConnectionManagerImpl(); + private final DebugHandler debugHandler = new DebugHandlerImpl(); private final ViaProviders providers = new ViaProviders(); private final ViaPlatform platform; private final ViaInjector injector; @@ -279,13 +282,8 @@ public class ViaManagerImpl implements ViaManager { } @Override - public boolean isDebug() { - return debug; - } - - @Override - public void setDebug(boolean debug) { - this.debug = debug; + public DebugHandler debugHandler() { + return debugHandler; } @Override diff --git a/common/src/main/java/com/viaversion/viaversion/commands/defaultsubs/DebugSubCmd.java b/common/src/main/java/com/viaversion/viaversion/commands/defaultsubs/DebugSubCmd.java index 723ac7cbb..00d56653a 100644 --- a/common/src/main/java/com/viaversion/viaversion/commands/defaultsubs/DebugSubCmd.java +++ b/common/src/main/java/com/viaversion/viaversion/commands/defaultsubs/DebugSubCmd.java @@ -20,6 +20,12 @@ package com.viaversion.viaversion.commands.defaultsubs; import com.viaversion.viaversion.api.Via; import com.viaversion.viaversion.api.command.ViaCommandSender; import com.viaversion.viaversion.api.command.ViaSubCommand; +import com.viaversion.viaversion.api.debug.DebugHandler; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Locale; public class DebugSubCmd extends ViaSubCommand { @Override @@ -34,8 +40,41 @@ public class DebugSubCmd extends ViaSubCommand { @Override public boolean execute(ViaCommandSender sender, String[] args) { - Via.getManager().setDebug(!Via.getManager().isDebug()); - sendMessage(sender, "&6Debug mode is now %s", (Via.getManager().isDebug() ? "&aenabled" : "&cdisabled")); - return true; + final DebugHandler debug = Via.getManager().debugHandler(); + if (args.length == 0) { + Via.getManager().debugHandler().setEnabled(!Via.getManager().debugHandler().enabled()); + sendMessage(sender, "&6Debug mode is now %s", (Via.getManager().debugHandler().enabled() ? "&aenabled" : "&cdisabled")); + return true; + } else if (args.length == 1) { + if (args[0].equalsIgnoreCase("clear")) { + debug.clearPacketTypesToLog(); + sendMessage(sender, "&6Cleared packet types to log"); + return true; + } else if (args[0].equalsIgnoreCase("logposttransform")) { + debug.setLogPostPacketTransform(!debug.logPostPacketTransform()); + sendMessage(sender, "&6Post transform packet logging is now %s", (debug.logPostPacketTransform() ? "&aenabled" : "&cdisabled")); + return true; + } + } else if (args.length == 2) { + if (args[0].equalsIgnoreCase("add")) { + debug.addPacketTypeNameToLog(args[1].toUpperCase(Locale.ROOT)); + sendMessage(sender, "&6Added packet type %s to debug logging", args[1]); + return true; + } else if (args[0].equalsIgnoreCase("remove")) { + debug.removePacketTypeNameToLog(args[1].toUpperCase(Locale.ROOT)); + sendMessage(sender, "&6Removed packet type %s from debug logging", args[1]); + return true; + } + } + return false; + } + + @Override + public List onTabComplete(final ViaCommandSender sender, final String[] args) { + if (args.length == 1) { + //TODO match current input + return Arrays.asList("clear", "logposttransform", "add", "remove"); + } + return Collections.emptyList(); } } diff --git a/common/src/main/java/com/viaversion/viaversion/debug/DebugHandlerImpl.java b/common/src/main/java/com/viaversion/viaversion/debug/DebugHandlerImpl.java new file mode 100644 index 000000000..29c8163f8 --- /dev/null +++ b/common/src/main/java/com/viaversion/viaversion/debug/DebugHandlerImpl.java @@ -0,0 +1,71 @@ +/* + * This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion + * Copyright (C) 2016-2021 ViaVersion and contributors + * + * 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 3 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. 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, see . + */ +package com.viaversion.viaversion.debug; + +import com.viaversion.viaversion.api.debug.DebugHandler; +import com.viaversion.viaversion.api.protocol.packet.PacketWrapper; + +import java.util.HashSet; +import java.util.Set; + +public final class DebugHandlerImpl implements DebugHandler { + + private final Set packetTypesToLog = new HashSet<>(); + private boolean logPostPacketTransform = true; + private boolean enabled; + + @Override + public boolean enabled() { + return enabled; + } + + @Override + public void setEnabled(final boolean enabled) { + this.enabled = enabled; + } + + @Override + public void addPacketTypeNameToLog(final String packetTypeName) { + packetTypesToLog.add(packetTypeName); + } + + @Override + public boolean removePacketTypeNameToLog(final String packetTypeName) { + return packetTypesToLog.remove(packetTypeName); + } + + @Override + public void clearPacketTypesToLog() { + packetTypesToLog.clear(); + } + + @Override + public boolean logPostPacketTransform() { + return logPostPacketTransform; + } + + @Override + public void setLogPostPacketTransform(final boolean logPostPacketTransform) { + this.logPostPacketTransform = logPostPacketTransform; + } + + @Override + public boolean shouldLog(final PacketWrapper wrapper) { + return packetTypesToLog.isEmpty() || (wrapper.getPacketType() != null && packetTypesToLog.contains(wrapper.getPacketType().getName())); + } +} diff --git a/common/src/main/java/com/viaversion/viaversion/protocol/ProtocolPipelineImpl.java b/common/src/main/java/com/viaversion/viaversion/protocol/ProtocolPipelineImpl.java index 14d971c26..d08bc5012 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocol/ProtocolPipelineImpl.java +++ b/common/src/main/java/com/viaversion/viaversion/protocol/ProtocolPipelineImpl.java @@ -20,6 +20,7 @@ package com.viaversion.viaversion.protocol; import com.google.common.collect.Sets; import com.viaversion.viaversion.api.Via; import com.viaversion.viaversion.api.connection.UserConnection; +import com.viaversion.viaversion.api.debug.DebugHandler; import com.viaversion.viaversion.api.platform.ViaPlatform; import com.viaversion.viaversion.api.protocol.AbstractSimpleProtocol; import com.viaversion.viaversion.api.protocol.Protocol; @@ -117,7 +118,8 @@ public class ProtocolPipelineImpl extends AbstractSimpleProtocol implements Prot packetWrapper.apply(direction, state, 0, protocolList, direction == Direction.CLIENTBOUND); super.transform(direction, state, packetWrapper); - if (Via.getManager().isDebug()) { + DebugHandler debugHandler = Via.getManager().debugHandler(); + if (debugHandler.enabled() && debugHandler.logPostPacketTransform() && debugHandler.shouldLog(packetWrapper)) { logPacket(direction, state, packetWrapper, originalID); } } diff --git a/common/src/main/java/com/viaversion/viaversion/protocol/packet/PacketWrapperImpl.java b/common/src/main/java/com/viaversion/viaversion/protocol/packet/PacketWrapperImpl.java index f0b89face..c4436ab39 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocol/packet/PacketWrapperImpl.java +++ b/common/src/main/java/com/viaversion/viaversion/protocol/packet/PacketWrapperImpl.java @@ -491,7 +491,7 @@ public class PacketWrapperImpl implements PacketWrapper { "packetValues=" + packetValues + ", readableObjects=" + readableObjects + ", id=" + id + - ", packetType" + packetType + + ", packetType=" + packetType + '}'; } } diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_14to1_13_2/Protocol1_14To1_13_2.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_14to1_13_2/Protocol1_14To1_13_2.java index 167e2bb32..d4384d91f 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_14to1_13_2/Protocol1_14To1_13_2.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_14to1_13_2/Protocol1_14To1_13_2.java @@ -67,7 +67,7 @@ public class Protocol1_14To1_13_2 extends AbstractProtocol