Archived
0

PacketListener annotation

This commit is contained in:
2018-06-16 15:58:23 +03:00
parent 250e513bd2
commit f2afa4a059
2 changed files with 40 additions and 11 deletions

View File

@@ -4,6 +4,7 @@
*/ */
package mc.core.network.proto_1_12_2.netty; package mc.core.network.proto_1_12_2.netty;
import com.google.common.collect.ImmutableMap;
import io.netty.channel.Channel; import io.netty.channel.Channel;
import io.netty.channel.ChannelFutureListener; import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelHandlerContext;
@@ -24,9 +25,11 @@ import mc.core.text.TextColor;
import mc.core.world.World; import mc.core.world.World;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import javax.annotation.PostConstruct;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Optional; import java.util.Optional;
import java.util.function.Function;
import java.util.stream.Stream;
import static mc.core.network.proto_1_12_2.netty.NettyServer.ATTR_STATE; import static mc.core.network.proto_1_12_2.netty.NettyServer.ATTR_STATE;
@@ -42,6 +45,19 @@ public class PacketHandler extends SimpleChannelInboundHandler<CSPacket> {
private World world; private World world;
@Autowired @Autowired
private ChatProcessor chatProcessor; private ChatProcessor chatProcessor;
private ImmutableMap<Class<? /*extends CSPacket*/>, Method> methods = ImmutableMap.of();
@PostConstruct
public void init() {
this.methods = Stream.of(this.getClass().getDeclaredMethods())
.filter(method -> method.isAnnotationPresent(PacketListener.class)
&& method.getParameterCount() == 2
&& method.getParameterTypes()[0].isAssignableFrom(Channel.class)
&& CSPacket.class.isAssignableFrom(method.getParameterTypes()[1]))
.collect(ImmutableMap.toImmutableMap(
method -> method.getParameterTypes()[1],
Function.identity()));
}
@Override @Override
public void channelInactive(ChannelHandlerContext ctx) throws Exception { public void channelInactive(ChannelHandlerContext ctx) throws Exception {
@@ -56,25 +72,21 @@ public class PacketHandler extends SimpleChannelInboundHandler<CSPacket> {
@Override @Override
protected void channelRead0(ChannelHandlerContext ctx, CSPacket packet) throws Exception { protected void channelRead0(ChannelHandlerContext ctx, CSPacket packet) throws Exception {
Optional<Method> optionalMethod = Arrays.stream(this.getClass().getDeclaredMethods()) if (this.methods.containsKey(packet.getClass())) {
.filter(method -> method.getName().equals("on" + packet.getClass().getSimpleName().replace("Packet", "")) this.methods.get(packet.getClass()).invoke(this, ctx.channel(), packet);
&& method.getParameterCount() == 2 } else {
&& method.getParameterTypes()[0].isAssignableFrom(Channel.class) log.trace("No def listener of \"{}\"", packet.getClass().getSimpleName());
&& method.getParameterTypes()[1].isAssignableFrom(packet.getClass()))
.findFirst();
if (optionalMethod.isPresent()) {
Method method = optionalMethod.get();
method.invoke(this, ctx.channel(), packet);
} }
} }
@PacketListener
private void onHandshake(Channel channel, HandshakePacket packet) { private void onHandshake(Channel channel, HandshakePacket packet) {
if (packet.getNextState().equals(State.UNKNOWN)) return; if (packet.getNextState().equals(State.UNKNOWN)) return;
log.debug("New state: {}", packet.getNextState()); log.debug("New state: {}", packet.getNextState());
channel.attr(ATTR_STATE).set(packet.getNextState()); channel.attr(ATTR_STATE).set(packet.getNextState());
} }
@PacketListener
private void onStatusRequest(Channel channel, StatusRequestPacket packet) { private void onStatusRequest(Channel channel, StatusRequestPacket packet) {
if (!channel.attr(ATTR_STATE).get().equals(State.STATUS)) return; if (!channel.attr(ATTR_STATE).get().equals(State.STATUS)) return;
@@ -87,11 +99,13 @@ public class PacketHandler extends SimpleChannelInboundHandler<CSPacket> {
channel.writeAndFlush(responsePacket); channel.writeAndFlush(responsePacket);
} }
@PacketListener
private void onPing(Channel channel, PingPacket packet) { private void onPing(Channel channel, PingPacket packet) {
if (!channel.attr(ATTR_STATE).get().equals(State.STATUS)) return; if (!channel.attr(ATTR_STATE).get().equals(State.STATUS)) return;
channel.writeAndFlush(packet); channel.writeAndFlush(packet);
} }
@PacketListener
private void onLoginStart(Channel channel, LoginStartPacket packet) { private void onLoginStart(Channel channel, LoginStartPacket packet) {
if (!channel.attr(ATTR_STATE).get().equals(State.LOGIN)) return; if (!channel.attr(ATTR_STATE).get().equals(State.LOGIN)) return;

View File

@@ -0,0 +1,15 @@
/*
* DmitriyMX <dimon550@gmail.com>
* 2018-06-16
*/
package mc.core.network.proto_1_12_2.netty;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface PacketListener {
}