diff --git a/pom.xml b/pom.xml index e5cc334..1ef3156 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ net.rubeta LegacyPing - 1.7 + 1.8 jar LegacyPing diff --git a/src/main/java/net/rubeta/legacyping/LegacyPing.java b/src/main/java/net/rubeta/legacyping/LegacyPing.java index a00d242..5f17d66 100644 --- a/src/main/java/net/rubeta/legacyping/LegacyPing.java +++ b/src/main/java/net/rubeta/legacyping/LegacyPing.java @@ -1,5 +1,8 @@ package net.rubeta.legacyping; +import org.bukkit.ChatColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.plugin.java.JavaPlugin; @@ -14,6 +17,10 @@ public final class LegacyPing extends JavaPlugin { @Override public void onEnable() { this.saveDefaultConfig(); + this.startThreads(); + } + + private void startThreads() { final FileConfiguration config = this.getConfig(); final String host = config.getString("host", "0.0.0.0"); final List ports = config.getIntegerList("port"); @@ -33,4 +40,17 @@ public final class LegacyPing extends JavaPlugin { public void onDisable() { this.threads.forEach(ServerThread::shutdown); } + + @Override + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + if (!sender.isOp()) { + return true; + } + + this.threads.forEach(ServerThread::shutdown); + this.threads.clear(); + this.startThreads(); + sender.sendMessage(ChatColor.GOLD + "Restarted"); + return true; + } } diff --git a/src/main/java/net/rubeta/legacyping/ServerThread.java b/src/main/java/net/rubeta/legacyping/ServerThread.java index 6b49faa..fdfb5a2 100644 --- a/src/main/java/net/rubeta/legacyping/ServerThread.java +++ b/src/main/java/net/rubeta/legacyping/ServerThread.java @@ -72,9 +72,11 @@ public class ServerThread extends Thread { if (!this.working.get()) { break; } + InetAddress address = null; try (final Socket socket = this.serverSocket.accept()) { final DataInputStream inputStream = new DataInputStream(socket.getInputStream()); final DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream()); + address = socket.getInetAddress(); socket.setTrafficClass(SocketOptions.TCP_NODELAY & SocketOptions.IP_TOS); final int packetLength = inputStream.readByte() | inputStream.readByte() << 1; // idk why it doesn't a VarInt @@ -89,6 +91,8 @@ public class ServerThread extends Thread { this.responseForModernPing(outputStream, MODERN_RESPONSE); } else { this.responseForModernPing(outputStream, DISCONNECT_REASON); + socket.close(); + continue; } outputStream.flush(); @@ -106,7 +110,8 @@ public class ServerThread extends Thread { outputStream.writeLong(inputStream.readLong()); // timestamp } catch (SocketTimeoutException | EOFException ignore) { } catch (Exception ex) { - this.logger.log(Level.WARNING, "Unexpectable exception in " + this.getName(), ex); + this.logger.warning("An exception occurred while communicating with " + address); + this.logger.log(Level.WARNING, "Exception in " + this.getName(), ex); } } } @@ -159,17 +164,21 @@ public class ServerThread extends Thread { return this.minecraftServer == null ? 37 : this.minecraftServer.getMaxPlayers(); } - public int readVarInt(DataInputStream in) throws IOException { + public int readVarInt(DataInputStream in) { int i = 0; int j = 0; - byte b0; - do { - b0 = in.readByte(); - i |= (b0 & 127) << j++ * 7; - if (j > 5) { - throw new RuntimeException("VarInt too big"); - } - } while ((b0 & 128) == 128); + try { + byte b0; + do { + b0 = in.readByte(); + i |= (b0 & 127) << j++ * 7; + if (j > 5) { + throw new RuntimeException("VarInt too big"); + } + } while ((b0 & 128) == 128); + } catch (Exception ignore) { + return 0; + } return i; } diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 284ec33..20fa2c4 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,3 +1,10 @@ name: LegacyPing version: '${project.version}' main: net.rubeta.legacyping.LegacyPing +commands: + legacyping: + permission: legacyping.command.legacyping + +permissions: + legacyping.command.legacyping: + default: op