package com.gmail.zahusek.test.serverstatus; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufOutputStream; import io.netty.channel.Channel; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Collection; import org.bukkit.entity.Player; import com.gmail.zahusek.tinyprotocolapi.asm.reflection.ClassAccess; import com.gmail.zahusek.tinyprotocolapi.listener.PacketEvent; import com.gmail.zahusek.tinyprotocolapi.listener.PacketHandlerList; import com.gmail.zahusek.tinyprotocolapi.listener.PacketID; import com.gmail.zahusek.tinyprotocolapi.element.PacketType; import com.google.common.base.Charsets; import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import static java.util.UUID.randomUUID; import static javax.imageio.ImageIO.write; import static io.netty.buffer.Unpooled.buffer; import static io.netty.handler.codec.base64.Base64.encode; @PacketID(id = PacketType.PacketStatusOutServerInfo) public class BetterServerListPingEvent extends PacketEvent { public static final PacketHandlerList handler = new PacketHandlerList(); private static final String DEFID = randomUUID().toString(); private static final ClassAccess fa = new ClassAccess("{nms}.PacketStatusOutServerInfo"); private static final Class<?> fb = fa.getCanonicalClass("{nms}.ServerPing"); private static final Gson fc = fa.get(null, Gson.class, 0); private final JsonObject json; public BetterServerListPingEvent(Player player, Channel channel, Object handle) { super(player, channel, handle); json = new JsonParser().parse(fc.toJson(handle)).getAsJsonObject().getAsJsonObject("b"); } public JsonArray sampleList(Collection<String> list) { JsonArray array = new JsonArray(); for(String player : list) { JsonObject data = new JsonObject(); data.addProperty("name", player); data.addProperty("id", DEFID); array.add(data); } return array; } public JsonObject getDefaultJson () { return json; } public JsonObject getProtocolJson() { return json.getAsJsonObject("version"); } public JsonObject getSampleJson() { return json.getAsJsonObject("players"); } public void saveJson() { fa.set(getPacket(), 1, fc.fromJson(json, fb)); } public String faviconSerializer (BufferedImage image) { if(image.getWidth() != 64 || image.getHeight() != 64) return json.get("favicon").getAsString(); ByteBuf buffer = buffer(); try { write(image, "PNG", new ByteBufOutputStream(buffer)); } catch (IOException e) { return json.get("favicon").getAsString(); } return "data:image/png;base64," + encode(buffer).toString(Charsets.UTF_8); } public String motd() { return "description";} public String icon() { return "favicon";} public String hoverList() { return "sample";} public String online() { return "online";} public String maxOnline() { return "max";} public String protocolVersion() { return "protocol";} public String protocolName() { return "name";} @Override public PacketHandlerList getPacketHandlerList() { return handler; } }