Skip to content

Commit

Permalink
[A.0.0.1.0] 重大更新 | 配置文件更新 工作空间创建bug修复
Browse files Browse the repository at this point in the history
  • Loading branch information
TheFloodDragon committed Jul 12, 2023
1 parent 110739f commit b19c104
Show file tree
Hide file tree
Showing 13 changed files with 468 additions and 14 deletions.
1 change: 1 addition & 0 deletions buildSrc/src/main/kotlin/Dependencies.kt
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ fun RepositoryHandler.projectRepositories() {
maven(repoTabooProject) {
isAllowInsecureProtocol = true
}
maven("https://papermc.io/repo/repository/maven-public/")
mavenCentral()
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package cn.fd.utilities.common.config

import taboolib.module.configuration.Config
import taboolib.module.configuration.ConfigNode
import taboolib.module.configuration.Configuration
import tb.module.configuration.Config

object Settings {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ object WorkspaceLoader {
*/
fun loadWorkspace(path: File, create: Boolean = true) {
workspaces.add(Workspace(path))
if (create && !path.exists()) path.createNewFile()
if (create && !path.exists()) path.mkdirs()
}

/**
Expand Down
8 changes: 7 additions & 1 deletion project/module-core/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1 +1,7 @@
dependencies {}
dependencies {
installTaboo("platform-bukkit")
installTaboo("platform-bungee")
installTaboo("platform-velocity")
compileOnly("net.md-5:bungeecord-api:1.20-R0.1-SNAPSHOT")
compileOnly("com.velocitypowered:velocity-api:3.1.1")
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package cn.fd.utilities.core.api

import cn.fd.utilities.core.util.listFilesDeep
import util.listFilesDeep
import java.io.File

class Workspace(
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package tb.common.platform.service

import taboolib.common.platform.PlatformService
import java.io.File

@PlatformService
interface PlatformIO {

val pluginId: String

val pluginVersion: String

val isPrimaryThread: Boolean

fun <T> server(): T

fun info(vararg message: Any?)

fun severe(vararg message: Any?)

fun warning(vararg message: Any?)

fun releaseResourceFile(path: String, replace: Boolean = false): File

//修改部分——添加
fun releaseResourceFile(resource: String, target: String = resource, replace: Boolean = false): File

fun getJarFile(): File

fun getDataFolder(): File

fun getPlatformData(): Map<String, Any>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package tb.module.configuration

@Target(AnnotationTarget.FIELD)
@Retention(AnnotationRetention.RUNTIME)
annotation class Config(
val value: String = "config.yml",
val target: String = "sameAsValue", //修改部分——添加
val migrate: Boolean = false,
val autoReload: Boolean = false
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
package tb.module.configuration

import taboolib.common.LifeCycle
import taboolib.common.TabooLibCommon
import taboolib.common.env.RuntimeDependencies
import taboolib.common.env.RuntimeDependency
import taboolib.common.inject.ClassVisitor
import taboolib.common.platform.Awake
import taboolib.common.platform.PlatformFactory
import taboolib.common5.FileWatcher
import taboolib.library.reflex.ClassField
import taboolib.module.configuration.ConfigNodeFile
import taboolib.module.configuration.ConfigNodeLoader
import taboolib.module.configuration.Configuration
import taboolib.module.configuration.SecuredFile
import util.releaseResourceFile
import java.util.function.Supplier

@RuntimeDependencies(
RuntimeDependency(
"!org.yaml:snakeyaml:2.0",
test = "!org.yaml.snakeyaml_2_0.Yaml",
relocate = ["!org.yaml.snakeyaml", "!org.yaml.snakeyaml_2_0"]
),
RuntimeDependency("!com.typesafe:config:1.4.2", test = "!com.typesafe.config.Config"),
RuntimeDependency("!com.electronwill.night-config:core:3.6.6", test = "!com.electronwill.nightconfig.core.Config"),
RuntimeDependency(
"!com.electronwill.night-config:toml:3.6.6",
test = "!com.electronwill.nightconfig.toml.TomlFormat"
),
RuntimeDependency(
"!com.electronwill.night-config:json:3.6.6",
test = "!com.electronwill.nightconfig.json.JsonFormat"
),
RuntimeDependency(
"!com.electronwill.night-config:hocon:3.6.6",
test = "!com.electronwill.nightconfig.hocon.HoconFormat"
)
)
@Awake
class ConfigLoader : ClassVisitor(1) {

@Suppress("DEPRECATION", "KotlinConstantConditions")
override fun visit(field: ClassField, clazz: Class<*>, instance: Supplier<*>?) {
if (field.isAnnotationPresent(Config::class.java)) {
val configAnno = field.getAnnotation(Config::class.java)
val name = configAnno.property("value", "config.yml")
val target = configAnno.property("target", "config.yml") //修改部分——添加
if (files.containsKey(name)) {
field.set(instance?.get(), files[name]!!.configuration)
} else {
val file = releaseResourceFile(name, if (target == "sameAsValue") name else target) //修改部分
// 兼容模式加载
val conf =
if (field.fieldType == SecuredFile::class.java) SecuredFile.loadConfiguration(file) else Configuration.loadFromFile(
file
)
// 赋值
field.set(instance?.get(), conf)
// 自动重载
if (configAnno.property("autoReload", false) && isFileWatcherHook) {
FileWatcher.INSTANCE.addSimpleListener(file) {
if (file.exists()) {
conf.loadFromFile(file)
}
}
}
val configFile = ConfigNodeFile(conf, file)
conf.onReload {
val loader = PlatformFactory.getAPI<ConfigNodeLoader>()
configFile.nodes.forEach { loader.visit(it, clazz, instance) }
}
files[name] = configFile
// 开发模式
if (TabooLibCommon.isDevelopmentMode()) {
TabooLibCommon.print("Loaded config file: ${file.absolutePath}")
}
}
}
}

override fun getLifeCycle(): LifeCycle {
return LifeCycle.INIT
}

companion object {

val files = HashMap<String, ConfigNodeFile>()

val isFileWatcherHook by lazy {
try {
FileWatcher.INSTANCE
true
} catch (ex: NoClassDefFoundError) {
false
}
}
}
}
86 changes: 86 additions & 0 deletions project/module-core/src/main/kotlin/tb/platform/BukkitIO.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
package tb.platform

import org.bukkit.Bukkit
import taboolib.common.io.newFile
import taboolib.common.platform.Awake
import taboolib.common.platform.Platform
import taboolib.common.platform.PlatformSide
import taboolib.platform.BukkitPlugin
import tb.common.platform.service.PlatformIO
import java.io.File

/**
* TabooLib
* taboolib.platform.BukkitIO
*
* @author sky
* @since 2021/6/14 11:10 下午
*/
@Awake
@PlatformSide([Platform.BUKKIT])
class BukkitIO : PlatformIO {

val plugin: BukkitPlugin
get() = BukkitPlugin.getInstance()

override val pluginId: String
get() = plugin.description.name

override val pluginVersion: String
get() = plugin.description.version

override val isPrimaryThread: Boolean
get() = Bukkit.isPrimaryThread()

@Suppress("UNCHECKED_CAST")
override fun <T> server(): T {
return Bukkit.getServer() as T
}

override fun info(vararg message: Any?) {
message.filterNotNull().forEach { plugin.logger.info(it.toString()) }
}

override fun severe(vararg message: Any?) {
message.filterNotNull().forEach { plugin.logger.severe(it.toString()) }
}

override fun warning(vararg message: Any?) {
message.filterNotNull().forEach { plugin.logger.warning(it.toString()) }
}

override fun releaseResourceFile(path: String, replace: Boolean): File {
val file = File(getDataFolder(), path)
if (file.exists() && !replace) {
return file
}
newFile(file).writeBytes(plugin.getResource(path)?.readBytes() ?: error("resource not found: $path"))
return file
}

//修改部分——添加
override fun releaseResourceFile(resource: String, target: String, replace: Boolean): File {
val file = File(getDataFolder(), target)
if (file.exists() && !replace) {
return file
}
newFile(file).writeBytes(plugin.getResource(resource)?.readBytes() ?: error("resource not found: $resource"))
return file
}

override fun getJarFile(): File {
return BukkitPlugin.getPluginInstance()?.nativeJarFile() ?: plugin.file
}

override fun getDataFolder(): File {
return BukkitPlugin.getPluginInstance()?.nativeDataFolder() ?: plugin.dataFolder
}

override fun getPlatformData(): Map<String, Any> {
return mapOf(
"bukkitVersion" to Bukkit.getVersion(),
"bukkitName" to Bukkit.getName(),
"onlineMode" to if (Bukkit.getOnlineMode()) 1 else 0
)
}
}
99 changes: 99 additions & 0 deletions project/module-core/src/main/kotlin/tb/platform/BungeeIO.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
package tb.platform

import taboolib.common.io.newFile
import taboolib.common.platform.Awake
import taboolib.common.platform.Platform
import taboolib.common.platform.PlatformSide
import taboolib.common.util.unsafeLazy
import taboolib.platform.BungeePlugin
import tb.common.platform.service.PlatformIO
import java.io.File
import java.util.logging.Logger

/**
* TabooLib
* taboolib.platform.BungeeIO
*
* @author sky
* @since 2021/6/14 11:10 下午
*/
@Awake
@PlatformSide([Platform.BUNGEE])
class BungeeIO : PlatformIO {

val plugin by unsafeLazy { BungeePlugin.getInstance() }

private val logger: Logger
get() = try {
BungeePlugin.getInstance().logger
} catch (ex: Exception) {
Logger.getAnonymousLogger()
}

override val pluginId: String
get() = BungeePlugin.getInstance().description.name

override val pluginVersion: String
get() = BungeePlugin.getInstance().description.version

override val isPrimaryThread: Boolean
get() = true

@Suppress("UNCHECKED_CAST")
override fun <T> server(): T {
return plugin.proxy as T
}

override fun info(vararg message: Any?) {
message.filterNotNull().forEach { logger.info(it.toString()) }
}

override fun severe(vararg message: Any?) {
message.filterNotNull().forEach { logger.severe(it.toString()) }
}

override fun warning(vararg message: Any?) {
message.filterNotNull().forEach { logger.warning(it.toString()) }
}

override fun releaseResourceFile(path: String, replace: Boolean): File {
val file = File(getDataFolder(), path)
if (file.exists() && !replace) {
return file
}
newFile(file).writeBytes(
BungeePlugin.getInstance().getResourceAsStream(path)?.readBytes() ?: error("resource not found: $path")
)
return file
}

//修改部分——添加
override fun releaseResourceFile(resource: String, target: String, replace: Boolean): File {
val file = File(getDataFolder(), target)
if (file.exists() && !replace) {
return file
}
newFile(file).writeBytes(
BungeePlugin.getInstance().getResourceAsStream(resource)?.readBytes()
?: error("resource not found: $resource")
)
return file
}

override fun getJarFile(): File {
return BungeePlugin.getPluginInstance()?.nativeJarFile() ?: BungeePlugin.getInstance().file
}

override fun getDataFolder(): File {
return BungeePlugin.getPluginInstance()?.nativeDataFolder() ?: BungeePlugin.getInstance().dataFolder
}

override fun getPlatformData(): Map<String, Any> {
val proxy = BungeePlugin.getInstance().proxy
return mapOf(
"managedServers" to proxy.servers.size,
"onlineMode" to if (proxy.config.isOnlineMode) 1 else 0,
"bungeecordVersion" to proxy.version,
)
}
}
Loading

0 comments on commit b19c104

Please sign in to comment.