diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..aa00ffa --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..ae9c995 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..2b63946 --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/main/java/me/unlegitdqrk/fakeminecraftserver/BasePacketHandler.java b/src/main/java/me/unlegitdqrk/fakeminecraftserver/BasePacketHandler.java deleted file mode 100644 index d28e230..0000000 --- a/src/main/java/me/unlegitdqrk/fakeminecraftserver/BasePacketHandler.java +++ /dev/null @@ -1,85 +0,0 @@ -package me.unlegitdqrk.fakeminecraftserver; - -import com.google.gson.Gson; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.Unpooled; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; -import me.unlegitdqrk.fakeminecraftserver.streams.MojewInputStream; -import me.unlegitdqrk.fakeminecraftserver.streams.MojewOutputStream; - -/** - * @author UnlegitDqrk - */ - -public class BasePacketHandler extends ChannelInboundHandlerAdapter { - private final Gson gson = new Gson(); - - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - MojewInputStream inputStream = new MojewInputStream((ByteBuf) msg); - - // handshake - int length = inputStream.readInt(); - int id = inputStream.readInt(); - - if (id == 0) { - // status request - try { - int version = inputStream.readInt(); - String address = inputStream.readUTF(); - int port = inputStream.readUnsignedShort(); - int state = inputStream.readInt(); - - System.out.println("Received request: " + length + ", " + id + ", " + version + ", " + address + ", " + port + ", " + state); - } catch (Exception ignored) { - // status request packet is sent inconsistently, so we ignore it - } - - inputStream.close(); - - // status response - String response = gson.toJson(StartFakeServer.response).replace(ColorConverter.ESCAPE + "", "\\u00A7"); // Mojew's parser needs this escaped (classic) - - if (StartFakeServer.response.getServerIconAsString() == null) System.out.println("Sending response: " + response); - else System.out.println("Sent response with image data."); - - MojewOutputStream outputStream = new MojewOutputStream(Unpooled.buffer()); - MojewOutputStream dataOutputStream = new MojewOutputStream(Unpooled.buffer()); - - dataOutputStream.writeInt(0); - dataOutputStream.writeUTF(response); - dataOutputStream.close(); - - outputStream.writeInt(dataOutputStream.writtenBytes()); - outputStream.write(dataOutputStream.getData()); - outputStream.close(); - - ctx.writeAndFlush(outputStream.buffer()); - } else if (id == 1) { - // ping request - long time = inputStream.readLong(); - System.out.println("Received ping packet: " + length + ", " + id + ", " + time); - - // ping response - MojewOutputStream outputStream = new MojewOutputStream(Unpooled.buffer()); - MojewOutputStream dataOutputStream = new MojewOutputStream(Unpooled.buffer()); - - dataOutputStream.writeInt(1); - dataOutputStream.writeLong(time); - dataOutputStream.close(); - - outputStream.writeInt(dataOutputStream.writtenBytes()); - outputStream.write(dataOutputStream.getData()); - outputStream.close(); - - ctx.writeAndFlush(outputStream.buffer()); - } - } - - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { - cause.printStackTrace(); - ctx.close(); - } -} diff --git a/src/main/java/me/unlegitdqrk/fakeminecraftserver/ColorConverter.java b/src/main/java/me/unlegitdqrk/fakeminecraftserver/ColorConverter.java deleted file mode 100644 index 356bab0..0000000 --- a/src/main/java/me/unlegitdqrk/fakeminecraftserver/ColorConverter.java +++ /dev/null @@ -1,120 +0,0 @@ -/* -Copyright (c) 2012, md_5. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation -and/or other materials provided with the distribution. - -The name of the author may not be used to endorse or promote products derived -from this software without specific prior written permission. - -You may not use the software for commercial software hosting services without -written permission from the author. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. -*/ - -package me.unlegitdqrk.fakeminecraftserver; - -import com.google.gson.annotations.SerializedName; - -import java.util.HashMap; -import java.util.regex.Pattern; - -public class ColorConverter { - private static final char COLOR_CHAR = '\u00A7'; - private static final Pattern url = Pattern.compile("^(?:(https?)://)?([-\\w_\\.]{2,}\\.[a-z]{2,4})(/\\S*)?$"); - public static final char ESCAPE = '\u00A7'; - - public static String replaceColors(String text) { - char[] charArray = text.toCharArray(); - - for (int index = 0; index < charArray.length; index++) { - char chr = charArray[index]; - if (chr != '&') continue; - if ((index + 1) == charArray.length) break; - - char forward = charArray[index + 1]; - - if ((forward >= '0' && forward <= '9') || (forward >= 'a' && forward <= 'f') - || (forward >= 'k' && forward <= 'r')) charArray[index] = ESCAPE; - } - return new String(charArray); - } - - public class ClickEvent { - public String action; - public String value; - } - - public enum Color { - @SerializedName("black") - BLACK("0"), - @SerializedName("dark_blue") - DARK_BLUE("1"), - @SerializedName("dark_green") - DARK_GREEN("2"), - @SerializedName("dark_aqua") - DARK_AQUA("3"), - @SerializedName("dark_red") - DARK_RED("4"), - @SerializedName("purple") - DARK_PURPLE("5"), - @SerializedName("gold") - GOLD("6"), - @SerializedName("gray") - GRAY("7"), - @SerializedName("dark_gray") - DARK_GRAY("8"), - @SerializedName("blue") - BLUE("9"), - @SerializedName("green") - GREEN("a"), - @SerializedName("aqua") - AQUA("b"), - @SerializedName("red") - RED("c"), - @SerializedName("light_purple") - LIGHT_PURPLE("d"), - @SerializedName("yellow") - YELLOW("e"), - @SerializedName("white") - WHITE("f"); - - public String code; - - Color(String code) { - this.code = code; - } - - - private static HashMap codeMap = new HashMap<>(); - - public static Color fromCode(String code) { - return codeMap.get(code); - } - - static { - for (Color color : values()) { - codeMap.put(color.code, color); - } - } - } -} - diff --git a/src/main/java/me/unlegitdqrk/fakeminecraftserver/Message.java b/src/main/java/me/unlegitdqrk/fakeminecraftserver/Message.java deleted file mode 100644 index 1b638db..0000000 --- a/src/main/java/me/unlegitdqrk/fakeminecraftserver/Message.java +++ /dev/null @@ -1,34 +0,0 @@ -package me.unlegitdqrk.fakeminecraftserver; - -import java.util.List; - -/** - * @author UnlegitDqrk - */ - -public class Message { - public String text; - - public boolean bold; - public boolean italic; - public boolean underlined; - public boolean strikethrough; - public boolean obfuscated; - public List extra; - - public ColorConverter.Color color; - - public ColorConverter.ClickEvent clickEvent; - - public Message() { - - } - - public Message(Message old) { - this.bold = old.bold; - this.italic = old.italic; - this.underlined = old.underlined; - this.strikethrough = old.strikethrough; - this.color = old.color; - } -} diff --git a/src/main/java/me/unlegitdqrk/fakeminecraftserver/SLPServer.java b/src/main/java/me/unlegitdqrk/fakeminecraftserver/SLPServer.java deleted file mode 100644 index 1c6ce14..0000000 --- a/src/main/java/me/unlegitdqrk/fakeminecraftserver/SLPServer.java +++ /dev/null @@ -1,45 +0,0 @@ -package me.unlegitdqrk.fakeminecraftserver; - -import io.netty.bootstrap.ServerBootstrap; -import io.netty.channel.*; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.nio.NioServerSocketChannel; - -/** - * @author UnlegitDqrk - */ - -public class SLPServer { - private int port; - - public int getPort() { - return port; - } - - public SLPServer(int port) { - this.port = port; - } - - public void run() throws Exception { - EventLoopGroup bossGroup = new NioEventLoopGroup(); - EventLoopGroup workerGroup = new NioEventLoopGroup(); - - try { - ServerBootstrap serverBootstrap = new ServerBootstrap(); - serverBootstrap.group(bossGroup, workerGroup) - .channel(NioServerSocketChannel.class) - .childHandler(new ChannelInitializer() { - @Override - public void initChannel(Channel channel) { - channel.pipeline().addLast(new BasePacketHandler()); - } - }).option(ChannelOption.SO_BACKLOG, 128).childOption(ChannelOption.SO_KEEPALIVE, true); - - ChannelFuture channelFuture = serverBootstrap.bind(port).sync(); - channelFuture.channel().closeFuture().sync(); - } finally { - workerGroup.shutdownGracefully(); - bossGroup.shutdownGracefully(); - } - } -} diff --git a/src/main/java/me/unlegitdqrk/fakeminecraftserver/StartFakeServer.java b/src/main/java/me/unlegitdqrk/fakeminecraftserver/StartFakeServer.java deleted file mode 100644 index 07da860..0000000 --- a/src/main/java/me/unlegitdqrk/fakeminecraftserver/StartFakeServer.java +++ /dev/null @@ -1,53 +0,0 @@ -package me.unlegitdqrk.fakeminecraftserver; - -import me.unlegitdqrk.fakeminecraftserver.data.StatusResponse; - -import javax.xml.bind.DatatypeConverter; -import java.awt.image.BufferedImage; -import java.io.*; -import java.util.Arrays; -import java.util.List; - -import static javax.imageio.ImageIO.read; -import static javax.imageio.ImageIO.write; - -/** - * @author UnlegitDqrk - */ - -public class StartFakeServer { - public static StatusResponse response = null; - - public static final int START_PORT = 25565; - - public static final int MAX_PLAYERS = 100; - public static final int ONLINE_PLAYERS = 10; - public static final int PROTOCOL_VERSION = 47; - public static final String PROTOCOL_TEXT = "1.8.8"; - public static final String MOTD_LINE1 = "&4Ein fake Minecraftserver"; - public static final String MOTD_LINE2 = "&cDeveloped by UnlegitDqrk"; - public static final List SAMPLES = Arrays.asList("&cSample 1", "&bSample 2", "&aSample 3"); - public static final File SERVER_ICON = new File("server-icon.png"); - - public static void start() throws Exception { - String serverIconAsString = null; - - if (SERVER_ICON.exists()) { - BufferedImage image = read(SERVER_ICON); - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - write(image, "png", baos); - serverIconAsString = "data:image/png;base64," + DatatypeConverter.printBase64Binary(baos.toByteArray()); - } - - Message description = new Message(); - String motd = MOTD_LINE1 + "\n" + MOTD_LINE2; - description.text = ColorConverter.replaceColors(motd).replace("\\n", "\n"); - - response = new StatusResponse(ColorConverter.replaceColors(PROTOCOL_TEXT), PROTOCOL_VERSION, - MAX_PLAYERS, ONLINE_PLAYERS, - description, serverIconAsString); - - new SLPServer(START_PORT).run(); - } - -} diff --git a/src/main/java/me/unlegitdqrk/fakeminecraftserver/data/StatusResponse.java b/src/main/java/me/unlegitdqrk/fakeminecraftserver/data/StatusResponse.java deleted file mode 100644 index 5cf269a..0000000 --- a/src/main/java/me/unlegitdqrk/fakeminecraftserver/data/StatusResponse.java +++ /dev/null @@ -1,73 +0,0 @@ -package me.unlegitdqrk.fakeminecraftserver.data; - -import me.unlegitdqrk.fakeminecraftserver.Message; - -/** - * @author UnlegitDqrk - */ - -public class StatusResponse { - private final Version version; - private final Players players; - private final Message description; - private final String serverIconAsString; - - public Message getDescription() { - return description; - } - - public Players getPlayers() { - return players; - } - - public String getServerIconAsString() { - return serverIconAsString; - } - - public Version getVersion() { - return version; - } - - public StatusResponse(String name, int protocol, int max, int online, Message description, String serverIconAsString) { - this.version = new Version(name, protocol); - this.players = new Players(max, online); - this.description = description; - this.serverIconAsString = serverIconAsString; - } - - public class Version { - private final String name; - private final int protocol; - - public String getName() { - return name; - } - - public int getProtocol() { - return protocol; - } - - public Version(String name, int protocol) { - this.name = name; - this.protocol = protocol; - } - } - - private class Players { - private final int maxPlayers; - private final int onlinePlayers; - - public int getMaxPlayers() { - return maxPlayers; - } - - public int getOnlinePlayers() { - return onlinePlayers; - } - - private Players(int maxPlayers, int onlinePlayers) { - this.maxPlayers = maxPlayers; - this.onlinePlayers = onlinePlayers; - } - } -} diff --git a/src/main/java/me/unlegitdqrk/fakeminecraftserver/streams/MojewInputStream.java b/src/main/java/me/unlegitdqrk/fakeminecraftserver/streams/MojewInputStream.java deleted file mode 100644 index c9e1172..0000000 --- a/src/main/java/me/unlegitdqrk/fakeminecraftserver/streams/MojewInputStream.java +++ /dev/null @@ -1,41 +0,0 @@ -package me.unlegitdqrk.fakeminecraftserver.streams; - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufInputStream; - -import java.io.IOException; -import java.nio.charset.StandardCharsets; - -/** - * @author UnlegitDqrk - */ - -public class MojewInputStream extends ByteBufInputStream { - - public MojewInputStream(ByteBuf buffer) { - super(buffer); - } - - @Override - public String readUTF() throws IOException { - byte[] input = new byte[readInt()]; - readFully(input); - - return new String(input, StandardCharsets.UTF_8); - } - - @Override - public int readInt() throws IOException { - int i = 0; - int j = 0; - - while (true) { - int k = readByte(); - i |= (k & 0x7F) << j++ * 7; - if (j > 5) throw new RuntimeException("VarInt too big"); - if ((k & 0x80) != 128) break; - } - - return i; - } -} diff --git a/src/main/java/me/unlegitdqrk/fakeminecraftserver/streams/MojewOutputStream.java b/src/main/java/me/unlegitdqrk/fakeminecraftserver/streams/MojewOutputStream.java deleted file mode 100644 index bf6d727..0000000 --- a/src/main/java/me/unlegitdqrk/fakeminecraftserver/streams/MojewOutputStream.java +++ /dev/null @@ -1,42 +0,0 @@ -package me.unlegitdqrk.fakeminecraftserver.streams; - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufOutputStream; - -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.util.Arrays; - -/** - * @author UnlegitDqrk - */ - -public class MojewOutputStream extends ByteBufOutputStream { - public MojewOutputStream(ByteBuf buffer) { - super(buffer); - } - - @Override - public void writeUTF(String s) throws IOException { - byte[] data = s.getBytes(StandardCharsets.UTF_8); - writeInt(s.length()); - write(data); - } - - @Override - public void writeInt(int paramInt) throws IOException { - while (true) { - if ((paramInt & 0xFFFFFF80) == 0) { - writeByte(paramInt); - return; - } - - writeByte(paramInt & 0x7F | 0x80); - paramInt >>>= 7; - } - } - - public byte[] getData() { - return Arrays.copyOfRange(buffer().array(), 0, writtenBytes()); - } -}