Waterfall/BungeeCord-Patches/0036-Proxy-query-event.patch
Minecrell d3dc2d3748 Implement full console command completion
Drop the original console command completion patch and rewrite it
for JLine 3. Add support to complete command names instead of just
command arguments.

The additional single thread executor for command completion was
dropped because it's redundant: since the command completer needs
to wait for it to complete anyway, we might as well do the completion
directly from the console thread.
2017-09-26 19:37:34 +01:00

219 lines
8.2 KiB
Diff

From 0497395a9022b1969c5a7b22514e147091a85311 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.14.1