Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ plugins {

allprojects {
group = "org.sayandev"
version = "1.10.5.20"
version = "1.10.5.20-pubsub2"
description = "A modular Kotlin framework for Minecraft: JE"

plugins.apply("maven-publish")
Expand Down
23 changes: 14 additions & 9 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,12 @@ cloud = "2.0.0"
cloud-platform = "2.0.0-beta.10"
#cloud-minecraft = "2.0.2-SNAPSHOT"
adventure = "4.23.0"
sayanventure = "1.0.2"
mysql-connector = "8.4.0"
sqlite-jdbc = "3.46.0.0"
h2 = "2.2.224"
mariadb = "3.3.3"
jedis = "5.0.0"
java-websocket = "1.6.0"
reflections = "0.10.2"
hikari = "5.1.0"
guava = "31.1-jre"
Expand All @@ -28,9 +28,10 @@ libby = "2.0.0-SNAPSHOT"
mccoroutines = "2.20.0"
kotlinx-coroutines = "1.10.1"
caffeine = "3.2.0"
kaml = "0.85.0"

# minecraft
adventure-platform = "4.3.4"
adventure-platform = "4.4.1"

# bukkit
paper = "1.21-R0.1-SNAPSHOT"
Expand Down Expand Up @@ -65,12 +66,12 @@ cloud-kotlin-extensions = { group = "org.incendo", name = "cloud-kotlin-extensio
adventure-api = { group = "net.kyori", name = "adventure-api", version.ref = "adventure" }
adventure-text-minimessage = { group = "net.kyori", name = "adventure-text-minimessage", version.ref = "adventure" }
adventure-text-serializer-gson = { group = "net.kyori", name = "adventure-text-serializer-gson", version.ref = "adventure" }
sayanventure-api = { group = "org.sayandev.sayanventure", name = "sayanventure", version.ref = "sayanventure" }
mysql-connector = { group = "com.mysql", name = "mysql-connector-j", version.ref = "mysql-connector" }
sqlite-jdbc = { group = "org.xerial", name = "sqlite-jdbc", version.ref = "sqlite-jdbc" }
h2 = { group = "com.h2database", name = "h2", version.ref = "h2" }
mariadb = { group = "org.mariadb.jdbc", name = "mariadb-java-client", version.ref = "mariadb" }
jedis = { group = "redis.clients", name = "jedis", version.ref = "jedis" }
java-websocket = { group = "org.java-websocket", name = "Java-WebSocket", version.ref = "java-websocket" }
reflections = { group = "org.reflections", name = "reflections", version.ref = "reflections" }
hikari = { group = "com.zaxxer", name = "HikariCP", version.ref = "hikari" }
guava = { group = "com.google.guava", name = "guava", version.ref = "guava" }
Expand All @@ -83,6 +84,7 @@ exposed-kotlin-datetime = { group = "org.jetbrains.exposed", name = "exposed-kot
libby = { group = "com.alessiodp.libby", name = "libby-core", version.ref = "libby" }
kotlinx-coroutines = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-core-jvm", version.ref = "kotlinx-coroutines" }
caffeine = { group = "com.github.ben-manes.caffeine", name = "caffeine", version.ref = "caffeine" }
kaml = { group = "com.charleskorn.kaml", name = "kaml", version.ref = "kaml" }

# bukkit
paper = { group = "io.papermc.paper", name = "paper-api", version.ref = "paper" }
Expand All @@ -93,7 +95,6 @@ cloud-minecraft-extras = { group = "org.incendo", name = "cloud-minecraft-extras
inventoryframework = { group = "com.github.stefvanschie.inventoryframework", name = "IF", version.ref = "inventoryframework" }
xseries = { group = "com.github.cryptomorin", name = "XSeries", version.ref = "xseries" }
adventure-platform-bukkit = { group = "net.kyori", name = "adventure-platform-bukkit", version.ref = "adventure-platform" }
sayanventure-platform-bukkit = { group = "org.sayandev.sayanventure", name = "sayanventure-bukkit", version.ref = "sayanventure" }
libby-bukkit = { group = "com.alessiodp.libby", name = "libby-bukkit", version.ref = "libby" }
libby-paper = { group = "com.alessiodp.libby", name = "libby-paper", version.ref = "libby" }
pathetic-pathfinder-bukkit = { group = "com.github.patheloper.pathetic", name = "pathetic-mapping", version.ref = "pathetic-pathfinder-bukkit" }
Expand All @@ -117,7 +118,7 @@ cloud-velocity = { group = "org.incendo", name = "cloud-velocity", version.ref =

# proxy - bungeecord
bungeecord = { group = "net.md-5", name = "bungeecord-api", version.ref = "bungeecord" }
sayanventure-platform-bungeecord = { group = "org.sayandev.sayanventure", name = "sayanventure-bungeecord", version.ref = "sayanventure" }
adventure-platform-bungeecord = { group = "net.kyori", name = "adventure-platform-bungeecord", version.ref = "adventure-platform" }
libby-bungee = { group = "com.alessiodp.libby", name = "libby-bungee", version.ref = "libby" }
mccoroutines-bungeecord-api = { group = "com.github.shynixn.mccoroutine", name = "mccoroutine-bungeecord-api", version.ref = "mccoroutines" }
mccoroutines-bungeecord-core = { group = "com.github.shynixn.mccoroutine", name = "mccoroutine-bungeecord-core", version.ref = "mccoroutines" }
Expand Down Expand Up @@ -149,18 +150,21 @@ implementation-core = [
"checker-qual",
"javassist",
"annotations",
"adventure-api",
"adventure-text-minimessage",
"adventure-text-serializer-gson",
# "slf4j-api",
"error_prone_annotations",
"geantyref",
# transitives - end
"kotlin",
# "kotlin",
"kaml",
"snakeyaml",
"configurate-yaml",
"configurate-extra-kotlin",
"cloud-core",
"cloud-kotlin-extensions",
# "cloud-kotlin-coroutines",
"sayanventure-api",
"reflections",
"kotlin-reflect",
"hikari",
Expand All @@ -175,14 +179,15 @@ implementation-core = [
# "h2",
"mariadb",
"jedis",
"java-websocket",
# "caffeine"
]
implementation-bukkit = [
"cloud-paper",
"cloud-minecraft-extras",
"inventoryframework",
"xseries",
"sayanventure-platform-bukkit",
"adventure-platform-bukkit",
"pathetic-pathfinder-bukkit",
"mccoroutines-bukkit-api",
"mccoroutines-bukkit-core",
Expand All @@ -201,7 +206,7 @@ implementation-proxy-velocity = [
"cloud-velocity"
]
implementation-proxy-bungeecord = [
"sayanventure-platform-bungeecord",
"adventure-platform-bungeecord",
"mccoroutines-bungeecord-api",
"mccoroutines-bungeecord-core",
]
2 changes: 1 addition & 1 deletion stickynote-bukkit/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
dependencies {
api(libs.libby.bukkit)
api(libs.libby.paper)
api(libs.sayanventure.platform.bukkit)
api(libs.cloud.paper)
api(libs.cloud.minecraft.extras)
api(libs.inventoryframework)
Expand All @@ -11,6 +10,7 @@ dependencies {
api(libs.mccoroutines.bukkit.core)
api(libs.mccoroutines.folia.api)
api(libs.mccoroutines.folia.core)
api(libs.adventure.platform.bukkit)

compileOnlyApi(libs.authlib)
compileOnlyApi(libs.placeholderapi)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package org.sayandev.stickynote.bukkit.extension

import org.sayandev.sayanventure.adventure.platform.bukkit.MinecraftComponentSerializer
import org.sayandev.sayanventure.adventure.text.Component
import net.kyori.adventure.platform.bukkit.MinecraftComponentSerializer
import net.kyori.adventure.text.Component

fun Component.toNmsComponent(): Any {
return MinecraftComponentSerializer.get().serialize(this)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,26 @@ package org.sayandev.stickynote.bukkit.extension

import org.bukkit.command.CommandSender
import org.bukkit.entity.Player
import org.sayandev.sayanventure.adventure.text.Component
import org.sayandev.sayanventure.adventure.text.minimessage.tag.resolver.TagResolver
import net.kyori.adventure.text.Component
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver
import org.sayandev.stickynote.bukkit.utils.AdventureUtils

fun CommandSender.sendComponent(message: String, vararg placeholder: TagResolver) {
AdventureUtils.sendComponent(this, message, *placeholder)
}

fun CommandSender.sendComponent(message: Component, vararg placeholder: TagResolver) {
AdventureUtils.sendComponent(this, message, *placeholder)
}

fun Player.sendComponentActionbar(content: String, vararg placeholder: TagResolver) {
AdventureUtils.sendComponentActionbar(this, content, *placeholder)
}

fun Player.sendComponentActionbar(content: Component, vararg placeholder: TagResolver) {
AdventureUtils.sendComponentActionbar(this, content, *placeholder)
}

fun CommandSender.openBook(title: Component, author: Component, vararg pages: Component) {
AdventureUtils.openBook(this, title, author, *pages)
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,51 +2,57 @@ package org.sayandev.stickynote.bukkit.messaging.publisher

import kotlinx.coroutines.CompletableDeferred
import org.bukkit.entity.Player
import org.sayandev.stickynote.bukkit.StickyNote
import org.sayandev.stickynote.bukkit.messaging.subscriber.PluginMessageSubscribeListener
import org.sayandev.stickynote.bukkit.onlinePlayers
import org.sayandev.stickynote.bukkit.plugin
import org.sayandev.stickynote.core.messaging.publisher.PayloadWrapper
import org.sayandev.stickynote.core.messaging.publisher.PayloadWrapper.Companion.asJson
import org.sayandev.stickynote.core.messaging.publisher.Publisher

abstract class PluginMessagePublisher<P, S>(
namespace: String,
name: String,
val payloadClass: Class<P>,
val resultClass: Class<S>,
import org.sayandev.stickynote.bukkit.warn
import org.sayandev.stickynote.core.messaging.MessageMeta
import org.sayandev.stickynote.core.messaging.PayloadWrapper
import org.sayandev.stickynote.core.messaging.PayloadWrapper.Companion.asJson
import org.sayandev.stickynote.core.messaging.Publisher
import org.sayandev.stickynote.core.messaging.SimpleConnectionMeta

abstract class PluginMessagePublisher<P : Any, R : Any>(
messageMeta: MessageMeta<P, R>,
connectionMeta: SimpleConnectionMeta,
val withSubscriber: Boolean
): Publisher<P, S>(
StickyNote.logger,
namespace,
name
): Publisher<SimpleConnectionMeta, P, R>(
messageMeta,
connectionMeta,
plugin.logger
) {

var subscriberListener: PluginMessageSubscribeListener<P, S>? = null
var subscriberListener: PluginMessageSubscribeListener<P, R>? = null

init {
register(this)
override fun register() {
super.register()
registerChannel()
}

override fun unregister() {
super.unregister()
unregisterChannel()
}

private fun registerChannel() {
plugin.server.messenger.registerOutgoingPluginChannel(plugin, this.id())
plugin.server.messenger.registerOutgoingPluginChannel(plugin, messageMeta.id())
if (withSubscriber) {
subscriberListener = PluginMessageSubscribeListener(namespace, name, payloadClass, resultClass, this)
subscriberListener = PluginMessageSubscribeListener(messageMeta, this)
}
}

private fun unregisterChannel() {
plugin.server.messenger.unregisterOutgoingPluginChannel(plugin, this.id())
plugin.server.messenger.unregisterOutgoingPluginChannel(plugin, messageMeta.id())
if (withSubscriber) {
plugin.server.messenger.unregisterIncomingPluginChannel(plugin, this.id())
plugin.server.messenger.unregisterIncomingPluginChannel(plugin, messageMeta.id())
}
}

suspend fun publish(player: Player, payloadWrapper: PayloadWrapper<P>): CompletableDeferred<S> {
player.sendPluginMessage(plugin, this.id(), payloadWrapper.asJson().toByteArray())
suspend fun publish(player: Player, payloadWrapper: PayloadWrapper<P>): CompletableDeferred<R> {
player.sendPluginMessage(plugin, messageMeta.id(), payloadWrapper.asJson().toByteArray())
return publish(payloadWrapper)
}

abstract fun handle(payload: P): S?
abstract override fun handle(payload: P): R?

}
}
Original file line number Diff line number Diff line change
@@ -1,18 +1,17 @@
package org.sayandev.stickynote.bukkit.messaging.publisher

abstract class ProxyPluginMessagePublisher<P, S>(
namespace: String,
name: String,
payloadClass: Class<P>,
resultClass: Class<S>,
): PluginMessagePublisher<P, S>(
namespace,
name,
payloadClass,
resultClass,
true
import org.sayandev.stickynote.core.messaging.MessageMeta
import org.sayandev.stickynote.core.messaging.SimpleConnectionMeta

abstract class ProxyPluginMessagePublisher<P : Any, R : Any>(
messageMeta: MessageMeta<P, R>,
connectionMeta: SimpleConnectionMeta,
): PluginMessagePublisher<P, R>(
messageMeta,
connectionMeta,
false
) {
override fun handle(payload: P): S? {
override fun handle(payload: P): R? {
return null
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,55 +4,49 @@ import org.bukkit.entity.Player
import org.bukkit.plugin.messaging.PluginMessageListener
import org.sayandev.stickynote.bukkit.messaging.publisher.PluginMessagePublisher
import org.sayandev.stickynote.bukkit.plugin
import org.sayandev.stickynote.core.messaging.publisher.PayloadWrapper
import org.sayandev.stickynote.core.messaging.publisher.PayloadWrapper.Companion.asJson
import org.sayandev.stickynote.core.messaging.publisher.PayloadWrapper.Companion.asPayloadWrapper
import org.sayandev.stickynote.core.messaging.publisher.PayloadWrapper.Companion.typedPayload
import org.sayandev.stickynote.core.messaging.publisher.Publisher.Companion.HANDLER_LIST
import org.sayandev.stickynote.bukkit.warn
import org.sayandev.stickynote.core.messaging.MessageMeta
import org.sayandev.stickynote.core.messaging.PayloadBehaviour
import org.sayandev.stickynote.core.messaging.PayloadWrapper
import org.sayandev.stickynote.core.messaging.PayloadWrapper.Companion.asJson
import org.sayandev.stickynote.core.messaging.PayloadWrapper.Companion.asPayloadWrapper
import org.sayandev.stickynote.core.messaging.PayloadWrapper.Companion.typedPayload
import org.sayandev.stickynote.core.messaging.Publisher.Companion.HANDLER_LIST

class PluginMessageSubscribeListener<P, S>(
val namespace: String,
val name: String,
val payloadClass: Class<P>,
val resultClass: Class<S>,
val publisher: PluginMessagePublisher<P, S>?
class PluginMessageSubscribeListener<P : Any, R : Any>(
val messageMeta: MessageMeta<P, R>,
val publisher: PluginMessagePublisher<P, R>?
): PluginMessageListener {

fun id(): String {
return "$namespace:$name"
}

init {
plugin.server.messenger.registerIncomingPluginChannel(plugin, this.id(), this)
plugin.server.messenger.registerIncomingPluginChannel(plugin, messageMeta.id(), this)
}

override fun onPluginMessageReceived(channel: String, player: Player, data: ByteArray) {
val result = String(data).asPayloadWrapper<S>()
when (result.state) {
PayloadWrapper.State.FORWARD -> {
val result = String(data).asPayloadWrapper<R>()
when (result.behaviour) {
PayloadBehaviour.FORWARD -> {
if (publisher != null) {
val wrappedPayload = String(data).asPayloadWrapper<P>()
val payloadResult = publisher.handle(wrappedPayload.typedPayload(payloadClass)) ?: return
player.sendPluginMessage(plugin, channel, PayloadWrapper(wrappedPayload.uniqueId, payloadResult, PayloadWrapper.State.RESPOND, wrappedPayload.source).asJson().toByteArray())
val payloadResult = publisher.handle(wrappedPayload.typedPayload(messageMeta.payloadType)) ?: return
player.sendPluginMessage(plugin, channel, PayloadWrapper(wrappedPayload.uniqueId, payloadResult, PayloadBehaviour.RESPONSE, wrappedPayload.source).asJson().toByteArray())
} else {
throw IllegalStateException("tried to handle a payload with state ${result.state}, but it doesn't have a publisher")
throw IllegalStateException("tried to handle a payload with state ${result.behaviour}, but it doesn't have a publisher")
}
}
PayloadWrapper.State.RESPOND -> {
for (publisher in HANDLER_LIST.filterIsInstance<PluginMessagePublisher<P, S>>()) {
if (publisher.id() == channel) {
PayloadBehaviour.RESPONSE -> {
for (publisher in HANDLER_LIST.filterIsInstance<PluginMessagePublisher<P, R>>()) {
if (messageMeta.id() == channel) {
publisher.payloads[result.uniqueId]?.apply {
//val handle = String(data).asOptionalPayloadWrapper<P>()?.typedPayload(payloadClass)?.let { publisher.handle(it) }
this.complete(result.typedPayload(resultClass))
this.complete(result.typedPayload(messageMeta.resultType))
publisher.payloads.remove(result.uniqueId)
} /*?: throw IllegalStateException("No payload found for uniqueId ${result.uniqueId}")*/
} ?: throw IllegalStateException("No payload found for uniqueId ${result.uniqueId}")
}
}
}
else -> {
throw IllegalStateException("a result payload has been received with ${result.state} state, but it doesn't belong here. (payload: ${result})")
throw IllegalStateException("a result payload has been received with ${result.behaviour} state, but it doesn't belong here. (payload: ${result})")
}
}
}

}
}
Loading