Reform dependency structure.

This commit is contained in:
2023-02-07 04:52:54 -05:00
parent eb587dc299
commit d335a0b63f
36 changed files with 121 additions and 98 deletions

View File

@ -1,3 +1,7 @@
plugins { plugins {
id("gay.pizza.foundation.concrete-library") id("gay.pizza.foundation.concrete-library")
} }
dependencies {
compileOnly(project(":foundation-shared"))
}

View File

@ -0,0 +1,11 @@
package gay.pizza.foundation.common
import gay.pizza.foundation.shared.IFoundationCore
import org.bukkit.Server
object FoundationCoreLoader {
fun get(server: Server): IFoundationCore {
return server.pluginManager.getPlugin("Foundation") as IFoundationCore?
?: throw RuntimeException("Foundation Core is not loaded!")
}
}

View File

@ -1,3 +0,0 @@
package gay.pizza.foundation.common
annotation class PluginMainClass

View File

@ -7,5 +7,6 @@ dependencies {
exclude(module = "opus-java") exclude(module = "opus-java")
} }
compileOnly(project(":foundation-core")) implementation(project(":common-plugin"))
compileOnly(project(":foundation-shared"))
} }

View File

@ -2,10 +2,8 @@ package gay.pizza.foundation.bifrost
import com.charleskorn.kaml.Yaml import com.charleskorn.kaml.Yaml
import gay.pizza.foundation.bifrost.model.BifrostConfig import gay.pizza.foundation.bifrost.model.BifrostConfig
import gay.pizza.foundation.common.PluginMainClass import gay.pizza.foundation.common.FoundationCoreLoader
import gay.pizza.foundation.core.FoundationCorePlugin import gay.pizza.foundation.shared.*
import gay.pizza.foundation.core.Util
import gay.pizza.foundation.common.AdvancementTitleCache
import io.papermc.paper.event.player.AsyncChatEvent import io.papermc.paper.event.player.AsyncChatEvent
import net.dv8tion.jda.api.EmbedBuilder import net.dv8tion.jda.api.EmbedBuilder
import net.dv8tion.jda.api.JDA import net.dv8tion.jda.api.JDA
@ -38,11 +36,8 @@ class FoundationBifrostPlugin : JavaPlugin(), DiscordEventListener, BukkitEventL
override fun onEnable() { override fun onEnable() {
isDev = description.version == "DEV" isDev = description.version == "DEV"
val foundation = FoundationCoreLoader.get(server)
val foundation = server.pluginManager.getPlugin("Foundation") as FoundationCorePlugin val configPath = copyDefaultConfig<FoundationBifrostPlugin>(
slF4JLogger.info("Plugin data path: ${foundation.pluginDataPath}")
val configPath = Util.copyDefaultConfig<FoundationBifrostPlugin>(
slF4JLogger, slF4JLogger,
foundation.pluginDataPath, foundation.pluginDataPath,
"bifrost.yaml" "bifrost.yaml"

View File

@ -4,5 +4,5 @@ plugins {
dependencies { dependencies {
implementation(project(":common-plugin")) implementation(project(":common-plugin"))
compileOnly(project(":foundation-core")) compileOnly(project(":foundation-shared"))
} }

View File

@ -2,9 +2,9 @@ package gay.pizza.foundation.chaos
import com.charleskorn.kaml.Yaml import com.charleskorn.kaml.Yaml
import gay.pizza.foundation.chaos.model.ChaosConfig import gay.pizza.foundation.chaos.model.ChaosConfig
import gay.pizza.foundation.common.PluginMainClass import gay.pizza.foundation.common.FoundationCoreLoader
import gay.pizza.foundation.core.FoundationCorePlugin import gay.pizza.foundation.shared.PluginMainClass
import gay.pizza.foundation.core.Util import gay.pizza.foundation.shared.copyDefaultConfig
import org.bukkit.plugin.java.JavaPlugin import org.bukkit.plugin.java.JavaPlugin
import kotlin.io.path.inputStream import kotlin.io.path.inputStream
@ -17,9 +17,8 @@ class FoundationChaosPlugin : JavaPlugin() {
} }
override fun onEnable() { override fun onEnable() {
val foundation = server.pluginManager.getPlugin("Foundation") as FoundationCorePlugin val foundation = FoundationCoreLoader.get(server)
slF4JLogger.info("Plugin data path: ${foundation.pluginDataPath}") val configPath = copyDefaultConfig<FoundationChaosPlugin>(
val configPath = Util.copyDefaultConfig<FoundationChaosPlugin>(
slF4JLogger, slF4JLogger,
foundation.pluginDataPath, foundation.pluginDataPath,
"chaos.yaml" "chaos.yaml"

View File

@ -1,6 +1,6 @@
package gay.pizza.foundation.chaos.modules package gay.pizza.foundation.chaos.modules
import gay.pizza.foundation.common.spawn import gay.pizza.foundation.shared.spawn
import org.bukkit.entity.TNTPrimed import org.bukkit.entity.TNTPrimed
import org.bukkit.plugin.Plugin import org.bukkit.plugin.Plugin

View File

@ -1,6 +1,6 @@
package gay.pizza.foundation.chaos.modules package gay.pizza.foundation.chaos.modules
import gay.pizza.foundation.common.spawn import gay.pizza.foundation.shared.spawn
import org.bukkit.entity.TNTPrimed import org.bukkit.entity.TNTPrimed
import org.bukkit.plugin.Plugin import org.bukkit.plugin.Plugin

View File

@ -3,10 +3,9 @@ plugins {
} }
dependencies { dependencies {
// TODO: might be able to ship all dependencies in core? are we duplicating classes in JARs? implementation(project(":foundation-shared"))
implementation("software.amazon.awssdk:s3:2.19.31") implementation("software.amazon.awssdk:s3:2.19.31")
implementation("org.quartz-scheduler:quartz:2.3.2") implementation("org.quartz-scheduler:quartz:2.3.2")
implementation("com.google.guava:guava:31.1-jre") implementation("com.google.guava:guava:31.1-jre")
api(project(":common-plugin"))
} }

View File

@ -1,6 +1,7 @@
package gay.pizza.foundation.core package gay.pizza.foundation.core
import gay.pizza.foundation.common.PluginMainClass import gay.pizza.foundation.shared.IFoundationCore
import gay.pizza.foundation.shared.PluginMainClass
import gay.pizza.foundation.core.abstraction.FoundationPlugin import gay.pizza.foundation.core.abstraction.FoundationPlugin
import gay.pizza.foundation.core.features.backup.BackupFeature import gay.pizza.foundation.core.features.backup.BackupFeature
import gay.pizza.foundation.core.features.dev.DevFeature import gay.pizza.foundation.core.features.dev.DevFeature
@ -15,17 +16,17 @@ import org.koin.dsl.module
import java.nio.file.Path import java.nio.file.Path
@PluginMainClass @PluginMainClass
class FoundationCorePlugin : FoundationPlugin() { class FoundationCorePlugin : IFoundationCore, FoundationPlugin() {
private lateinit var _pluginDataPath: Path private lateinit var _pluginDataPath: Path
var pluginDataPath: Path override var pluginDataPath: Path
/** /**
* Data path of the core plugin. * Data path of the core plugin.
* Can be used as a check of sorts for dependencies to be sure the plugin is loaded. * Can be used as a check of sorts for dependencies to be sure the plugin is loaded.
*/ */
get() { get() {
if (!::_pluginDataPath.isInitialized) { if (!::_pluginDataPath.isInitialized) {
throw Exception("FoundationCore is not loaded!") throw Exception("Foundation Core is not loaded!")
} }
return _pluginDataPath return _pluginDataPath
} }

View File

@ -2,8 +2,6 @@ package gay.pizza.foundation.core
import net.kyori.adventure.text.Component import net.kyori.adventure.text.Component
import net.kyori.adventure.text.format.TextColor import net.kyori.adventure.text.format.TextColor
import org.slf4j.Logger
import java.nio.file.Path
object Util { object Util {
private val leftBracket: Component = Component.text('[') private val leftBracket: Component = Component.text('[')
@ -22,39 +20,4 @@ object Util {
.append(whitespace) .append(whitespace)
.append(Component.text(message)) .append(Component.text(message))
} }
/**
* Copy the default configuration from the resource [resourceName] into the directory [targetPath].
* @param targetPath The output directory as a path, it must exist before calling this.
* @param resourceName Path to resource, it should be in the root of the `resources` directory,
* without the leading slash.
*/
inline fun <reified T> copyDefaultConfig(log: Logger, targetPath: Path, resourceName: String): Path {
if (resourceName.startsWith("/")) {
throw IllegalArgumentException("resourceName starts with slash")
}
if (!targetPath.toFile().exists()) {
throw Exception("Configuration output path does not exist!")
}
val outPath = targetPath.resolve(resourceName)
val outFile = outPath.toFile()
if (outFile.exists()) {
log.debug("Configuration file already exists.")
return outPath
}
val resourceStream = T::class.java.getResourceAsStream("/$resourceName")
?: throw Exception("Configuration resource does not exist!")
val outputStream = outFile.outputStream()
resourceStream.use {
outputStream.use {
log.info("Copied default configuration to $outPath")
resourceStream.copyTo(outputStream)
}
}
return outPath
}
} }

View File

@ -1,6 +1,6 @@
package gay.pizza.foundation.core.features.backup package gay.pizza.foundation.core.features.backup
import gay.pizza.foundation.common.Platform import gay.pizza.foundation.shared.Platform
import gay.pizza.foundation.core.FoundationCorePlugin import gay.pizza.foundation.core.FoundationCorePlugin
import gay.pizza.foundation.core.Util import gay.pizza.foundation.core.Util
import net.kyori.adventure.text.Component import net.kyori.adventure.text.Component

View File

@ -1,8 +1,8 @@
package gay.pizza.foundation.core.features.backup package gay.pizza.foundation.core.features.backup
import com.charleskorn.kaml.Yaml import com.charleskorn.kaml.Yaml
import gay.pizza.foundation.shared.copyDefaultConfig
import gay.pizza.foundation.core.FoundationCorePlugin import gay.pizza.foundation.core.FoundationCorePlugin
import gay.pizza.foundation.core.Util
import gay.pizza.foundation.core.abstraction.Feature import gay.pizza.foundation.core.abstraction.Feature
import gay.pizza.foundation.core.features.scheduler.cancel import gay.pizza.foundation.core.features.scheduler.cancel
import gay.pizza.foundation.core.features.scheduler.cron import gay.pizza.foundation.core.features.scheduler.cron
@ -46,7 +46,7 @@ class BackupFeature : Feature() {
override fun module() = module { override fun module() = module {
single { single {
val configPath = Util.copyDefaultConfig<FoundationCorePlugin>( val configPath = copyDefaultConfig<FoundationCorePlugin>(
plugin.slF4JLogger, plugin.slF4JLogger,
plugin.pluginDataPath, plugin.pluginDataPath,
"backup.yaml", "backup.yaml",

View File

@ -3,8 +3,8 @@ package gay.pizza.foundation.core.features.dev
import com.charleskorn.kaml.Yaml import com.charleskorn.kaml.Yaml
import com.sun.net.httpserver.HttpExchange import com.sun.net.httpserver.HttpExchange
import com.sun.net.httpserver.HttpServer import com.sun.net.httpserver.HttpServer
import gay.pizza.foundation.shared.copyDefaultConfig
import gay.pizza.foundation.core.FoundationCorePlugin import gay.pizza.foundation.core.FoundationCorePlugin
import gay.pizza.foundation.core.Util
import gay.pizza.foundation.core.features.update.UpdateService import gay.pizza.foundation.core.features.update.UpdateService
import kotlinx.serialization.json.Json import kotlinx.serialization.json.Json
import kotlinx.serialization.json.decodeFromStream import kotlinx.serialization.json.decodeFromStream
@ -23,7 +23,7 @@ class DevUpdateServer(val plugin: FoundationCorePlugin) {
} }
fun enable() { fun enable() {
val configPath = Util.copyDefaultConfig<FoundationCorePlugin>( val configPath = copyDefaultConfig<FoundationCorePlugin>(
plugin.slF4JLogger, plugin.slF4JLogger,
plugin.pluginDataPath, plugin.pluginDataPath,
"devupdate.yaml" "devupdate.yaml"

View File

@ -1,8 +1,8 @@
package gay.pizza.foundation.core.features.gameplay package gay.pizza.foundation.core.features.gameplay
import com.charleskorn.kaml.Yaml import com.charleskorn.kaml.Yaml
import gay.pizza.foundation.shared.copyDefaultConfig
import gay.pizza.foundation.core.FoundationCorePlugin import gay.pizza.foundation.core.FoundationCorePlugin
import gay.pizza.foundation.core.Util
import gay.pizza.foundation.core.abstraction.Feature import gay.pizza.foundation.core.abstraction.Feature
import org.bukkit.Bukkit import org.bukkit.Bukkit
import org.bukkit.Material import org.bukkit.Material
@ -24,7 +24,7 @@ class GameplayFeature : Feature() {
override fun module() = module { override fun module() = module {
single { single {
val configPath = Util.copyDefaultConfig<FoundationCorePlugin>( val configPath = copyDefaultConfig<FoundationCorePlugin>(
plugin.slF4JLogger, plugin.slF4JLogger,
plugin.pluginDataPath, plugin.pluginDataPath,
"gameplay.yaml", "gameplay.yaml",

View File

@ -1,6 +1,6 @@
package gay.pizza.foundation.core.features.player package gay.pizza.foundation.core.features.player
import gay.pizza.foundation.common.chat import gay.pizza.foundation.shared.chat
import org.bukkit.command.Command import org.bukkit.command.Command
import org.bukkit.command.CommandExecutor import org.bukkit.command.CommandExecutor
import org.bukkit.command.CommandSender import org.bukkit.command.CommandSender

View File

@ -1,6 +1,6 @@
package gay.pizza.foundation.core.features.player package gay.pizza.foundation.core.features.player
import gay.pizza.foundation.common.spawn import gay.pizza.foundation.shared.spawn
import org.bukkit.command.Command import org.bukkit.command.Command
import org.bukkit.command.CommandExecutor import org.bukkit.command.CommandExecutor
import org.bukkit.command.CommandSender import org.bukkit.command.CommandSender

View File

@ -4,8 +4,8 @@ import com.charleskorn.kaml.Yaml
import com.google.common.cache.Cache import com.google.common.cache.Cache
import com.google.common.cache.CacheBuilder import com.google.common.cache.CacheBuilder
import com.google.common.cache.RemovalCause import com.google.common.cache.RemovalCause
import gay.pizza.foundation.shared.copyDefaultConfig
import gay.pizza.foundation.core.FoundationCorePlugin import gay.pizza.foundation.core.FoundationCorePlugin
import gay.pizza.foundation.core.Util
import gay.pizza.foundation.core.abstraction.Feature import gay.pizza.foundation.core.abstraction.Feature
import net.kyori.adventure.text.Component import net.kyori.adventure.text.Component
import org.bukkit.GameMode import org.bukkit.GameMode
@ -53,7 +53,7 @@ class PlayerFeature : Feature() {
override fun module() = org.koin.dsl.module { override fun module() = org.koin.dsl.module {
single { single {
val configPath = Util.copyDefaultConfig<FoundationCorePlugin>( val configPath = copyDefaultConfig<FoundationCorePlugin>(
plugin.slF4JLogger, plugin.slF4JLogger,
plugin.pluginDataPath, plugin.pluginDataPath,
"player.yaml", "player.yaml",

View File

@ -1,7 +1,7 @@
package gay.pizza.foundation.core.features.stats package gay.pizza.foundation.core.features.stats
import gay.pizza.foundation.common.SortOrder import gay.pizza.foundation.shared.SortOrder
import gay.pizza.foundation.common.allPlayerStatisticsOf import gay.pizza.foundation.shared.allPlayerStatisticsOf
import org.bukkit.Statistic import org.bukkit.Statistic
import org.bukkit.command.Command import org.bukkit.command.Command
import org.bukkit.command.CommandExecutor import org.bukkit.command.CommandExecutor

View File

@ -3,6 +3,7 @@ plugins {
} }
dependencies { dependencies {
api(project(":common-heimdall")) implementation(project(":common-plugin"))
compileOnly(project(":foundation-core")) compileOnly(project(":foundation-shared"))
implementation(project(":common-heimdall"))
} }

View File

@ -3,8 +3,9 @@ package gay.pizza.foundation.heimdall.plugin
import com.charleskorn.kaml.Yaml import com.charleskorn.kaml.Yaml
import com.zaxxer.hikari.HikariConfig import com.zaxxer.hikari.HikariConfig
import com.zaxxer.hikari.HikariDataSource import com.zaxxer.hikari.HikariDataSource
import gay.pizza.foundation.common.PluginMainClass import gay.pizza.foundation.common.FoundationCoreLoader
import gay.pizza.foundation.core.Util import gay.pizza.foundation.shared.PluginMainClass
import gay.pizza.foundation.shared.copyDefaultConfig
import gay.pizza.foundation.heimdall.plugin.buffer.BufferFlushThread import gay.pizza.foundation.heimdall.plugin.buffer.BufferFlushThread
import gay.pizza.foundation.heimdall.plugin.buffer.EventBuffer import gay.pizza.foundation.heimdall.plugin.buffer.EventBuffer
import gay.pizza.foundation.heimdall.plugin.event.* import gay.pizza.foundation.heimdall.plugin.event.*
@ -44,12 +45,10 @@ class FoundationHeimdallPlugin : JavaPlugin(), Listener {
val exportChunksCommand = getCommand("export_all_chunks") ?: throw Exception("Failed to get export_all_chunks command") val exportChunksCommand = getCommand("export_all_chunks") ?: throw Exception("Failed to get export_all_chunks command")
exportChunksCommand.setExecutor(ExportAllChunksCommand(this)) exportChunksCommand.setExecutor(ExportAllChunksCommand(this))
val pluginDataPath = dataFolder.toPath() val foundation = FoundationCoreLoader.get(server)
pluginDataPath.toFile().mkdir() val configPath = copyDefaultConfig<FoundationHeimdallPlugin>(
val configPath = Util.copyDefaultConfig<FoundationHeimdallPlugin>(
slF4JLogger, slF4JLogger,
pluginDataPath, foundation.pluginDataPath,
"heimdall.yaml" "heimdall.yaml"
) )
config = Yaml.default.decodeFromStream(HeimdallConfig.serializer(), configPath.inputStream()) config = Yaml.default.decodeFromStream(HeimdallConfig.serializer(), configPath.inputStream())

View File

@ -1,6 +1,6 @@
name: Foundation-Heimdall name: Foundation-Heimdall
version: '${version}' version: '${version}'
main: gay.pizza.foundation.heimdall.plugin.HeimdallPlugin main: gay.pizza.foundation.heimdall.plugin.FoundationHeimdallPlugin
api-version: 1.18 api-version: 1.18
prefix: Foundation-Heimdall prefix: Foundation-Heimdall
load: STARTUP load: STARTUP

View File

@ -0,0 +1,3 @@
plugins {
id("gay.pizza.foundation.concrete-library")
}

View File

@ -1,4 +1,4 @@
package gay.pizza.foundation.common package gay.pizza.foundation.shared
import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer

View File

@ -1,4 +1,4 @@
package gay.pizza.foundation.common package gay.pizza.foundation.shared
import org.bukkit.entity.Player import org.bukkit.entity.Player

View File

@ -1,4 +1,4 @@
package gay.pizza.foundation.common package gay.pizza.foundation.shared
fun <T, R : Comparable<R>> Collection<T>.sortedBy(order: SortOrder, selector: (T) -> R?): List<T> = fun <T, R : Comparable<R>> Collection<T>.sortedBy(order: SortOrder, selector: (T) -> R?): List<T> =
if (order == SortOrder.Ascending) { if (order == SortOrder.Ascending) {

View File

@ -0,0 +1,7 @@
package gay.pizza.foundation.shared
import java.nio.file.Path
interface IFoundationCore {
val pluginDataPath: Path
}

View File

@ -1,4 +1,4 @@
package gay.pizza.foundation.common package gay.pizza.foundation.shared
object Platform { object Platform {
private val os: String? = System.getProperty("os.name") private val os: String? = System.getProperty("os.name")

View File

@ -0,0 +1,3 @@
package gay.pizza.foundation.shared
annotation class PluginMainClass

View File

@ -1,4 +1,4 @@
package gay.pizza.foundation.common package gay.pizza.foundation.shared
import org.bukkit.Material import org.bukkit.Material
import org.bukkit.OfflinePlayer import org.bukkit.OfflinePlayer

View File

@ -1,4 +1,4 @@
package gay.pizza.foundation.common package gay.pizza.foundation.shared
enum class SortOrder { enum class SortOrder {
Ascending, Ascending,

View File

@ -1,4 +1,4 @@
package gay.pizza.foundation.common package gay.pizza.foundation.shared
import org.bukkit.Location import org.bukkit.Location
import org.bukkit.World import org.bukkit.World

View File

@ -0,0 +1,39 @@
package gay.pizza.foundation.shared
import org.slf4j.Logger
import java.nio.file.Path
/**
* Copy the default configuration from the resource [resourceName] into the directory [targetPath].
* @param targetPath The output directory as a path, it must exist before calling this.
* @param resourceName Path to resource, it should be in the root of the `resources` directory,
* without the leading slash.
*/
inline fun <reified T> copyDefaultConfig(log: Logger, targetPath: Path, resourceName: String): Path {
if (resourceName.startsWith("/")) {
throw IllegalArgumentException("resourceName starts with slash")
}
if (!targetPath.toFile().exists()) {
throw Exception("Configuration output path does not exist!")
}
val outPath = targetPath.resolve(resourceName)
val outFile = outPath.toFile()
if (outFile.exists()) {
log.debug("Configuration file already exists.")
return outPath
}
val resourceStream = T::class.java.getResourceAsStream("/$resourceName")
?: throw Exception("Configuration resource does not exist!")
val outputStream = outFile.outputStream()
resourceStream.use {
outputStream.use {
log.info("Copied default configuration to $outPath")
resourceStream.copyTo(outputStream)
}
}
return outPath
}

View File

@ -12,6 +12,7 @@ include(
":common-plugin", ":common-plugin",
":common-heimdall", ":common-heimdall",
":foundation-core", ":foundation-core",
":foundation-shared",
":foundation-bifrost", ":foundation-bifrost",
":foundation-chaos", ":foundation-chaos",
":foundation-heimdall", ":foundation-heimdall",

View File

@ -1,10 +1,10 @@
plugins { plugins {
id("gay.pizza.foundation.concrete-library") id("gay.pizza.foundation.concrete-base")
id("com.github.johnrengelman.shadow") id("com.github.johnrengelman.shadow")
} }
dependencies { dependencies {
api(project(":common-heimdall")) implementation(project(":common-heimdall"))
implementation("com.github.ajalt.clikt:clikt:3.5.1") implementation("com.github.ajalt.clikt:clikt:3.5.1")
implementation("org.slf4j:slf4j-simple:2.0.6") implementation("org.slf4j:slf4j-simple:2.0.6")