From 885489eeb7891db0a9c086c36f5e6802a75947f9 Mon Sep 17 00:00:00 2001 From: minecrafter 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 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 throw new IllegalStateException( "No session!" ); } + // Waterfall start + List 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 } ); Map 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 entry : data.entrySet() ) { @@ -129,10 +146,7 @@ public class QueryHandler extends SimpleChannelInboundHandler // 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