Skip to content
This repository has been archived by the owner on May 5, 2024. It is now read-only.

feat: Broadcast Command #2

Merged
merged 1 commit into from
May 4, 2024
Merged
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
11 changes: 9 additions & 2 deletions build.gradle.kts
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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"
)
)
}
}
16 changes: 15 additions & 1 deletion src/main/kotlin/de/themeparkcraft/proxy/ProxyPlugin.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -21,6 +22,8 @@ class ProxyPlugin @Inject constructor(val server: ProxyServer, private val logge

companion object {
lateinit var instance: ProxyPlugin
val PREFIX: String =
"<gradient:#f6e58d:#ffda79>ThemeParkCraft</gradient> <color:#576574>•</color> <color:#c8d6e5>"
}

init {
Expand All @@ -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())
}

Expand Down
Original file line number Diff line number Diff line change
@@ -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<String> {
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")
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down