diff --git a/build.gradle.kts b/build.gradle.kts index cc2006b..9bd7385 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,5 +1,4 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar -import org.jetbrains.kotlin.gradle.tasks.KotlinCompile val fruxzAscendVersion: String by project val fruxzStackedVersion: String by project @@ -58,6 +57,14 @@ kotlin { compilerOptions { jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_21) apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_0) - freeCompilerArgs.addAll(listOf("-opt-in=kotlin.RequiresOptIn", "-Xopt-in=dev.kord.common.annotation.KordPreview", "-Xopt-in=dev.kord.common.annotation.KordExperimental", "-Xopt-in=kotlin.time.ExperimentalTime", "-Xopt-in=kotlin.contracts.ExperimentalContracts")) + freeCompilerArgs.addAll( + listOf( + "-opt-in=kotlin.RequiresOptIn", + "-Xopt-in=dev.kord.common.annotation.KordPreview", + "-Xopt-in=dev.kord.common.annotation.KordExperimental", + "-Xopt-in=kotlin.time.ExperimentalTime", + "-Xopt-in=kotlin.contracts.ExperimentalContracts" + ) + ) } } \ No newline at end of file diff --git a/src/main/kotlin/de/themeparkcraft/proxy/ProxyPlugin.kt b/src/main/kotlin/de/themeparkcraft/proxy/ProxyPlugin.kt index 52347f6..717dd81 100644 --- a/src/main/kotlin/de/themeparkcraft/proxy/ProxyPlugin.kt +++ b/src/main/kotlin/de/themeparkcraft/proxy/ProxyPlugin.kt @@ -6,6 +6,7 @@ import com.velocitypowered.api.event.proxy.ProxyInitializeEvent import com.velocitypowered.api.event.proxy.ProxyShutdownEvent import com.velocitypowered.api.plugin.Plugin import com.velocitypowered.api.proxy.ProxyServer +import de.themeparkcraft.proxy.commands.BroadcastCommand import de.themeparkcraft.proxy.commands.HubCommand import de.themeparkcraft.proxy.listener.PingListener import org.slf4j.Logger @@ -21,6 +22,8 @@ class ProxyPlugin @Inject constructor(val server: ProxyServer, private val logge companion object { lateinit var instance: ProxyPlugin + val PREFIX: String = + "ThemeParkCraft " } init { @@ -35,10 +38,21 @@ class ProxyPlugin @Inject constructor(val server: ProxyServer, private val logge val eventManager = server.eventManager commandManager.register( - commandManager.metaBuilder("hub").aliases("lobby", "l", "h").build(), + commandManager + .metaBuilder("hub") + .aliases("lobby", "l", "h") + .build(), HubCommand(server) ) + commandManager.register( + commandManager + .metaBuilder("broadcast") + .aliases("bc") + .build(), + BroadcastCommand(server) + ) + eventManager.register(this, PingListener()) } diff --git a/src/main/kotlin/de/themeparkcraft/proxy/commands/BroadcastCommand.kt b/src/main/kotlin/de/themeparkcraft/proxy/commands/BroadcastCommand.kt new file mode 100644 index 0000000..1eccab4 --- /dev/null +++ b/src/main/kotlin/de/themeparkcraft/proxy/commands/BroadcastCommand.kt @@ -0,0 +1,53 @@ +package de.themeparkcraft.proxy.commands + +import com.velocitypowered.api.command.SimpleCommand +import com.velocitypowered.api.proxy.Player +import com.velocitypowered.api.proxy.ProxyServer +import de.themeparkcraft.proxy.ProxyPlugin +import de.themeparkcraft.proxy.extensions.text + +/** + * Represents a command that broadcasts a message to all players on the server. + * + * @param proxy The proxy server instance. + */ +class BroadcastCommand(private val proxy: ProxyServer) : SimpleCommand { + + /** + * Executes the broadcast command by sending a message to all players on the server. + * + * @param invocation The command invocation. + */ + override fun execute(invocation: SimpleCommand.Invocation?) { + if (invocation == null) return + + val message = invocation.arguments().joinToString(" ") + val textComp = text("${ProxyPlugin.PREFIX}$message") + + proxy.allPlayers.forEach { it.sendMessage(textComp) } + } + + /** + * Returns a list of suggestions for the given command invocation. + * + * @param invocation The command invocation. + * @return The list of suggestions. + */ + override fun suggest(invocation: SimpleCommand.Invocation?): MutableList { + return mutableListOf() + } + + /** + * Checks if the invocation source has the permission "ventureproxy.broadcast". + * + * @param invocation The invocation representing the command execution. + * @return true if the source has the permission, false otherwise. + */ + override fun hasPermission(invocation: SimpleCommand.Invocation?): Boolean { + if (invocation == null) return true + if (invocation.source() !is Player) return true + + val player = invocation.source() as Player + return player.hasPermission("ventureproxy.broadcast") + } +} \ No newline at end of file diff --git a/src/main/kotlin/de/themeparkcraft/proxy/listener/PingListener.kt b/src/main/kotlin/de/themeparkcraft/proxy/listener/PingListener.kt index 8479540..1fdb18d 100644 --- a/src/main/kotlin/de/themeparkcraft/proxy/listener/PingListener.kt +++ b/src/main/kotlin/de/themeparkcraft/proxy/listener/PingListener.kt @@ -29,8 +29,12 @@ class PingListener { val connection = connection.virtualHost.getOrNull() ?: return try { - when(connection.hostString) { - "blockventuremc.net" -> response.favicon(Favicon("data:image/png;base64,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")) + when (connection.hostString) { + "blockventuremc.net" -> response.favicon( + Favicon( + "data:image/png;base64,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" + ) + ) } } catch (e: Exception) {