mirror of
https://github.com/PaperMC/Waterfall.git
synced 2024-11-28 21:25:47 +01:00
219 lines
8.2 KiB
Diff
219 lines
8.2 KiB
Diff
From 885489eeb7891db0a9c086c36f5e6802a75947f9 Mon Sep 17 00:00:00 2001
|
|
From: minecrafter <unknown@unknown>
|
|
Date: Sun, 3 Jul 2016 04:03:21 -0400
|
|
Subject: [PATCH] Proxy query event
|
|
|
|
|
|
diff --git a/api/src/main/java/io/github/waterfallmc/waterfall/QueryResult.java b/api/src/main/java/io/github/waterfallmc/waterfall/QueryResult.java
|
|
new file mode 100644
|
|
index 00000000..1e33cd19
|
|
--- /dev/null
|
|
+++ b/api/src/main/java/io/github/waterfallmc/waterfall/QueryResult.java
|
|
@@ -0,0 +1,62 @@
|
|
+package io.github.waterfallmc.waterfall;
|
|
+
|
|
+import lombok.AllArgsConstructor;
|
|
+import lombok.Data;
|
|
+import lombok.NonNull;
|
|
+
|
|
+import java.util.List;
|
|
+
|
|
+@Data
|
|
+@AllArgsConstructor
|
|
+public class QueryResult {
|
|
+ /**
|
|
+ * The message of the day to return.
|
|
+ */
|
|
+ @NonNull
|
|
+ private String motd;
|
|
+ /**
|
|
+ * The game type to return, usually SMP.
|
|
+ */
|
|
+ @NonNull
|
|
+ private String gameType;
|
|
+ /**
|
|
+ * The world name to return.
|
|
+ */
|
|
+ @NonNull
|
|
+ private String worldName;
|
|
+ /**
|
|
+ * The number of players currently online.
|
|
+ */
|
|
+ @NonNull
|
|
+ private int onlinePlayers;
|
|
+ /**
|
|
+ * The maximum number of players that can be online.
|
|
+ */
|
|
+ @NonNull
|
|
+ private int maxPlayers;
|
|
+ /**
|
|
+ * The port for this server.
|
|
+ */
|
|
+ @NonNull
|
|
+ private int port;
|
|
+ /**
|
|
+ * The hostname for this server.
|
|
+ */
|
|
+ @NonNull
|
|
+ private String address;
|
|
+ /**
|
|
+ * The game ID for this server, usually MINECRAFT.
|
|
+ */
|
|
+ @NonNull
|
|
+ private String gameId;
|
|
+ /**
|
|
+ * The players currently online.
|
|
+ */
|
|
+ @NonNull
|
|
+ private final List<String> players;
|
|
+ /**
|
|
+ * The version to return for this server.
|
|
+ */
|
|
+ @NonNull
|
|
+ private String version;
|
|
+}
|
|
diff --git a/api/src/main/java/io/github/waterfallmc/waterfall/event/ProxyQueryEvent.java b/api/src/main/java/io/github/waterfallmc/waterfall/event/ProxyQueryEvent.java
|
|
new file mode 100644
|
|
index 00000000..220d59f0
|
|
--- /dev/null
|
|
+++ b/api/src/main/java/io/github/waterfallmc/waterfall/event/ProxyQueryEvent.java
|
|
@@ -0,0 +1,28 @@
|
|
+package io.github.waterfallmc.waterfall.event;
|
|
+
|
|
+import io.github.waterfallmc.waterfall.QueryResult;
|
|
+import lombok.AllArgsConstructor;
|
|
+import lombok.Data;
|
|
+import lombok.EqualsAndHashCode;
|
|
+import lombok.NonNull;
|
|
+import net.md_5.bungee.api.config.ListenerInfo;
|
|
+import net.md_5.bungee.api.plugin.Event;
|
|
+
|
|
+/**
|
|
+ * This event will be posted whenever a Query request is received.
|
|
+ */
|
|
+@AllArgsConstructor
|
|
+@EqualsAndHashCode(callSuper = false)
|
|
+@Data
|
|
+public class ProxyQueryEvent extends Event {
|
|
+ /**
|
|
+ * The listener associated with this query.
|
|
+ */
|
|
+ @NonNull
|
|
+ private final ListenerInfo listener;
|
|
+ /**
|
|
+ * The query to return.
|
|
+ */
|
|
+ @NonNull
|
|
+ private QueryResult result;
|
|
+}
|
|
diff --git a/query/src/main/java/net/md_5/bungee/query/QueryHandler.java b/query/src/main/java/net/md_5/bungee/query/QueryHandler.java
|
|
index 79d6886a..a72cfd92 100644
|
|
--- a/query/src/main/java/net/md_5/bungee/query/QueryHandler.java
|
|
+++ b/query/src/main/java/net/md_5/bungee/query/QueryHandler.java
|
|
@@ -2,6 +2,8 @@ package net.md_5.bungee.query;
|
|
|
|
import com.google.common.cache.Cache;
|
|
import com.google.common.cache.CacheBuilder;
|
|
+import io.github.waterfallmc.waterfall.QueryResult;
|
|
+import io.github.waterfallmc.waterfall.event.ProxyQueryEvent;
|
|
import io.netty.buffer.ByteBuf;
|
|
import io.netty.channel.AddressedEnvelope;
|
|
import io.netty.channel.ChannelHandlerContext;
|
|
@@ -9,10 +11,12 @@ import io.netty.channel.SimpleChannelInboundHandler;
|
|
import io.netty.channel.socket.DatagramPacket;
|
|
import java.net.InetAddress;
|
|
import java.util.LinkedHashMap;
|
|
+import java.util.List;
|
|
import java.util.Map;
|
|
import java.util.Random;
|
|
import java.util.concurrent.TimeUnit;
|
|
import java.util.logging.Level;
|
|
+import java.util.stream.Collectors;
|
|
import lombok.Data;
|
|
import lombok.RequiredArgsConstructor;
|
|
import net.md_5.bungee.api.ProxyServer;
|
|
@@ -84,19 +88,30 @@ public class QueryHandler extends SimpleChannelInboundHandler<DatagramPacket>
|
|
throw new IllegalStateException( "No session!" );
|
|
}
|
|
|
|
+ // Waterfall start
|
|
+ List<String> players = bungee.getPlayers().stream().map(ProxiedPlayer::getName).collect(Collectors.toList());
|
|
+
|
|
+ ProxyQueryEvent event = new ProxyQueryEvent(listener, new QueryResult(listener.getMotd(), "SMP", "Waterfall_Proxy",
|
|
+ bungee.getOnlineCount(), listener.getMaxPlayers(), listener.getHost().getPort(),
|
|
+ listener.getHost().getHostString(), "MINECRAFT", players, bungee.getGameVersion()));
|
|
+ QueryResult result = bungee.getPluginManager().callEvent(event).getResult();
|
|
+ // Waterfall end
|
|
+
|
|
out.writeByte( 0x00 );
|
|
out.writeInt( sessionId );
|
|
|
|
if ( in.readableBytes() == 0 )
|
|
{
|
|
// Short response
|
|
- writeString( out, listener.getMotd() ); // MOTD
|
|
- writeString( out, "SMP" ); // Game Type
|
|
- writeString( out, "BungeeCord_Proxy" ); // World Name
|
|
- writeNumber( out, bungee.getOnlineCount() ); // Online Count
|
|
- writeNumber( out, listener.getMaxPlayers() ); // Max Players
|
|
- writeShort( out, listener.getHost().getPort() ); // Port
|
|
- writeString( out, listener.getHost().getHostString() ); // IP
|
|
+ // Waterfall start
|
|
+ writeString( out, result.getMotd() ); // MOTD
|
|
+ writeString( out, result.getGameType() ); // Game Type
|
|
+ writeString( out, result.getWorldName() ); // World Name
|
|
+ writeNumber( out, result.getOnlinePlayers() ); // Online Count
|
|
+ writeNumber( out, result.getMaxPlayers() ); // Max Players
|
|
+ writeShort( out, result.getPort() ); // Port
|
|
+ writeString( out, result.getAddress() ); // IP
|
|
+ // Waterfall end
|
|
} else if ( in.readableBytes() == 4 )
|
|
{
|
|
// Long Response
|
|
@@ -106,18 +121,20 @@ public class QueryHandler extends SimpleChannelInboundHandler<DatagramPacket>
|
|
} );
|
|
Map<String, String> data = new LinkedHashMap<>();
|
|
|
|
- data.put( "hostname", listener.getMotd() );
|
|
- data.put( "gametype", "SMP" );
|
|
+ // Waterfall start
|
|
+ data.put( "hostname", result.getMotd() );
|
|
+ data.put( "gametype", result.getGameType() );
|
|
// Start Extra Info
|
|
- data.put( "game_id", "MINECRAFT" );
|
|
- data.put( "version", bungee.getGameVersion() );
|
|
- data.put( "plugins", "" );
|
|
+ data.put( "game_id", result.getGameId() );
|
|
+ data.put( "version", result.getVersion() );
|
|
+ data.put( "plugins", "" ); // TODO: Allow population?
|
|
// End Extra Info
|
|
- data.put( "map", "BungeeCord_Proxy" );
|
|
- data.put( "numplayers", Integer.toString( bungee.getOnlineCount() ) );
|
|
- data.put( "maxplayers", Integer.toString( listener.getMaxPlayers() ) );
|
|
- data.put( "hostport", Integer.toString( listener.getHost().getPort() ) );
|
|
- data.put( "hostip", listener.getHost().getHostString() );
|
|
+ data.put( "map", result.getWorldName() );
|
|
+ data.put( "numplayers", Integer.toString( result.getOnlinePlayers() ) );
|
|
+ data.put( "maxplayers", Integer.toString( result.getMaxPlayers() ) );
|
|
+ data.put( "hostport", Integer.toString( result.getPort() ) );
|
|
+ data.put( "hostip", result.getAddress() );
|
|
+ // Waterfall end
|
|
|
|
for ( Map.Entry<String, String> entry : data.entrySet() )
|
|
{
|
|
@@ -129,10 +146,7 @@ public class QueryHandler extends SimpleChannelInboundHandler<DatagramPacket>
|
|
// Padding
|
|
writeString( out, "\01player_\00" );
|
|
// Player List
|
|
- for ( ProxiedPlayer p : bungee.getPlayers() )
|
|
- {
|
|
- writeString( out, p.getName() );
|
|
- }
|
|
+ result.getPlayers().stream().forEach(p -> writeString(out, p)); // Waterfall
|
|
out.writeByte( 0x00 ); // Null
|
|
} else
|
|
{
|
|
--
|
|
2.18.0
|
|
|