package net.minecraft.network;
import com.google.common.base.Charsets;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import java.net.InetSocketAddress;
import net.minecraft.server.MinecraftServer;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class PingResponseHandler extends ChannelInboundHandlerAdapter
{
private static final Logger logger = LogManager.getLogger();
private NetworkSystem networkSystem;
private static final String __OBFID = "CL_00001444";
public PingResponseHandler(NetworkSystem networkSystemIn)
{
this.networkSystem = networkSystemIn;
}
public void channelRead(ChannelHandlerContext p_channelRead_1_, Object p_channelRead_2_)
{
ByteBuf var3 = (ByteBuf)p_channelRead_2_;
var3.markReaderIndex();
boolean var4 = true;
try
{
try
{
if (var3.readUnsignedByte() != 254)
{
return;
}
InetSocketAddress var5 = (InetSocketAddress)p_channelRead_1_.channel().remoteAddress();
MinecraftServer var6 = this.networkSystem.getServer();
int var7 = var3.readableBytes();
String var8;
switch (var7)
{
case 0:
logger.debug("Ping: (<1.3.x) from {}:{}", new Object[] {var5.getAddress(), Integer.valueOf(var5.getPort())});
var8 = String.format("%s\u00a7%d\u00a7%d", new Object[] {var6.getMOTD(), Integer.valueOf(var6.getCurrentPlayerCount()), Integer.valueOf(var6.getMaxPlayers())});
this.writeAndFlush(p_channelRead_1_, this.getStringBuffer(var8));
break;
case 1:
if (var3.readUnsignedByte() != 1)
{
return;
}
logger.debug("Ping: (1.4-1.5.x) from {}:{}", new Object[] {var5.getAddress(), Integer.valueOf(var5.getPort())});
var8 = String.format("\u00a71\u0000%d\u0000%s\u0000%s\u0000%d\u0000%d", new Object[] {Integer.valueOf(127), var6.getMinecraftVersion(), var6.getMOTD(), Integer.valueOf(var6.getCurrentPlayerCount()), Integer.valueOf(var6.getMaxPlayers())});
this.writeAndFlush(p_channelRead_1_, this.getStringBuffer(var8));
break;
default:
boolean var23 = var3.readUnsignedByte() == 1;
var23 &= var3.readUnsignedByte() == 250;
var23 &= "MC|PingHost".equals(new String(var3.readBytes(var3.readShort() * 2).array(), Charsets.UTF_16BE));
int var9 = var3.readUnsignedShort();
var23 &= var3.readUnsignedByte() >= 73;
var23 &= 3 + var3.readBytes(var3.readShort() * 2).array().length + 4 == var9;
var23 &= var3.readInt() <= 65535;
var23 &= var3.readableBytes() == 0;
if (!var23)
{
return;
}
logger.debug("Ping: (1.6) from {}:{}", new Object[] {var5.getAddress(), Integer.valueOf(var5.getPort())});
String var10 = String.format("\u00a71\u0000%d\u0000%s\u0000%s\u0000%d\u0000%d", new Object[] {Integer.valueOf(127), var6.getMinecraftVersion(), var6.getMOTD(), Integer.valueOf(var6.getCurrentPlayerCount()), Integer.valueOf(var6.getMaxPlayers())});
ByteBuf var11 = this.getStringBuffer(var10);
try
{
this.writeAndFlush(p_channelRead_1_, var11);
}
finally
{
var11.release();
}
}
var3.release();
var4 = false;
}
catch (RuntimeException var21)
{
;
}
}
finally
{
if (var4)
{
var3.resetReaderIndex();
p_channelRead_1_.channel().pipeline().remove("legacy_query");
p_channelRead_1_.fireChannelRead(p_channelRead_2_);
}
}
}
private void writeAndFlush(ChannelHandlerContext ctx, ByteBuf data)
{
ctx.pipeline().firstContext().writeAndFlush(data).addListener(ChannelFutureListener.CLOSE);
}
private ByteBuf getStringBuffer(String string)
{
ByteBuf var2 = Unpooled.buffer();
var2.writeByte(255);
char[] var3 = string.toCharArray();
var2.writeShort(var3.length);
char[] var4 = var3;
int var5 = var3.length;
for (int var6 = 0; var6 < var5; ++var6)
{
char var7 = var4[var6];
var2.writeChar(var7);
}
return var2;
}
}