From e8b21db8d3b968ec326999cce83e99fc5ce29a63 Mon Sep 17 00:00:00 2001 From: Rollczi Date: Sat, 14 Oct 2023 23:06:39 +0200 Subject: [PATCH 01/10] Remove spigot support. --- .../main/kotlin/eternalcode.java.gradle.kts | 10 - {core => chatformatter-core}/build.gradle.kts | 20 +- .../formatter/ChatFormatterApi.java | 6 +- .../formatter/ChatFormatterApiProvider.java | 23 ++ .../formatter/ChatFormatterCommand.java | 0 .../formatter/ChatFormatterPlugin.java | 103 +++++++++ .../eternalcode/formatter/ChatHandler.java | 9 + .../formatter/ChatHandlerImpl.java | 102 +++----- .../eternalcode/formatter/ChatMessage.java | 7 + .../formatter/ChatRenderedMessage.java | 6 + .../eternalcode/formatter/ChatSettings.java | 2 - .../adventure/PlayerSignedMessage.java | 0 .../adventure/TextColorTagResolver.java | 0 .../formatter/config/ConfigManager.java | 0 .../formatter/config/PluginConfig.java | 14 +- .../formatter/config/TemplateComposer.java | 0 .../eternalcode/formatter/legacy/Legacy.java | 12 - .../legacy/LegacyPostMessageProcessor.java | 0 .../formatter/legacy/LegacyPostProcessor.java | 0 .../formatter/legacy/LegacyPreProcessor.java | 0 .../formatter/placeholder/Placeholder.java | 0 .../placeholder}/PlaceholderAPIStack.java | 2 +- .../placeholder/PlaceholderRegistry.java | 0 .../placeholder/PlaceholderStack.java | 0 .../placeholder/PlayerPlaceholder.java | 0 .../placeholder/PlayerPlaceholderStack.java | 0 .../formatter/rank}/ChatRankProvider.java | 2 +- .../formatter/rank}/VaultRankProvider.java | 4 +- .../formatter/template/Template.java | 0 .../template/TemplateRepository.java | 0 .../formatter/template/TemplateService.java | 0 .../formatter/updater/UpdaterController.java | 0 .../formatter/updater/UpdaterService.java | 0 .../formatter/legacy/LegacyTest.java | 0 .../formatter/template/TemplateTest.java | 0 chatformatter-paper-plugin/build.gradle.kts | 119 ++++++++++ .../paper/ChatFormatterPaperPlugin.java | 36 +++ .../paper/PaperChatEventExecutor.java | 38 +++ config/checkstyle/checkstyle.xml | 217 ------------------ config/checkstyle/suppressions.xml | 6 - .../formatter/ChatFormatterPlugin.java | 108 --------- .../formatter/ChatFormatterProvider.java | 23 -- .../preparatory/ChatPreparatory.java | 21 -- .../preparatory/ChatPreparatoryService.java | 30 --- .../preparatory/ChatPrepareResult.java | 32 --- paper-multi-version-support/build.gradle.kts | 7 - .../LegacyChatComposerProvider.java | 24 -- .../LegacyChatFormatterProvider.java | 24 -- .../LegacyDependencyProvider.java | 9 - .../ModernChatRendererProvider.java | 24 -- paper-support/build.gradle.kts | 36 --- .../ChatFormatterPaperSupportPlugin.java | 18 -- .../formatter/paper/ChatPaperPreparatory.java | 58 ----- .../paper/adventure/PaperSignedMessage.java | 60 ----- .../adventure/PaperSignedMessageProvider.java | 29 --- .../paper/injector/DependencyContainer.java | 35 --- .../paper/injector/DependencyInjector.java | 89 ------- settings.gradle.kts | 5 +- 58 files changed, 383 insertions(+), 987 deletions(-) rename {core => chatformatter-core}/build.gradle.kts (81%) rename core/src/main/java/com/eternalcode/formatter/ChatFormatter.java => chatformatter-core/src/main/java/com/eternalcode/formatter/ChatFormatterApi.java (65%) create mode 100644 chatformatter-core/src/main/java/com/eternalcode/formatter/ChatFormatterApiProvider.java rename {core => chatformatter-core}/src/main/java/com/eternalcode/formatter/ChatFormatterCommand.java (100%) create mode 100644 chatformatter-core/src/main/java/com/eternalcode/formatter/ChatFormatterPlugin.java create mode 100644 chatformatter-core/src/main/java/com/eternalcode/formatter/ChatHandler.java rename core/src/main/java/com/eternalcode/formatter/ChatController.java => chatformatter-core/src/main/java/com/eternalcode/formatter/ChatHandlerImpl.java (59%) create mode 100644 chatformatter-core/src/main/java/com/eternalcode/formatter/ChatMessage.java create mode 100644 chatformatter-core/src/main/java/com/eternalcode/formatter/ChatRenderedMessage.java rename {core => chatformatter-core}/src/main/java/com/eternalcode/formatter/ChatSettings.java (81%) rename {core => chatformatter-core}/src/main/java/com/eternalcode/formatter/adventure/PlayerSignedMessage.java (100%) rename {core => chatformatter-core}/src/main/java/com/eternalcode/formatter/adventure/TextColorTagResolver.java (100%) rename {core => chatformatter-core}/src/main/java/com/eternalcode/formatter/config/ConfigManager.java (100%) rename {core => chatformatter-core}/src/main/java/com/eternalcode/formatter/config/PluginConfig.java (89%) rename {core => chatformatter-core}/src/main/java/com/eternalcode/formatter/config/TemplateComposer.java (100%) rename {core => chatformatter-core}/src/main/java/com/eternalcode/formatter/legacy/Legacy.java (87%) rename {core => chatformatter-core}/src/main/java/com/eternalcode/formatter/legacy/LegacyPostMessageProcessor.java (100%) rename {core => chatformatter-core}/src/main/java/com/eternalcode/formatter/legacy/LegacyPostProcessor.java (100%) rename {core => chatformatter-core}/src/main/java/com/eternalcode/formatter/legacy/LegacyPreProcessor.java (100%) rename {core => chatformatter-core}/src/main/java/com/eternalcode/formatter/placeholder/Placeholder.java (100%) rename {core/src/main/java/com/eternalcode/formatter/hook => chatformatter-core/src/main/java/com/eternalcode/formatter/placeholder}/PlaceholderAPIStack.java (88%) rename {core => chatformatter-core}/src/main/java/com/eternalcode/formatter/placeholder/PlaceholderRegistry.java (100%) rename {core => chatformatter-core}/src/main/java/com/eternalcode/formatter/placeholder/PlaceholderStack.java (100%) rename {core => chatformatter-core}/src/main/java/com/eternalcode/formatter/placeholder/PlayerPlaceholder.java (100%) rename {core => chatformatter-core}/src/main/java/com/eternalcode/formatter/placeholder/PlayerPlaceholderStack.java (100%) rename {core/src/main/java/com/eternalcode/formatter => chatformatter-core/src/main/java/com/eternalcode/formatter/rank}/ChatRankProvider.java (73%) rename {core/src/main/java/com/eternalcode/formatter/hook => chatformatter-core/src/main/java/com/eternalcode/formatter/rank}/VaultRankProvider.java (88%) rename {core => chatformatter-core}/src/main/java/com/eternalcode/formatter/template/Template.java (100%) rename {core => chatformatter-core}/src/main/java/com/eternalcode/formatter/template/TemplateRepository.java (100%) rename {core => chatformatter-core}/src/main/java/com/eternalcode/formatter/template/TemplateService.java (100%) rename {core => chatformatter-core}/src/main/java/com/eternalcode/formatter/updater/UpdaterController.java (100%) rename {core => chatformatter-core}/src/main/java/com/eternalcode/formatter/updater/UpdaterService.java (100%) rename {core => chatformatter-core}/src/test/java/com/eternalcode/formatter/legacy/LegacyTest.java (100%) rename {core => chatformatter-core}/src/test/java/com/eternalcode/formatter/template/TemplateTest.java (100%) create mode 100644 chatformatter-paper-plugin/build.gradle.kts create mode 100644 chatformatter-paper-plugin/src/main/java/com/eternalcode/formatter/paper/ChatFormatterPaperPlugin.java create mode 100644 chatformatter-paper-plugin/src/main/java/com/eternalcode/formatter/paper/PaperChatEventExecutor.java delete mode 100644 config/checkstyle/checkstyle.xml delete mode 100644 config/checkstyle/suppressions.xml delete mode 100644 core/src/main/java/com/eternalcode/formatter/ChatFormatterPlugin.java delete mode 100644 core/src/main/java/com/eternalcode/formatter/ChatFormatterProvider.java delete mode 100644 core/src/main/java/com/eternalcode/formatter/preparatory/ChatPreparatory.java delete mode 100644 core/src/main/java/com/eternalcode/formatter/preparatory/ChatPreparatoryService.java delete mode 100644 core/src/main/java/com/eternalcode/formatter/preparatory/ChatPrepareResult.java delete mode 100644 paper-multi-version-support/build.gradle.kts delete mode 100644 paper-multi-version-support/src/main/java/com/eternalcode/paper/multiversion/LegacyChatComposerProvider.java delete mode 100644 paper-multi-version-support/src/main/java/com/eternalcode/paper/multiversion/LegacyChatFormatterProvider.java delete mode 100644 paper-multi-version-support/src/main/java/com/eternalcode/paper/multiversion/LegacyDependencyProvider.java delete mode 100644 paper-multi-version-support/src/main/java/com/eternalcode/paper/multiversion/ModernChatRendererProvider.java delete mode 100644 paper-support/build.gradle.kts delete mode 100644 paper-support/src/main/java/com/eternalcode/formatter/paper/ChatFormatterPaperSupportPlugin.java delete mode 100644 paper-support/src/main/java/com/eternalcode/formatter/paper/ChatPaperPreparatory.java delete mode 100644 paper-support/src/main/java/com/eternalcode/formatter/paper/adventure/PaperSignedMessage.java delete mode 100644 paper-support/src/main/java/com/eternalcode/formatter/paper/adventure/PaperSignedMessageProvider.java delete mode 100644 paper-support/src/main/java/com/eternalcode/formatter/paper/injector/DependencyContainer.java delete mode 100644 paper-support/src/main/java/com/eternalcode/formatter/paper/injector/DependencyInjector.java diff --git a/buildSrc/src/main/kotlin/eternalcode.java.gradle.kts b/buildSrc/src/main/kotlin/eternalcode.java.gradle.kts index a3580b9..1c919aa 100644 --- a/buildSrc/src/main/kotlin/eternalcode.java.gradle.kts +++ b/buildSrc/src/main/kotlin/eternalcode.java.gradle.kts @@ -1,20 +1,10 @@ plugins { `java-library` - checkstyle } group = "com.eternalcode" version = "1.0.7" -checkstyle { - toolVersion = "10.12.3" - - configFile = file("${rootDir}/config/checkstyle/checkstyle.xml") - - maxErrors = 0 - maxWarnings = 0 -} - repositories { mavenCentral() maven { url = uri("https://hub.spigotmc.org/nexus/content/repositories/snapshots/") } diff --git a/core/build.gradle.kts b/chatformatter-core/build.gradle.kts similarity index 81% rename from core/build.gradle.kts rename to chatformatter-core/build.gradle.kts index d556d05..6a6dc20 100644 --- a/core/build.gradle.kts +++ b/chatformatter-core/build.gradle.kts @@ -2,20 +2,7 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar plugins { id("eternalcode.java") - id("com.github.johnrengelman.shadow") - id("net.minecrell.plugin-yml.bukkit") - id("xyz.jpenilla.run-paper") version "2.2.0" -} - -bukkit { - main = "com.eternalcode.formatter.ChatFormatterPlugin" - apiVersion = "1.19" - prefix = "ChatFormatter" - author = "EternalCodeTeam" - name = "ChatFormatter" - version = "${project.version}" - depend = listOf("PlaceholderAPI", "Vault") } dependencies { @@ -56,16 +43,12 @@ dependencies { } tasks { - runServer { - minecraftVersion("1.19.3") - } - withType { useJUnitPlatform() } withType { - archiveFileName.set("ChatFormatter v${project.version}.jar") + archiveFileName.set("chatformatter-core-${version}.jar") exclude( "org/intellij/lang/annotations/**", @@ -78,6 +61,7 @@ tasks { val prefix = "com.eternalcode.formatter.libs" listOf( + "com.eternalcode.gitcheck", "net.dzikoysk", "dev.rollczi", "panda", diff --git a/core/src/main/java/com/eternalcode/formatter/ChatFormatter.java b/chatformatter-core/src/main/java/com/eternalcode/formatter/ChatFormatterApi.java similarity index 65% rename from core/src/main/java/com/eternalcode/formatter/ChatFormatter.java rename to chatformatter-core/src/main/java/com/eternalcode/formatter/ChatFormatterApi.java index 1477c5a..806ff2a 100644 --- a/core/src/main/java/com/eternalcode/formatter/ChatFormatter.java +++ b/chatformatter-core/src/main/java/com/eternalcode/formatter/ChatFormatterApi.java @@ -1,10 +1,10 @@ package com.eternalcode.formatter; +import com.eternalcode.formatter.rank.ChatRankProvider; import com.eternalcode.formatter.template.TemplateService; import com.eternalcode.formatter.placeholder.PlaceholderRegistry; -import com.eternalcode.formatter.preparatory.ChatPreparatoryService; -public interface ChatFormatter { +public interface ChatFormatterApi { PlaceholderRegistry getPlaceholderRegistry(); @@ -12,6 +12,6 @@ public interface ChatFormatter { ChatRankProvider getRankProvider(); - ChatPreparatoryService getChatPreparatoryService(); + ChatHandler getChatHandler(); } diff --git a/chatformatter-core/src/main/java/com/eternalcode/formatter/ChatFormatterApiProvider.java b/chatformatter-core/src/main/java/com/eternalcode/formatter/ChatFormatterApiProvider.java new file mode 100644 index 0000000..ce4079f --- /dev/null +++ b/chatformatter-core/src/main/java/com/eternalcode/formatter/ChatFormatterApiProvider.java @@ -0,0 +1,23 @@ +package com.eternalcode.formatter; + +public final class ChatFormatterApiProvider { + + private static ChatFormatterApi chatFormatterAPI; + + static void enable(ChatFormatterApi chatFormatterAPI) { + ChatFormatterApiProvider.chatFormatterAPI = chatFormatterAPI; + } + + static void disable() { + ChatFormatterApiProvider.chatFormatterAPI = null; + } + + public static ChatFormatterApi get() { + if (chatFormatterAPI == null) { + throw new IllegalStateException(); + } + + return chatFormatterAPI; + } + +} diff --git a/core/src/main/java/com/eternalcode/formatter/ChatFormatterCommand.java b/chatformatter-core/src/main/java/com/eternalcode/formatter/ChatFormatterCommand.java similarity index 100% rename from core/src/main/java/com/eternalcode/formatter/ChatFormatterCommand.java rename to chatformatter-core/src/main/java/com/eternalcode/formatter/ChatFormatterCommand.java diff --git a/chatformatter-core/src/main/java/com/eternalcode/formatter/ChatFormatterPlugin.java b/chatformatter-core/src/main/java/com/eternalcode/formatter/ChatFormatterPlugin.java new file mode 100644 index 0000000..297d401 --- /dev/null +++ b/chatformatter-core/src/main/java/com/eternalcode/formatter/ChatFormatterPlugin.java @@ -0,0 +1,103 @@ +package com.eternalcode.formatter; + +import com.eternalcode.formatter.config.ConfigManager; +import com.eternalcode.formatter.config.PluginConfig; +import com.eternalcode.formatter.legacy.LegacyPostProcessor; +import com.eternalcode.formatter.legacy.LegacyPreProcessor; +import com.eternalcode.formatter.placeholder.PlaceholderAPIStack; +import com.eternalcode.formatter.rank.VaultRankProvider; +import com.eternalcode.formatter.rank.ChatRankProvider; +import com.eternalcode.formatter.template.TemplateService; +import com.eternalcode.formatter.placeholder.PlaceholderRegistry; +import com.eternalcode.formatter.updater.UpdaterController; +import com.eternalcode.formatter.updater.UpdaterService; +import com.google.common.base.Stopwatch; +import dev.rollczi.litecommands.LiteCommands; +import dev.rollczi.litecommands.bukkit.LiteBukkitFactory; +import net.kyori.adventure.platform.AudienceProvider; +import net.kyori.adventure.platform.bukkit.BukkitAudiences; +import net.kyori.adventure.text.minimessage.MiniMessage; +import org.bstats.bukkit.Metrics; +import org.bukkit.Server; +import org.bukkit.command.CommandSender; +import org.bukkit.plugin.Plugin; +import org.bukkit.plugin.java.JavaPlugin; + +import java.util.List; +import java.util.concurrent.TimeUnit; + +public class ChatFormatterPlugin implements ChatFormatterApi { + + private final PlaceholderRegistry placeholderRegistry; + private final TemplateService templateService; + private final ChatRankProvider rankProvider; + private final ChatHandler chatHandler; + + private final LiteCommands liteCommands; + + public ChatFormatterPlugin(Plugin plugin) { + Server server = plugin.getServer(); + Stopwatch stopwatch = Stopwatch.createStarted(); + + ConfigManager configManager = new ConfigManager(plugin.getDataFolder()); + configManager.loadAndRenderConfigs(); + + PluginConfig pluginConfig = configManager.getPluginConfig(); + + this.placeholderRegistry = new PlaceholderRegistry(); + this.placeholderRegistry.stack(pluginConfig); + this.placeholderRegistry.playerStack(new PlaceholderAPIStack()); + this.templateService = new TemplateService(pluginConfig); + this.rankProvider = new VaultRankProvider(server); + UpdaterService updaterService = new UpdaterService(plugin.getDescription()); + + AudienceProvider audienceProvider = BukkitAudiences.create(plugin); + MiniMessage miniMessage = MiniMessage.builder() + .preProcessor(new LegacyPreProcessor()) + .postProcessor(new LegacyPostProcessor()) + .build(); + + this.liteCommands = LiteBukkitFactory.builder(server, "chat-formatter") + .commandInstance(new ChatFormatterCommand(configManager, audienceProvider, miniMessage)) + .register(); + + // bStats metrics + new Metrics((JavaPlugin) plugin, 15199); + + this.chatHandler = new ChatHandlerImpl(miniMessage, pluginConfig, this.rankProvider, this.placeholderRegistry, this.templateService); + + List.of( + new UpdaterController(updaterService, pluginConfig, audienceProvider, miniMessage) + ).forEach(listener -> server.getPluginManager().registerEvents(listener, plugin)); + + ChatFormatterApiProvider.enable(this); + + plugin.getLogger().info("Plugin enabled in " + stopwatch.elapsed(TimeUnit.MILLISECONDS) + "ms"); + } + + public void close() { + ChatFormatterApiProvider.disable(); + this.liteCommands.getPlatform().unregisterAll(); + } + + @Override + public PlaceholderRegistry getPlaceholderRegistry() { + return this.placeholderRegistry; + } + + @Override + public TemplateService getTemplateService() { + return this.templateService; + } + + @Override + public ChatRankProvider getRankProvider() { + return this.rankProvider; + } + + @Override + public ChatHandler getChatHandler() { + return this.chatHandler; + } + +} diff --git a/chatformatter-core/src/main/java/com/eternalcode/formatter/ChatHandler.java b/chatformatter-core/src/main/java/com/eternalcode/formatter/ChatHandler.java new file mode 100644 index 0000000..5e9d40a --- /dev/null +++ b/chatformatter-core/src/main/java/com/eternalcode/formatter/ChatHandler.java @@ -0,0 +1,9 @@ +package com.eternalcode.formatter; + +import org.bukkit.event.Listener; + +public interface ChatHandler extends Listener { + + ChatRenderedMessage process(ChatMessage message); + +} diff --git a/core/src/main/java/com/eternalcode/formatter/ChatController.java b/chatformatter-core/src/main/java/com/eternalcode/formatter/ChatHandlerImpl.java similarity index 59% rename from core/src/main/java/com/eternalcode/formatter/ChatController.java rename to chatformatter-core/src/main/java/com/eternalcode/formatter/ChatHandlerImpl.java index eba6d6a..6828d09 100644 --- a/core/src/main/java/com/eternalcode/formatter/ChatController.java +++ b/chatformatter-core/src/main/java/com/eternalcode/formatter/ChatHandlerImpl.java @@ -4,16 +4,10 @@ import com.eternalcode.formatter.legacy.Legacy; import com.eternalcode.formatter.legacy.LegacyPostMessageProcessor; import com.eternalcode.formatter.legacy.LegacyPreProcessor; +import com.eternalcode.formatter.rank.ChatRankProvider; import com.eternalcode.formatter.template.TemplateService; import com.eternalcode.formatter.placeholder.PlaceholderRegistry; -import com.eternalcode.formatter.preparatory.ChatPreparatoryService; -import com.eternalcode.formatter.preparatory.ChatPrepareResult; -import com.eternalcode.formatter.adventure.PlayerSignedMessage; import com.google.common.collect.ImmutableMap; -import net.kyori.adventure.audience.Audience; -import net.kyori.adventure.chat.ChatType; -import net.kyori.adventure.identity.Identity; -import net.kyori.adventure.platform.AudienceProvider; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextDecoration; @@ -23,17 +17,12 @@ import net.kyori.adventure.text.minimessage.tag.standard.StandardTags; import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.player.AsyncPlayerChatEvent; import java.util.ArrayList; import java.util.List; import java.util.Map; -import java.util.Set; -class ChatController implements Listener { +class ChatHandlerImpl implements ChatHandler { private static final String PERMISSION_ALL = "chatformatter.*"; private static final String PERMISSION_LEGACY = "chatformatter.legacycolor"; @@ -81,95 +70,62 @@ class ChatController implements Listener { .postProcessor(new LegacyPostMessageProcessor()) .build(); - private final AudienceProvider audienceProvider; private final MiniMessage miniMessage; private final ChatSettings settings; private final ChatRankProvider rankProvider; private final PlaceholderRegistry placeholderRegistry; private final TemplateService templateService; - private final ChatPreparatoryService preparatoryService; - ChatController(AudienceProvider audienceProvider, MiniMessage miniMessage, ChatSettings settings, ChatRankProvider rankProvider, PlaceholderRegistry placeholderRegistry, TemplateService templateService, ChatPreparatoryService preparatoryService) { - this.audienceProvider = audienceProvider; + ChatHandlerImpl(MiniMessage miniMessage, ChatSettings settings, ChatRankProvider rankProvider, PlaceholderRegistry placeholderRegistry, TemplateService templateService) { this.miniMessage = miniMessage; this.settings = settings; this.rankProvider = rankProvider; this.placeholderRegistry = placeholderRegistry; this.templateService = templateService; - this.preparatoryService = preparatoryService; } - @EventHandler(priority = EventPriority.LOWEST) - void onPreChat(AsyncPlayerChatEvent event) { - if (!this.settings.isPreFormatting()) { - return; - } - - String rank = this.rankProvider.getRank(event.getPlayer()); - String raw = this.settings.getRawFormat(rank); - String format = Legacy.toBukkitFormat(raw); - - event.setFormat(format); - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - void onChat(AsyncPlayerChatEvent event) { - event.setCancelled(true); - - Player player = event.getPlayer(); - Identity identity = Identity.identity(player.getUniqueId()); - - String message = this.settings.isPreFormatting() - ? Legacy.toAdventureFormat(event.getFormat()) - : this.settings.getRawFormat(this.rankProvider.getRank(player)); - - message = this.templateService.applyTemplates(message); - message = this.placeholderRegistry.format(message, player); + @Override + public ChatRenderedMessage process(ChatMessage chatMessage) { + Player sender = chatMessage.sender(); - Component messageComponent = this.miniMessage.deserialize(message, this.createTagResolvers(event)); + String format = this.settings.getRawFormat(this.rankProvider.getRank(sender)); - Set recipients = event.getRecipients(); + format = this.templateService.applyTemplates(format); + format = this.placeholderRegistry.format(format, sender); - if (!this.preparatoryService.isEmpty()) { - ChatPrepareResult result = this.preparatoryService.prepare(player, recipients, GSON.serialize(messageComponent), event.getMessage()); + Component renderedMessage = this.miniMessage.deserialize(format, this.createTags(chatMessage)); - if (result.isCancelled()) { - return; - } - - messageComponent = GSON.deserialize(result.getRawMessage()); - recipients = result.getReceivers(); - } + return new ChatRenderedMessage(sender, GSON.serialize(renderedMessage)); + } - PlayerSignedMessage signedMessage = new PlayerSignedMessage(messageComponent, identity); - ChatType.Bound chatType = ChatType.CHAT.bind(Component.text("chat")); + private TagResolver createTags(ChatMessage chatMessage) { + Player sender = chatMessage.sender(); - for (Player recipient : recipients) { - Audience recipientAudience = this.audienceProvider.player(recipient.getUniqueId()); + Component message = GSON.deserialize(chatMessage.jsonMessage()); + String messageString = MESSAGE_DESERIALIZER.serialize(message); - recipientAudience.sendMessage(signedMessage, chatType); - } + TagResolver.Single displayNamePlaceholder = displayNamePlaceholder(sender); + TagResolver.Single messagePlaceholder = messagePlaceholder(sender, messageString); - this.audienceProvider.console().sendMessage(signedMessage, chatType); + return TagResolver.resolver(displayNamePlaceholder, messagePlaceholder); } - private TagResolver createTagResolvers(AsyncPlayerChatEvent event) { - String message = event.getMessage(); - Player player = event.getPlayer(); + private TagResolver.Single displayNamePlaceholder(Player sender) { + return Placeholder.parsed("displayname", Legacy.clearSection(sender.getDisplayName())); + } - TagResolver.Single displayNamePlaceholder = Placeholder.parsed("displayname", Legacy.clearSection(event.getPlayer().getDisplayName())); + private TagResolver.Single messagePlaceholder(Player sender, String messageString) { + String safeMessage = sender.hasPermission(PERMISSION_LEGACY) + ? messageString + : Legacy.ampersandToPlaceholder(messageString); - String safeMessage = player.hasPermission(PERMISSION_LEGACY) - ? message - : Legacy.ampersandToPlaceholder(message); - Component componentMessage = MESSAGE_DESERIALIZER.deserialize(safeMessage, this.messageResolver(player)); - TagResolver.Single messagePlaceholder = Placeholder.component("message", componentMessage); + Component componentMessage = MESSAGE_DESERIALIZER.deserialize(safeMessage, this.providePermittedTags(sender)); - return TagResolver.resolver(displayNamePlaceholder, messagePlaceholder); + return Placeholder.component("message", componentMessage); } - private TagResolver messageResolver(Player player) { + private TagResolver providePermittedTags(Player player) { List tagResolvers = new ArrayList<>(); if (player.hasPermission(PERMISSION_ALL)) { diff --git a/chatformatter-core/src/main/java/com/eternalcode/formatter/ChatMessage.java b/chatformatter-core/src/main/java/com/eternalcode/formatter/ChatMessage.java new file mode 100644 index 0000000..c6da969 --- /dev/null +++ b/chatformatter-core/src/main/java/com/eternalcode/formatter/ChatMessage.java @@ -0,0 +1,7 @@ +package com.eternalcode.formatter; + +import org.bukkit.entity.Player; + +public record ChatMessage(Player sender, String jsonMessage) { + +} diff --git a/chatformatter-core/src/main/java/com/eternalcode/formatter/ChatRenderedMessage.java b/chatformatter-core/src/main/java/com/eternalcode/formatter/ChatRenderedMessage.java new file mode 100644 index 0000000..4e042c7 --- /dev/null +++ b/chatformatter-core/src/main/java/com/eternalcode/formatter/ChatRenderedMessage.java @@ -0,0 +1,6 @@ +package com.eternalcode.formatter; + +import org.bukkit.entity.Player; + +public record ChatRenderedMessage(Player sender, String jsonMessage) { +} diff --git a/core/src/main/java/com/eternalcode/formatter/ChatSettings.java b/chatformatter-core/src/main/java/com/eternalcode/formatter/ChatSettings.java similarity index 81% rename from core/src/main/java/com/eternalcode/formatter/ChatSettings.java rename to chatformatter-core/src/main/java/com/eternalcode/formatter/ChatSettings.java index 7fb6c90..db5805f 100644 --- a/core/src/main/java/com/eternalcode/formatter/ChatSettings.java +++ b/chatformatter-core/src/main/java/com/eternalcode/formatter/ChatSettings.java @@ -4,8 +4,6 @@ public interface ChatSettings { boolean isReceiveUpdates(); - boolean isPreFormatting(); - String getRawFormat(String rank); } diff --git a/core/src/main/java/com/eternalcode/formatter/adventure/PlayerSignedMessage.java b/chatformatter-core/src/main/java/com/eternalcode/formatter/adventure/PlayerSignedMessage.java similarity index 100% rename from core/src/main/java/com/eternalcode/formatter/adventure/PlayerSignedMessage.java rename to chatformatter-core/src/main/java/com/eternalcode/formatter/adventure/PlayerSignedMessage.java diff --git a/core/src/main/java/com/eternalcode/formatter/adventure/TextColorTagResolver.java b/chatformatter-core/src/main/java/com/eternalcode/formatter/adventure/TextColorTagResolver.java similarity index 100% rename from core/src/main/java/com/eternalcode/formatter/adventure/TextColorTagResolver.java rename to chatformatter-core/src/main/java/com/eternalcode/formatter/adventure/TextColorTagResolver.java diff --git a/core/src/main/java/com/eternalcode/formatter/config/ConfigManager.java b/chatformatter-core/src/main/java/com/eternalcode/formatter/config/ConfigManager.java similarity index 100% rename from core/src/main/java/com/eternalcode/formatter/config/ConfigManager.java rename to chatformatter-core/src/main/java/com/eternalcode/formatter/config/ConfigManager.java diff --git a/core/src/main/java/com/eternalcode/formatter/config/PluginConfig.java b/chatformatter-core/src/main/java/com/eternalcode/formatter/config/PluginConfig.java similarity index 89% rename from core/src/main/java/com/eternalcode/formatter/config/PluginConfig.java rename to chatformatter-core/src/main/java/com/eternalcode/formatter/config/PluginConfig.java index f1f5fc1..6e03e60 100644 --- a/core/src/main/java/com/eternalcode/formatter/config/PluginConfig.java +++ b/chatformatter-core/src/main/java/com/eternalcode/formatter/config/PluginConfig.java @@ -21,12 +21,6 @@ public class PluginConfig implements ChatSettings, PlaceholderStack, TemplateRep @Description("# \\____|_| |_|\\__,_|\\__|_| \\___/|_| |_| |_| |_|\\__,_|\\__|\\__\\___|_| ") @Description(" ") - @Description({ " ", "# Do you want to use pre-chat format? (Other plugins could add their custom prefixes etc.)" }) - @Description("# INFO: This option requires to use custom badges like {displayname} and {message} in each message.") - public boolean preFormatting = false; - - public String defaultFormat = "{displayname} {arrow_right} {message}"; - @Description({ " ", "# Do you want to receive updates about new versions of ChatFormatter?" }) public boolean receiveUpdates = true; @@ -52,8 +46,9 @@ public class PluginConfig implements ChatSettings, PlaceholderStack, TemplateRep "# Example message", " " }) + public String defaultFormat = "{displayname} {arrow_right} {message}"; public Map format = new ImmutableMap.Builder() - .put("default", "{member} &f{displayname} &8{arrow_right} {message} ") + .put("member", "{member} &f{displayname} &8{arrow_right} {message} ") .put("admin", "$template({admin}, &c)") .build(); @@ -80,11 +75,6 @@ public boolean isReceiveUpdates() { return this.receiveUpdates; } - @Override - public boolean isPreFormatting() { - return this.preFormatting; - } - @Override public String getRawFormat(String rank) { return this.format.getOrDefault(rank, this.defaultFormat); diff --git a/core/src/main/java/com/eternalcode/formatter/config/TemplateComposer.java b/chatformatter-core/src/main/java/com/eternalcode/formatter/config/TemplateComposer.java similarity index 100% rename from core/src/main/java/com/eternalcode/formatter/config/TemplateComposer.java rename to chatformatter-core/src/main/java/com/eternalcode/formatter/config/TemplateComposer.java diff --git a/core/src/main/java/com/eternalcode/formatter/legacy/Legacy.java b/chatformatter-core/src/main/java/com/eternalcode/formatter/legacy/Legacy.java similarity index 87% rename from core/src/main/java/com/eternalcode/formatter/legacy/Legacy.java rename to chatformatter-core/src/main/java/com/eternalcode/formatter/legacy/Legacy.java index 4a79184..359284e 100644 --- a/core/src/main/java/com/eternalcode/formatter/legacy/Legacy.java +++ b/chatformatter-core/src/main/java/com/eternalcode/formatter/legacy/Legacy.java @@ -30,18 +30,6 @@ public static String clearSection(String text) { return text.replace(SECTION, AMPERSAND); } - public static String toBukkitFormat(String text) { - return text - .replace("", "%1$s") - .replace("", "%2$s"); - } - - public static String toAdventureFormat(String text) { - return text - .replace("%1$s", "") - .replace("%2$s", ""); - } - public static String ampersandToPlaceholder(String text) { StringBuilder builder = new StringBuilder(text); Matcher colorMatcher = AMPERSAND_PATTERN.matcher(builder.toString()); diff --git a/core/src/main/java/com/eternalcode/formatter/legacy/LegacyPostMessageProcessor.java b/chatformatter-core/src/main/java/com/eternalcode/formatter/legacy/LegacyPostMessageProcessor.java similarity index 100% rename from core/src/main/java/com/eternalcode/formatter/legacy/LegacyPostMessageProcessor.java rename to chatformatter-core/src/main/java/com/eternalcode/formatter/legacy/LegacyPostMessageProcessor.java diff --git a/core/src/main/java/com/eternalcode/formatter/legacy/LegacyPostProcessor.java b/chatformatter-core/src/main/java/com/eternalcode/formatter/legacy/LegacyPostProcessor.java similarity index 100% rename from core/src/main/java/com/eternalcode/formatter/legacy/LegacyPostProcessor.java rename to chatformatter-core/src/main/java/com/eternalcode/formatter/legacy/LegacyPostProcessor.java diff --git a/core/src/main/java/com/eternalcode/formatter/legacy/LegacyPreProcessor.java b/chatformatter-core/src/main/java/com/eternalcode/formatter/legacy/LegacyPreProcessor.java similarity index 100% rename from core/src/main/java/com/eternalcode/formatter/legacy/LegacyPreProcessor.java rename to chatformatter-core/src/main/java/com/eternalcode/formatter/legacy/LegacyPreProcessor.java diff --git a/core/src/main/java/com/eternalcode/formatter/placeholder/Placeholder.java b/chatformatter-core/src/main/java/com/eternalcode/formatter/placeholder/Placeholder.java similarity index 100% rename from core/src/main/java/com/eternalcode/formatter/placeholder/Placeholder.java rename to chatformatter-core/src/main/java/com/eternalcode/formatter/placeholder/Placeholder.java diff --git a/core/src/main/java/com/eternalcode/formatter/hook/PlaceholderAPIStack.java b/chatformatter-core/src/main/java/com/eternalcode/formatter/placeholder/PlaceholderAPIStack.java similarity index 88% rename from core/src/main/java/com/eternalcode/formatter/hook/PlaceholderAPIStack.java rename to chatformatter-core/src/main/java/com/eternalcode/formatter/placeholder/PlaceholderAPIStack.java index 0f134e8..8823d6a 100644 --- a/core/src/main/java/com/eternalcode/formatter/hook/PlaceholderAPIStack.java +++ b/chatformatter-core/src/main/java/com/eternalcode/formatter/placeholder/PlaceholderAPIStack.java @@ -1,4 +1,4 @@ -package com.eternalcode.formatter.hook; +package com.eternalcode.formatter.placeholder; import me.clip.placeholderapi.PlaceholderAPI; import org.bukkit.entity.Player; diff --git a/core/src/main/java/com/eternalcode/formatter/placeholder/PlaceholderRegistry.java b/chatformatter-core/src/main/java/com/eternalcode/formatter/placeholder/PlaceholderRegistry.java similarity index 100% rename from core/src/main/java/com/eternalcode/formatter/placeholder/PlaceholderRegistry.java rename to chatformatter-core/src/main/java/com/eternalcode/formatter/placeholder/PlaceholderRegistry.java diff --git a/core/src/main/java/com/eternalcode/formatter/placeholder/PlaceholderStack.java b/chatformatter-core/src/main/java/com/eternalcode/formatter/placeholder/PlaceholderStack.java similarity index 100% rename from core/src/main/java/com/eternalcode/formatter/placeholder/PlaceholderStack.java rename to chatformatter-core/src/main/java/com/eternalcode/formatter/placeholder/PlaceholderStack.java diff --git a/core/src/main/java/com/eternalcode/formatter/placeholder/PlayerPlaceholder.java b/chatformatter-core/src/main/java/com/eternalcode/formatter/placeholder/PlayerPlaceholder.java similarity index 100% rename from core/src/main/java/com/eternalcode/formatter/placeholder/PlayerPlaceholder.java rename to chatformatter-core/src/main/java/com/eternalcode/formatter/placeholder/PlayerPlaceholder.java diff --git a/core/src/main/java/com/eternalcode/formatter/placeholder/PlayerPlaceholderStack.java b/chatformatter-core/src/main/java/com/eternalcode/formatter/placeholder/PlayerPlaceholderStack.java similarity index 100% rename from core/src/main/java/com/eternalcode/formatter/placeholder/PlayerPlaceholderStack.java rename to chatformatter-core/src/main/java/com/eternalcode/formatter/placeholder/PlayerPlaceholderStack.java diff --git a/core/src/main/java/com/eternalcode/formatter/ChatRankProvider.java b/chatformatter-core/src/main/java/com/eternalcode/formatter/rank/ChatRankProvider.java similarity index 73% rename from core/src/main/java/com/eternalcode/formatter/ChatRankProvider.java rename to chatformatter-core/src/main/java/com/eternalcode/formatter/rank/ChatRankProvider.java index 990098d..70e379b 100644 --- a/core/src/main/java/com/eternalcode/formatter/ChatRankProvider.java +++ b/chatformatter-core/src/main/java/com/eternalcode/formatter/rank/ChatRankProvider.java @@ -1,4 +1,4 @@ -package com.eternalcode.formatter; +package com.eternalcode.formatter.rank; import org.bukkit.entity.Player; diff --git a/core/src/main/java/com/eternalcode/formatter/hook/VaultRankProvider.java b/chatformatter-core/src/main/java/com/eternalcode/formatter/rank/VaultRankProvider.java similarity index 88% rename from core/src/main/java/com/eternalcode/formatter/hook/VaultRankProvider.java rename to chatformatter-core/src/main/java/com/eternalcode/formatter/rank/VaultRankProvider.java index 3e70cab..a49170d 100644 --- a/core/src/main/java/com/eternalcode/formatter/hook/VaultRankProvider.java +++ b/chatformatter-core/src/main/java/com/eternalcode/formatter/rank/VaultRankProvider.java @@ -1,6 +1,6 @@ -package com.eternalcode.formatter.hook; +package com.eternalcode.formatter.rank; -import com.eternalcode.formatter.ChatRankProvider; +import com.eternalcode.formatter.rank.ChatRankProvider; import net.milkbowl.vault.permission.Permission; import org.bukkit.Server; import org.bukkit.entity.Player; diff --git a/core/src/main/java/com/eternalcode/formatter/template/Template.java b/chatformatter-core/src/main/java/com/eternalcode/formatter/template/Template.java similarity index 100% rename from core/src/main/java/com/eternalcode/formatter/template/Template.java rename to chatformatter-core/src/main/java/com/eternalcode/formatter/template/Template.java diff --git a/core/src/main/java/com/eternalcode/formatter/template/TemplateRepository.java b/chatformatter-core/src/main/java/com/eternalcode/formatter/template/TemplateRepository.java similarity index 100% rename from core/src/main/java/com/eternalcode/formatter/template/TemplateRepository.java rename to chatformatter-core/src/main/java/com/eternalcode/formatter/template/TemplateRepository.java diff --git a/core/src/main/java/com/eternalcode/formatter/template/TemplateService.java b/chatformatter-core/src/main/java/com/eternalcode/formatter/template/TemplateService.java similarity index 100% rename from core/src/main/java/com/eternalcode/formatter/template/TemplateService.java rename to chatformatter-core/src/main/java/com/eternalcode/formatter/template/TemplateService.java diff --git a/core/src/main/java/com/eternalcode/formatter/updater/UpdaterController.java b/chatformatter-core/src/main/java/com/eternalcode/formatter/updater/UpdaterController.java similarity index 100% rename from core/src/main/java/com/eternalcode/formatter/updater/UpdaterController.java rename to chatformatter-core/src/main/java/com/eternalcode/formatter/updater/UpdaterController.java diff --git a/core/src/main/java/com/eternalcode/formatter/updater/UpdaterService.java b/chatformatter-core/src/main/java/com/eternalcode/formatter/updater/UpdaterService.java similarity index 100% rename from core/src/main/java/com/eternalcode/formatter/updater/UpdaterService.java rename to chatformatter-core/src/main/java/com/eternalcode/formatter/updater/UpdaterService.java diff --git a/core/src/test/java/com/eternalcode/formatter/legacy/LegacyTest.java b/chatformatter-core/src/test/java/com/eternalcode/formatter/legacy/LegacyTest.java similarity index 100% rename from core/src/test/java/com/eternalcode/formatter/legacy/LegacyTest.java rename to chatformatter-core/src/test/java/com/eternalcode/formatter/legacy/LegacyTest.java diff --git a/core/src/test/java/com/eternalcode/formatter/template/TemplateTest.java b/chatformatter-core/src/test/java/com/eternalcode/formatter/template/TemplateTest.java similarity index 100% rename from core/src/test/java/com/eternalcode/formatter/template/TemplateTest.java rename to chatformatter-core/src/test/java/com/eternalcode/formatter/template/TemplateTest.java diff --git a/chatformatter-paper-plugin/build.gradle.kts b/chatformatter-paper-plugin/build.gradle.kts new file mode 100644 index 0000000..27e2ca8 --- /dev/null +++ b/chatformatter-paper-plugin/build.gradle.kts @@ -0,0 +1,119 @@ +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar +import java.io.FileOutputStream +import java.io.IOException +import java.util.jar.JarEntry +import java.util.jar.JarFile +import java.util.jar.JarOutputStream + +plugins{ + id("eternalcode.java") + id("net.minecrell.plugin-yml.bukkit") + id("com.github.johnrengelman.shadow") + id("xyz.jpenilla.run-paper") version "2.2.0" +} + +bukkit { + main = "com.eternalcode.formatter.paper.ChatFormatterPaperSupportPlugin" + apiVersion = "1.13" + prefix = "ChatFormatter-PaperSupport" + author = "EternalCodeTeam" + name = "ChatFormatter-PaperSupport" + version = "${project.version}" + depend = listOf("ChatFormatter") +} + +dependencies { + compileOnly(project(":chatformatter-core")) + compileOnly("com.eternalcode:eternalcombat-api:1.1.1") + compileOnly("io.papermc.paper:paper-api:1.19.3-R0.1-SNAPSHOT") +} + +tasks.withType { + archiveFileName.set("chatformatter-paper-plugin-${version}.jar") + + exclude( + "org/intellij/lang/annotations/**", + "org/jetbrains/annotations/**", + "META-INF/**", + "javax/**" + ) + + mergeServiceFiles() +} + +tasks.create("shadowAll") { + val projects = listOf( + project(":chatformatter-core"), + project(":chatformatter-paper-plugin") + ) + + for (project in projects) { + dependsOn(project.tasks.shadowJar) + } + + doLast { + merge("ChatFormatter v${project.version}.jar", projects) + } +} + +fun merge(archiveFileName: String, projects: List) { + val outputFile = File(project.layout.buildDirectory.asFile.get(), "libs/${archiveFileName}") + val outputDir = outputFile.parentFile ?: throw RuntimeException("Could not get output directory") + + if (!outputDir.exists() && !outputDir.mkdirs()) { + throw RuntimeException("Could not create output directory") + } + + if (outputFile.exists()) { + outputFile.delete() + } + + if (!outputFile.createNewFile()) { + throw RuntimeException("Could not find output file to merge") + } + + JarOutputStream(FileOutputStream(outputFile)).use { outputJar -> + for (project in projects) { + val shadowJar = project.tasks.shadowJar.get() + + for (file in shadowJar.outputs.files.files) { + JarFile(file).use { jarFile -> + for (entry in jarFile.entries()) { + if (entry.isDirectory) { + continue + } + + val bytes = jarFile.getInputStream(entry).readBytes() + val newEntry = JarEntry(entry.name) + + newEntry.setTime(System.currentTimeMillis()) + newEntry.setSize(bytes.size.toLong()) + + try { + outputJar.putNextEntry(newEntry) + outputJar.write(bytes) + outputJar.closeEntry() + } + catch (exception: IOException) { + if (exception.message?.contains("duplicate entry: ") == true) { + continue + } + + exception.printStackTrace() + } + } + } + } + } + } + +} + +tasks.runServer { + minecraftVersion("1.19.3") + downloadPlugins { + val outputFile = File(project.layout.buildDirectory.asFile.get(), "libs/ChatFormatter v${project.version}.jar") + + downloadPlugins.url(outputFile.toURL()!!.toString()) + } +} diff --git a/chatformatter-paper-plugin/src/main/java/com/eternalcode/formatter/paper/ChatFormatterPaperPlugin.java b/chatformatter-paper-plugin/src/main/java/com/eternalcode/formatter/paper/ChatFormatterPaperPlugin.java new file mode 100644 index 0000000..8a053db --- /dev/null +++ b/chatformatter-paper-plugin/src/main/java/com/eternalcode/formatter/paper/ChatFormatterPaperPlugin.java @@ -0,0 +1,36 @@ +package com.eternalcode.formatter.paper; + +import com.eternalcode.combat.EternalCombatApi; +import com.eternalcode.combat.EternalCombatProvider; +import com.eternalcode.combat.fight.FightManager; +import com.eternalcode.formatter.ChatFormatterPlugin; +import com.eternalcode.formatter.ChatHandler; +import io.papermc.paper.event.player.AsyncChatEvent; +import org.bukkit.Server; +import org.bukkit.event.EventPriority; +import org.bukkit.plugin.PluginManager; +import org.bukkit.plugin.java.JavaPlugin; + +public class ChatFormatterPaperPlugin extends JavaPlugin { + + private ChatFormatterPlugin chatFormatter; + + @Override + public void onEnable() { + chatFormatter = new ChatFormatterPlugin(this); + + ChatHandler handler = chatFormatter.getChatHandler(); + Server server = this.getServer(); + PluginManager pluginManager = server.getPluginManager(); + + pluginManager.registerEvent(AsyncChatEvent.class, handler, EventPriority.LOWEST, new PaperChatEventExecutor(), this, true); + } + + @Override + public void onDisable() { + if (chatFormatter != null) { + chatFormatter.close(); + } + } + +} diff --git a/chatformatter-paper-plugin/src/main/java/com/eternalcode/formatter/paper/PaperChatEventExecutor.java b/chatformatter-paper-plugin/src/main/java/com/eternalcode/formatter/paper/PaperChatEventExecutor.java new file mode 100644 index 0000000..d183b03 --- /dev/null +++ b/chatformatter-paper-plugin/src/main/java/com/eternalcode/formatter/paper/PaperChatEventExecutor.java @@ -0,0 +1,38 @@ +package com.eternalcode.formatter.paper; + +import com.eternalcode.formatter.ChatHandler; +import com.eternalcode.formatter.ChatMessage; +import com.eternalcode.formatter.ChatRenderedMessage; +import io.papermc.paper.event.player.AsyncChatEvent; +import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; +import org.bukkit.event.Event; +import org.bukkit.event.EventException; +import org.bukkit.event.Listener; +import org.bukkit.plugin.EventExecutor; +import org.jetbrains.annotations.NotNull; + +class PaperChatEventExecutor implements EventExecutor { + + private final static GsonComponentSerializer GSON = GsonComponentSerializer.gson(); + + @Override + public void execute(@NotNull Listener listener, @NotNull Event event) throws EventException { + if (!(listener instanceof ChatHandler handler)) { + throw new EventException("Listener is not a ChatHandler"); + } + + if (!(event instanceof AsyncChatEvent paperEvent)) { + return; + } + + paperEvent.renderer((source, sourceDisplayName, message, viewer) -> { + String jsonMessage = GSON.serialize(message); + + ChatMessage chatMessage = new ChatMessage(source, jsonMessage); + ChatRenderedMessage result = handler.process(chatMessage); + + return GSON.deserialize(result.jsonMessage()); + }); + } + +} diff --git a/config/checkstyle/checkstyle.xml b/config/checkstyle/checkstyle.xml deleted file mode 100644 index ff41fc6..0000000 --- a/config/checkstyle/checkstyle.xml +++ /dev/null @@ -1,217 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/config/checkstyle/suppressions.xml b/config/checkstyle/suppressions.xml deleted file mode 100644 index d609557..0000000 --- a/config/checkstyle/suppressions.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/core/src/main/java/com/eternalcode/formatter/ChatFormatterPlugin.java b/core/src/main/java/com/eternalcode/formatter/ChatFormatterPlugin.java deleted file mode 100644 index d0871dc..0000000 --- a/core/src/main/java/com/eternalcode/formatter/ChatFormatterPlugin.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.eternalcode.formatter; - -import com.eternalcode.formatter.config.ConfigManager; -import com.eternalcode.formatter.config.PluginConfig; -import com.eternalcode.formatter.legacy.LegacyPostProcessor; -import com.eternalcode.formatter.legacy.LegacyPreProcessor; -import com.eternalcode.formatter.hook.PlaceholderAPIStack; -import com.eternalcode.formatter.hook.VaultRankProvider; -import com.eternalcode.formatter.template.TemplateService; -import com.eternalcode.formatter.placeholder.PlaceholderRegistry; -import com.eternalcode.formatter.preparatory.ChatPreparatoryService; -import com.eternalcode.formatter.updater.UpdaterController; -import com.eternalcode.formatter.updater.UpdaterService; -import com.google.common.base.Stopwatch; -import dev.rollczi.litecommands.LiteCommands; -import dev.rollczi.litecommands.bukkit.LiteBukkitFactory; -import net.kyori.adventure.platform.AudienceProvider; -import net.kyori.adventure.platform.bukkit.BukkitAudiences; -import net.kyori.adventure.text.minimessage.MiniMessage; -import org.bstats.bukkit.Metrics; -import org.bukkit.command.CommandSender; -import org.bukkit.plugin.java.JavaPlugin; - -import java.util.concurrent.TimeUnit; -import java.util.stream.Stream; - -public class ChatFormatterPlugin extends JavaPlugin implements ChatFormatter { - - private ConfigManager configManager; - - private PlaceholderRegistry placeholderRegistry; - private TemplateService templateService; - private ChatRankProvider rankProvider; - private ChatPreparatoryService chatPreparatoryService; - private UpdaterService updaterService; - - private AudienceProvider audienceProvider; - private MiniMessage miniMessage; - - private LiteCommands liteCommands; - - @Override - public void onEnable() { - Stopwatch stopwatch = Stopwatch.createStarted(); - - this.configManager = new ConfigManager(this.getDataFolder()); - this.configManager.loadAndRenderConfigs(); - - PluginConfig pluginConfig = this.configManager.getPluginConfig(); - - this.placeholderRegistry = new PlaceholderRegistry(); - this.placeholderRegistry.stack(pluginConfig); - this.placeholderRegistry.playerStack(new PlaceholderAPIStack()); - this.templateService = new TemplateService(pluginConfig); - this.rankProvider = new VaultRankProvider(this.getServer()); - this.chatPreparatoryService = new ChatPreparatoryService(); - this.updaterService = new UpdaterService(this.getDescription()); - - this.audienceProvider = BukkitAudiences.create(this); - this.miniMessage = MiniMessage.builder() - .preProcessor(new LegacyPreProcessor()) - .postProcessor(new LegacyPostProcessor()) - .build(); - - this.liteCommands = LiteBukkitFactory.builder(this.getServer(), "chat-formatter") - .commandInstance(new ChatFormatterCommand(this.configManager, this.audienceProvider, this.miniMessage)) - .register(); - - // bStats metrics - new Metrics(this, 15199); - - Stream.of( - new ChatController(this.audienceProvider, this.miniMessage, pluginConfig, this.rankProvider, this.placeholderRegistry, this.templateService, this.chatPreparatoryService), - new UpdaterController(this.updaterService, pluginConfig, this.audienceProvider, this.miniMessage) - ).forEach(listener -> this.getServer().getPluginManager().registerEvents(listener, this)); - - ChatFormatterProvider.enable(this); - - this.getLogger().info("Plugin enabled in " + stopwatch.elapsed(TimeUnit.MILLISECONDS) + "ms"); - } - - @Override - public void onDisable() { - ChatFormatterProvider.disable(); - this.liteCommands.getPlatform().unregisterAll(); - } - - @Override - public PlaceholderRegistry getPlaceholderRegistry() { - return this.placeholderRegistry; - } - - @Override - public TemplateService getTemplateService() { - return this.templateService; - } - - @Override - public ChatRankProvider getRankProvider() { - return this.rankProvider; - } - - @Override - public ChatPreparatoryService getChatPreparatoryService() { - return this.chatPreparatoryService; - } - -} diff --git a/core/src/main/java/com/eternalcode/formatter/ChatFormatterProvider.java b/core/src/main/java/com/eternalcode/formatter/ChatFormatterProvider.java deleted file mode 100644 index d749c5c..0000000 --- a/core/src/main/java/com/eternalcode/formatter/ChatFormatterProvider.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.eternalcode.formatter; - -public final class ChatFormatterProvider { - - private static ChatFormatter chatFormatter; - - static void enable(ChatFormatter chatFormatter) { - ChatFormatterProvider.chatFormatter = chatFormatter; - } - - static void disable() { - ChatFormatterProvider.chatFormatter = null; - } - - public static ChatFormatter get() { - if (chatFormatter == null) { - throw new IllegalStateException(); - } - - return chatFormatter; - } - -} diff --git a/core/src/main/java/com/eternalcode/formatter/preparatory/ChatPreparatory.java b/core/src/main/java/com/eternalcode/formatter/preparatory/ChatPreparatory.java deleted file mode 100644 index 5c2957f..0000000 --- a/core/src/main/java/com/eternalcode/formatter/preparatory/ChatPreparatory.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.eternalcode.formatter.preparatory; - -import org.bukkit.entity.Player; - -import java.util.Set; - -public interface ChatPreparatory { - - /** - * Prepare raw json component - * - * @param player target player - * @param receivers receivers of the message - * @param rawJson raw json component to prepare. - * @param message original message - * @param canceled if the message is canceled - * @return prepared raw json component. - */ - ChatPrepareResult prepare(Player player, Set receivers, String rawJson, String message, boolean canceled); - -} diff --git a/core/src/main/java/com/eternalcode/formatter/preparatory/ChatPreparatoryService.java b/core/src/main/java/com/eternalcode/formatter/preparatory/ChatPreparatoryService.java deleted file mode 100644 index 4541244..0000000 --- a/core/src/main/java/com/eternalcode/formatter/preparatory/ChatPreparatoryService.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.eternalcode.formatter.preparatory; - -import org.bukkit.entity.Player; - -import java.util.HashSet; -import java.util.Set; - -public class ChatPreparatoryService { - - private final Set preparations = new HashSet<>(); - - public void registerPreparatory(ChatPreparatory chatPreparatory) { - this.preparations.add(chatPreparatory); - } - - public boolean isEmpty() { - return this.preparations.isEmpty(); - } - - public ChatPrepareResult prepare(Player player, Set receivers, String jsonFormat, String message) { - ChatPrepareResult result = new ChatPrepareResult(jsonFormat, receivers, false); - - for (ChatPreparatory preparation : this.preparations) { - result = preparation.prepare(player, result.getReceivers(), result.getRawMessage(), message, result.isCancelled()); - } - - return result; - } - -} diff --git a/core/src/main/java/com/eternalcode/formatter/preparatory/ChatPrepareResult.java b/core/src/main/java/com/eternalcode/formatter/preparatory/ChatPrepareResult.java deleted file mode 100644 index 77ad26d..0000000 --- a/core/src/main/java/com/eternalcode/formatter/preparatory/ChatPrepareResult.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.eternalcode.formatter.preparatory; - -import org.bukkit.entity.Player; - -import java.util.HashSet; -import java.util.Set; - -public final class ChatPrepareResult { - - private final Set receivers = new HashSet<>(); - private final String rawMessage; - private final boolean cancelled; - - public ChatPrepareResult(String rawMessage, Set receivers, boolean cancelled) { - this.rawMessage = rawMessage; - this.receivers.addAll(receivers); - this.cancelled = cancelled; - } - - public boolean isCancelled() { - return this.cancelled; - } - - public String getRawMessage() { - return this.rawMessage; - } - - public Set getReceivers() { - return this.receivers; - } - -} diff --git a/paper-multi-version-support/build.gradle.kts b/paper-multi-version-support/build.gradle.kts deleted file mode 100644 index f4fe7c8..0000000 --- a/paper-multi-version-support/build.gradle.kts +++ /dev/null @@ -1,7 +0,0 @@ -plugins { - id("eternalcode.java") -} - -dependencies { - compileOnly("com.destroystokyo.paper:paper-api:1.16.5-R0.1-SNAPSHOT") -} \ No newline at end of file diff --git a/paper-multi-version-support/src/main/java/com/eternalcode/paper/multiversion/LegacyChatComposerProvider.java b/paper-multi-version-support/src/main/java/com/eternalcode/paper/multiversion/LegacyChatComposerProvider.java deleted file mode 100644 index f90b7ca..0000000 --- a/paper-multi-version-support/src/main/java/com/eternalcode/paper/multiversion/LegacyChatComposerProvider.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.eternalcode.paper.multiversion; - -import io.papermc.paper.chat.ChatComposer; -import net.kyori.adventure.text.Component; - -public final class LegacyChatComposerProvider implements LegacyDependencyProvider { - - private final Component component; - - public LegacyChatComposerProvider(Component component) { - this.component = component; - } - - @Override - public Class getType() { - return ChatComposer.class; - } - - @Override - public Object getDependency() { - return (ChatComposer) (source, sourceDisplayName, ignoredMessage) -> this.component; - } - -} diff --git a/paper-multi-version-support/src/main/java/com/eternalcode/paper/multiversion/LegacyChatFormatterProvider.java b/paper-multi-version-support/src/main/java/com/eternalcode/paper/multiversion/LegacyChatFormatterProvider.java deleted file mode 100644 index 91b9824..0000000 --- a/paper-multi-version-support/src/main/java/com/eternalcode/paper/multiversion/LegacyChatFormatterProvider.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.eternalcode.paper.multiversion; - -import io.papermc.paper.chat.ChatFormatter; -import net.kyori.adventure.text.Component; - -public final class LegacyChatFormatterProvider implements LegacyDependencyProvider { - - private final Component component; - - public LegacyChatFormatterProvider(Component component) { - this.component = component; - } - - @Override - public Class getType() { - return ChatFormatter.class; - } - - @Override - public Object getDependency() { - return (ChatFormatter) (displayName, message) -> this.component; - } - -} diff --git a/paper-multi-version-support/src/main/java/com/eternalcode/paper/multiversion/LegacyDependencyProvider.java b/paper-multi-version-support/src/main/java/com/eternalcode/paper/multiversion/LegacyDependencyProvider.java deleted file mode 100644 index fd3ae87..0000000 --- a/paper-multi-version-support/src/main/java/com/eternalcode/paper/multiversion/LegacyDependencyProvider.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.eternalcode.paper.multiversion; - -public interface LegacyDependencyProvider { - - Class getType(); - - T getDependency(); - -} diff --git a/paper-multi-version-support/src/main/java/com/eternalcode/paper/multiversion/ModernChatRendererProvider.java b/paper-multi-version-support/src/main/java/com/eternalcode/paper/multiversion/ModernChatRendererProvider.java deleted file mode 100644 index b1beb31..0000000 --- a/paper-multi-version-support/src/main/java/com/eternalcode/paper/multiversion/ModernChatRendererProvider.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.eternalcode.paper.multiversion; - -import io.papermc.paper.chat.ChatRenderer; -import net.kyori.adventure.text.Component; - -public class ModernChatRendererProvider implements LegacyDependencyProvider { - - private final Component component; - - public ModernChatRendererProvider(Component component) { - this.component = component; - } - - @Override - public Class getType() { - return ChatRenderer.class; - } - - @Override - public Object getDependency() { - return (ChatRenderer) (source, sourceDisplayName, ignoredMessage, viewer) -> this.component; - } - -} diff --git a/paper-support/build.gradle.kts b/paper-support/build.gradle.kts deleted file mode 100644 index 5f8fa75..0000000 --- a/paper-support/build.gradle.kts +++ /dev/null @@ -1,36 +0,0 @@ -import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar - -plugins{ - id("eternalcode.java") - id("net.minecrell.plugin-yml.bukkit") - id("com.github.johnrengelman.shadow") -} - -bukkit { - main = "com.eternalcode.formatter.paper.ChatFormatterPaperSupportPlugin" - apiVersion = "1.13" - prefix = "ChatFormatter-PaperSupport" - author = "EternalCodeTeam" - name = "ChatFormatter-PaperSupport" - version = "${project.version}" - depend = listOf("ChatFormatter") -} - -dependencies { - compileOnly(project(":core")) - implementation(project(":paper-multi-version-support")) - compileOnly("io.papermc.paper:paper-api:1.19.3-R0.1-SNAPSHOT") -} - -tasks.withType { - archiveFileName.set("ChatFormatter-PaperSupport v${project.version}.jar") - - exclude( - "org/intellij/lang/annotations/**", - "org/jetbrains/annotations/**", - "META-INF/**", - "javax/**" - ) - - mergeServiceFiles() -} \ No newline at end of file diff --git a/paper-support/src/main/java/com/eternalcode/formatter/paper/ChatFormatterPaperSupportPlugin.java b/paper-support/src/main/java/com/eternalcode/formatter/paper/ChatFormatterPaperSupportPlugin.java deleted file mode 100644 index 1b8d743..0000000 --- a/paper-support/src/main/java/com/eternalcode/formatter/paper/ChatFormatterPaperSupportPlugin.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.eternalcode.formatter.paper; - -import com.eternalcode.formatter.ChatFormatter; -import com.eternalcode.formatter.ChatFormatterProvider; -import com.eternalcode.formatter.preparatory.ChatPreparatoryService; -import org.bukkit.plugin.java.JavaPlugin; - -public class ChatFormatterPaperSupportPlugin extends JavaPlugin { - - @Override - public void onEnable() { - ChatFormatter chatFormatter = ChatFormatterProvider.get(); - ChatPreparatoryService preparatoryService = chatFormatter.getChatPreparatoryService(); - - preparatoryService.registerPreparatory(new ChatPaperPreparatory(this.getServer().getPluginManager())); - } - -} diff --git a/paper-support/src/main/java/com/eternalcode/formatter/paper/ChatPaperPreparatory.java b/paper-support/src/main/java/com/eternalcode/formatter/paper/ChatPaperPreparatory.java deleted file mode 100644 index e0a3fb0..0000000 --- a/paper-support/src/main/java/com/eternalcode/formatter/paper/ChatPaperPreparatory.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.eternalcode.formatter.paper; - -import com.eternalcode.paper.multiversion.LegacyChatComposerProvider; -import com.eternalcode.paper.multiversion.LegacyChatFormatterProvider; -import com.eternalcode.paper.multiversion.ModernChatRendererProvider; -import com.eternalcode.formatter.paper.adventure.PaperSignedMessageProvider; -import com.eternalcode.formatter.paper.injector.DependencyInjector; -import com.eternalcode.formatter.preparatory.ChatPreparatory; -import com.eternalcode.formatter.preparatory.ChatPrepareResult; -import io.papermc.paper.event.player.AsyncChatEvent; -import net.kyori.adventure.audience.Audience; -import net.kyori.adventure.audience.ForwardingAudience; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; -import org.bukkit.entity.Player; -import org.bukkit.plugin.PluginManager; - -import java.util.HashSet; -import java.util.Set; - -class ChatPaperPreparatory implements ChatPreparatory { - - private static final GsonComponentSerializer GSON = GsonComponentSerializer.gson(); - - private final PluginManager pluginManager; - - ChatPaperPreparatory(PluginManager pluginManager) { - this.pluginManager = pluginManager; - } - - @Override - public ChatPrepareResult prepare(Player player, Set receivers, String jsonFormat, String message, boolean canceled) { - Component formatted = GSON.deserialize(jsonFormat); - Component original = Component.text(message); - HashSet audiences = new HashSet<>(receivers); - - DependencyInjector injector = new DependencyInjector() - .register(boolean.class, true) - .register(Player.class, player) - .register(Set.class, audiences) - .register(Component.class, original) - .tryRegister(() -> new PaperSignedMessageProvider(original, player)) - .tryRegister(() -> new LegacyChatComposerProvider(formatted)) - .tryRegister(() -> new LegacyChatFormatterProvider(formatted)) - .tryRegister(() -> new ModernChatRendererProvider(formatted)); - - AsyncChatEvent event = injector.newInstance(AsyncChatEvent.class); - - event.setCancelled(canceled); - this.pluginManager.callEvent(event); - - ForwardingAudience audience = Audience.audience(audiences); - String serialized = GSON.serialize(event.renderer().render(player, player.displayName(), event.message(), audience)); - - return new ChatPrepareResult(serialized, receivers, event.isCancelled()); - } - -} diff --git a/paper-support/src/main/java/com/eternalcode/formatter/paper/adventure/PaperSignedMessage.java b/paper-support/src/main/java/com/eternalcode/formatter/paper/adventure/PaperSignedMessage.java deleted file mode 100644 index 363f171..0000000 --- a/paper-support/src/main/java/com/eternalcode/formatter/paper/adventure/PaperSignedMessage.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.eternalcode.formatter.paper.adventure; - -import net.kyori.adventure.chat.SignedMessage; -import net.kyori.adventure.identity.Identity; -import net.kyori.adventure.text.Component; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.security.SecureRandom; -import java.time.Instant; - -public class PaperSignedMessage implements SignedMessage { - - private static final SecureRandom RANDOM = new SecureRandom(); - - private final Instant instant; - private final long salt; - private final Component unsignedContent; - private final String message; - private final Identity identity; - - public PaperSignedMessage(Component unsignedContent, Identity identity) { - this.identity = identity; - this.instant = Instant.now(); - this.salt = RANDOM.nextLong(); - this.unsignedContent = unsignedContent; - this.message = "-"; - } - - @Override - public @NotNull Instant timestamp() { - return this.instant; - } - - @Override - public long salt() { - return this.salt; - } - - @Override - public Signature signature() { - return null; - } - - @Override - public @Nullable Component unsignedContent() { - return this.unsignedContent; - } - - @Override - public @NotNull String message() { - return this.message; - } - - @Override - public @NotNull Identity identity() { - return this.identity; - } - -} diff --git a/paper-support/src/main/java/com/eternalcode/formatter/paper/adventure/PaperSignedMessageProvider.java b/paper-support/src/main/java/com/eternalcode/formatter/paper/adventure/PaperSignedMessageProvider.java deleted file mode 100644 index 823a935..0000000 --- a/paper-support/src/main/java/com/eternalcode/formatter/paper/adventure/PaperSignedMessageProvider.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.eternalcode.formatter.paper.adventure; - -import com.eternalcode.paper.multiversion.LegacyDependencyProvider; -import net.kyori.adventure.chat.SignedMessage; -import net.kyori.adventure.identity.Identity; -import net.kyori.adventure.text.Component; -import org.bukkit.entity.Player; - -public class PaperSignedMessageProvider implements LegacyDependencyProvider { - - private final Component messageComponent; - private final Player player; - - public PaperSignedMessageProvider(Component messageComponent, Player player) { - this.messageComponent = messageComponent; - this.player = player; - } - - @Override - public Class getType() { - return SignedMessage.class; - } - - @Override - public SignedMessage getDependency() { - return new PaperSignedMessage(this.messageComponent, Identity.identity(this.player.getUniqueId())); - } - -} diff --git a/paper-support/src/main/java/com/eternalcode/formatter/paper/injector/DependencyContainer.java b/paper-support/src/main/java/com/eternalcode/formatter/paper/injector/DependencyContainer.java deleted file mode 100644 index 31d965a..0000000 --- a/paper-support/src/main/java/com/eternalcode/formatter/paper/injector/DependencyContainer.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.eternalcode.formatter.paper.injector; - -import java.util.ArrayList; -import java.util.List; - -class DependencyContainer { - - private final T value; - private final List extraValues = new ArrayList<>(); - - DependencyContainer(T value) { - this.value = value; - } - - public void addExtraValue(T value) { - this.extraValues.add(value); - } - - public T getExtraOrNormal(int index) { - if (index == 0) { - return this.value; - } - - if (index >= this.extraValues.size()) { - if (this.extraValues.isEmpty()) { - return this.value; - } - - return this.extraValues.get(this.extraValues.size() - 1); - } - - return this.extraValues.get(index); - } - -} diff --git a/paper-support/src/main/java/com/eternalcode/formatter/paper/injector/DependencyInjector.java b/paper-support/src/main/java/com/eternalcode/formatter/paper/injector/DependencyInjector.java deleted file mode 100644 index bcf3a74..0000000 --- a/paper-support/src/main/java/com/eternalcode/formatter/paper/injector/DependencyInjector.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.eternalcode.formatter.paper.injector; - -import com.eternalcode.paper.multiversion.LegacyDependencyProvider; - -import java.lang.reflect.Constructor; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.function.Supplier; - -public class DependencyInjector { - - private final Map, DependencyContainer> dependencies = new HashMap<>(); - - public DependencyInjector tryRegister(Supplier> provider) { - try { - LegacyDependencyProvider legacyDependencyProvider = provider.get(); - - this.registerUnSafe(legacyDependencyProvider.getType(), legacyDependencyProvider.getDependency()); - } - catch (NoClassDefFoundError ignored) { } - - return this; - } - - @SuppressWarnings("unchecked") - private void registerUnSafe(Class type, T dependency) { - this.register((Class) type, dependency); - } - - @SuppressWarnings("unchecked") - public DependencyInjector register(Class clazz, T instance) { - DependencyContainer container = (DependencyContainer) this.dependencies.get(clazz); - - if (container == null) { - this.dependencies.put(clazz, new DependencyContainer<>(instance)); - return this; - } - - container.addExtraValue(instance); - return this; - } - - public T newInstance(Class clazz) { - for (Constructor constructor : clazz.getConstructors()) { - if (constructor.isAnnotationPresent(Deprecated.class)) { - continue; - } - - List parameters = new ArrayList<>(); - Map, Integer> parameterCount = new HashMap<>(); - - for (Class parameterType : constructor.getParameterTypes()) { - parameters.add(this.getDependency(parameterType, parameterCount.getOrDefault(parameterType, 0))); - parameterCount.merge(parameterType, 1, Integer::sum); - } - - try { - return clazz.cast(constructor.newInstance(parameters.toArray(new Object[0]))); - } - catch (ReflectiveOperationException e) { - throw new IllegalStateException("Failed to instantiate " + clazz, e); - } - } - - throw new IllegalStateException("No constructor found for " + clazz); - } - - @SuppressWarnings("unchecked") - private T getDependency(Class clazz, int index) { - DependencyContainer container = this.dependencies.get(clazz); - - if (container != null) { - return (T) container.getExtraOrNormal(index); - } - - for (Map.Entry, DependencyContainer> entry : this.dependencies.entrySet()) { - Class key = entry.getKey(); - - if (clazz.isAssignableFrom(key)) { - return (T) entry.getValue().getExtraOrNormal(index); - } - } - - throw new IllegalStateException("No dependency found for " + clazz); - } - -} diff --git a/settings.gradle.kts b/settings.gradle.kts index f9e07ee..21205b5 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,3 +1,2 @@ -include(":core") -include(":paper-multi-version-support") -include(":paper-support") +include(":chatformatter-core") +include(":chatformatter-paper-plugin") From 8293cf4660f8c7cab809e8e4e7cca5ed4a020818 Mon Sep 17 00:00:00 2001 From: Martin Sulikowski Date: Sun, 15 Oct 2023 00:40:52 +0200 Subject: [PATCH 02/10] Remove eternalcombat, fix plugin.yml --- chatformatter-paper-plugin/build.gradle.kts | 8 +++----- .../formatter/paper/ChatFormatterPaperPlugin.java | 3 --- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/chatformatter-paper-plugin/build.gradle.kts b/chatformatter-paper-plugin/build.gradle.kts index 27e2ca8..990ea23 100644 --- a/chatformatter-paper-plugin/build.gradle.kts +++ b/chatformatter-paper-plugin/build.gradle.kts @@ -13,18 +13,16 @@ plugins{ } bukkit { - main = "com.eternalcode.formatter.paper.ChatFormatterPaperSupportPlugin" + main = "com.eternalcode.formatter.paper.ChatFormatterPaperPlugin" apiVersion = "1.13" - prefix = "ChatFormatter-PaperSupport" + prefix = "ChatFormatter" author = "EternalCodeTeam" - name = "ChatFormatter-PaperSupport" + name = "ChatFormatter" version = "${project.version}" - depend = listOf("ChatFormatter") } dependencies { compileOnly(project(":chatformatter-core")) - compileOnly("com.eternalcode:eternalcombat-api:1.1.1") compileOnly("io.papermc.paper:paper-api:1.19.3-R0.1-SNAPSHOT") } diff --git a/chatformatter-paper-plugin/src/main/java/com/eternalcode/formatter/paper/ChatFormatterPaperPlugin.java b/chatformatter-paper-plugin/src/main/java/com/eternalcode/formatter/paper/ChatFormatterPaperPlugin.java index 8a053db..083fa8b 100644 --- a/chatformatter-paper-plugin/src/main/java/com/eternalcode/formatter/paper/ChatFormatterPaperPlugin.java +++ b/chatformatter-paper-plugin/src/main/java/com/eternalcode/formatter/paper/ChatFormatterPaperPlugin.java @@ -1,8 +1,5 @@ package com.eternalcode.formatter.paper; -import com.eternalcode.combat.EternalCombatApi; -import com.eternalcode.combat.EternalCombatProvider; -import com.eternalcode.combat.fight.FightManager; import com.eternalcode.formatter.ChatFormatterPlugin; import com.eternalcode.formatter.ChatHandler; import io.papermc.paper.event.player.AsyncChatEvent; From 2bd624fbb018f74841f9e8b3eb754687c7db64c5 Mon Sep 17 00:00:00 2001 From: Martin Sulikowski Date: Wed, 18 Oct 2023 17:56:01 +0200 Subject: [PATCH 03/10] Improve shadowAll task, setup working `runServer` task --- chatformatter-core/build.gradle.kts | 4 +- .../formatter/ChatFormatterPlugin.java | 5 +- .../adventure/PlayerSignedMessage.java | 60 ------------------- chatformatter-paper-plugin/build.gradle.kts | 17 +++--- 4 files changed, 15 insertions(+), 71 deletions(-) delete mode 100644 chatformatter-core/src/main/java/com/eternalcode/formatter/adventure/PlayerSignedMessage.java diff --git a/chatformatter-core/build.gradle.kts b/chatformatter-core/build.gradle.kts index 6a6dc20..7294355 100644 --- a/chatformatter-core/build.gradle.kts +++ b/chatformatter-core/build.gradle.kts @@ -1,5 +1,3 @@ -import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar - plugins { id("eternalcode.java") id("com.github.johnrengelman.shadow") @@ -47,7 +45,7 @@ tasks { useJUnitPlatform() } - withType { + shadowJar { archiveFileName.set("chatformatter-core-${version}.jar") exclude( diff --git a/chatformatter-core/src/main/java/com/eternalcode/formatter/ChatFormatterPlugin.java b/chatformatter-core/src/main/java/com/eternalcode/formatter/ChatFormatterPlugin.java index 297d401..1ab4732 100644 --- a/chatformatter-core/src/main/java/com/eternalcode/formatter/ChatFormatterPlugin.java +++ b/chatformatter-core/src/main/java/com/eternalcode/formatter/ChatFormatterPlugin.java @@ -77,7 +77,10 @@ public ChatFormatterPlugin(Plugin plugin) { public void close() { ChatFormatterApiProvider.disable(); - this.liteCommands.getPlatform().unregisterAll(); + + if (this.liteCommands != null) { + this.liteCommands.getPlatform().unregisterAll(); + } } @Override diff --git a/chatformatter-core/src/main/java/com/eternalcode/formatter/adventure/PlayerSignedMessage.java b/chatformatter-core/src/main/java/com/eternalcode/formatter/adventure/PlayerSignedMessage.java deleted file mode 100644 index f16c6fe..0000000 --- a/chatformatter-core/src/main/java/com/eternalcode/formatter/adventure/PlayerSignedMessage.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.eternalcode.formatter.adventure; - -import net.kyori.adventure.chat.SignedMessage; -import net.kyori.adventure.identity.Identity; -import net.kyori.adventure.text.Component; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.security.SecureRandom; -import java.time.Instant; - -public class PlayerSignedMessage implements SignedMessage { - - private static final SecureRandom RANDOM = new SecureRandom(); - - private final Instant instant; - private final long salt; - private final Component unsignedContent; - private final String message; - private final Identity identity; - - public PlayerSignedMessage(Component unsignedContent, Identity identity) { - this.identity = identity; - this.instant = Instant.now(); - this.salt = RANDOM.nextLong(); - this.unsignedContent = unsignedContent; - this.message = "-"; - } - - @Override - public @NotNull Instant timestamp() { - return this.instant; - } - - @Override - public long salt() { - return this.salt; - } - - @Override - public Signature signature() { - return null; - } - - @Override - public @Nullable Component unsignedContent() { - return this.unsignedContent; - } - - @Override - public @NotNull String message() { - return this.message; - } - - @Override - public @NotNull Identity identity() { - return this.identity; - } - -} diff --git a/chatformatter-paper-plugin/build.gradle.kts b/chatformatter-paper-plugin/build.gradle.kts index 990ea23..0d26e7a 100644 --- a/chatformatter-paper-plugin/build.gradle.kts +++ b/chatformatter-paper-plugin/build.gradle.kts @@ -18,6 +18,7 @@ bukkit { prefix = "ChatFormatter" author = "EternalCodeTeam" name = "ChatFormatter" + depend = listOf("PlaceholderAPI", "Vault") version = "${project.version}" } @@ -26,7 +27,7 @@ dependencies { compileOnly("io.papermc.paper:paper-api:1.19.3-R0.1-SNAPSHOT") } -tasks.withType { +tasks.shadowJar { archiveFileName.set("chatformatter-paper-plugin-${version}.jar") exclude( @@ -39,7 +40,9 @@ tasks.withType { mergeServiceFiles() } -tasks.create("shadowAll") { +tasks.create("shadowAll", ShadowJar::class) { + group = "shadow" + val projects = listOf( project(":chatformatter-core"), project(":chatformatter-paper-plugin") @@ -107,11 +110,11 @@ fun merge(archiveFileName: String, projects: List) { } +runPaper { + disablePluginJarDetection() +} + tasks.runServer { minecraftVersion("1.19.3") - downloadPlugins { - val outputFile = File(project.layout.buildDirectory.asFile.get(), "libs/ChatFormatter v${project.version}.jar") - - downloadPlugins.url(outputFile.toURL()!!.toString()) - } + pluginJars = files("/build/libs/ChatFormatter v${project.version}.jar") } From 5c50283cbef8cee41275d2e8b9e150f284bc83b7 Mon Sep 17 00:00:00 2001 From: Martin Sulikowski Date: Wed, 18 Oct 2023 18:18:12 +0200 Subject: [PATCH 04/10] Update CI --- .github/workflows/gradle.yml | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 62fcec6..ecfa47f 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -34,14 +34,9 @@ jobs: - name: Build with Gradle uses: gradle/gradle-build-action@62cce3c597efd445cd71ee868887b8b1117703a7 with: - arguments: core:shadowJar paper-support:shadowJar + arguments: shadowAll - name: Upload a ChatFormatter Artifact uses: actions/upload-artifact@v3.1.3 with: name: 'Successfully build ChatFormatter' - path: core/build/libs/*.jar - - name: Upload a PaperSupport Artifact - uses: actions/upload-artifact@v3.1.3 - with: - name: 'Successfully build PaperSupport' - path: paper-support/build/libs/*.jar + path: chatformatter-paper-plugin/build/libs/*.jar \ No newline at end of file From 5f8e88c7c992c25cae3b6a21b015f981d577f37b Mon Sep 17 00:00:00 2001 From: Martin Sulikowski Date: Wed, 18 Oct 2023 18:21:36 +0200 Subject: [PATCH 05/10] Correct CI path. --- .github/workflows/gradle.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index ecfa47f..cdf56d1 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -39,4 +39,4 @@ jobs: uses: actions/upload-artifact@v3.1.3 with: name: 'Successfully build ChatFormatter' - path: chatformatter-paper-plugin/build/libs/*.jar \ No newline at end of file + path: chatformatter-paper-plugin/build/libs/ChatFormatter*.jar \ No newline at end of file From 1dc173317b4803ca8b390957e6dfd5e7807db0ed Mon Sep 17 00:00:00 2001 From: Martin Sulikowski Date: Wed, 18 Oct 2023 18:23:00 +0200 Subject: [PATCH 06/10] Correct CI path. --- .github/workflows/gradle.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index cdf56d1..18a8a2c 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -39,4 +39,4 @@ jobs: uses: actions/upload-artifact@v3.1.3 with: name: 'Successfully build ChatFormatter' - path: chatformatter-paper-plugin/build/libs/ChatFormatter*.jar \ No newline at end of file + path: chatformatter-paper-plugin/build/libs/ChatFormatter v*.jar \ No newline at end of file From 1fb2a412fa11cb1af7b1d08ce540d7f9eb2a99f2 Mon Sep 17 00:00:00 2001 From: Martin Sulikowski Date: Wed, 18 Oct 2023 18:54:07 +0200 Subject: [PATCH 07/10] Remove unnecessary type. --- chatformatter-paper-plugin/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chatformatter-paper-plugin/build.gradle.kts b/chatformatter-paper-plugin/build.gradle.kts index 0d26e7a..25a2f79 100644 --- a/chatformatter-paper-plugin/build.gradle.kts +++ b/chatformatter-paper-plugin/build.gradle.kts @@ -40,7 +40,7 @@ tasks.shadowJar { mergeServiceFiles() } -tasks.create("shadowAll", ShadowJar::class) { +tasks.create("shadowAll") { group = "shadow" val projects = listOf( From 69e7eee2d9d8f55e9ec646a38e2475fe9d88e737 Mon Sep 17 00:00:00 2001 From: Rollczi Date: Wed, 18 Oct 2023 19:39:55 +0200 Subject: [PATCH 08/10] Move shadowAll to main gradle plugin. --- .github/workflows/gradle.yml | 2 +- build.gradle.kts | 90 +++++++++++++++++++++ chatformatter-paper-plugin/build.gradle.kts | 87 -------------------- 3 files changed, 91 insertions(+), 88 deletions(-) create mode 100644 build.gradle.kts diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 18a8a2c..a65c3bd 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -39,4 +39,4 @@ jobs: uses: actions/upload-artifact@v3.1.3 with: name: 'Successfully build ChatFormatter' - path: chatformatter-paper-plugin/build/libs/ChatFormatter v*.jar \ No newline at end of file + path: build/libs/ChatFormatter v*.jar \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..46b3e1a --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,90 @@ +import java.io.FileOutputStream +import java.io.IOException +import java.util.jar.JarEntry +import java.util.jar.JarFile +import java.util.jar.JarOutputStream + +plugins{ + id("eternalcode.java") + id("com.github.johnrengelman.shadow") + id("xyz.jpenilla.run-paper") version "2.2.0" +} + +tasks.create("shadowAll") { + group = "shadow" + + val projects = listOf( + project(":chatformatter-core"), + project(":chatformatter-paper-plugin") + ) + + for (project in projects) { + dependsOn(project.name + ":shadowJar") + } + + doLast { + merge("ChatFormatter v${project.version}.jar", projects) + } +} + +fun merge(archiveFileName: String, projects: List) { + val outputFile = File(project.layout.buildDirectory.asFile.get(), "libs/${archiveFileName}") + val outputDir = outputFile.parentFile ?: throw RuntimeException("Could not get output directory") + + if (!outputDir.exists() && !outputDir.mkdirs()) { + throw RuntimeException("Could not create output directory") + } + + if (outputFile.exists()) { + outputFile.delete() + } + + if (!outputFile.createNewFile()) { + throw RuntimeException("Could not find output file to merge") + } + + JarOutputStream(FileOutputStream(outputFile)).use { outputJar -> + for (project in projects) { + val shadowJar = project.tasks.shadowJar.get() + + for (file in shadowJar.outputs.files.files) { + JarFile(file).use { jarFile -> + for (entry in jarFile.entries()) { + if (entry.isDirectory) { + continue + } + + val bytes = jarFile.getInputStream(entry).readBytes() + val newEntry = JarEntry(entry.name) + + newEntry.setTime(System.currentTimeMillis()) + newEntry.setSize(bytes.size.toLong()) + + try { + outputJar.putNextEntry(newEntry) + outputJar.write(bytes) + outputJar.closeEntry() + } + catch (exception: IOException) { + if (exception.message?.contains("duplicate entry: ") == true) { + continue + } + + exception.printStackTrace() + } + } + } + } + } + } + +} + +runPaper { + disablePluginJarDetection() +} + +tasks.runServer { + minecraftVersion("1.19.3") + pluginJars = files("/build/libs/ChatFormatter v${project.version}.jar") +} diff --git a/chatformatter-paper-plugin/build.gradle.kts b/chatformatter-paper-plugin/build.gradle.kts index 25a2f79..d60e004 100644 --- a/chatformatter-paper-plugin/build.gradle.kts +++ b/chatformatter-paper-plugin/build.gradle.kts @@ -1,15 +1,7 @@ -import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar -import java.io.FileOutputStream -import java.io.IOException -import java.util.jar.JarEntry -import java.util.jar.JarFile -import java.util.jar.JarOutputStream - plugins{ id("eternalcode.java") id("net.minecrell.plugin-yml.bukkit") id("com.github.johnrengelman.shadow") - id("xyz.jpenilla.run-paper") version "2.2.0" } bukkit { @@ -39,82 +31,3 @@ tasks.shadowJar { mergeServiceFiles() } - -tasks.create("shadowAll") { - group = "shadow" - - val projects = listOf( - project(":chatformatter-core"), - project(":chatformatter-paper-plugin") - ) - - for (project in projects) { - dependsOn(project.tasks.shadowJar) - } - - doLast { - merge("ChatFormatter v${project.version}.jar", projects) - } -} - -fun merge(archiveFileName: String, projects: List) { - val outputFile = File(project.layout.buildDirectory.asFile.get(), "libs/${archiveFileName}") - val outputDir = outputFile.parentFile ?: throw RuntimeException("Could not get output directory") - - if (!outputDir.exists() && !outputDir.mkdirs()) { - throw RuntimeException("Could not create output directory") - } - - if (outputFile.exists()) { - outputFile.delete() - } - - if (!outputFile.createNewFile()) { - throw RuntimeException("Could not find output file to merge") - } - - JarOutputStream(FileOutputStream(outputFile)).use { outputJar -> - for (project in projects) { - val shadowJar = project.tasks.shadowJar.get() - - for (file in shadowJar.outputs.files.files) { - JarFile(file).use { jarFile -> - for (entry in jarFile.entries()) { - if (entry.isDirectory) { - continue - } - - val bytes = jarFile.getInputStream(entry).readBytes() - val newEntry = JarEntry(entry.name) - - newEntry.setTime(System.currentTimeMillis()) - newEntry.setSize(bytes.size.toLong()) - - try { - outputJar.putNextEntry(newEntry) - outputJar.write(bytes) - outputJar.closeEntry() - } - catch (exception: IOException) { - if (exception.message?.contains("duplicate entry: ") == true) { - continue - } - - exception.printStackTrace() - } - } - } - } - } - } - -} - -runPaper { - disablePluginJarDetection() -} - -tasks.runServer { - minecraftVersion("1.19.3") - pluginJars = files("/build/libs/ChatFormatter v${project.version}.jar") -} From 43d4c82c6b9bc8da41603fe9b2c69abefc94f627 Mon Sep 17 00:00:00 2001 From: Martin Sulikowski Date: Thu, 19 Oct 2023 19:12:50 +0200 Subject: [PATCH 09/10] Revert to "default" --- .../java/com/eternalcode/formatter/config/PluginConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chatformatter-core/src/main/java/com/eternalcode/formatter/config/PluginConfig.java b/chatformatter-core/src/main/java/com/eternalcode/formatter/config/PluginConfig.java index 6e03e60..6de6a50 100644 --- a/chatformatter-core/src/main/java/com/eternalcode/formatter/config/PluginConfig.java +++ b/chatformatter-core/src/main/java/com/eternalcode/formatter/config/PluginConfig.java @@ -48,7 +48,7 @@ public class PluginConfig implements ChatSettings, PlaceholderStack, TemplateRep }) public String defaultFormat = "{displayname} {arrow_right} {message}"; public Map format = new ImmutableMap.Builder() - .put("member", "{member} &f{displayname} &8{arrow_right} {message} ") + .put("default", "{member} &f{displayname} &8{arrow_right} {message} ") .put("admin", "$template({admin}, &c)") .build(); From 710aec25347e489f5cc2b2715081d0706bc7ea7d Mon Sep 17 00:00:00 2001 From: Rollczi Date: Sun, 22 Oct 2023 01:20:25 +0200 Subject: [PATCH 10/10] Fix component serializing to message content. --- build.gradle.kts | 3 ++- .../formatter/ChatHandlerImpl.java | 15 +++++------ .../formatter/adventure/ComponentUtil.java | 25 +++++++++++++++++++ 3 files changed, 35 insertions(+), 8 deletions(-) create mode 100644 chatformatter-core/src/main/java/com/eternalcode/formatter/adventure/ComponentUtil.java diff --git a/build.gradle.kts b/build.gradle.kts index 46b3e1a..f2e2e44 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -85,6 +85,7 @@ runPaper { } tasks.runServer { - minecraftVersion("1.19.3") + minecraftVersion("1.20.1") + dependsOn("shadowAll") pluginJars = files("/build/libs/ChatFormatter v${project.version}.jar") } diff --git a/chatformatter-core/src/main/java/com/eternalcode/formatter/ChatHandlerImpl.java b/chatformatter-core/src/main/java/com/eternalcode/formatter/ChatHandlerImpl.java index 6828d09..ea00680 100644 --- a/chatformatter-core/src/main/java/com/eternalcode/formatter/ChatHandlerImpl.java +++ b/chatformatter-core/src/main/java/com/eternalcode/formatter/ChatHandlerImpl.java @@ -1,5 +1,6 @@ package com.eternalcode.formatter; +import com.eternalcode.formatter.adventure.ComponentUtil; import com.eternalcode.formatter.adventure.TextColorTagResolver; import com.eternalcode.formatter.legacy.Legacy; import com.eternalcode.formatter.legacy.LegacyPostMessageProcessor; @@ -64,7 +65,7 @@ class ChatHandlerImpl implements ChatHandler { .build(); private static final GsonComponentSerializer GSON = GsonComponentSerializer.gson(); - private static final MiniMessage MESSAGE_DESERIALIZER = MiniMessage.builder() + private static final MiniMessage EMPTY_MESSAGE_DESERIALIZER = MiniMessage.builder() .tags(TagResolver.empty()) .preProcessor(new LegacyPreProcessor()) .postProcessor(new LegacyPostMessageProcessor()) @@ -103,10 +104,10 @@ private TagResolver createTags(ChatMessage chatMessage) { Player sender = chatMessage.sender(); Component message = GSON.deserialize(chatMessage.jsonMessage()); - String messageString = MESSAGE_DESERIALIZER.serialize(message); + String rawMessage = ComponentUtil.toRawContent(message); TagResolver.Single displayNamePlaceholder = displayNamePlaceholder(sender); - TagResolver.Single messagePlaceholder = messagePlaceholder(sender, messageString); + TagResolver.Single messagePlaceholder = messagePlaceholder(sender, rawMessage); return TagResolver.resolver(displayNamePlaceholder, messagePlaceholder); } @@ -115,12 +116,12 @@ private TagResolver.Single displayNamePlaceholder(Player sender) { return Placeholder.parsed("displayname", Legacy.clearSection(sender.getDisplayName())); } - private TagResolver.Single messagePlaceholder(Player sender, String messageString) { + private TagResolver.Single messagePlaceholder(Player sender, String rawMessage) { String safeMessage = sender.hasPermission(PERMISSION_LEGACY) - ? messageString - : Legacy.ampersandToPlaceholder(messageString); + ? rawMessage + : Legacy.ampersandToPlaceholder(rawMessage); - Component componentMessage = MESSAGE_DESERIALIZER.deserialize(safeMessage, this.providePermittedTags(sender)); + Component componentMessage = EMPTY_MESSAGE_DESERIALIZER.deserialize(safeMessage, this.providePermittedTags(sender)); return Placeholder.component("message", componentMessage); } diff --git a/chatformatter-core/src/main/java/com/eternalcode/formatter/adventure/ComponentUtil.java b/chatformatter-core/src/main/java/com/eternalcode/formatter/adventure/ComponentUtil.java new file mode 100644 index 0000000..953ce46 --- /dev/null +++ b/chatformatter-core/src/main/java/com/eternalcode/formatter/adventure/ComponentUtil.java @@ -0,0 +1,25 @@ +package com.eternalcode.formatter.adventure; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.TextComponent; + +public final class ComponentUtil { + + private ComponentUtil() { + } + + public static String toRawContent(Component component) { + StringBuilder builder = new StringBuilder(); + + if (component instanceof TextComponent textComponent) { + builder.append(textComponent.content()); + } + + for (Component child : component.children()) { + builder.append(toRawContent(child)); + } + + return builder.toString(); + } + +}