Skip to content
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
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@

## Todo
- [x] release publishing
- [ ] placeholders
- [x] placeholders
- [ ] signs
- [ ] npcs
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ repositories {
maven("https://repo.waterdog.dev/snapshots/")
maven("https://repo.opencollab.dev/maven-releases/")
maven("https://repo.opencollab.dev/maven-snapshots/")
maven("https://repo.extendedclip.com/releases/")
}

dependencies {
Expand Down
7 changes: 7 additions & 0 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,15 @@ bungeecord = "1.21-R0.4"
waterdog = "2.0.4-SNAPSHOT"
paper = "26.3.build.+"
minestom = "26_3-SNAPSHOT"
placeholderapi = "2.12.3"
miniplaceholders = "3.2.0"

adventure = "5.2.0"
adventure-platform-bungeecord = "4.4.1"


configurate = "4.2.0"
caffeine = "3.3.1"
slf4j = "2.0.20"

cloud = "2.1.0"
Expand All @@ -42,6 +45,8 @@ bungeecord-api = { module = "net.md-5:bungeecord-api", version.ref = "bungeecord
waterdog-api = { module = "dev.waterdog.waterdogpe:waterdog", version.ref = "waterdog" }
paper-api = { module = "io.papermc.paper:paper-api", version.ref = "paper" }
minestom = { module = "net.minestom:minestom", version.ref = "minestom" }
placeholderapi = { module = "me.clip:placeholderapi", version.ref = "placeholderapi" }
miniplaceholders-api = { module = "io.github.miniplaceholders:miniplaceholders-api", version.ref = "miniplaceholders" }

adventure = { module = "net.kyori:adventure-api", version.ref = "adventure" }
adventure-text-minimessage = { module = "net.kyori:adventure-text-minimessage", version.ref = "adventure" }
Expand All @@ -54,6 +59,8 @@ configurate-yaml = { module = "org.spongepowered:configurate-yaml", version.ref
configurate-gson = { module = "org.spongepowered:configurate-gson", version.ref = "configurate" }
configurate-extra-kotlin = { module = "org.spongepowered:configurate-extra-kotlin", version.ref = "configurate" }

caffeine = { module = "com.github.ben-manes.caffeine:caffeine", version.ref = "caffeine" }

slf4j-api = { module = "org.slf4j:slf4j-api", version.ref = "slf4j" }

cloud-core = { module = "org.incendo:cloud-core", version.ref = "cloud" }
Expand Down
19 changes: 19 additions & 0 deletions server/placeholders/placeholders-paper/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,3 +1,22 @@
plugins {
id("simplecloud.base-conventions")
alias(libs.plugins.blossom)
}

dependencies {
implementation(projects.server.placeholders.placeholdersShared)
compileOnly(libs.simplecloud.api)
compileOnly(libs.paper.api)
compileOnly(libs.placeholderapi)
compileOnly(libs.miniplaceholders.api)
}

sourceSets {
main {
blossom {
kotlinSources {
property("version", project.version.toString())
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package app.simplecloud.plugin.placeholders

object BuildConstants {
const val VERSION = "{{ version }}"
}
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package app.simplecloud.plugin.placeholders.paper

import app.simplecloud.plugin.placeholders.paper.expansion.MiniPlaceholdersExpansion
import app.simplecloud.plugin.placeholders.paper.expansion.PlaceholderApiExpansion
import app.simplecloud.plugin.placeholders.shared.PlaceholdersPlugin
import org.bukkit.plugin.java.JavaPlugin

class PaperPlaceholdersPlugin : JavaPlugin() {

private val placeholders = PlaceholdersPlugin()

private var placeholderApiExpansion: PlaceholderApiExpansion? = null
private var miniPlaceholdersExpansion: MiniPlaceholdersExpansion? = null

override fun onEnable() {
placeholders.start()

if (server.pluginManager.isPluginEnabled("PlaceholderAPI")) {
val expansion = PlaceholderApiExpansion(placeholders.resolver)
expansion.register()
placeholderApiExpansion = expansion
}
if (server.pluginManager.isPluginEnabled("MiniPlaceholders")) {
val expansion = MiniPlaceholdersExpansion(placeholders.resolver, placeholders.types)
expansion.register()
miniPlaceholdersExpansion = expansion
}

if (placeholderApiExpansion == null && miniPlaceholdersExpansion == null) {
logger.warning("Neither PlaceholderAPI nor MiniPlaceholders is installed, no placeholders will be registered")
}
}

override fun onDisable() {
placeholderApiExpansion?.unregister()
miniPlaceholdersExpansion?.unregister()
placeholders.shutdown()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package app.simplecloud.plugin.placeholders.paper.expansion

import app.simplecloud.plugin.placeholders.BuildConstants
import app.simplecloud.plugin.placeholders.shared.placeholder.PlaceholderType
import app.simplecloud.plugin.placeholders.shared.query.PlaceholderQuery
import app.simplecloud.plugin.placeholders.shared.resolve.PlaceholderResolver
import io.github.miniplaceholders.api.Expansion
import net.kyori.adventure.text.Component
import net.kyori.adventure.text.minimessage.tag.Tag
import net.kyori.adventure.text.minimessage.tag.resolver.ArgumentQueue

class MiniPlaceholdersExpansion(
private val resolver: PlaceholderResolver,
types: List<PlaceholderType<*>>,
) {

private val expansion: Expansion

init {
val builder = Expansion.builder("simplecloud").author("SimpleCloud").version(BuildConstants.VERSION)
types.forEach { type ->
type.properties.forEach { property ->
builder.globalPlaceholder("${type.prefix}_$property") { queue, _ -> resolve(type, property, queue) }
}
}
expansion = builder.build()
}

fun register() = expansion.register()

fun unregister() {
if (expansion.registered()) expansion.unregister()
}

private fun resolve(type: PlaceholderType<*>, property: String, queue: ArgumentQueue): Tag {
val arguments = mutableListOf<String>()
while (queue.hasNext()) arguments += queue.pop().value()

val target = arguments.joinToString(":").ifEmpty { null }
val value = resolver.resolve(PlaceholderQuery(type, target, property))
return Tag.selfClosingInserting(Component.text(value))
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package app.simplecloud.plugin.placeholders.paper.expansion

import app.simplecloud.plugin.placeholders.BuildConstants
import app.simplecloud.plugin.placeholders.shared.resolve.PlaceholderResolver
import me.clip.placeholderapi.expansion.PlaceholderExpansion
import org.bukkit.OfflinePlayer

class PlaceholderApiExpansion(
private val resolver: PlaceholderResolver,
) : PlaceholderExpansion() {

override fun getIdentifier() = "simplecloud"

override fun getAuthor() = "SimpleCloud"

override fun getVersion() = BuildConstants.VERSION

override fun persist() = true

override fun onRequest(player: OfflinePlayer?, params: String): String? = resolver.resolve(params)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
name: simplecloud-placeholder
version: ${version}
main: app.simplecloud.plugin.placeholders.paper.PaperPlaceholdersPlugin
api-version: "1.21.11"
author: SimpleCloud Maintainers
description: Provides SimpleCloud placeholders for PlaceholderAPI and MiniPlaceholders
website: https://github.com/simplecloudapp/plugins
folia-supported: true

dependencies:
server:
PlaceholderAPI:
load: BEFORE
required: false
join-classpath: true
MiniPlaceholders:
load: BEFORE
required: false
join-classpath: true
simplecloud-api:
load: BEFORE
required: true
join-classpath: true
6 changes: 6 additions & 0 deletions server/placeholders/placeholders-shared/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
plugins {
id("simplecloud.base-conventions")
}

dependencies {
compileOnly(libs.simplecloud.api)
compileOnly(libs.slf4j.api)
implementation(libs.caffeine)
}
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package app.simplecloud.plugin.placeholders.shared

import app.simplecloud.api.CloudApi
import app.simplecloud.api.CloudApiOptions
import app.simplecloud.plugin.placeholders.shared.placeholder.GroupPlaceholders
import app.simplecloud.plugin.placeholders.shared.placeholder.PersistentServerPlaceholders
import app.simplecloud.plugin.placeholders.shared.placeholder.PlaceholderType
import app.simplecloud.plugin.placeholders.shared.placeholder.ServerPlaceholders
import app.simplecloud.plugin.placeholders.shared.query.PlaceholderQueryParser
import app.simplecloud.plugin.placeholders.shared.resolve.PlaceholderResolver

class PlaceholdersPlugin {

private val api: CloudApi = CloudApi.create(CloudApiOptions.builder().component("placeholders").build())

val types: List<PlaceholderType<*>> = listOf(PersistentServerPlaceholders, ServerPlaceholders, GroupPlaceholders)
val resolver = PlaceholderResolver(api, PlaceholderQueryParser(types))

fun start() {
resolver.preloadCurrent(types)
}

fun shutdown() {
resolver.shutdown()
api.close()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package app.simplecloud.plugin.placeholders.shared.placeholder

import app.simplecloud.api.CloudApi
import app.simplecloud.api.group.Group
import app.simplecloud.api.runtime.SimpleCloudRuntime
import app.simplecloud.api.server.ServerQuery
import kotlinx.coroutines.future.await

object GroupPlaceholders : PlaceholderType<GroupPlaceholders.Data> {

data class Data(val group: Group, val playerCount: Int)

override val prefix = "group"

override val properties = setOf("name", "type", "min_memory", "max_memory", "max_players", "player_count")

override fun getValue(resource: Data, property: String): Any? = when (property) {
"name" -> resource.group.name
"type" -> resource.group.type
"min_memory" -> resource.group.minMemory
"max_memory" -> resource.group.maxMemory
"max_players" -> resource.group.maxPlayers
"player_count" -> resource.playerCount
else -> null
}

override suspend fun loadCurrent(api: CloudApi): Data? = load(api, SimpleCloudRuntime.groupName())

override suspend fun load(api: CloudApi, target: String): Data? {
val group = api.group().getGroupByName(target).await() ?: return null
val query = ServerQuery.create().filterByServerGroupName(group.name)
val servers = api.server().getAllServers(query).await()
return Data(group, servers.sumOf { it.playerCount ?: 0 })
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package app.simplecloud.plugin.placeholders.shared.placeholder

import app.simplecloud.api.CloudApi
import app.simplecloud.api.persistentserver.PersistentServer
import app.simplecloud.api.runtime.SimpleCloudRuntime
import kotlinx.coroutines.future.await

object PersistentServerPlaceholders : PlaceholderType<PersistentServer> {

override val prefix = "persistent_server"

override val properties = setOf(
"id",
"name",
"type",
"host",
"max_players",
"min_memory",
"max_memory",
"player_count",
"is_active",
)

override fun getValue(resource: PersistentServer, property: String): Any? = when (property) {
"id" -> resource.persistentServerId
"name" -> resource.name
"type" -> resource.type
"host" -> resource.serverhostId
"max_players" -> resource.maxPlayers
"min_memory" -> resource.minMemory
"max_memory" -> resource.maxMemory
"player_count" -> resource.playerCount
"is_active" -> resource.isActive
else -> null
}

override suspend fun loadCurrent(api: CloudApi): PersistentServer? =
api.persistentServer().getPersistentServerById(SimpleCloudRuntime.serverId()).await()

override suspend fun load(api: CloudApi, target: String): PersistentServer? =
api.persistentServer().getPersistentServerByName(target).await()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package app.simplecloud.plugin.placeholders.shared.placeholder

import app.simplecloud.api.CloudApi

interface PlaceholderType<T : Any> {

val prefix: String

val properties: Set<String>

fun getValue(resource: T, property: String): Any?

suspend fun loadCurrent(api: CloudApi): T?

suspend fun load(api: CloudApi, target: String): T?
}
Loading
Loading