Zum Inhalt

Kotlin API guide

Dependency

Publish from the SkyyEconomy checkout:

.\gradlew.bat publishApiToMavenLocal

Consumer build.gradle.kts:

repositories {
    mavenLocal()
    mavenCentral()
    maven("https://repo.papermc.io/repository/maven-public/")
}

dependencies {
    compileOnly("de.skyymedia:skyyeconomy-api:0.2.0")
    compileOnly("io.papermc.paper:paper-api:26.1.2.build.+")
}

Alternatively copy SkyyEconomy-API-0.2.0.jar into libs/ and use:

dependencies {
    compileOnly(files("libs/SkyyEconomy-API-0.2.0.jar"))
}

Consumer plugin.yml:

name: JobSystem
version: '1.0.0'
main: example.jobs.JobSystemPlugin
api-version: '26.1'
depend: [SkyyEconomy]

Complete JobSystem example

package example.jobs

import de.skyymedia.economy.api.EconomyApi
import de.skyymedia.economy.api.ListenerRegistration
import de.skyymedia.economy.api.event.BalanceChangeEvent
import de.skyymedia.economy.api.model.FailureCode
import de.skyymedia.economy.api.model.Money
import de.skyymedia.economy.api.model.MutationContext
import de.skyymedia.economy.api.model.ResultStatus
import org.bukkit.entity.Player
import org.bukkit.plugin.java.JavaPlugin
import java.util.UUID

class JobSystemPlugin : JavaPlugin() {
    private lateinit var economy: EconomyApi
    private var balanceListener: ListenerRegistration? = null

    override fun onEnable() {
        economy = server.servicesManager.load(EconomyApi::class.java)
            ?: error("SkyyEconomy is required")
        balanceListener = economy.eventService().register(BalanceChangeEvent::class.java) { event ->
            logger.fine("Balance changed for ${event.accountUniqueId}: ${event.newBalance}")
        }
    }

    override fun onDisable() {
        balanceListener?.close()
    }

    fun rewardMiner(player: Player, rewardId: UUID) {
        val amount = Money.parse("25.00", 2)
        val context = MutationContext.builder("JobSystem", "Miner reward")
            .actor(player.uniqueId, player.name)
            .requestId("miner-reward:$rewardId")
            .metadata("job", "miner")
            .build()

        economy.economyService().deposit(player.uniqueId, amount, context)
            .whenComplete { result, failure ->
                server.scheduler.runTask(this, Runnable {
                    when {
                        failure != null -> logger.warning("Economy request failed: ${failure.message}")
                        result.status == ResultStatus.SUCCESS -> player.sendMessage("Reward credited.")
                        result.status == ResultStatus.ALREADY_PROCESSED -> logger.info("Reward was already credited.")
                        result.failureCode == FailureCode.ACCOUNT_RECEIVE_BLOCKED -> player.sendMessage("Your account cannot receive money.")
                        else -> player.sendMessage("Reward rejected: ${result.failureCode}")
                    }
                })
            }
    }

    fun readBalance(playerId: UUID) = economy.economyService().getBalance(playerId)

    fun withdraw(playerId: UUID, purchaseId: UUID) = economy.economyService().withdraw(
        playerId,
        Money.parse("10.00", 2),
        MutationContext.builder("JobSystem", "Job shop purchase")
            .requestId("job-purchase:$purchaseId")
            .build(),
    )

    fun transfer(from: UUID, to: UUID, amount: Money, transferId: UUID) =
        economy.economyService().transfer(
            from,
            to,
            amount,
            MutationContext.builder("JobSystem", "Team payout")
                .requestId("team-payout:$transferId")
                .build(),
        )

    fun history(playerId: UUID, page: Int = 1) =
        economy.transactionService().getTransactions(playerId, page, 20)

    fun restrictionStatus(playerId: UUID) =
        economy.accountRestrictionService().getActiveRestrictions(playerId)
}

The flow is JobSystem -> SkyyEconomy API -> authoritative transaction/ledger -> Redis invalidation after commit. Never infer a completed reward from a Redis event.