From 04452f05deb8fa2b7a6b3310ba4f1b4f94197190 Mon Sep 17 00:00:00 2001 From: ItsFlicker <1812496278@qq.com> Date: Sun, 21 Apr 2024 13:50:44 +0800 Subject: [PATCH] [2.1.1] Add Options --- build.gradle.kts | 2 +- gradle.properties | 2 +- .../me/arasple/mc/trchat/util/YamlUpdater.kt | 92 +++++++++++++++++++ .../me/arasple/mc/trchat/api/nms/NMS.kt | 2 +- .../me/arasple/mc/trchat/api/nms/NMSImpl.kt | 4 +- .../trchat/api/impl/BukkitComponentManager.kt | 2 +- .../mc/trchat/api/impl/BukkitProxyManager.kt | 24 +++-- .../mc/trchat/module/conf/file/Settings.kt | 8 ++ .../module/display/channel/PrivateChannel.kt | 7 +- .../trchat/module/display/format/obj/Style.kt | 10 +- .../mc/trchat/module/internal/TrChatBukkit.kt | 11 ++- .../internal/listener/ListenerAnvilChange.kt | 16 ++-- .../internal/listener/ListenerSignChange.kt | 14 +-- .../src/main/resources/settings.yml | 8 +- 14 files changed, 164 insertions(+), 38 deletions(-) create mode 100644 project/common/src/main/kotlin/me/arasple/mc/trchat/util/YamlUpdater.kt diff --git a/build.gradle.kts b/build.gradle.kts index f434ca87..ae5340b2 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -19,7 +19,7 @@ subprojects { install(BUKKIT_ALL, BUNGEE, VELOCITY) } version { - taboolib = "6.1.1-beta18" + taboolib = "6.1.1" coroutines = null } } diff --git a/gradle.properties b/gradle.properties index e1e9d7d6..f8e1000d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ group=me.arasple.mc.trchat -version=2.1.0 +version=2.1.1 kotlin.incremental=true kotlin.incremental.java=true kotlin.incremental.useClasspathSnapshot=true diff --git a/project/common/src/main/kotlin/me/arasple/mc/trchat/util/YamlUpdater.kt b/project/common/src/main/kotlin/me/arasple/mc/trchat/util/YamlUpdater.kt new file mode 100644 index 00000000..f3caf3a7 --- /dev/null +++ b/project/common/src/main/kotlin/me/arasple/mc/trchat/util/YamlUpdater.kt @@ -0,0 +1,92 @@ +package me.arasple.mc.trchat.util + +import taboolib.common.PrimitiveIO +import taboolib.common.PrimitiveSettings +import taboolib.common.platform.function.getDataFolder +import taboolib.library.configuration.ConfigurationSection +import taboolib.module.configuration.Configuration +import java.io.File + +/** + * module-starrysky + * com.mcstarrysky.starrysky.config.YamlUpdater + * + * @author 米擦亮 + * @since 2023/9/6 20:50 + */ +object YamlUpdater { + + fun update(path: String, skipNodes: Array = emptyArray(), updateExists: Boolean = true) { + // 读取 Jar 包内的对应配置文件 + val cache = Configuration.loadFromInputStream(javaClass.classLoader.getResourceAsStream(path) ?: error("resource not found: $path")) + val file = File(getDataFolder(), path) + if (!file.exists()) { + return + } + val config = Configuration.loadFromFile(file) + + val updated = mutableListOf() + read(cache, config, skipNodes, updated, updateExists) + if (updated.isNotEmpty()) { + config.saveToFile(config.file) + } + + if (PrimitiveSettings.IS_DEBUG_MODE) { + PrimitiveIO.println("Auto updated configuration: $path, with ${updated.size} elements updated.") + for (node in updated) { + PrimitiveIO.println("|- $node") + } + } + } + + private fun read(cache: ConfigurationSection, to: ConfigurationSection, skipNodes: Array, updated: MutableList, updateExists: Boolean) { + var name = cache.name + var c = cache + while (c.parent != null) { + name = "${c.parent!!.name}.$name" + c = c.parent!! + } + if (name.isNotEmpty()) { + name += '.' + } + // 遍历给定新版配置文件的所有配置项目 + for (key in cache.getKeys(false)) { + // 白名单配置项不进行任何检查 + if (key in skipNodes) continue + + // 旧版没有, 添加 + if (!to.contains(key)) { + updated += "$name$key (+)" + to[key] = cache[key] + continue + } + + // 是否不更新已存在配置, 只补全缺失项 + if (!updateExists) continue + + // 好像 switch case 不能判断为空, 我基础没学好 + if (cache[key] == null) { + updated += "$name$key (${to[key]} -> null)" + to[key] = null + continue + } + + val read = cache[key] + + if (read is ConfigurationSection) { + val write = to[key] + // 根本不是配置选区, 那肯定要覆盖掉了, 没话说了 + if (write == null || write !is ConfigurationSection) { + updated += "$name$key (${to[key]} -> $read)" + to[key] = read + continue + } + read(read, write, skipNodes, updated, true) + } else { + if (read == to[key]) continue + updated += "$name$key (${to[key]} -> $read)" + to[key] = read + } + } + } +} \ No newline at end of file diff --git a/project/module-nms/src/main/kotlin/me/arasple/mc/trchat/api/nms/NMS.kt b/project/module-nms/src/main/kotlin/me/arasple/mc/trchat/api/nms/NMS.kt index ccdcc694..b23420ac 100644 --- a/project/module-nms/src/main/kotlin/me/arasple/mc/trchat/api/nms/NMS.kt +++ b/project/module-nms/src/main/kotlin/me/arasple/mc/trchat/api/nms/NMS.kt @@ -19,7 +19,7 @@ abstract class NMS { */ abstract fun rawMessageFromCraftChatMessage(component: Any): String - abstract fun sendMessage(receiver: Player, component: ComponentText, sender: UUID?) + abstract fun sendMessage(receiver: Player, component: ComponentText, sender: UUID?, usePacket: Boolean = true) abstract fun hoverItem(component: ComponentText, itemStack: ItemStack): ComponentText diff --git a/project/module-nms/src/main/kotlin/me/arasple/mc/trchat/api/nms/NMSImpl.kt b/project/module-nms/src/main/kotlin/me/arasple/mc/trchat/api/nms/NMSImpl.kt index cfe35552..65cbb631 100644 --- a/project/module-nms/src/main/kotlin/me/arasple/mc/trchat/api/nms/NMSImpl.kt +++ b/project/module-nms/src/main/kotlin/me/arasple/mc/trchat/api/nms/NMSImpl.kt @@ -60,8 +60,8 @@ class NMSImpl : NMS() { } } - override fun sendMessage(receiver: Player, component: ComponentText, sender: UUID?) { - if (Folia.isFolia || ServerUtil.isModdedServer) { + override fun sendMessage(receiver: Player, component: ComponentText, sender: UUID?, usePacket: Boolean) { + if (!usePacket || Folia.isFolia || ServerUtil.isModdedServer) { component.sendTo(adaptPlayer(receiver)) return } diff --git a/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/api/impl/BukkitComponentManager.kt b/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/api/impl/BukkitComponentManager.kt index 8a40c526..713d8550 100644 --- a/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/api/impl/BukkitComponentManager.kt +++ b/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/api/impl/BukkitComponentManager.kt @@ -70,7 +70,7 @@ object BukkitComponentManager : ComponentManager { event.message } if (commandSender is Player) { - NMS.instance.sendMessage(commandSender, newComponent, event.sender) + NMS.instance.sendMessage(commandSender, newComponent, event.sender, Settings.usePackets) } else { newComponent.sendTo(adaptCommandSender(commandSender)) } diff --git a/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/api/impl/BukkitProxyManager.kt b/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/api/impl/BukkitProxyManager.kt index a2b057e9..cf7e6f2c 100644 --- a/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/api/impl/BukkitProxyManager.kt +++ b/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/api/impl/BukkitProxyManager.kt @@ -8,6 +8,7 @@ import me.arasple.mc.trchat.module.internal.proxy.BukkitProxyProcessor import me.arasple.mc.trchat.module.internal.proxy.redis.RedisManager import me.arasple.mc.trchat.util.parseString import org.bukkit.Bukkit +import org.bukkit.ChatColor import org.bukkit.plugin.messaging.PluginMessageRecipient import org.spigotmc.SpigotConfig import taboolib.common.platform.Platform @@ -38,12 +39,14 @@ object BukkitProxyManager : ClientMessageManager { override var port = 25565 var allPlayerNames = mapOf() - get() = if (mode != ProxyMode.REDIS) { - field - } else { + get() = if (mode == ProxyMode.NONE) { + onlinePlayers.associate { it.name to ChatColor.stripColor(it.displayName) } + } else if (mode == ProxyMode.REDIS) { val result = mutableMapOf() (processor as BukkitProxyProcessor.RedisSide).allNames.values.forEach { result += it } result + } else { + field } init { @@ -108,21 +111,24 @@ object BukkitProxyManager : ClientMessageManager { } override fun getPlayerNames(): Map { - if (mode == ProxyMode.NONE) { - return onlinePlayers.associate { it.name to it.displayName } - } return allPlayerNames } + fun getPlayerNamesMerged(): Set { + return allPlayerNames.let { it.keys + it.values.filterNotNull() } + } + override fun getExactName(name: String): String? { var player = Bukkit.getPlayerExact(name) if (player == null) { - player = Bukkit.getOnlinePlayers().firstOrNull { it.displayName == name } + player = Bukkit.getOnlinePlayers().firstOrNull { ChatColor.stripColor(it.displayName) == name } } return if (player != null && player.isOnline) { player.name } else { - getPlayerNames().keys.firstOrNull { it.equals(name, ignoreCase = true) } + getPlayerNames().entries.firstOrNull { + it.key.equals(name, ignoreCase = true) || it.value?.equals(name, ignoreCase = true) == true + }?.key } } @@ -161,7 +167,7 @@ object BukkitProxyManager : ClientMessageManager { fun updateNames() { sendMessage(onlinePlayers.firstOrNull(), arrayOf( "UpdateNames", - onlinePlayers.joinToString(",") { it.name + "-" + it.displayName }, + onlinePlayers.joinToString(",") { it.name + "-" + ChatColor.stripColor(it.displayName) }, port.toString() )) } diff --git a/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/conf/file/Settings.kt b/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/conf/file/Settings.kt index b9c60cb5..e1ac3e59 100644 --- a/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/conf/file/Settings.kt +++ b/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/conf/file/Settings.kt @@ -24,6 +24,10 @@ object Settings { lateinit var conf: Configuration private set + @ConfigNode("Options.Use-Packets", "settings.yml") + var usePackets = true + private set + @ConfigNode("Channel.Default", "settings.yml") var defaultChannel = "Normal" private set @@ -43,6 +47,10 @@ object Settings { var componentMaxLength = 32700 private set + @ConfigNode("Simple-Component.Hover", "settings.yml") + var simpleHover = false + private set + @Awake(LifeCycle.ENABLE) fun init() { conf.onReload { diff --git a/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/display/channel/PrivateChannel.kt b/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/display/channel/PrivateChannel.kt index cc548927..f5c4dd01 100644 --- a/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/display/channel/PrivateChannel.kt +++ b/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/display/channel/PrivateChannel.kt @@ -70,12 +70,7 @@ class PrivateChannel( } dynamic("player", optional = true) { suggest { - BukkitProxyManager.getPlayerNames().flatMap { (key, value) -> - if (key !in PlayerData.vanishing) { - if (value == null || key == value) listOf(key) else listOf(key, value) - } - else emptyList() - } + BukkitProxyManager.getPlayerNamesMerged().filter { it !in PlayerData.vanishing } } execute { sender, _, argument -> sender.session.lastPrivateTo = BukkitProxyManager.getExactName(argument) diff --git a/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/display/format/obj/Style.kt b/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/display/format/obj/Style.kt index 4fbb2e12..bce065a3 100644 --- a/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/display/format/obj/Style.kt +++ b/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/display/format/obj/Style.kt @@ -1,8 +1,10 @@ package me.arasple.mc.trchat.module.display.format.obj +import me.arasple.mc.trchat.module.conf.file.Settings import me.arasple.mc.trchat.module.internal.script.Condition import me.arasple.mc.trchat.util.color.colorify import me.arasple.mc.trchat.util.parseInline +import me.arasple.mc.trchat.util.parseSimple import me.arasple.mc.trchat.util.pass import me.arasple.mc.trchat.util.setPlaceholders import org.bukkit.command.CommandSender @@ -31,7 +33,11 @@ sealed interface Style { data class Text(override val contents: List>) : Hover { override fun process(component: ComponentText, content: String) { - component.hoverText(content) + if (Settings.simpleHover) { + component.hoverText(content.parseSimple()) + } else { + component.hoverText(content.colorify()) + } } } @@ -90,7 +96,7 @@ sealed interface Style { } is Hover.Text -> { contents.filter { it.second.pass(sender) }.joinToString("\n") { it.first } - .parseInline(sender).setPlaceholders(sender).replaceWithOrder(*vars).colorify() + .parseInline(sender).setPlaceholders(sender).replaceWithOrder(*vars) } else -> { contents.firstOrNull { it.second.pass(sender) }?.first diff --git a/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/internal/TrChatBukkit.kt b/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/internal/TrChatBukkit.kt index 11751346..4ee08026 100644 --- a/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/internal/TrChatBukkit.kt +++ b/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/internal/TrChatBukkit.kt @@ -28,7 +28,6 @@ object TrChatBukkit : Plugin() { var isGlobalMuting = false - @Awake(LifeCycle.CONST) internal fun detectPaperEnv() { try { // Paper 1.16.5+ @@ -40,12 +39,20 @@ object TrChatBukkit : Plugin() { } } + @Awake(LifeCycle.CONST) + internal fun onConst() { + detectPaperEnv() +// registerLifeCycleTask(LifeCycle.INIT, 0) { +// YamlUpdater.update("settings.yml", updateExists = false) +// } + } + override fun onLoad() { console().sendLang("Plugin-Loading", Bukkit.getBukkitVersion()) } override fun onEnable() { - if (Folia.isFolia) { + if (!Settings.usePackets || Folia.isFolia) { disablePacketListener() } BukkitProxyManager.processor diff --git a/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/internal/listener/ListenerAnvilChange.kt b/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/internal/listener/ListenerAnvilChange.kt index 42eb1e0d..076b0c78 100644 --- a/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/internal/listener/ListenerAnvilChange.kt +++ b/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/internal/listener/ListenerAnvilChange.kt @@ -1,6 +1,8 @@ package me.arasple.mc.trchat.module.internal.listener import me.arasple.mc.trchat.TrChat +import me.arasple.mc.trchat.module.adventure.toAdventure +import me.arasple.mc.trchat.module.internal.TrChatBukkit import me.arasple.mc.trchat.util.color.MessageColors import me.arasple.mc.trchat.util.parseSimple import org.bukkit.event.inventory.InventoryType @@ -30,6 +32,10 @@ object ListenerAnvilChange { var color = true private set + @ConfigNode("Simple-Component.Anvil", "settings.yml") + var simple = false + private set + @Suppress("Deprecation") @SubscribeEvent(priority = EventPriority.HIGHEST, ignoreCancelled = true) fun onAnvilCraft(e: PrepareAnvilEvent) { @@ -46,12 +52,10 @@ object ListenerAnvilChange { if (filter) { setDisplayName(TrChat.api().getFilterManager().filter(displayName, adaptPlayer(p)).filtered) } - if (color) { - if (p.hasPermission("trchat.color.simple")) { - setDisplayNameComponent(arrayOf(displayName.parseSimple().toSpigotObject())) - } else { - setDisplayName(MessageColors.replaceWithPermission(p, displayName, MessageColors.Type.ANVIL)) - } + if (simple && TrChatBukkit.isPaperEnv && p.hasPermission("trchat.simple.anvil")) { + displayName(displayName.parseSimple().toAdventure()) + } else if (color) { + setDisplayName(MessageColors.replaceWithPermission(p, displayName, MessageColors.Type.ANVIL)) } } e.result = result diff --git a/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/internal/listener/ListenerSignChange.kt b/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/internal/listener/ListenerSignChange.kt index db3c1097..b2abb3d9 100644 --- a/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/internal/listener/ListenerSignChange.kt +++ b/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/internal/listener/ListenerSignChange.kt @@ -28,6 +28,10 @@ object ListenerSignChange { var color = true private set + @ConfigNode("Simple-Component.Sign", "settings.yml") + var simple = false + private set + @Suppress("Deprecation") @SubscribeEvent(priority = EventPriority.HIGHEST, ignoreCancelled = true) fun onSignChange(e: SignChangeEvent) { @@ -37,12 +41,10 @@ object ListenerSignChange { if (filter) { e.setLine(index, TrChat.api().getFilterManager().filter(e.getLine(index) ?: "", adaptPlayer(p)).filtered) } - if (color) { - if (TrChatBukkit.isPaperEnv && p.hasPermission("trchat.color.simple")) { - e.line(index, (e.getLine(index) ?: "").parseSimple().toAdventure()) - } else { - e.setLine(index, MessageColors.replaceWithPermission(p, e.getLine(index) ?: "", MessageColors.Type.SIGN)) - } + if (simple && TrChatBukkit.isPaperEnv && p.hasPermission("trchat.simple.sign")) { + e.line(index, (e.getLine(index) ?: "").parseSimple().toAdventure()) + } else if (color) { + e.setLine(index, MessageColors.replaceWithPermission(p, e.getLine(index) ?: "", MessageColors.Type.SIGN)) } } } diff --git a/project/runtime-bukkit/src/main/resources/settings.yml b/project/runtime-bukkit/src/main/resources/settings.yml index 7d163f43..d614de80 100644 --- a/project/runtime-bukkit/src/main/resources/settings.yml +++ b/project/runtime-bukkit/src/main/resources/settings.yml @@ -9,6 +9,7 @@ Options: Component-Max-Length: 32700 Always-Cancel-Chat-Event: false Cheat-Client-Secure-Chat: true + Use-Packets: true Disabled-Commands: [] Channel: @@ -42,4 +43,9 @@ Color: Chat: true Sign: true Anvil: true - Book: true \ No newline at end of file + Book: true + +Simple-Component: + Hover: false + Anvil: false + Sign: false \ No newline at end of file