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