From 848b0cf11352fca0fba231dbffece85a5fd90746 Mon Sep 17 00:00:00 2001 From: Myles Date: Sun, 25 Sep 2016 16:03:03 +0100 Subject: [PATCH] Make ViaCommandSender better, fix quite a few of the commands. --- .../bukkit/BukkitCommandSender.java | 17 +++++ .../ViaVersion/handlers/ViaDecodeHandler.java | 2 +- .../protocol1_9to1_8/ArmorListener.java | 9 ++- .../java/us/myles/ViaVersion/ViaManager.java | 3 +- .../ViaVersion/api/ViaVersionConfig.java | 5 ++ .../api/command/ViaCommandSender.java | 7 ++ .../ViaVersion/api/platform/ViaPlatform.java | 3 + .../commands/defaultsubs/AutoTeamSubCmd.java | 3 +- .../commands/defaultsubs/DebugSubCmd.java | 10 +-- .../defaultsubs/DisplayLeaksSubCmd.java | 1 - .../commands/defaultsubs/DumpSubCmd.java | 6 -- .../commands/defaultsubs/HelpSubCmd.java | 9 +-- .../commands/defaultsubs/ListSubCmd.java | 9 +-- .../commands/defaultsubs/PPSSubCmd.java | 14 ++-- .../commands/defaultsubs/ReloadSubCmd.java | 7 +- .../protocols/protocol1_9to1_8/ArmorType.java | 74 +++++++------------ 16 files changed, 87 insertions(+), 92 deletions(-) diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitCommandSender.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitCommandSender.java index 64dbf26b6..2cc59c25b 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitCommandSender.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/BukkitCommandSender.java @@ -2,8 +2,11 @@ package us.myles.ViaVersion.bukkit; import lombok.AllArgsConstructor; import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; import us.myles.ViaVersion.api.command.ViaCommandSender; +import java.util.UUID; + @AllArgsConstructor public class BukkitCommandSender implements ViaCommandSender { private CommandSender sender; @@ -17,4 +20,18 @@ public class BukkitCommandSender implements ViaCommandSender { public void sendMessage(String msg) { sender.sendMessage(msg); } + + @Override + public UUID getUUID() { + if (sender instanceof Player) { + return ((Player) sender).getUniqueId(); + } else { + return UUID.fromString(getName()); + } + } + + @Override + public String getName() { + return sender.getName(); + } } diff --git a/bukkit/src/main/java/us/myles/ViaVersion/handlers/ViaDecodeHandler.java b/bukkit/src/main/java/us/myles/ViaVersion/handlers/ViaDecodeHandler.java index a947ee757..228388a24 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/handlers/ViaDecodeHandler.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/handlers/ViaDecodeHandler.java @@ -48,7 +48,7 @@ public class ViaDecodeHandler extends ByteToMessageDecoder { // Transform ByteBuf newPacket = ctx.alloc().buffer(); try { - if (id == ViaDecodeHandler.PASSTHROUGH_ID) { + if (id == PacketWrapper.PASSTHROUGH_ID) { newPacket.writeBytes(bytebuf); } else { PacketWrapper wrapper = new PacketWrapper(id, bytebuf, info); diff --git a/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/ArmorListener.java b/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/ArmorListener.java index 9e31d4c27..38f8a5dad 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/ArmorListener.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/listeners/protocol1_9to1_8/ArmorListener.java @@ -12,6 +12,7 @@ import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerRespawnEvent; import org.bukkit.inventory.CraftingInventory; +import org.bukkit.inventory.ItemStack; import us.myles.ViaVersion.ViaVersionPlugin; import us.myles.ViaVersion.api.PacketWrapper; import us.myles.ViaVersion.api.ViaListener; @@ -33,7 +34,11 @@ public class ArmorListener extends ViaListener { // Ensure that the player is on our pipe if (!isOnPipe(player)) return; - int armor = ArmorType.calculateArmorPoints(player.getInventory().getArmorContents()); + + int armor = 0; + for (ItemStack stack : player.getInventory().getArmorContents()) { + armor += ArmorType.findById(stack.getTypeId()).getArmorPoints(); + } PacketWrapper wrapper = new PacketWrapper(0x4B, null, getUserConnection(player)); try { @@ -58,7 +63,7 @@ public class ArmorListener extends ViaListener { if (human instanceof Player && e.getInventory() instanceof CraftingInventory) { final Player player = (Player) human; if (e.getCurrentItem() != null) { - if (ArmorType.isArmor(e.getCurrentItem().getType())) { + if (ArmorType.isArmor(e.getCurrentItem().getTypeId())) { sendDelayedArmorUpdate(player); return; } diff --git a/common/src/main/java/us/myles/ViaVersion/ViaManager.java b/common/src/main/java/us/myles/ViaVersion/ViaManager.java index e891e04c4..541e2e2fc 100644 --- a/common/src/main/java/us/myles/ViaVersion/ViaManager.java +++ b/common/src/main/java/us/myles/ViaVersion/ViaManager.java @@ -9,6 +9,7 @@ import us.myles.ViaVersion.api.platform.ViaInjector; import us.myles.ViaVersion.api.platform.ViaPlatform; import us.myles.ViaVersion.api.protocol.ProtocolRegistry; import us.myles.ViaVersion.api.protocol.ProtocolVersion; +import us.myles.ViaVersion.commands.ViaCommandHandler; import us.myles.ViaVersion.protocols.base.ProtocolInfo; import us.myles.ViaVersion.update.UpdateUtil; @@ -24,7 +25,7 @@ public class ViaManager { private boolean debug = false; // Internals private ViaInjector injector; - private ViaVersionCommand commandHandler; + private ViaCommandHandler commandHandler; public ViaManager(ViaPlatform platform) { this.platform = platform; diff --git a/common/src/main/java/us/myles/ViaVersion/api/ViaVersionConfig.java b/common/src/main/java/us/myles/ViaVersion/api/ViaVersionConfig.java index ac8c1d1cd..365392cd3 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/ViaVersionConfig.java +++ b/common/src/main/java/us/myles/ViaVersion/api/ViaVersionConfig.java @@ -217,4 +217,9 @@ public interface ViaVersionConfig { * @return Disconnect message */ String getReloadDisconnectMsg(); + + /** + * Reloads the config from disk + */ + void reloadConfig(); } diff --git a/common/src/main/java/us/myles/ViaVersion/api/command/ViaCommandSender.java b/common/src/main/java/us/myles/ViaVersion/api/command/ViaCommandSender.java index 8dacd6526..e47eec91b 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/command/ViaCommandSender.java +++ b/common/src/main/java/us/myles/ViaVersion/api/command/ViaCommandSender.java @@ -1,6 +1,13 @@ package us.myles.ViaVersion.api.command; +import java.util.UUID; + public interface ViaCommandSender { public boolean hasPermission(String permission); + public void sendMessage(String msg); + + public UUID getUUID(); + + public String getName(); } diff --git a/common/src/main/java/us/myles/ViaVersion/api/platform/ViaPlatform.java b/common/src/main/java/us/myles/ViaVersion/api/platform/ViaPlatform.java index 749db27f0..3e1f10629 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/platform/ViaPlatform.java +++ b/common/src/main/java/us/myles/ViaVersion/api/platform/ViaPlatform.java @@ -2,6 +2,7 @@ package us.myles.ViaVersion.api.platform; import us.myles.ViaVersion.api.ViaAPI; import us.myles.ViaVersion.api.ViaVersionConfig; +import us.myles.ViaVersion.api.command.ViaCommandSender; import java.util.UUID; import java.util.logging.Logger; @@ -22,6 +23,8 @@ public interface ViaPlatform { public void runSync(Runnable runnable); + public ViaCommandSender[] getOnlinePlayers(); + public void sendMessage(UUID uuid, String message); public boolean kickPlayer(UUID uuid, String message); diff --git a/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/AutoTeamSubCmd.java b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/AutoTeamSubCmd.java index dee8f5331..e495f1cb4 100644 --- a/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/AutoTeamSubCmd.java +++ b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/AutoTeamSubCmd.java @@ -1,6 +1,7 @@ package us.myles.ViaVersion.commands.defaultsubs; import us.myles.ViaVersion.ViaVersionPlugin; +import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.ViaVersion; import us.myles.ViaVersion.api.command.ViaCommandSender; import us.myles.ViaVersion.api.command.ViaSubCommand; @@ -20,7 +21,7 @@ public class AutoTeamSubCmd extends ViaSubCommand { public boolean execute(ViaCommandSender sender, String[] args) { ViaVersionPlugin plugin = (ViaVersionPlugin) ViaVersion.getInstance(); - boolean newValue = !ViaVersion.getConfig().isAutoTeam(); + boolean newValue = !Via.getConfig().isAutoTeam(); plugin.getConfig().set("auto-team", newValue); plugin.saveConfig(); sendMessage(sender, "&6We will %s", (newValue ? "&aautomatically team players" : "&cno longer auto team players")); diff --git a/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DebugSubCmd.java b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DebugSubCmd.java index 997f5670d..47396264c 100644 --- a/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DebugSubCmd.java +++ b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DebugSubCmd.java @@ -1,8 +1,6 @@ package us.myles.ViaVersion.commands.defaultsubs; -import org.bukkit.command.CommandSender; -import us.myles.ViaVersion.ViaVersionPlugin; -import us.myles.ViaVersion.api.ViaVersion; +import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.command.ViaCommandSender; import us.myles.ViaVersion.api.command.ViaSubCommand; @@ -19,10 +17,8 @@ public class DebugSubCmd extends ViaSubCommand { @Override public boolean execute(ViaCommandSender sender, String[] args) { - ViaVersionPlugin plugin = (ViaVersionPlugin) ViaVersion.getInstance(); - - plugin.setDebug(!plugin.isDebug()); - sendMessage(sender, "&6Debug mode is now %s", (plugin.isDebug() ? "&aenabled" : "&cdisabled")); + Via.getManager().setDebug(!Via.getManager().isDebug()); + sendMessage(sender, "&6Debug mode is now %s", (Via.getManager().isDebug() ? "&aenabled" : "&cdisabled")); return true; } } diff --git a/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DisplayLeaksSubCmd.java b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DisplayLeaksSubCmd.java index 309b1a85c..5710105db 100644 --- a/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DisplayLeaksSubCmd.java +++ b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DisplayLeaksSubCmd.java @@ -1,7 +1,6 @@ package us.myles.ViaVersion.commands.defaultsubs; import io.netty.util.ResourceLeakDetector; -import org.bukkit.command.CommandSender; import us.myles.ViaVersion.api.command.ViaCommandSender; import us.myles.ViaVersion.api.command.ViaSubCommand; diff --git a/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DumpSubCmd.java b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DumpSubCmd.java index adb108ff7..eaa45d65a 100644 --- a/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DumpSubCmd.java +++ b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/DumpSubCmd.java @@ -3,12 +3,6 @@ package us.myles.ViaVersion.commands.defaultsubs; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonObject; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.command.CommandSender; -import org.bukkit.plugin.Plugin; -import us.myles.ViaVersion.ViaVersionPlugin; -import us.myles.ViaVersion.api.ViaVersion; import us.myles.ViaVersion.api.command.ViaCommandSender; import us.myles.ViaVersion.api.command.ViaSubCommand; import us.myles.ViaVersion.api.protocol.ProtocolRegistry; diff --git a/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/HelpSubCmd.java b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/HelpSubCmd.java index 6f674c18f..96983349a 100644 --- a/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/HelpSubCmd.java +++ b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/HelpSubCmd.java @@ -1,11 +1,8 @@ package us.myles.ViaVersion.commands.defaultsubs; -import org.bukkit.command.CommandSender; -import us.myles.ViaVersion.ViaVersionPlugin; -import us.myles.ViaVersion.api.ViaVersion; +import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.command.ViaCommandSender; import us.myles.ViaVersion.api.command.ViaSubCommand; -import us.myles.ViaVersion.commands.ViaCommandHandler; public class HelpSubCmd extends ViaSubCommand { @Override @@ -20,9 +17,7 @@ public class HelpSubCmd extends ViaSubCommand { @Override public boolean execute(ViaCommandSender sender, String[] args) { - ViaVersionPlugin plugin = (ViaVersionPlugin) ViaVersion.getInstance(); - - ((ViaCommandHandler) plugin.getCommandHandler()).showHelp(sender); + Via.getManager().getCommandHandler().showHelp(sender); return true; } } diff --git a/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/ListSubCmd.java b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/ListSubCmd.java index 53c4047e1..c1e8e8458 100644 --- a/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/ListSubCmd.java +++ b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/ListSubCmd.java @@ -1,9 +1,6 @@ package us.myles.ViaVersion.commands.defaultsubs; -import org.bukkit.Bukkit; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import us.myles.ViaVersion.api.ViaVersion; +import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.command.ViaCommandSender; import us.myles.ViaVersion.api.command.ViaSubCommand; import us.myles.ViaVersion.api.protocol.ProtocolVersion; @@ -35,8 +32,8 @@ public class ListSubCmd extends ViaSubCommand { } }); - for (Player p : Bukkit.getOnlinePlayers()) { - int playerVersion = ViaVersion.getInstance().getPlayerVersion(p); + for (ViaCommandSender p : Via.getPlatform().getOnlinePlayers()) { + int playerVersion = Via.getAPI().getPlayerVersion(p.getUUID()); ProtocolVersion key = ProtocolVersion.getProtocol(playerVersion); if (!playerVersions.containsKey(key)) playerVersions.put(key, new HashSet()); diff --git a/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/PPSSubCmd.java b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/PPSSubCmd.java index 6cf98ae8e..c46d4ccac 100644 --- a/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/PPSSubCmd.java +++ b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/PPSSubCmd.java @@ -1,10 +1,6 @@ package us.myles.ViaVersion.commands.defaultsubs; -import org.bukkit.Bukkit; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import us.myles.ViaVersion.ViaVersionPlugin; -import us.myles.ViaVersion.api.ViaVersion; +import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.command.ViaCommandSender; import us.myles.ViaVersion.api.command.ViaSubCommand; import us.myles.ViaVersion.api.data.UserConnection; @@ -35,13 +31,13 @@ public class PPSSubCmd extends ViaSubCommand { int clients = 0; long max = 0; - for (Player p : Bukkit.getOnlinePlayers()) { - if (!ViaVersion.getInstance().isPorted(p)) + for (ViaCommandSender p : Via.getPlatform().getOnlinePlayers()) { + if (!Via.getAPI().isPorted(p.getUUID())) continue; - int playerVersion = ViaVersion.getInstance().getPlayerVersion(p); + int playerVersion = Via.getAPI().getPlayerVersion(p.getUUID()); if (!playerVersions.containsKey(playerVersion)) playerVersions.put(playerVersion, new HashSet()); - UserConnection uc = ((ViaVersionPlugin) ViaVersion.getInstance()).getConnection(p); + UserConnection uc = Via.getManager().getConnection(p.getUUID()); if (uc.getPacketsPerSecond() > -1) { playerVersions.get(playerVersion).add(p.getName() + " (" + uc.getPacketsPerSecond() + " PPS)"); totalPackets += uc.getPacketsPerSecond(); diff --git a/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/ReloadSubCmd.java b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/ReloadSubCmd.java index b919e4ab8..938651a36 100644 --- a/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/ReloadSubCmd.java +++ b/common/src/main/java/us/myles/ViaVersion/commands/defaultsubs/ReloadSubCmd.java @@ -1,7 +1,6 @@ package us.myles.ViaVersion.commands.defaultsubs; -import us.myles.ViaVersion.ViaVersionPlugin; -import us.myles.ViaVersion.api.ViaVersion; +import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.command.ViaCommandSender; import us.myles.ViaVersion.api.command.ViaSubCommand; @@ -18,9 +17,7 @@ public class ReloadSubCmd extends ViaSubCommand { @Override public boolean execute(ViaCommandSender sender, String[] args) { - ViaVersionPlugin plugin = (ViaVersionPlugin) ViaVersion.getInstance(); - - plugin.getConf().generateConfig(); + Via.getConfig().reloadConfig(); sendMessage(sender, "&6Configuration successfully reloaded! Some features may need a restart."); return true; } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/ArmorType.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/ArmorType.java index b9446c5fb..a9cd642cc 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/ArmorType.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/ArmorType.java @@ -2,8 +2,6 @@ package us.myles.ViaVersion.protocols.protocol1_9to1_8; import lombok.Getter; import lombok.RequiredArgsConstructor; -import org.bukkit.Material; -import org.bukkit.inventory.ItemStack; import java.util.HashMap; @@ -11,54 +9,39 @@ import java.util.HashMap; @Getter public enum ArmorType { - LEATHER_HELMET(1, 298, Material.LEATHER_HELMET), - LEATHER_CHESTPLATE(3, 299, Material.LEATHER_CHESTPLATE), - LEATHER_LEGGINGS(2, 300, Material.LEATHER_LEGGINGS), - LEATHER_BOOTS(1, 301, Material.LEATHER_BOOTS), - CHAINMAIL_HELMET(2, 302, Material.CHAINMAIL_HELMET), - CHAINMAIL_CHESTPLATE(5, 303, Material.CHAINMAIL_CHESTPLATE), - CHAINMAIL_LEGGINGS(4, 304, Material.CHAINMAIL_LEGGINGS), - CHAINMAIL_BOOTS(1, 305, Material.CHAINMAIL_BOOTS), - IRON_HELMET(2, 306, Material.IRON_HELMET), - IRON_CHESTPLATE(6, 307, Material.IRON_CHESTPLATE), - IRON_LEGGINGS(5, 308, Material.IRON_LEGGINGS), - IRON_BOOTS(2, 309, Material.IRON_BOOTS), - DIAMOND_HELMET(3, 310, Material.DIAMOND_HELMET), - DIAMOND_CHESTPLATE(8, 311, Material.DIAMOND_CHESTPLATE), - DIAMOND_LEGGINGS(6, 312, Material.DIAMOND_LEGGINGS), - DIAMOND_BOOTS(3, 313, Material.DIAMOND_BOOTS), - GOLD_HELMET(2, 314, Material.GOLD_HELMET), - GOLD_CHESTPLATE(5, 315, Material.GOLD_CHESTPLATE), - GOLD_LEGGINGS(3, 316, Material.GOLD_LEGGINGS), - GOLD_BOOTS(1, 317, Material.GOLD_BOOTS), - NONE(0, 0, Material.AIR); + LEATHER_HELMET(1, 298), + LEATHER_CHESTPLATE(3, 299), + LEATHER_LEGGINGS(2, 300), + LEATHER_BOOTS(1, 301), + CHAINMAIL_HELMET(2, 302), + CHAINMAIL_CHESTPLATE(5, 303), + CHAINMAIL_LEGGINGS(4, 304), + CHAINMAIL_BOOTS(1, 305), + IRON_HELMET(2, 306), + IRON_CHESTPLATE(6, 307), + IRON_LEGGINGS(5, 308), + IRON_BOOTS(2, 309), + DIAMOND_HELMET(3, 310), + DIAMOND_CHESTPLATE(8, 311), + DIAMOND_LEGGINGS(6, 312), + DIAMOND_BOOTS(3, 313), + GOLD_HELMET(2, 314), + GOLD_CHESTPLATE(5, 315), + GOLD_LEGGINGS(3, 316), + GOLD_BOOTS(1, 317), + NONE(0, 0); - private static HashMap armor; + private static HashMap armor; static { - armor = new HashMap(); + armor = new HashMap<>(); for (ArmorType a : ArmorType.values()) { - armor.put(a.getType(), a); + armor.put(a.getId(), a); } } private final int armorPoints; private final int id; - private final Material type; - - public static ArmorType findByType(Material type) { - ArmorType t = armor.get(type); - return t == null ? ArmorType.NONE : t; - } - - public static int calculateArmorPoints(ItemStack[] armor) { - int total = 0; - for (ItemStack anArmor : armor) { - if (anArmor != null) - total += findByType(anArmor.getType()).getArmorPoints(); - } - return total; - } public static ArmorType findById(int id) { for (ArmorType a : ArmorType.values()) @@ -67,9 +50,9 @@ public enum ArmorType { return ArmorType.NONE; } - public static boolean isArmor(Material material) { + public static boolean isArmor(int id) { for (ArmorType a : ArmorType.values()) - if (a.getType() == material) + if (a.getId() == id) return true; return false; } @@ -83,8 +66,7 @@ public enum ArmorType { return total; } - public Material getType() { - return this.type; + public int getId() { + return this.id; } - } \ No newline at end of file