From 3f475a7dc1626611a496d7d4ff1da21c20a34bd7 Mon Sep 17 00:00:00 2001 From: MiaoWoo Date: Thu, 27 Feb 2020 18:15:33 +0800 Subject: [PATCH] feat: MiaoConsole exclude nukkit Signed-off-by: MiaoWoo --- packages/plugins/src/MiaoConsole.ts | 212 +++++++++++++++------------- 1 file changed, 110 insertions(+), 102 deletions(-) diff --git a/packages/plugins/src/MiaoConsole.ts b/packages/plugins/src/MiaoConsole.ts index e615e159..38e22e38 100644 --- a/packages/plugins/src/MiaoConsole.ts +++ b/packages/plugins/src/MiaoConsole.ts @@ -16,7 +16,7 @@ const refList: Array<{ server: string, future: string }> = [ { server: 'func_147137_ag', future: 'field_151274_e' }//catserver 1.12.2 ] -@plugin({ name: 'MiaoConsole', version: '1.0.0', author: 'MiaoWoo', source: __filename }) +@plugin({ name: 'MiaoConsole', version: '1.0.0', author: 'MiaoWoo', servers: ['!nukkit'], source: __filename }) export class MiaoConsole extends interfaces.Plugin { public static GlobalContainer: Container public static GlobalLogger: Console @@ -98,6 +98,7 @@ export class MiaoConsole extends interfaces.Plugin { } injectMiaoDetect() { + let MiaoDetectHandler = getMiaoDetectHandler(); this.pipeline.addFirst('miao_detect', new MiaoDetectHandler()) this.container.bind(MessageHandle).toFunction(this.onmessage.bind(this)) this.logger.info('Netty Channel Pipeline Inject MiaoDetectHandler Successful!') @@ -132,111 +133,118 @@ export class MiaoConsole extends interfaces.Plugin { } sendResult(ctx: any, type: string, msg: string) { + let TextWebSocketFrame = getTextWebSocketFrame() ctx.writeAndFlush(new TextWebSocketFrame(`${type}${SPLIT_LINE}${msg}`)) } } -const ChannelInboundHandlerAdapter = Java.type('io.netty.channel.ChannelInboundHandlerAdapter') -const CharsetUtil = Java.type('io.netty.util.CharsetUtil') -const TextWebSocketFrame = Java.type('io.netty.handler.codec.http.websocketx.TextWebSocketFrame') -const MiaoDetectHandler = Java.extend(ChannelInboundHandlerAdapter, { - channelRead: (ctx: any, channel: any) => { - channel.pipeline().addFirst('miaowebsocket', new WebSocketHandler()) - ctx.fireChannelRead(channel) - } -}) -const TypeParameterMatcher = Java.type('io.netty.util.internal.TypeParameterMatcher') -const DefaultHttpResponse = Java.type('io.netty.handler.codec.http.DefaultHttpResponse') -const DefaultFullHttpResponse = Java.type('io.netty.handler.codec.http.DefaultFullHttpResponse') -const HttpHeaders = Java.type('io.netty.handler.codec.http.HttpHeaders') -const HttpVersion = Java.type('io.netty.handler.codec.http.HttpVersion') -const HttpResponseStatus = Java.type('io.netty.handler.codec.http.HttpResponseStatus') -const LastHttpContent = Java.type('io.netty.handler.codec.http.LastHttpContent') -const HttpServerCodec = Java.type('io.netty.handler.codec.http.HttpServerCodec') -const ChunkedWriteHandler = Java.type('io.netty.handler.stream.ChunkedWriteHandler') -const HttpObjectAggregator = Java.type('io.netty.handler.codec.http.HttpObjectAggregator') -const WebSocketServerProtocolHandler = Java.type('io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler') -const SimpleChannelInboundHandler = Java.type('io.netty.channel.SimpleChannelInboundHandler') -const FullHttpRequestMatcher = TypeParameterMatcher.get(base.getClass('io.netty.handler.codec.http.FullHttpRequest')) -const File = Java.type('java.io.File') -const Runnable = Java.type('java.lang.Runnable') -const RandomAccessFile = Java.type('java.io.RandomAccessFile') -const DefaultFileRegion = Java.type('io.netty.channel.DefaultFileRegion') -const ChannelFutureListener = Java.type('io.netty.channel.ChannelFutureListener') -const HttpRequestHandler = Java.extend(SimpleChannelInboundHandler, { - acceptInboundMessage: (msg: any) => { - return FullHttpRequestMatcher.match(msg) - }, - channelRead0: (ctx: any, request: any) => { - if ('/ws' == request.getUri()) { - ctx.fireChannelRead(request.retain()) - } else { - ctx.executor().execute(new Runnable({ - run: () => { - if (HttpHeaders.is100ContinueExpected(request)) { - ctx.writeAndFlush(new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.CONTINUE)) - } - let filename = request.getUri().split('?')[0].substr(1) - let file = new File('/home/project/WebWorkSpace/MiaoConsole', filename || 'index.html') - if (!file.exists() || !file.isFile()) { - ctx.write(new DefaultHttpResponse(request.getProtocolVersion(), HttpResponseStatus.NOT_FOUND)) - ctx.writeAndFlush(LastHttpContent.EMPTY_LAST_CONTENT).addListener(ChannelFutureListener.CLOSE) - return - } - let response = new DefaultHttpResponse(request.getProtocolVersion(), HttpResponseStatus.OK) - response.headers().set(HttpHeaders.Names.CONTENT_TYPE, "text/html charset=UTF-8") - let raf = new RandomAccessFile(file, 'r') - let keepAlive = HttpHeaders.isKeepAlive(request) - if (keepAlive) { - response.headers().set(HttpHeaders.Names.CONTENT_LENGTH, file.length()) - response.headers().set(HttpHeaders.Names.CONNECTION, HttpHeaders.Values.KEEP_ALIVE) - } - ctx.write(response) - ctx.write(new DefaultFileRegion(raf.getChannel(), 0, raf.length())) - let future = ctx.writeAndFlush(LastHttpContent.EMPTY_LAST_CONTENT) - if (!keepAlive) { - future.addListener(ChannelFutureListener.CLOSE) - } - } - })) +function getMiaoDetectHandler() { + const ChannelInboundHandlerAdapter = Java.type('io.netty.channel.ChannelInboundHandlerAdapter') + const CharsetUtil = Java.type('io.netty.util.CharsetUtil') + const MiaoDetectHandler = Java.extend(ChannelInboundHandlerAdapter, { + channelRead: (ctx: any, channel: any) => { + channel.pipeline().addFirst('miaowebsocket', new WebSocketHandler()) + ctx.fireChannelRead(channel) } - } -}) -const TextWebSocketFrameMatcher = TypeParameterMatcher.get(base.getClass('io.netty.handler.codec.http.websocketx.TextWebSocketFrame')) -const TextWebSocketFrameHandler = Java.extend(SimpleChannelInboundHandler, { - userEventTriggered: (ctx: any, evt: any) => { - if (evt == 'HANDSHAKE_COMPLETE') { - clients.push(ctx.channel()) - MiaoConsole.GlobalLogger.console(`new client §b${ctx.channel().id()} §aconnected...`) + }) + const TypeParameterMatcher = Java.type('io.netty.util.internal.TypeParameterMatcher') + const DefaultHttpResponse = Java.type('io.netty.handler.codec.http.DefaultHttpResponse') + const DefaultFullHttpResponse = Java.type('io.netty.handler.codec.http.DefaultFullHttpResponse') + const HttpHeaders = Java.type('io.netty.handler.codec.http.HttpHeaders') + const HttpVersion = Java.type('io.netty.handler.codec.http.HttpVersion') + const HttpResponseStatus = Java.type('io.netty.handler.codec.http.HttpResponseStatus') + const LastHttpContent = Java.type('io.netty.handler.codec.http.LastHttpContent') + const HttpServerCodec = Java.type('io.netty.handler.codec.http.HttpServerCodec') + const ChunkedWriteHandler = Java.type('io.netty.handler.stream.ChunkedWriteHandler') + const HttpObjectAggregator = Java.type('io.netty.handler.codec.http.HttpObjectAggregator') + const WebSocketServerProtocolHandler = Java.type('io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler') + const SimpleChannelInboundHandler = Java.type('io.netty.channel.SimpleChannelInboundHandler') + const FullHttpRequestMatcher = TypeParameterMatcher.get(base.getClass('io.netty.handler.codec.http.FullHttpRequest')) + const File = Java.type('java.io.File') + const Runnable = Java.type('java.lang.Runnable') + const RandomAccessFile = Java.type('java.io.RandomAccessFile') + const DefaultFileRegion = Java.type('io.netty.channel.DefaultFileRegion') + const ChannelFutureListener = Java.type('io.netty.channel.ChannelFutureListener') + const HttpRequestHandler = Java.extend(SimpleChannelInboundHandler, { + acceptInboundMessage: (msg: any) => { + return FullHttpRequestMatcher.match(msg) + }, + channelRead0: (ctx: any, request: any) => { + if ('/ws' == request.getUri()) { + ctx.fireChannelRead(request.retain()) + } else { + ctx.executor().execute(new Runnable({ + run: () => { + if (HttpHeaders.is100ContinueExpected(request)) { + ctx.writeAndFlush(new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.CONTINUE)) + } + let filename = request.getUri().split('?')[0].substr(1) + let file = new File('/home/project/WebWorkSpace/MiaoConsole', filename || 'index.html') + if (!file.exists() || !file.isFile()) { + ctx.write(new DefaultHttpResponse(request.getProtocolVersion(), HttpResponseStatus.NOT_FOUND)) + ctx.writeAndFlush(LastHttpContent.EMPTY_LAST_CONTENT).addListener(ChannelFutureListener.CLOSE) + return + } + let response = new DefaultHttpResponse(request.getProtocolVersion(), HttpResponseStatus.OK) + response.headers().set(HttpHeaders.Names.CONTENT_TYPE, "text/html charset=UTF-8") + let raf = new RandomAccessFile(file, 'r') + let keepAlive = HttpHeaders.isKeepAlive(request) + if (keepAlive) { + response.headers().set(HttpHeaders.Names.CONTENT_LENGTH, file.length()) + response.headers().set(HttpHeaders.Names.CONNECTION, HttpHeaders.Values.KEEP_ALIVE) + } + ctx.write(response) + ctx.write(new DefaultFileRegion(raf.getChannel(), 0, raf.length())) + let future = ctx.writeAndFlush(LastHttpContent.EMPTY_LAST_CONTENT) + if (!keepAlive) { + future.addListener(ChannelFutureListener.CLOSE) + } + } + })) + } } - }, - acceptInboundMessage: (msg: any) => { - return TextWebSocketFrameMatcher.match(msg) - }, - channelRead0: (ctx: any, msg: any) => { - MiaoConsole.GlobalContainer.get(MessageHandle)(ctx, msg) - } -}) -const WebSocketHandler = Java.extend(ChannelInboundHandlerAdapter, { - channelRead: function(ctx: any, msg: any) { - msg.markReaderIndex() - let message: string = msg.toString(CharsetUtil.UTF_8) - let channel = ctx.channel() - let pipeline = channel.pipeline() - if (message.indexOf('HTTP/1.1') > 0) { - pipeline.names().forEach(f => { - if (f == 'miaowebsocket' || f.indexOf('DefaultChannelPipeline') > -1) { return } - pipeline.remove(f) - }) - pipeline.addLast('http', new HttpServerCodec()) - pipeline.addLast('chunk', new ChunkedWriteHandler()) - pipeline.addLast('httpobj', new HttpObjectAggregator(64 * 1024)) - pipeline.addLast('http_request', new HttpRequestHandler()) - pipeline.addLast('websocket', new WebSocketServerProtocolHandler("/ws")) - pipeline.addLast('websocket_handler', new TextWebSocketFrameHandler()) + }) + const TextWebSocketFrameMatcher = TypeParameterMatcher.get(base.getClass('io.netty.handler.codec.http.websocketx.TextWebSocketFrame')) + const TextWebSocketFrameHandler = Java.extend(SimpleChannelInboundHandler, { + userEventTriggered: (ctx: any, evt: any) => { + if (evt == 'HANDSHAKE_COMPLETE') { + clients.push(ctx.channel()) + MiaoConsole.GlobalLogger.console(`new client §b${ctx.channel().id()} §aconnected...`) + } + }, + acceptInboundMessage: (msg: any) => { + return TextWebSocketFrameMatcher.match(msg) + }, + channelRead0: (ctx: any, msg: any) => { + MiaoConsole.GlobalContainer.get(MessageHandle)(ctx, msg) } - pipeline.remove('miaowebsocket') - msg.resetReaderIndex() - ctx.fireChannelRead(msg) - } -}) + }) + const WebSocketHandler = Java.extend(ChannelInboundHandlerAdapter, { + channelRead: function(ctx: any, msg: any) { + msg.markReaderIndex() + let message: string = msg.toString(CharsetUtil.UTF_8) + let channel = ctx.channel() + let pipeline = channel.pipeline() + if (message.indexOf('HTTP/1.1') > 0) { + pipeline.names().forEach(f => { + if (f == 'miaowebsocket' || f.indexOf('DefaultChannelPipeline') > -1) { return } + pipeline.remove(f) + }) + pipeline.addLast('http', new HttpServerCodec()) + pipeline.addLast('chunk', new ChunkedWriteHandler()) + pipeline.addLast('httpobj', new HttpObjectAggregator(64 * 1024)) + pipeline.addLast('http_request', new HttpRequestHandler()) + pipeline.addLast('websocket', new WebSocketServerProtocolHandler("/ws")) + pipeline.addLast('websocket_handler', new TextWebSocketFrameHandler()) + } + pipeline.remove('miaowebsocket') + msg.resetReaderIndex() + ctx.fireChannelRead(msg) + } + }) + return MiaoDetectHandler; +} + +function getTextWebSocketFrame() { + return Java.type('io.netty.handler.codec.http.websocketx.TextWebSocketFrame') +}