Add support for Minecraft 1.11

Improve QueryHandler session handling as suggested by IchBinJoe
This commit is contained in:
md_5
2016-11-15 02:40:46 +11:00
parent 1ad81564ad
commit 9ecdde2292
23 changed files with 240 additions and 46 deletions

View File

@@ -6,13 +6,13 @@
<parent>
<groupId>net.md-5</groupId>
<artifactId>bungeecord-parent</artifactId>
<version>1.10-SNAPSHOT</version>
<version>1.11-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<groupId>net.md-5</groupId>
<artifactId>bungeecord-query</artifactId>
<version>1.10-SNAPSHOT</version>
<version>1.11-SNAPSHOT</version>
<packaging>jar</packaging>
<name>BungeeCord-Query</name>

View File

@@ -1,17 +1,19 @@
package net.md_5.bungee.query;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import io.netty.buffer.ByteBuf;
import io.netty.channel.AddressedEnvelope;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.socket.DatagramPacket;
import java.nio.ByteOrder;
import java.util.HashMap;
import java.net.InetAddress;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Random;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import lombok.Data;
import lombok.RequiredArgsConstructor;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.config.ListenerInfo;
@@ -25,11 +27,11 @@ public class QueryHandler extends SimpleChannelInboundHandler<DatagramPacket>
private final ListenerInfo listener;
/*========================================================================*/
private final Random random = new Random();
private final Map<Integer, Long> sessions = new HashMap<>();
private final Cache<InetAddress, QuerySession> sessions = CacheBuilder.newBuilder().expireAfterWrite( 30, TimeUnit.SECONDS).build();
private void writeShort(ByteBuf buf, int s)
{
buf.order( ByteOrder.LITTLE_ENDIAN ).writeShort( s );
buf.writeShortLE( s );
}
private void writeNumber(ByteBuf buf, int i)
@@ -68,7 +70,7 @@ public class QueryHandler extends SimpleChannelInboundHandler<DatagramPacket>
out.writeInt( sessionId );
int challengeToken = random.nextInt();
sessions.put( challengeToken, System.currentTimeMillis() );
sessions.put( msg.sender().getAddress(), new QuerySession( challengeToken, System.currentTimeMillis() ) );
writeNumber( out, challengeToken );
}
@@ -76,8 +78,8 @@ public class QueryHandler extends SimpleChannelInboundHandler<DatagramPacket>
if ( type == 0x00 )
{
int challengeToken = in.readInt();
Long session = sessions.get( challengeToken );
if ( session == null || System.currentTimeMillis() - session > TimeUnit.SECONDS.toMillis( 30 ) )
QuerySession session = sessions.getIfPresent( msg.sender().getAddress() );
if ( session == null || session.getToken() != challengeToken )
{
throw new IllegalStateException( "No session!" );
}
@@ -147,4 +149,12 @@ public class QueryHandler extends SimpleChannelInboundHandler<DatagramPacket>
{
bungee.getLogger().log( Level.WARNING, "Error whilst handling query packet from " + ctx.channel().remoteAddress(), cause );
}
@Data
private static class QuerySession
{
private final int token;
private final long time;
}
}