Skip to content

Commit

Permalink
fix: expose method with Connection param
Browse files Browse the repository at this point in the history
  • Loading branch information
Boy0000 committed Jun 14, 2024
1 parent 7a940c1 commit f3ef3e3
Showing 1 changed file with 58 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,16 @@ import org.bukkit.plugin.java.JavaPlugin
* * The lambda should return the modified packet or `null` to prevent it from being sent.
* @return The modified packet or null to prevent it from sending
*/
@JvmName("interceptClientboundPlayer")
fun JavaPlugin.interceptClientbound(key: String = "write_packet_interceptor", intercept: (Packet<*>, Player?) -> Packet<*>?) {
PacketListener.interceptClientbound(Key.key(this.name.lowercase(), key.substringAfter(":")), intercept)
}

@JvmName("interceptClientboundConnection")
fun JavaPlugin.interceptClientbound(key: String = "write_packet_interceptor", intercept: (Packet<*>, Connection) -> Packet<*>?) {
PacketListener.interceptClientbound(Key.key(this.name.lowercase(), key.substringAfter(":")), intercept)
}

/**
* Intercept a Clientbound packet to either alter it or prevent it from being sent to the player
* @param key Optional key to register the packet-listener with
Expand All @@ -34,10 +40,16 @@ fun JavaPlugin.interceptClientbound(key: String = "write_packet_interceptor", in
* * The lambda should return the modified packet or `null` to prevent it from being sent.
* @return The modified packet or null to prevent it from sending
*/
@JvmName("interceptServerboundPlayer")
fun JavaPlugin.interceptServerbound(key: String = "read_packet_interceptor", intercept: (Packet<*>, Player?) -> Packet<*>?) {
PacketListener.interceptServerbound(Key.key(this.name.lowercase(), key.substringAfter(":")), intercept)
}

@JvmName("interceptServerboundConnection")
fun JavaPlugin.interceptServerbound(key: String = "read_packet_interceptor", intercept: (Packet<*>, Connection) -> Packet<*>?) {
PacketListener.interceptServerbound(Key.key(this.name.lowercase(), key.substringAfter(":")), intercept)
}

object PacketListener {

/**
Expand All @@ -49,10 +61,16 @@ object PacketListener {
* * The lambda should return the modified packet or `null` to prevent it from being sent.
* @return The modified packet or null to prevent it from sending
*/
@JvmName("interceptClientboundPlayer")
fun interceptClientbound(plugin: JavaPlugin, key: String = "write_packet_interceptor", intercept: (Packet<*>, Player?) -> Packet<*>?) {
interceptClientbound(Key.key(plugin.name.lowercase(), key.substringAfter(":")), intercept)
}

@JvmName("interceptClientboundConnection")
fun interceptClientbound(plugin: JavaPlugin, key: String = "write_packet_interceptor", intercept: (Packet<*>, Connection) -> Packet<*>?) {
interceptClientbound(Key.key(plugin.name.lowercase(), key.substringAfter(":")), intercept)
}

/**
* Intercept a Clientbound packet to either alter it or prevent it from being sent to the player
* @param key Optional key to register the packet-listener with
Expand All @@ -62,10 +80,16 @@ object PacketListener {
* * The lambda should return the modified packet or `null` to prevent it from being sent.
* @return The modified packet or null to prevent it from sending
*/
@JvmName("interceptServerboundPlayer")
fun interceptServerbound(plugin: JavaPlugin, key: String = "read_packet_interceptor", intercept: (Packet<*>, Player?) -> Packet<*>?) {
interceptServerbound(Key.key(plugin.name.lowercase(), key.substringAfter(":")), intercept)
}

@JvmName("interceptServerboundConnection")
fun interceptServerbound(plugin: JavaPlugin, key: String = "read_packet_interceptor", interceptConnection: (Packet<*>, Connection) -> Packet<*>?) {
interceptServerbound(Key.key(plugin.name.lowercase(), key.substringAfter(":")), interceptConnection)
}

fun unregisterListener(plugin: JavaPlugin) {
ChannelInitializeListenerHolder.getListeners().keys.filter { it.namespace() == plugin.name.lowercase() }.forEach(ChannelInitializeListenerHolder::removeListener)
}
Expand All @@ -74,6 +98,7 @@ object PacketListener {
ChannelInitializeListenerHolder.removeListener(key)
}

@JvmName("interceptClientboundPlayer")
internal fun interceptClientbound(key: Key? = null, intercept: (Packet<*>, Player?) -> Packet<*>?) {
val key = key ?: Key.key("write_packet_interceptor${ChannelInitializeListenerHolder.getListeners().keys.indexOfLast { it.value().startsWith("write_packet_interceptor") }.plus(1)}")

Expand All @@ -89,6 +114,23 @@ object PacketListener {
}
}

@JvmName("interceptClientboundConnection")
internal fun interceptClientbound(key: Key? = null, intercept: (Packet<*>, Connection) -> Packet<*>?) {
val key = key ?: Key.key("write_packet_interceptor${ChannelInitializeListenerHolder.getListeners().keys.indexOfLast { it.value().startsWith("write_packet_interceptor") }.plus(1)}")

ChannelInitializeListenerHolder.addListener(key) { channel ->
channel.pipeline().addBefore("packet_handler", key.asString(), object : ChannelDuplexHandler() {
val connection = channel.pipeline()["packet_handler"] as Connection
override fun write(ctx: ChannelHandlerContext, packet: Any, promise: ChannelPromise) {
// Player IS nullable, just not marked in Paper
if (packet is Packet<*>) intercept(packet, connection)?.let { ctx.write(it, promise) }
else ctx.write(packet, promise)
}
})
}
}

@JvmName("interceptServerboundPlayer")
internal fun interceptServerbound(key: Key? = null, intercept: (Packet<*>, Player?) -> Packet<*>?) {
val key = key ?: Key.key("write_packet_interceptor${ChannelInitializeListenerHolder.getListeners().keys.indexOfLast { it.value().startsWith("read_packet_interceptor") }.plus(1)}")

Expand All @@ -103,4 +145,20 @@ object PacketListener {
})
}
}

@JvmName("interceptServerboundConnection")
internal fun interceptServerbound(key: Key? = null, intercept: (Packet<*>, Connection) -> Packet<*>?) {
val key = key ?: Key.key("write_packet_interceptor${ChannelInitializeListenerHolder.getListeners().keys.indexOfLast { it.value().startsWith("read_packet_interceptor") }.plus(1)}")

ChannelInitializeListenerHolder.addListener(key) { channel ->
channel.pipeline().addBefore("packet_handler", key.asString(), object : ChannelDuplexHandler() {
val connection = channel.pipeline()["packet_handler"] as Connection
override fun channelRead(ctx: ChannelHandlerContext, packet: Any) {
// Player IS nullable, just not marked in Paper
if (packet is Packet<*>) intercept(packet, connection)?.let { ctx.fireChannelRead(it) }
else ctx.fireChannelRead(packet)
}
})
}
}
}

0 comments on commit f3ef3e3

Please sign in to comment.