diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 62fcec6..a65c3bd 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: 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..f2e2e44 --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,91 @@ +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.20.1") + dependsOn("shadowAll") + pluginJars = files("/build/libs/ChatFormatter v${project.version}.jar") +} 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 77% rename from core/build.gradle.kts rename to chatformatter-core/build.gradle.kts index d556d05..7294355 100644 --- a/core/build.gradle.kts +++ b/chatformatter-core/build.gradle.kts @@ -1,21 +1,6 @@ -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 +41,12 @@ dependencies { } tasks { - runServer { - minecraftVersion("1.19.3") - } - withType { useJUnitPlatform() } - withType { - archiveFileName.set("ChatFormatter v${project.version}.jar") + shadowJar { + archiveFileName.set("chatformatter-core-${version}.jar") exclude( "org/intellij/lang/annotations/**", @@ -78,6 +59,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..1ab4732 --- /dev/null +++ b/chatformatter-core/src/main/java/com/eternalcode/formatter/ChatFormatterPlugin.java @@ -0,0 +1,106 @@ +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(); + + if (this.liteCommands != null) { + 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 58% 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..ea00680 100644 --- a/core/src/main/java/com/eternalcode/formatter/ChatController.java +++ b/chatformatter-core/src/main/java/com/eternalcode/formatter/ChatHandlerImpl.java @@ -1,19 +1,14 @@ 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; 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 +18,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"; @@ -75,101 +65,68 @@ class ChatController implements Listener { .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()) .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 rawMessage = ComponentUtil.toRawContent(message); - recipientAudience.sendMessage(signedMessage, chatType); - } + TagResolver.Single displayNamePlaceholder = displayNamePlaceholder(sender); + TagResolver.Single messagePlaceholder = messagePlaceholder(sender, rawMessage); - 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 rawMessage) { + String safeMessage = sender.hasPermission(PERMISSION_LEGACY) + ? rawMessage + : Legacy.ampersandToPlaceholder(rawMessage); - 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 = EMPTY_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/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(); + } + +} 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 91% 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..6de6a50 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,6 +46,7 @@ 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("admin", "$template({admin}, &c)") @@ -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/paper-support/build.gradle.kts b/chatformatter-paper-plugin/build.gradle.kts similarity index 50% rename from paper-support/build.gradle.kts rename to chatformatter-paper-plugin/build.gradle.kts index 5f8fa75..d60e004 100644 --- a/paper-support/build.gradle.kts +++ b/chatformatter-paper-plugin/build.gradle.kts @@ -1,5 +1,3 @@ -import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar - plugins{ id("eternalcode.java") id("net.minecrell.plugin-yml.bukkit") @@ -7,23 +5,22 @@ 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" + depend = listOf("PlaceholderAPI", "Vault") version = "${project.version}" - depend = listOf("ChatFormatter") } dependencies { - compileOnly(project(":core")) - implementation(project(":paper-multi-version-support")) + compileOnly(project(":chatformatter-core")) compileOnly("io.papermc.paper:paper-api:1.19.3-R0.1-SNAPSHOT") } -tasks.withType { - archiveFileName.set("ChatFormatter-PaperSupport v${project.version}.jar") +tasks.shadowJar { + archiveFileName.set("chatformatter-paper-plugin-${version}.jar") exclude( "org/intellij/lang/annotations/**", @@ -33,4 +30,4 @@ tasks.withType { ) mergeServiceFiles() -} \ No newline at end of file +} 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..083fa8b --- /dev/null +++ b/chatformatter-paper-plugin/src/main/java/com/eternalcode/formatter/paper/ChatFormatterPaperPlugin.java @@ -0,0 +1,33 @@ +package com.eternalcode.formatter.paper; + +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/adventure/PlayerSignedMessage.java b/core/src/main/java/com/eternalcode/formatter/adventure/PlayerSignedMessage.java deleted file mode 100644 index f16c6fe..0000000 --- a/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/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/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")