diff --git a/build.gradle.kts b/build.gradle.kts index 5133942..1de2799 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -5,32 +5,41 @@ plugins { `java-library` alias(libs.plugins.lombok) alias(libs.plugins.runpaper) - alias(libs.plugins.userdev) +// alias(libs.plugins.userdev) alias(libs.plugins.shadow) // Plugins for publishing on platforms alias(libs.plugins.hangar) alias(libs.plugins.minotaur) // Plugins to generate plugin metadata files -// alias(libs.plugins.paperyml) + alias(libs.plugins.paperyml) alias(libs.plugins.pluginyml) } repositories { mavenCentral() + maven() { + url = uri("https://hub.spigotmc.org/nexus/content/repositories/snapshots/") + content { + includeGroup("org.spigotmc") + includeGroup("org.bukkit") + } + } maven("https://jitpack.io") maven("https://repo.extendedclip.com/content/repositories/placeholderapi/") maven("https://repo.techscode.com/repository/maven-releases/") } dependencies { - paperweight.paperDevBundle(libs.versions.minecraft) +// paperweight.paperDevBundle(libs.versions.minecraft) + compileOnly(libs.spigot) - compileOnly(libs.jedis) - compileOnly(libs.commandframework) - compileOnly(libs.configlib) - compileOnly(libs.guice) - compileOnly(libs.hikaridb) - compileOnly(libs.stringsimilarity) + library(libs.jedis) + library(libs.commandframework) + library(libs.configlib) + library(libs.guice) + library(libs.hikaridb) + library(libs.stringsimilarity) + library(libs.bundles.adventure) // Plugin dependencies compileOnly(libs.miniplaceholders) @@ -39,6 +48,7 @@ dependencies { compileOnly(libs.ultrapermissions) implementation(libs.bstats) + implementation(projects.paper) } tasks { @@ -46,6 +56,9 @@ tasks { options.encoding = Charsets.UTF_8.name() options.release.set(17) } + build { + dependsOn("shadowJar") + } processResources { filteringCharset = Charsets.UTF_8.name() val props = mapOf( @@ -63,7 +76,7 @@ tasks { options.encoding = Charsets.UTF_8.name() } assemble { - dependsOn(reobfJar) +// dependsOn(reobfJar) } jar { enabled = false @@ -79,13 +92,16 @@ tasks { exclude("META-INF/versions/**") exclude("META-INF/**.kotlin_module") } - minimize() +// minimize() + } + runServer { + minecraftVersion("1.20.4") } } tasks.getByName("modrinth").dependsOn(tasks.modrinthSyncBody) -val versions = listOf("1.19.2", "1.19.4", "1.20", "1.20.1", "1.20.2"); +val versions = listOf("1.19.4", "1.20", "1.20.1", "1.20.2", "1.20.3", "1.20.4"); modrinth { token.set(System.getenv("MODRINTH_TOKEN")) @@ -143,25 +159,30 @@ bukkit { load = BukkitPluginDescription.PluginLoadOrder.POSTWORLD softDepend = listOf("MiniPlaceholders", "LuckPerms", "PlaceholderAPI", "UltraPermissions") prefix = "FairyChat" + generateLibrariesJson = true } -//paper { -// main = "de.rexlmanu.fairychat.plugin.FairyChatPlugin" -// loader = "de.rexlmanu.fairychat.plugin.FairyChatLoader" -// apiVersion = "1.19" -// foliaSupported = true -// author = "rexlManu" -// website = "https://github.com/rexlManu/FairyChat" -// prefix = "FairyChat" -// serverDependencies { -// register("MiniPlaceholders") { -// required = false -// } -// register("LuckPerms") { -// required = false -// } -// register("PlaceholderAPI") { -// required = false -// } -// } -//} \ No newline at end of file +paper { + main = "de.rexlmanu.fairychat.plugin.FairyChatPlugin" + loader = "de.rexlmanu.fairychat.plugin.paper.FairyChatLoader" + apiVersion = "1.20" + foliaSupported = true + author = "rexlManu" + website = "https://github.com/rexlManu/FairyChat" + prefix = "FairyChat" + serverDependencies { + register("MiniPlaceholders") { + required = false + } + register("LuckPerms") { + required = false + } + register("PlaceholderAPI") { + required = false + } + register("UltraPermissions") { + required = false + } + } + generateLibrariesJson = true +} \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e70de8f..fbb7f44 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,7 @@ [versions] minecraft = "1.20.4-R0.1-SNAPSHOT" +adventure = "4.3.2" +minimessage = "4.16.0" [plugins] userdev = { id = "io.papermc.paperweight.userdev", version = "1.5.11" } runpaper = { id = "xyz.jpenilla.run-paper", version = "2.2.2" } @@ -10,6 +12,9 @@ minotaur = { id = "com.modrinth.minotaur", version = "2.8.7" } paperyml = { id = "net.minecrell.plugin-yml.paper", version = "0.6.0" } pluginyml = { id = "net.minecrell.plugin-yml.bukkit", version = "0.6.0" } [libraries] +spigot = { module = "org.spigotmc:spigot-api", version = "1.20.4-R0.1-SNAPSHOT" } +paper = { module = "io.papermc.paper:paper-api", version = "1.20.4-R0.1-SNAPSHOT" } + annotations = { module = "org.jetbrains:annotations", version = "24.1.0" } jedis = { module = "redis.clients:jedis", version = "4.1.1" } miniplaceholders = { module = "io.github.miniplaceholders:miniplaceholders-api", version = "2.2.3" } @@ -21,4 +26,19 @@ bstats = { module = "org.bstats:bstats-bukkit", version = "3.0.2" } hikaridb = { module = "com.zaxxer:HikariCP", version = "5.0.1" } placeholderapi = { module = "me.clip:placeholderapi", version = "2.11.5" } stringsimilarity = { module = "net.ricecode:string-similarity", version = "1.0.0" } -ultrapermissions = { module = "me.TechsCode:UltraPermissionsAPI", version = "5.5.2" } \ No newline at end of file +ultrapermissions = { module = "me.TechsCode:UltraPermissionsAPI", version = "5.5.2" } + +adventure-platform-bukkit = { module = "net.kyori:adventure-platform-bukkit", version.ref = "adventure" } +adventure-minimessage = { module = "net.kyori:adventure-text-minimessage", version.ref = "minimessage" } +adventure-text-serializer-plain = { module = "net.kyori:adventure-text-serializer-plain", version.ref = "minimessage" } +adventure-text-serializer-gson = { module = "net.kyori:adventure-text-serializer-gson", version.ref = "minimessage" } +adventure-text-serializer-legacy = { module = "net.kyori:adventure-text-serializer-legacy", version.ref = "minimessage" } + +[bundles] +adventure = [ + "adventure-platform-bukkit", + "adventure-minimessage", + "adventure-text-serializer-plain", + "adventure-text-serializer-gson", + "adventure-text-serializer-legacy" +] \ No newline at end of file diff --git a/paper/build.gradle.kts b/paper/build.gradle.kts new file mode 100644 index 0000000..4a9ce02 --- /dev/null +++ b/paper/build.gradle.kts @@ -0,0 +1,13 @@ +plugins { + `java-library` + alias(libs.plugins.lombok) +} +repositories { + mavenCentral() + maven("https://repo.papermc.io/repository/maven-public/") +} + +dependencies { + compileOnly(libs.paper) + compileOnly(libs.guice) +} \ No newline at end of file diff --git a/paper/src/main/java/de/rexlmanu/fairychat/plugin/paper/AdaptPluginMeta.java b/paper/src/main/java/de/rexlmanu/fairychat/plugin/paper/AdaptPluginMeta.java new file mode 100644 index 0000000..3fefa1d --- /dev/null +++ b/paper/src/main/java/de/rexlmanu/fairychat/plugin/paper/AdaptPluginMeta.java @@ -0,0 +1,3 @@ +package de.rexlmanu.fairychat.plugin.paper; + +public record AdaptPluginMeta(String version) {} diff --git a/paper/src/main/java/de/rexlmanu/fairychat/plugin/paper/DefaultChatRenderer.java b/paper/src/main/java/de/rexlmanu/fairychat/plugin/paper/DefaultChatRenderer.java new file mode 100644 index 0000000..fe1d543 --- /dev/null +++ b/paper/src/main/java/de/rexlmanu/fairychat/plugin/paper/DefaultChatRenderer.java @@ -0,0 +1,14 @@ +package de.rexlmanu.fairychat.plugin.paper; + +import net.kyori.adventure.audience.Audience; +import net.kyori.adventure.text.Component; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +public interface DefaultChatRenderer { + Component render( + @NotNull Player source, + @NotNull Component sourceDisplayName, + @NotNull Component message, + @NotNull Audience viewer); +} diff --git a/paper/src/main/java/de/rexlmanu/fairychat/plugin/paper/Environment.java b/paper/src/main/java/de/rexlmanu/fairychat/plugin/paper/Environment.java new file mode 100644 index 0000000..5ce3274 --- /dev/null +++ b/paper/src/main/java/de/rexlmanu/fairychat/plugin/paper/Environment.java @@ -0,0 +1,37 @@ +package de.rexlmanu.fairychat.plugin.paper; + +public enum Environment { + SPIGOT, + PAPER, + UNKNOWN; + + public static final Environment ENVIRONMENT = detectEnvironment(); + + public boolean isPaper() { + return this == PAPER; + } + + public boolean isSpigot() { + return this == SPIGOT; + } + + private static Environment detectEnvironment() { + if (hasClass("com.destroystokyo.paper.PaperConfig") + || hasClass("io.papermc.paper.configuration.Configuration")) { + return PAPER; + } else if (hasClass("org.spigotmc.SpigotConfig")) { + return SPIGOT; + } else { + return UNKNOWN; + } + } + + private static boolean hasClass(String className) { + try { + Class.forName(className); + return true; + } catch (ClassNotFoundException e) { + return false; + } + } +} diff --git a/paper/src/main/java/de/rexlmanu/fairychat/plugin/paper/FairyChatLoader.java b/paper/src/main/java/de/rexlmanu/fairychat/plugin/paper/FairyChatLoader.java new file mode 100644 index 0000000..f402201 --- /dev/null +++ b/paper/src/main/java/de/rexlmanu/fairychat/plugin/paper/FairyChatLoader.java @@ -0,0 +1,49 @@ +package de.rexlmanu.fairychat.plugin.paper; + +import com.google.gson.Gson; +import io.papermc.paper.plugin.loader.PluginClasspathBuilder; +import io.papermc.paper.plugin.loader.PluginLoader; +import io.papermc.paper.plugin.loader.library.impl.MavenLibraryResolver; +import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.util.List; +import java.util.Map; +import java.util.stream.Stream; +import org.eclipse.aether.artifact.DefaultArtifact; +import org.eclipse.aether.graph.Dependency; +import org.eclipse.aether.repository.RemoteRepository; +import org.jetbrains.annotations.NotNull; + +@SuppressWarnings("UnstableApiUsage") +public class FairyChatLoader implements PluginLoader { + @Override + public void classloader(@NotNull PluginClasspathBuilder classpathBuilder) { + MavenLibraryResolver resolver = new MavenLibraryResolver(); + PluginLibraries pluginLibraries = this.load(); + pluginLibraries.asDependencies().forEach(resolver::addDependency); + pluginLibraries.asRepositories().forEach(resolver::addRepository); + classpathBuilder.addLibrary(resolver); + } + + public PluginLibraries load() { + try (var inputStream = this.getClass().getResourceAsStream("/paper-libraries.json")) { + return new Gson() + .fromJson( + new InputStreamReader(inputStream, StandardCharsets.UTF_8), PluginLibraries.class); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private record PluginLibraries(Map repositories, List dependencies) { + public Stream asDependencies() { + return this.dependencies.stream().map(d -> new Dependency(new DefaultArtifact(d), null)); + } + + public Stream asRepositories() { + return this.repositories.entrySet().stream() + .map(e -> new RemoteRepository.Builder(e.getKey(), "default", e.getValue()).build()); + } + } +} diff --git a/src/main/java/de/rexlmanu/fairychat/plugin/utility/scheduler/FoliaPluginScheduler.java b/paper/src/main/java/de/rexlmanu/fairychat/plugin/paper/FoliaPluginScheduler.java similarity index 93% rename from src/main/java/de/rexlmanu/fairychat/plugin/utility/scheduler/FoliaPluginScheduler.java rename to paper/src/main/java/de/rexlmanu/fairychat/plugin/paper/FoliaPluginScheduler.java index 30291db..fbf14ec 100644 --- a/src/main/java/de/rexlmanu/fairychat/plugin/utility/scheduler/FoliaPluginScheduler.java +++ b/paper/src/main/java/de/rexlmanu/fairychat/plugin/paper/FoliaPluginScheduler.java @@ -1,4 +1,4 @@ -package de.rexlmanu.fairychat.plugin.utility.scheduler; +package de.rexlmanu.fairychat.plugin.paper; import com.google.inject.Inject; import com.google.inject.Singleton; diff --git a/paper/src/main/java/de/rexlmanu/fairychat/plugin/paper/PaperAsyncChatHandler.java b/paper/src/main/java/de/rexlmanu/fairychat/plugin/paper/PaperAsyncChatHandler.java new file mode 100644 index 0000000..6045dc8 --- /dev/null +++ b/paper/src/main/java/de/rexlmanu/fairychat/plugin/paper/PaperAsyncChatHandler.java @@ -0,0 +1,50 @@ +package de.rexlmanu.fairychat.plugin.paper; + +import io.papermc.paper.event.player.AsyncChatEvent; +import java.util.Set; +import java.util.function.Consumer; +import lombok.Data; +import lombok.RequiredArgsConstructor; +import net.kyori.adventure.audience.Audience; +import net.kyori.adventure.text.Component; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.jetbrains.annotations.NotNull; + +@RequiredArgsConstructor +public class PaperAsyncChatHandler implements Listener { + @RequiredArgsConstructor + @Data + public static class WrappedAsyncChatEvent { + private final AsyncChatEvent event; + + public Player getPlayer() { + return this.event.getPlayer(); + } + + public void setCancelled(boolean cancelled) { + this.event.setCancelled(cancelled); + } + + public void renderer(DefaultChatRenderer renderer) { + this.event.renderer(renderer::render); + } + + public @NotNull Set viewers() { + return this.event.viewers(); + } + + public Component message() { + return this.event.message(); + } + } + + private final Consumer eventConsumer; + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void handle(AsyncChatEvent event) { + this.eventConsumer.accept(new WrappedAsyncChatEvent(event)); + } +} diff --git a/paper/src/main/java/de/rexlmanu/fairychat/plugin/paper/PluginMetaFactory.java b/paper/src/main/java/de/rexlmanu/fairychat/plugin/paper/PluginMetaFactory.java new file mode 100644 index 0000000..e235359 --- /dev/null +++ b/paper/src/main/java/de/rexlmanu/fairychat/plugin/paper/PluginMetaFactory.java @@ -0,0 +1,15 @@ +package de.rexlmanu.fairychat.plugin.paper; + +import lombok.experimental.UtilityClass; +import org.bukkit.plugin.java.JavaPlugin; + +@UtilityClass +public class PluginMetaFactory { + public AdaptPluginMeta create(JavaPlugin javaPlugin) { + if (Environment.ENVIRONMENT.isPaper()) { + return new AdaptPluginMeta(javaPlugin.getPluginMeta().getVersion()); + } + + return new AdaptPluginMeta(javaPlugin.getDescription().getVersion()); + } +} diff --git a/src/main/java/de/rexlmanu/fairychat/plugin/utility/scheduler/PluginScheduler.java b/paper/src/main/java/de/rexlmanu/fairychat/plugin/paper/PluginScheduler.java similarity index 70% rename from src/main/java/de/rexlmanu/fairychat/plugin/utility/scheduler/PluginScheduler.java rename to paper/src/main/java/de/rexlmanu/fairychat/plugin/paper/PluginScheduler.java index 1edcb54..5b124e2 100644 --- a/src/main/java/de/rexlmanu/fairychat/plugin/utility/scheduler/PluginScheduler.java +++ b/paper/src/main/java/de/rexlmanu/fairychat/plugin/paper/PluginScheduler.java @@ -1,4 +1,4 @@ -package de.rexlmanu.fairychat.plugin.utility.scheduler; +package de.rexlmanu.fairychat.plugin.paper; public interface PluginScheduler { void runAsync(Runnable runnable); diff --git a/paper/src/main/java/de/rexlmanu/fairychat/plugin/paper/event/EventMessageUtils.java b/paper/src/main/java/de/rexlmanu/fairychat/plugin/paper/event/EventMessageUtils.java new file mode 100644 index 0000000..b4f6219 --- /dev/null +++ b/paper/src/main/java/de/rexlmanu/fairychat/plugin/paper/event/EventMessageUtils.java @@ -0,0 +1,115 @@ +package de.rexlmanu.fairychat.plugin.paper.event; + +import de.rexlmanu.fairychat.plugin.paper.Environment; +import java.util.function.Consumer; +import java.util.function.Supplier; +import lombok.experimental.UtilityClass; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; +import org.bukkit.entity.Player; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.PlayerAdvancementDoneEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.inventory.ItemStack; + +@UtilityClass +public class EventMessageUtils { + public static Supplier quitMessage(PlayerQuitEvent event) { + if (Environment.ENVIRONMENT.isPaper()) { + return event::quitMessage; + } + return () -> { + String quitMessage = event.getQuitMessage(); + if (quitMessage == null) return Component.empty(); + return LegacyComponentSerializer.legacySection().deserialize(quitMessage); + }; + } + + public static Consumer quitMessageSetter(PlayerQuitEvent event) { + if (Environment.ENVIRONMENT.isPaper()) { + return event::quitMessage; + } + return component -> { + if (component == null) { + event.setQuitMessage(null); + return; + } + event.setQuitMessage(LegacyComponentSerializer.legacySection().serialize(component)); + }; + } + + public static Supplier joinMessage(PlayerJoinEvent event) { + if (Environment.ENVIRONMENT.isPaper()) { + return event::joinMessage; + } + return () -> { + String joinMessage = event.getJoinMessage(); + if (joinMessage == null) return Component.empty(); + return LegacyComponentSerializer.legacySection().deserialize(joinMessage); + }; + } + + public static Consumer joinMessageSetter(PlayerJoinEvent event) { + if (Environment.ENVIRONMENT.isPaper()) { + return event::joinMessage; + } + return component -> { + if (component == null) { + event.setJoinMessage(null); + return; + } + event.setJoinMessage(LegacyComponentSerializer.legacySection().serialize(component)); + }; + } + + public static Supplier deathMessage(PlayerDeathEvent event) { + if (Environment.ENVIRONMENT.isPaper()) { + return event::deathMessage; + } + return () -> { + String deathMessage = event.getDeathMessage(); + if (deathMessage == null) return Component.empty(); + return LegacyComponentSerializer.legacySection().deserialize(deathMessage); + }; + } + + public static Consumer deathMessageSetter(PlayerDeathEvent event) { + if (Environment.ENVIRONMENT.isPaper()) { + return event::deathMessage; + } + return component -> { + if (component == null) { + event.setDeathMessage(null); + return; + } + event.setDeathMessage(LegacyComponentSerializer.legacySection().serialize(component)); + }; + } + + public static Supplier advancementMessage(PlayerAdvancementDoneEvent event) { + if (Environment.ENVIRONMENT.isPaper()) { + return event::message; + } + return Component::empty; + } + + public static Consumer advancementMessageSetter(PlayerAdvancementDoneEvent event) { + if (Environment.ENVIRONMENT.isPaper()) { + return event::message; + } + return component -> {}; + } + + public static Supplier playerDisplayName(Player player) { + if (Environment.ENVIRONMENT.isPaper()) return player::displayName; + + return () -> LegacyComponentSerializer.legacySection().deserialize(player.getDisplayName()); + } + + public static Component displayNameOfItem(ItemStack itemStack) { + var component = itemStack.displayName().asComponent().hoverEvent(itemStack.asHoverEvent()); + + return component; + } +} diff --git a/paper/src/main/java/de/rexlmanu/fairychat/plugin/paper/event/FairyAsyncChatEvent.java b/paper/src/main/java/de/rexlmanu/fairychat/plugin/paper/event/FairyAsyncChatEvent.java new file mode 100644 index 0000000..bec7c25 --- /dev/null +++ b/paper/src/main/java/de/rexlmanu/fairychat/plugin/paper/event/FairyAsyncChatEvent.java @@ -0,0 +1,57 @@ +package de.rexlmanu.fairychat.plugin.paper.event; + +import de.rexlmanu.fairychat.plugin.paper.DefaultChatRenderer; +import java.util.Set; +import lombok.Getter; +import lombok.Setter; +import net.kyori.adventure.audience.Audience; +import net.kyori.adventure.text.Component; +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; + +@Getter +@Setter +public class FairyAsyncChatEvent extends Event implements Cancellable { + private static final HandlerList HANDLER_LIST = new HandlerList(); + + private Player player; + private Set viewers; + private DefaultChatRenderer renderer; + private Component message; + private boolean cancelled; + + public FairyAsyncChatEvent( + final boolean async, + final @NotNull Player player, + final @NotNull Set viewers, + final @NotNull DefaultChatRenderer renderer, + final @NotNull Component message) { + super(async); + this.player = player; + this.viewers = viewers; + this.renderer = renderer; + this.message = message; + } + + @Override + public @NotNull HandlerList getHandlers() { + return HANDLER_LIST; + } + + public static HandlerList getHandlerList() { + return HANDLER_LIST; + } + + @Override + public boolean isCancelled() { + return this.cancelled; + } + + @Override + public void setCancelled(boolean cancel) { + this.cancelled = cancel; + } +} diff --git a/paper/src/main/java/de/rexlmanu/fairychat/plugin/paper/event/FairyEventHandler.java b/paper/src/main/java/de/rexlmanu/fairychat/plugin/paper/event/FairyEventHandler.java new file mode 100644 index 0000000..a0e4d7a --- /dev/null +++ b/paper/src/main/java/de/rexlmanu/fairychat/plugin/paper/event/FairyEventHandler.java @@ -0,0 +1,5 @@ +package de.rexlmanu.fairychat.plugin.paper.event; + +import org.bukkit.event.Listener; + +public interface FairyEventHandler extends Listener {} diff --git a/paper/src/main/java/de/rexlmanu/fairychat/plugin/paper/event/PaperEventHandler.java b/paper/src/main/java/de/rexlmanu/fairychat/plugin/paper/event/PaperEventHandler.java new file mode 100644 index 0000000..b66a2dd --- /dev/null +++ b/paper/src/main/java/de/rexlmanu/fairychat/plugin/paper/event/PaperEventHandler.java @@ -0,0 +1,29 @@ +package de.rexlmanu.fairychat.plugin.paper.event; + +import com.google.inject.Inject; +import io.papermc.paper.event.player.AsyncChatEvent; +import java.util.HashSet; +import lombok.RequiredArgsConstructor; +import org.bukkit.event.EventHandler; + +@RequiredArgsConstructor(onConstructor = @__(@Inject)) +public class PaperEventHandler implements FairyEventHandler { + @EventHandler + public void handle(AsyncChatEvent event) { + FairyAsyncChatEvent chatEvent = + new FairyAsyncChatEvent( + event.isAsynchronous(), + event.getPlayer(), + new HashSet<>(event.viewers()), + event.renderer()::render, + event.message()); + + chatEvent.callEvent(); + + event.setCancelled(chatEvent.isCancelled()); + event.renderer(chatEvent.renderer()::render); + event.message(chatEvent.message()); + event.viewers().clear(); + event.viewers().addAll(chatEvent.viewers()); + } +} diff --git a/settings.gradle.kts b/settings.gradle.kts index dc42c5c..ad8b6d6 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,2 +1,4 @@ -rootProject.name = "FairyChat" +enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") +rootProject.name = "FairyChat" +include("paper") diff --git a/src/main/java/de/rexlmanu/fairychat/plugin/FairyChatLoader.java b/src/main/java/de/rexlmanu/fairychat/plugin/FairyChatLoader.java deleted file mode 100644 index 6f60685..0000000 --- a/src/main/java/de/rexlmanu/fairychat/plugin/FairyChatLoader.java +++ /dev/null @@ -1,46 +0,0 @@ -package de.rexlmanu.fairychat.plugin; - -import io.papermc.paper.plugin.loader.PluginClasspathBuilder; -import io.papermc.paper.plugin.loader.PluginLoader; -import io.papermc.paper.plugin.loader.library.impl.MavenLibraryResolver; -import org.eclipse.aether.artifact.DefaultArtifact; -import org.eclipse.aether.graph.Dependency; -import org.eclipse.aether.repository.RemoteRepository; -import org.jetbrains.annotations.NotNull; - -@SuppressWarnings("UnstableApiUsage") -public class FairyChatLoader implements PluginLoader { - - @Override - public void classloader(@NotNull PluginClasspathBuilder classpathBuilder) { - MavenLibraryResolver resolver = new MavenLibraryResolver(); - resolver.addDependency(new Dependency(new DefaultArtifact("redis.clients:jedis:4.1.1"), null)); - resolver.addDependency( - new Dependency(new DefaultArtifact("org.jetbrains:annotations:24.0.1"), null)); - resolver.addDependency( - new Dependency(new DefaultArtifact("cloud.commandframework:cloud-paper:1.8.3"), null)); - resolver.addDependency( - new Dependency( - new DefaultArtifact("de.exlll:configlib-yaml:4.5.0"), null)); - resolver.addDependency( - new Dependency(new DefaultArtifact("com.google.inject:guice:7.0.0"), null)); - resolver.addDependency(new Dependency(new DefaultArtifact("com.zaxxer:HikariCP:5.0.1"), null)); - resolver.addDependency( - new Dependency(new DefaultArtifact("net.ricecode:string-similarity:1.0.0"), null)); - - resolver.addRepository( - new RemoteRepository.Builder( - "paper", "default", "https://repo.papermc.io/repository/maven-public/") - .build()); - resolver.addRepository( - new RemoteRepository.Builder("jitpack", "default", "https://jitpack.io").build()); - resolver.addRepository( - new RemoteRepository.Builder( - "sonatype-snapshots", - "default", - "https://oss.sonatype.org/content/repositories/snapshots") - .build()); - - classpathBuilder.addLibrary(resolver); - } -} diff --git a/src/main/java/de/rexlmanu/fairychat/plugin/FairyChatModule.java b/src/main/java/de/rexlmanu/fairychat/plugin/FairyChatModule.java index 1da5694..b8d3838 100644 --- a/src/main/java/de/rexlmanu/fairychat/plugin/FairyChatModule.java +++ b/src/main/java/de/rexlmanu/fairychat/plugin/FairyChatModule.java @@ -7,12 +7,14 @@ import com.google.inject.Singleton; import com.google.inject.name.Names; import de.rexlmanu.fairychat.plugin.configuration.PluginConfigurationProvider; +import de.rexlmanu.fairychat.plugin.paper.AdaptPluginMeta; +import de.rexlmanu.fairychat.plugin.paper.PluginMetaFactory; import de.rexlmanu.fairychat.plugin.utility.ComponentTypeAdapter; import de.rexlmanu.fairychat.plugin.utility.annotation.PluginLogger; -import io.papermc.paper.plugin.configuration.PluginMeta; import java.nio.file.Path; import java.util.logging.Logger; import lombok.RequiredArgsConstructor; +import net.kyori.adventure.platform.bukkit.BukkitAudiences; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; @@ -38,7 +40,8 @@ protected void configure() { .annotatedWith(Names.named("dataFolder")) .toInstance(this.plugin.getDataFolder().toPath()); this.bind(Logger.class).annotatedWith(PluginLogger.class).toInstance(this.plugin.getLogger()); - this.bind(PluginMeta.class).toInstance(this.plugin.getPluginMeta()); + this.bind(BukkitAudiences.class).toInstance(BukkitAudiences.create(this.plugin)); + this.bind(AdaptPluginMeta.class).toInstance(PluginMetaFactory.create(this.plugin)); this.bind(MiniMessage.class).toInstance(MiniMessage.miniMessage()); this.bind(MiniMessage.class) diff --git a/src/main/java/de/rexlmanu/fairychat/plugin/FairyChatPlugin.java b/src/main/java/de/rexlmanu/fairychat/plugin/FairyChatPlugin.java index 0ae962e..9e37d11 100644 --- a/src/main/java/de/rexlmanu/fairychat/plugin/FairyChatPlugin.java +++ b/src/main/java/de/rexlmanu/fairychat/plugin/FairyChatPlugin.java @@ -26,9 +26,13 @@ import de.rexlmanu.fairychat.plugin.database.DatabaseClient; import de.rexlmanu.fairychat.plugin.database.DatabaseModule; import de.rexlmanu.fairychat.plugin.integration.IntegrationRegistry; +import de.rexlmanu.fairychat.plugin.paper.Environment; +import de.rexlmanu.fairychat.plugin.paper.event.FairyEventHandler; +import de.rexlmanu.fairychat.plugin.paper.event.PaperEventHandler; import de.rexlmanu.fairychat.plugin.permission.PermissionModule; import de.rexlmanu.fairychat.plugin.redis.RedisConnector; import de.rexlmanu.fairychat.plugin.redis.channel.RedisSubscriberModule; +import de.rexlmanu.fairychat.plugin.utility.event.SpigotEventHandler; import de.rexlmanu.fairychat.plugin.utility.scheduler.PluginSchedulerModule; import de.rexlmanu.fairychat.plugin.utility.update.UpdateChecker; import org.bukkit.plugin.java.JavaPlugin; @@ -69,6 +73,14 @@ public void onEnable() { this.registerListeners(); this.injector.getInstance(UpdateChecker.class).checkAndNotify(); + + FairyEventHandler chatListener; + if (Environment.ENVIRONMENT.isPaper()) { + chatListener = this.injector.getInstance(PaperEventHandler.class); + } else { + chatListener = this.injector.getInstance(SpigotEventHandler.class); + } + this.getServer().getPluginManager().registerEvents(chatListener, this); } private void registerListeners() { diff --git a/src/main/java/de/rexlmanu/fairychat/plugin/command/BroadcastCommand.java b/src/main/java/de/rexlmanu/fairychat/plugin/command/BroadcastCommand.java index daab0d9..038a141 100644 --- a/src/main/java/de/rexlmanu/fairychat/plugin/command/BroadcastCommand.java +++ b/src/main/java/de/rexlmanu/fairychat/plugin/command/BroadcastCommand.java @@ -10,6 +10,7 @@ import de.rexlmanu.fairychat.plugin.configuration.PluginConfiguration; import de.rexlmanu.fairychat.plugin.core.broadcast.BroadcastMessageData; import de.rexlmanu.fairychat.plugin.redis.RedisConnector; +import net.kyori.adventure.platform.bukkit.BukkitAudiences; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; @@ -23,7 +24,7 @@ public BroadcastCommand( MiniMessage miniMessage, RedisConnector connector, Server server, - Provider configurationProvider) { + Provider configurationProvider, BukkitAudiences bukkitAudiences) { commandManager.command( commandManager .commandBuilder("broadcast") @@ -41,7 +42,7 @@ public BroadcastCommand( * If the redis connector isn't available, we send the message to all online players. */ if (!connector.available()) { - server.getOnlinePlayers().forEach(player -> player.sendMessage(component)); + server.getOnlinePlayers().forEach(player -> bukkitAudiences.player(player).sendMessage(component)); return; } diff --git a/src/main/java/de/rexlmanu/fairychat/plugin/command/CommandModule.java b/src/main/java/de/rexlmanu/fairychat/plugin/command/CommandModule.java index 5e69005..3b96af5 100644 --- a/src/main/java/de/rexlmanu/fairychat/plugin/command/CommandModule.java +++ b/src/main/java/de/rexlmanu/fairychat/plugin/command/CommandModule.java @@ -13,6 +13,7 @@ import de.rexlmanu.fairychat.plugin.configuration.PluginConfiguration; import java.util.function.Function; import lombok.RequiredArgsConstructor; +import net.kyori.adventure.platform.bukkit.BukkitAudiences; import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import org.bukkit.command.CommandSender; @@ -26,7 +27,8 @@ public final CommandManager provideCommandManager( JavaPlugin javaPlugin, Injector injector, MiniMessage miniMessage, - Provider configurationProvider) { + Provider configurationProvider, + BukkitAudiences bukkitAudiences) { try { Function mapper = Function.identity(); @@ -48,10 +50,12 @@ public final CommandManager provideCommandManager( commandManager.registerExceptionHandler( InvalidSyntaxException.class, (sender, e) -> - sender.sendMessage( - miniMessage.deserialize( - configurationProvider.get().messages().invalidSyntax(), - Placeholder.unparsed("syntax", e.getCorrectSyntax())))); + bukkitAudiences + .sender(sender) + .sendMessage( + miniMessage.deserialize( + configurationProvider.get().messages().invalidSyntax(), + Placeholder.unparsed("syntax", e.getCorrectSyntax())))); return commandManager; } catch (Exception e) { diff --git a/src/main/java/de/rexlmanu/fairychat/plugin/command/FairyChatCommand.java b/src/main/java/de/rexlmanu/fairychat/plugin/command/FairyChatCommand.java index 099781d..fd4aec8 100644 --- a/src/main/java/de/rexlmanu/fairychat/plugin/command/FairyChatCommand.java +++ b/src/main/java/de/rexlmanu/fairychat/plugin/command/FairyChatCommand.java @@ -3,7 +3,8 @@ import cloud.commandframework.CommandManager; import com.google.inject.Inject; import de.rexlmanu.fairychat.plugin.configuration.PluginConfigurationProvider; -import io.papermc.paper.plugin.configuration.PluginMeta; +import de.rexlmanu.fairychat.plugin.paper.AdaptPluginMeta; +import net.kyori.adventure.platform.bukkit.BukkitAudiences; import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import org.bukkit.command.CommandSender; @@ -13,19 +14,20 @@ public class FairyChatCommand { public FairyChatCommand( CommandManager commandManager, MiniMessage miniMessage, - PluginMeta pluginMeta, - PluginConfigurationProvider configurationProvider) { + AdaptPluginMeta pluginMeta, + PluginConfigurationProvider configurationProvider, + BukkitAudiences bukkitAudiences) { commandManager.command( commandManager .commandBuilder("fairychat") .handler( commandContext -> - commandContext - .getSender() + bukkitAudiences + .sender(commandContext.getSender()) .sendMessage( miniMessage.deserialize( "This server is running Cick to visit plugin page'>FairyChat v by Cick to visit author'>rexlManu.", - Placeholder.parsed("version", pluginMeta.getVersion()))))); + Placeholder.parsed("version", pluginMeta.version()))))); commandManager.command( commandManager @@ -35,8 +37,8 @@ public FairyChatCommand( .handler( commandContext -> { configurationProvider.loadConfig(); - commandContext - .getSender() + bukkitAudiences + .sender(commandContext.getSender()) .sendMessage( miniMessage.deserialize( configurationProvider.configuration().messages().pluginReloaded())); diff --git a/src/main/java/de/rexlmanu/fairychat/plugin/command/IgnoreCommand.java b/src/main/java/de/rexlmanu/fairychat/plugin/command/IgnoreCommand.java index fee4763..2fb3323 100644 --- a/src/main/java/de/rexlmanu/fairychat/plugin/command/IgnoreCommand.java +++ b/src/main/java/de/rexlmanu/fairychat/plugin/command/IgnoreCommand.java @@ -9,6 +9,7 @@ import de.rexlmanu.fairychat.plugin.core.user.User; import de.rexlmanu.fairychat.plugin.core.user.UserFactory; import de.rexlmanu.fairychat.plugin.core.user.UserService; +import net.kyori.adventure.platform.bukkit.BukkitAudiences; import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import org.bukkit.command.CommandSender; @@ -22,7 +23,8 @@ public IgnoreCommand( UserService userService, UserFactory userFactory, UserIgnoreService userIgnoreService, - Provider configurationProvider) { + Provider configurationProvider, + BukkitAudiences bukkitAudiences) { commandManager.command( commandManager .commandBuilder("ignore") @@ -43,8 +45,8 @@ public IgnoreCommand( User target = commandContext.get("target"); if (user.equals(target)) { - commandContext - .getSender() + bukkitAudiences + .sender(commandContext.getSender()) .sendMessage( miniMessage.deserialize( configurationProvider.get().messages().youCantIgnoreYourself())); @@ -53,8 +55,8 @@ public IgnoreCommand( if (userIgnoreService.isIgnored(user.uniqueId(), target.uniqueId())) { userIgnoreService.setIgnored(user.uniqueId(), target.uniqueId(), false); - commandContext - .getSender() + bukkitAudiences + .sender(commandContext.getSender()) .sendMessage( miniMessage.deserialize( configurationProvider.get().messages().youUnignoredUser(), @@ -63,8 +65,8 @@ public IgnoreCommand( } userIgnoreService.setIgnored(user.uniqueId(), target.uniqueId(), true); - commandContext - .getSender() + bukkitAudiences + .sender(commandContext.getSender()) .sendMessage( miniMessage.deserialize( configurationProvider.get().messages().youIgnoredUser(), diff --git a/src/main/java/de/rexlmanu/fairychat/plugin/command/PrivateMessageCommand.java b/src/main/java/de/rexlmanu/fairychat/plugin/command/PrivateMessageCommand.java index fcd17e3..bd40c58 100644 --- a/src/main/java/de/rexlmanu/fairychat/plugin/command/PrivateMessageCommand.java +++ b/src/main/java/de/rexlmanu/fairychat/plugin/command/PrivateMessageCommand.java @@ -11,6 +11,7 @@ import de.rexlmanu.fairychat.plugin.core.user.User; import de.rexlmanu.fairychat.plugin.core.user.UserFactory; import de.rexlmanu.fairychat.plugin.core.user.UserService; +import net.kyori.adventure.platform.bukkit.BukkitAudiences; import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -25,7 +26,8 @@ public PrivateMessageCommand( MiniMessage miniMessage, UserFactory userFactory, UserIgnoreService userIgnoreService, - Provider configurationProvider) { + Provider configurationProvider, + BukkitAudiences bukkitAudiences) { commandManager.command( commandManager .commandBuilder( @@ -54,8 +56,8 @@ public PrivateMessageCommand( }); String message = commandContext.get("message"); if (user.equals(recipient)) { - commandContext - .getSender() + bukkitAudiences + .sender(commandContext.getSender()) .sendMessage( miniMessage.deserialize( configurationProvider.get().messages().youCantMessageYourself())); @@ -64,8 +66,8 @@ public PrivateMessageCommand( if (userIgnoreService.isIgnored(recipient.uniqueId(), user.uniqueId()) && !commandContext.getSender().hasPermission("fairychat.bypass.ignore")) { - commandContext - .getSender() + bukkitAudiences + .sender(commandContext.getSender()) .sendMessage( miniMessage.deserialize( configurationProvider.get().messages().youCantMessageThisPlayer())); @@ -102,8 +104,8 @@ public PrivateMessageCommand( String message = commandContext.get("message"); User lastRecipient = privateMessagingService.lastRecipient(user).orElse(null); if (lastRecipient == null) { - commandContext - .getSender() + bukkitAudiences + .sender(commandContext.getSender()) .sendMessage( miniMessage.deserialize( configurationProvider.get().messages().youDidntMessageAnyone())); @@ -112,8 +114,8 @@ public PrivateMessageCommand( if (userIgnoreService.isIgnored(lastRecipient.uniqueId(), user.uniqueId()) && !commandContext.getSender().hasPermission("fairychat.bypass.ignore")) { - commandContext - .getSender() + bukkitAudiences + .sender(commandContext.getSender()) .sendMessage( miniMessage.deserialize( configurationProvider.get().messages().youCantMessageThisPlayer())); diff --git a/src/main/java/de/rexlmanu/fairychat/plugin/core/broadcast/BroadcastChannelSubscriber.java b/src/main/java/de/rexlmanu/fairychat/plugin/core/broadcast/BroadcastChannelSubscriber.java index b8a0018..f2763f9 100644 --- a/src/main/java/de/rexlmanu/fairychat/plugin/core/broadcast/BroadcastChannelSubscriber.java +++ b/src/main/java/de/rexlmanu/fairychat/plugin/core/broadcast/BroadcastChannelSubscriber.java @@ -4,12 +4,14 @@ import com.google.inject.Singleton; import de.rexlmanu.fairychat.plugin.redis.channel.RedisChannelSubscriber; import lombok.RequiredArgsConstructor; +import net.kyori.adventure.platform.bukkit.BukkitAudiences; import org.bukkit.Server; @Singleton @RequiredArgsConstructor(onConstructor = @__(@Inject)) public class BroadcastChannelSubscriber implements RedisChannelSubscriber { private final Server server; + private final BukkitAudiences bukkitAudiences; @Override public Class getDataType() { @@ -18,6 +20,8 @@ public Class getDataType() { @Override public void handle(BroadcastMessageData data) { - this.server.getOnlinePlayers().forEach(player -> player.sendMessage(data.message())); + this.server + .getOnlinePlayers() + .forEach(player -> this.bukkitAudiences.player(player).sendMessage(data.message())); } } diff --git a/src/main/java/de/rexlmanu/fairychat/plugin/core/chatchannel/ChatChannel.java b/src/main/java/de/rexlmanu/fairychat/plugin/core/chatchannel/ChatChannel.java new file mode 100644 index 0000000..9da29fd --- /dev/null +++ b/src/main/java/de/rexlmanu/fairychat/plugin/core/chatchannel/ChatChannel.java @@ -0,0 +1,22 @@ +package de.rexlmanu.fairychat.plugin.core.chatchannel; + +import de.rexlmanu.fairychat.plugin.core.playerchat.cooldown.strategy.CooldownStrategyType; +import java.util.List; +import java.util.Map; + +public class ChatChannel { + private String name; + private boolean defaultChannel; + private String mentionName; + private boolean enterable; + private boolean allowMultipleChannelsEntering; + private String enterPermission; + private String messageViewPermission; + private String sentMessagePermission; + private Map formats; + private CooldownStrategyType cooldownStrategyType; + private ServerFilterMode filterMode; + private List serverList; + private boolean localOnly; + +} diff --git a/src/main/java/de/rexlmanu/fairychat/plugin/core/chatchannel/ServerFilterMode.java b/src/main/java/de/rexlmanu/fairychat/plugin/core/chatchannel/ServerFilterMode.java new file mode 100644 index 0000000..ca38d85 --- /dev/null +++ b/src/main/java/de/rexlmanu/fairychat/plugin/core/chatchannel/ServerFilterMode.java @@ -0,0 +1,7 @@ +package de.rexlmanu.fairychat.plugin.core.chatchannel; + +public enum ServerFilterMode { + WHITELIST, + BLACKLIST, + NONE +} diff --git a/src/main/java/de/rexlmanu/fairychat/plugin/core/chatclear/DefaultChatClearService.java b/src/main/java/de/rexlmanu/fairychat/plugin/core/chatclear/DefaultChatClearService.java index 9b70424..cd7d36b 100644 --- a/src/main/java/de/rexlmanu/fairychat/plugin/core/chatclear/DefaultChatClearService.java +++ b/src/main/java/de/rexlmanu/fairychat/plugin/core/chatclear/DefaultChatClearService.java @@ -7,6 +7,7 @@ import com.google.inject.Singleton; import de.rexlmanu.fairychat.plugin.configuration.PluginConfiguration; import lombok.RequiredArgsConstructor; +import net.kyori.adventure.platform.bukkit.BukkitAudiences; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.Server; @@ -18,14 +19,18 @@ public class DefaultChatClearService implements ChatClearService { private final Server server; private final Provider configurationProvider; private final MiniMessage miniMessage; + private final BukkitAudiences bukkitAudiences; @Override public void clearChat(Player player) { for (int i = 0; i < CLEAR_CHAT_MAX_LINES; i++) { - player.sendMessage(Component.empty()); + this.bukkitAudiences.player(player).sendMessage(Component.empty()); } - player.sendMessage( - this.miniMessage.deserialize(this.configurationProvider.get().messages().chatCleared())); + this.bukkitAudiences + .player(player) + .sendMessage( + this.miniMessage.deserialize( + this.configurationProvider.get().messages().chatCleared())); } @Override diff --git a/src/main/java/de/rexlmanu/fairychat/plugin/core/custommessages/CustomMessageBukkitListener.java b/src/main/java/de/rexlmanu/fairychat/plugin/core/custommessages/CustomMessageBukkitListener.java index 92e94e8..36415cd 100644 --- a/src/main/java/de/rexlmanu/fairychat/plugin/core/custommessages/CustomMessageBukkitListener.java +++ b/src/main/java/de/rexlmanu/fairychat/plugin/core/custommessages/CustomMessageBukkitListener.java @@ -7,6 +7,8 @@ import de.rexlmanu.fairychat.plugin.configuration.PluginConfiguration; import de.rexlmanu.fairychat.plugin.core.custommessages.redis.CustomMessageDto; import de.rexlmanu.fairychat.plugin.integration.IntegrationRegistry; +import de.rexlmanu.fairychat.plugin.paper.Environment; +import de.rexlmanu.fairychat.plugin.paper.event.EventMessageUtils; import de.rexlmanu.fairychat.plugin.redis.RedisConnector; import java.util.ArrayList; import java.util.function.Consumer; @@ -37,13 +39,13 @@ public class CustomMessageBukkitListener implements Listener { @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void handlePlayerJoin(PlayerJoinEvent event) { if (event.getPlayer().hasPermission("fairychat.messages.join.ignore")) { - event.joinMessage(null); + EventMessageUtils.joinMessageSetter(event).accept(null); return; } this.handleEventMessage( event.getPlayer(), - event::joinMessage, - event::joinMessage, + EventMessageUtils.joinMessage(event), + EventMessageUtils.joinMessageSetter(event), TagResolver::empty, this.configurationProvider.get().messages().joinMessage(), this.configurationProvider.get().customMessages().broadcastJoinMessages()); @@ -52,13 +54,13 @@ public void handlePlayerJoin(PlayerJoinEvent event) { @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void handlePlayerQuit(PlayerQuitEvent event) { if (event.getPlayer().hasPermission("fairychat.messages.join.ignore")) { - event.quitMessage(null); + EventMessageUtils.quitMessageSetter(event).accept(null); return; } this.handleEventMessage( event.getPlayer(), - event::quitMessage, - event::quitMessage, + EventMessageUtils.quitMessage(event), + EventMessageUtils.quitMessageSetter(event), TagResolver::empty, this.configurationProvider.get().messages().quitMessage(), this.configurationProvider.get().customMessages().broadcastQuitMessages()); @@ -66,28 +68,39 @@ public void handlePlayerQuit(PlayerQuitEvent event) { @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void handlePlayerDeath(PlayerDeathEvent event) { - if (event.deathMessage() instanceof TranslatableComponent translatableComponent) { - event.deathMessage(this.replaceFirstArgument(event.getPlayer(), translatableComponent)); + var deathMessage = EventMessageUtils.deathMessage(event); + if (EventMessageUtils.deathMessage(event).get() + instanceof TranslatableComponent translatableComponent) { + EventMessageUtils.deathMessageSetter(event) + .accept(this.replaceFirstArgument(event.getEntity(), translatableComponent)); } this.handleEventMessage( - event.getPlayer(), - event::deathMessage, - event::deathMessage, - () -> Placeholder.component("death_message", event.deathMessage()), + event.getEntity(), + EventMessageUtils.deathMessage(event), + EventMessageUtils.deathMessageSetter(event), + () -> Placeholder.component("death_message", EventMessageUtils.deathMessage(event).get()), this.configurationProvider.get().messages().deathMessage(), this.configurationProvider.get().customMessages().broadcastDeathMessages()); } @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void handlePlayerAdvancementDone(PlayerAdvancementDoneEvent event) { - if (event.message() instanceof TranslatableComponent translatableComponent) { - event.message(this.replaceFirstArgument(event.getPlayer(), translatableComponent)); + // spigot don't support of modifying the advancement message + if (Environment.ENVIRONMENT.isSpigot()) { + return; + } + if (EventMessageUtils.advancementMessage(event).get() + instanceof TranslatableComponent translatableComponent) { + EventMessageUtils.advancementMessageSetter(event) + .accept(this.replaceFirstArgument(event.getPlayer(), translatableComponent)); } this.handleEventMessage( event.getPlayer(), - event::message, - event::message, - () -> Placeholder.component("advancement_message", event.message()), + EventMessageUtils.advancementMessage(event), + EventMessageUtils.advancementMessageSetter(event), + () -> + Placeholder.component( + "advancement_message", EventMessageUtils.advancementMessage(event).get()), this.configurationProvider.get().messages().advancementDoneMessage(), this.configurationProvider.get().customMessages().broadcastAdvancementMessages()); } diff --git a/src/main/java/de/rexlmanu/fairychat/plugin/core/custommessages/redis/CustomMessageSubscriber.java b/src/main/java/de/rexlmanu/fairychat/plugin/core/custommessages/redis/CustomMessageSubscriber.java index dcd042e..d47087c 100644 --- a/src/main/java/de/rexlmanu/fairychat/plugin/core/custommessages/redis/CustomMessageSubscriber.java +++ b/src/main/java/de/rexlmanu/fairychat/plugin/core/custommessages/redis/CustomMessageSubscriber.java @@ -6,12 +6,14 @@ import de.rexlmanu.fairychat.plugin.configuration.PluginConfiguration; import de.rexlmanu.fairychat.plugin.redis.channel.RedisChannelSubscriber; import lombok.RequiredArgsConstructor; +import net.kyori.adventure.platform.bukkit.BukkitAudiences; import org.bukkit.Server; @RequiredArgsConstructor(onConstructor = @__(@Inject)) public class CustomMessageSubscriber implements RedisChannelSubscriber { private final Server server; private final Provider configurationProvider; + private final BukkitAudiences bukkitAudiences; @Override public Class getDataType() { @@ -22,9 +24,9 @@ public Class getDataType() { public void handle(CustomMessageDto data) { if (Constants.SERVER_IDENTITY_ORIGIN.equals(data.origin())) return; - this.server.getOnlinePlayers().forEach(player -> player.sendMessage(data.component())); + this.server.getOnlinePlayers().forEach(player -> this.bukkitAudiences.player(player).sendMessage(data.component())); if (this.configurationProvider.get().displayChatInConsole()) - this.server.getConsoleSender().sendMessage(data.component()); + this.bukkitAudiences.sender(this.server.getConsoleSender()).sendMessage(data.component()); } } diff --git a/src/main/java/de/rexlmanu/fairychat/plugin/core/mentions/MentionService.java b/src/main/java/de/rexlmanu/fairychat/plugin/core/mentions/MentionService.java index 8b0be07..4d743d1 100644 --- a/src/main/java/de/rexlmanu/fairychat/plugin/core/mentions/MentionService.java +++ b/src/main/java/de/rexlmanu/fairychat/plugin/core/mentions/MentionService.java @@ -9,6 +9,7 @@ import de.rexlmanu.fairychat.plugin.integration.IntegrationRegistry; import lombok.RequiredArgsConstructor; import net.kyori.adventure.key.Key; +import net.kyori.adventure.platform.bukkit.BukkitAudiences; import net.kyori.adventure.sound.Sound; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; @@ -23,6 +24,7 @@ public class MentionService { private final MiniMessage miniMessage; private final IntegrationRegistry registry; private final UserIgnoreService userIgnoreService; + private final BukkitAudiences bukkitAudiences; public Component checkMentions(Player viewer, Component message) { @@ -41,7 +43,7 @@ public Component checkMentions(Player viewer, Component message) { return message; } - viewer.playSound( + this.bukkitAudiences.player(viewer).playSound( Sound.sound( Key.key(this.configurationProvider.get().mention().soundName()), Sound.Source.MASTER, diff --git a/src/main/java/de/rexlmanu/fairychat/plugin/core/messagesimilarity/MessageSimilarityBukkitListener.java b/src/main/java/de/rexlmanu/fairychat/plugin/core/messagesimilarity/MessageSimilarityBukkitListener.java index 3f6b268..9c1fcf6 100644 --- a/src/main/java/de/rexlmanu/fairychat/plugin/core/messagesimilarity/MessageSimilarityBukkitListener.java +++ b/src/main/java/de/rexlmanu/fairychat/plugin/core/messagesimilarity/MessageSimilarityBukkitListener.java @@ -3,11 +3,12 @@ import com.google.inject.Inject; import com.google.inject.Provider; import de.rexlmanu.fairychat.plugin.configuration.PluginConfiguration; +import de.rexlmanu.fairychat.plugin.paper.event.FairyAsyncChatEvent; import de.rexlmanu.fairychat.plugin.utility.ExpiringMap; -import io.papermc.paper.event.player.AsyncChatEvent; import java.util.UUID; import java.util.concurrent.TimeUnit; import lombok.RequiredArgsConstructor; +import net.kyori.adventure.platform.bukkit.BukkitAudiences; import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; import org.bukkit.entity.Player; @@ -20,10 +21,11 @@ public class MessageSimilarityBukkitListener implements Listener { private final ExpiringMap lastMessages = new ExpiringMap<>(); private final Provider configurationProvider; private final MiniMessage miniMessage; + private final BukkitAudiences bukkitAudiences; @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) - public void handle(AsyncChatEvent event) { - Player player = event.getPlayer(); + public void handle(FairyAsyncChatEvent event) { + Player player = event.player(); if (player.hasPermission("fairychat.bypass.similarity")) return; @@ -41,17 +43,19 @@ public void handle(AsyncChatEvent event) { if (score >= this.configurationProvider.get().similarityPercentage()) { event.setCancelled(true); - player.sendMessage( - this.miniMessage.deserialize( - this.configurationProvider.get().messages().yourLastMessageWasTooSimilar())); + bukkitAudiences + .player(player) + .sendMessage( + this.miniMessage.deserialize( + this.configurationProvider.get().messages().yourLastMessageWasTooSimilar())); } } } @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void handleChatAfterProcess(AsyncChatEvent event) { + public void handleChatAfterProcess(FairyAsyncChatEvent event) { this.lastMessages.put( - event.getPlayer().getUniqueId(), + event.player().getUniqueId(), PlainTextComponentSerializer.plainText().serialize(event.message()), this.configurationProvider.get().similarityMessageCacheSeconds(), TimeUnit.SECONDS); diff --git a/src/main/java/de/rexlmanu/fairychat/plugin/core/playerchat/PlayerChatFormatRenderer.java b/src/main/java/de/rexlmanu/fairychat/plugin/core/playerchat/PlayerChatFormatRenderer.java index 1877e7f..faac012 100644 --- a/src/main/java/de/rexlmanu/fairychat/plugin/core/playerchat/PlayerChatFormatRenderer.java +++ b/src/main/java/de/rexlmanu/fairychat/plugin/core/playerchat/PlayerChatFormatRenderer.java @@ -9,9 +9,9 @@ import de.rexlmanu.fairychat.plugin.core.mentions.MentionService; import de.rexlmanu.fairychat.plugin.integration.IntegrationRegistry; import de.rexlmanu.fairychat.plugin.integration.chat.PlaceholderSupport; +import de.rexlmanu.fairychat.plugin.paper.DefaultChatRenderer; import de.rexlmanu.fairychat.plugin.permission.PermissionProvider; import de.rexlmanu.fairychat.plugin.utility.LegacySupport; -import io.papermc.paper.chat.ChatRenderer; import java.util.ArrayList; import java.util.List; import java.util.function.Function; @@ -28,7 +28,7 @@ @Singleton @RequiredArgsConstructor(onConstructor = @__(@Inject)) -public class PlayerChatFormatRenderer implements ChatRenderer { +public class PlayerChatFormatRenderer implements DefaultChatRenderer { private final Provider configurationProvider; private final MiniMessage miniMessage; private final PermissionProvider permissionProvider; diff --git a/src/main/java/de/rexlmanu/fairychat/plugin/core/playerchat/PlayerChatListener.java b/src/main/java/de/rexlmanu/fairychat/plugin/core/playerchat/PlayerChatListener.java index a42318a..aa94522 100644 --- a/src/main/java/de/rexlmanu/fairychat/plugin/core/playerchat/PlayerChatListener.java +++ b/src/main/java/de/rexlmanu/fairychat/plugin/core/playerchat/PlayerChatListener.java @@ -8,15 +8,15 @@ import de.rexlmanu.fairychat.plugin.configuration.PluginConfiguration; import de.rexlmanu.fairychat.plugin.core.ignore.UserIgnoreService; import de.rexlmanu.fairychat.plugin.core.playerchat.cooldown.PlayerChatCooldownService; +import de.rexlmanu.fairychat.plugin.paper.event.FairyAsyncChatEvent; import de.rexlmanu.fairychat.plugin.redis.RedisConnector; -import io.papermc.paper.event.player.AsyncChatEvent; import lombok.RequiredArgsConstructor; +import net.kyori.adventure.platform.bukkit.BukkitAudiences; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.tag.resolver.Formatter; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; @RequiredArgsConstructor(onConstructor = @__(@Inject)) @@ -27,19 +27,24 @@ public class PlayerChatListener implements Listener { private final PlayerChatCooldownService playerChatCooldownService; private final Provider configurationProvider; private final MiniMessage miniMessage; + private final BukkitAudiences bukkitAudiences; - @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) - public void handle(AsyncChatEvent event) { - Player player = event.getPlayer(); + @EventHandler + public void handle(FairyAsyncChatEvent event) { + Player player = event.player(); if (this.playerChatCooldownService.enabled() && this.playerChatCooldownService.isCooldowned(player.getUniqueId()) && !player.hasPermission("fairychat.bypass.cooldown")) { - player.sendMessage( - this.miniMessage.deserialize( - this.configurationProvider.get().messages().onCooldown(), - Formatter.number( - "time", this.playerChatCooldownService.getTime(player.getUniqueId()) / 1000D))); + this.bukkitAudiences + .player(player) + .sendMessage( + this.miniMessage.deserialize( + this.configurationProvider.get().messages().onCooldown(), + Formatter.number( + "time", + this.playerChatCooldownService.getTime(player.getUniqueId()) + / 1000D))); event.setCancelled(true); return; } @@ -51,7 +56,7 @@ public void handle(AsyncChatEvent event) { audience -> audience instanceof Player recipient && this.userIgnoreService.isIgnored( - recipient.getUniqueId(), player.getUniqueId())); + recipient.getUniqueId(), player.getUniqueId())); if (this.playerChatCooldownService.enabled()) { this.playerChatCooldownService.trigger(player.getUniqueId(), event.message()); diff --git a/src/main/java/de/rexlmanu/fairychat/plugin/core/playerchat/PlayerChatMessageSubscriber.java b/src/main/java/de/rexlmanu/fairychat/plugin/core/playerchat/PlayerChatMessageSubscriber.java index 444a9da..221380d 100644 --- a/src/main/java/de/rexlmanu/fairychat/plugin/core/playerchat/PlayerChatMessageSubscriber.java +++ b/src/main/java/de/rexlmanu/fairychat/plugin/core/playerchat/PlayerChatMessageSubscriber.java @@ -9,6 +9,7 @@ import de.rexlmanu.fairychat.plugin.core.mentions.MentionService; import de.rexlmanu.fairychat.plugin.redis.channel.RedisChannelSubscriber; import lombok.RequiredArgsConstructor; +import net.kyori.adventure.platform.bukkit.BukkitAudiences; import org.bukkit.Server; @Singleton @@ -18,6 +19,7 @@ public class PlayerChatMessageSubscriber implements RedisChannelSubscriber configurationProvider; private final UserIgnoreService userIgnoreService; private final MentionService mentionService; + private final BukkitAudiences bukkitAudiences; @Override public Class getDataType() { @@ -33,10 +35,12 @@ public void handle(PlayerChatMessageData data) { !this.userIgnoreService.isIgnored(recipient.getUniqueId(), data.senderId())) .forEach( player -> - player.sendMessage(this.mentionService.checkMentions(player, data.message()))); + this.bukkitAudiences + .player(player) + .sendMessage(this.mentionService.checkMentions(player, data.message()))); if (!this.configurationProvider.get().displayChatInConsole()) return; - this.server.getConsoleSender().sendMessage(data.message()); + this.bukkitAudiences.sender(this.server.getConsoleSender()).sendMessage(data.message()); } } diff --git a/src/main/java/de/rexlmanu/fairychat/plugin/core/privatemessaging/defaults/DefaultPrivateMessagingService.java b/src/main/java/de/rexlmanu/fairychat/plugin/core/privatemessaging/defaults/DefaultPrivateMessagingService.java index 3a0cd9b..0e1482c 100644 --- a/src/main/java/de/rexlmanu/fairychat/plugin/core/privatemessaging/defaults/DefaultPrivateMessagingService.java +++ b/src/main/java/de/rexlmanu/fairychat/plugin/core/privatemessaging/defaults/DefaultPrivateMessagingService.java @@ -13,6 +13,7 @@ import java.util.UUID; import java.util.concurrent.TimeUnit; import lombok.RequiredArgsConstructor; +import net.kyori.adventure.platform.bukkit.BukkitAudiences; import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import org.bukkit.Server; @@ -27,17 +28,18 @@ public class DefaultPrivateMessagingService implements PrivateMessagingService { private final Server server; private final UserService userService; private final ExpiringMap lastMessageRecipient = new ExpiringMap<>(); + private final BukkitAudiences bukkitAudiences; @Override public void sendMessage(User user, User recipient, String message) { - this.getPlayer(user) + this.bukkitAudiences.player(this.getPlayer(user)) .sendMessage( this.miniMessage.deserialize( this.configurationProvider.get().privateMessaging().senderFormat(), Placeholder.unparsed("message", message), Placeholder.unparsed("sender_name", user.username()), Placeholder.unparsed("recipient_name", recipient.username()))); - this.getPlayer(recipient) + this.bukkitAudiences.player(this.getPlayer(recipient)) .sendMessage( this.miniMessage.deserialize( this.configurationProvider.get().privateMessaging().receiverFormat(), diff --git a/src/main/java/de/rexlmanu/fairychat/plugin/core/privatemessaging/redis/RedisPrivateMessagingService.java b/src/main/java/de/rexlmanu/fairychat/plugin/core/privatemessaging/redis/RedisPrivateMessagingService.java index 3012e78..dc5a7c6 100644 --- a/src/main/java/de/rexlmanu/fairychat/plugin/core/privatemessaging/redis/RedisPrivateMessagingService.java +++ b/src/main/java/de/rexlmanu/fairychat/plugin/core/privatemessaging/redis/RedisPrivateMessagingService.java @@ -14,6 +14,7 @@ import java.util.Optional; import java.util.UUID; import lombok.RequiredArgsConstructor; +import net.kyori.adventure.platform.bukkit.BukkitAudiences; import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import org.bukkit.Server; @@ -27,6 +28,7 @@ public class RedisPrivateMessagingService implements PrivateMessagingService { private final Provider configurationProvider; private final MiniMessage miniMessage; private final Server server; + private final BukkitAudiences bukkitAudiences; public void setLastRecipient(UUID senderId, UUID recipientId) { this.connector.useResourceAsync( @@ -45,7 +47,7 @@ public void sendMessage(User user, User recipient, String message) { this.getPlayer(user) .ifPresent( player -> - player.sendMessage( + this.bukkitAudiences.player(player).sendMessage( this.miniMessage.deserialize( this.configurationProvider.get().privateMessaging().senderFormat(), Placeholder.unparsed("message", message), @@ -57,7 +59,7 @@ public void sendMessage(User user, User recipient, String message) { this.getPlayer(recipient) .ifPresentOrElse( player -> - player.sendMessage( + this.bukkitAudiences.player(player).sendMessage( this.miniMessage.deserialize( this.configurationProvider.get().privateMessaging().receiverFormat(), Placeholder.unparsed("message", message), diff --git a/src/main/java/de/rexlmanu/fairychat/plugin/core/privatemessaging/redis/RedisPrivateMessagingSubscriber.java b/src/main/java/de/rexlmanu/fairychat/plugin/core/privatemessaging/redis/RedisPrivateMessagingSubscriber.java index f98c78b..5a1d494 100644 --- a/src/main/java/de/rexlmanu/fairychat/plugin/core/privatemessaging/redis/RedisPrivateMessagingSubscriber.java +++ b/src/main/java/de/rexlmanu/fairychat/plugin/core/privatemessaging/redis/RedisPrivateMessagingSubscriber.java @@ -10,6 +10,7 @@ import de.rexlmanu.fairychat.plugin.redis.channel.RedisChannelSubscriber; import java.util.Optional; import lombok.RequiredArgsConstructor; +import net.kyori.adventure.platform.bukkit.BukkitAudiences; import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import org.bukkit.Server; @@ -22,6 +23,7 @@ public class RedisPrivateMessagingSubscriber implements RedisChannelSubscriber

configurationProvider; private final Server server; + private final BukkitAudiences bukkitAudiences; @Override public Class getDataType() { @@ -42,7 +44,7 @@ public void handle(PrivateMessageData data) { this.getPlayer(recipient) .ifPresent( player -> - player.sendMessage( + this.bukkitAudiences.player(player).sendMessage( this.miniMessage.deserialize( this.configurationProvider.get().privateMessaging().receiverFormat(), Placeholder.unparsed("message", data.message()), diff --git a/src/main/java/de/rexlmanu/fairychat/plugin/core/user/listener/UserBukkitListener.java b/src/main/java/de/rexlmanu/fairychat/plugin/core/user/listener/UserBukkitListener.java index cb38f30..9c65d87 100644 --- a/src/main/java/de/rexlmanu/fairychat/plugin/core/user/listener/UserBukkitListener.java +++ b/src/main/java/de/rexlmanu/fairychat/plugin/core/user/listener/UserBukkitListener.java @@ -5,7 +5,7 @@ import de.rexlmanu.fairychat.plugin.Constants; import de.rexlmanu.fairychat.plugin.core.user.UserFactory; import de.rexlmanu.fairychat.plugin.core.user.UserService; -import de.rexlmanu.fairychat.plugin.utility.scheduler.PluginScheduler; +import de.rexlmanu.fairychat.plugin.paper.PluginScheduler; import de.rexlmanu.fairychat.plugin.utility.update.UpdateChecker; import org.bukkit.Server; import org.bukkit.event.EventHandler; diff --git a/src/main/java/de/rexlmanu/fairychat/plugin/integration/types/BuiltInPlaceholdersIntegration.java b/src/main/java/de/rexlmanu/fairychat/plugin/integration/types/BuiltInPlaceholdersIntegration.java index 12158cf..a59db5c 100644 --- a/src/main/java/de/rexlmanu/fairychat/plugin/integration/types/BuiltInPlaceholdersIntegration.java +++ b/src/main/java/de/rexlmanu/fairychat/plugin/integration/types/BuiltInPlaceholdersIntegration.java @@ -5,6 +5,7 @@ import de.rexlmanu.fairychat.plugin.configuration.PluginConfiguration; import de.rexlmanu.fairychat.plugin.integration.Integration; import de.rexlmanu.fairychat.plugin.integration.chat.PlaceholderSupport; +import de.rexlmanu.fairychat.plugin.paper.event.EventMessageUtils; import lombok.RequiredArgsConstructor; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; @@ -32,7 +33,8 @@ public TagResolver resolvePlayerPlaceholderWithChatMessage(Player player, Compon public TagResolver resolvePlayerPlaceholder(Player player) { return TagResolver.resolver( Placeholder.parsed("sender_name", player.getName()), - Placeholder.component("sender_displayname", player.displayName()), + Placeholder.component( + "sender_displayname", EventMessageUtils.playerDisplayName(player).get()), TagResolver.resolver( "fc_world_name", (argumentQueue, context) -> { diff --git a/src/main/java/de/rexlmanu/fairychat/plugin/integration/types/DisplayItemChatIntegration.java b/src/main/java/de/rexlmanu/fairychat/plugin/integration/types/DisplayItemChatIntegration.java index b1af4d8..4d50028 100644 --- a/src/main/java/de/rexlmanu/fairychat/plugin/integration/types/DisplayItemChatIntegration.java +++ b/src/main/java/de/rexlmanu/fairychat/plugin/integration/types/DisplayItemChatIntegration.java @@ -2,30 +2,39 @@ import de.rexlmanu.fairychat.plugin.integration.Integration; import de.rexlmanu.fairychat.plugin.integration.chat.PlaceholderSupport; +import de.rexlmanu.fairychat.plugin.paper.Environment; +import de.rexlmanu.fairychat.plugin.paper.event.EventMessageUtils; +import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.tag.Tag; import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; +import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import org.bukkit.entity.Player; public class DisplayItemChatIntegration implements Integration, PlaceholderSupport { - @Override - public boolean available() { - return true; - } - - @Override - public TagResolver resolveChatMessagePlaceholder(Player player, String message) { - if (!player.hasPermission("fairychat.feature.displayitem")) - return TagResolver.empty(); + @Override + public boolean available() { + return true; + } - var item = player.getInventory().getItemInMainHand(); + @Override + public TagResolver resolveChatMessagePlaceholder(Player player, String message) { + if (!player.hasPermission("fairychat.feature.displayitem")) return TagResolver.empty(); - if (item.getType().isAir()) - return TagResolver.empty(); + var item = player.getInventory().getItemInMainHand(); - var component = item.displayName().asComponent().hoverEvent(item.asHoverEvent()); + if (item.getType().isAir()) return TagResolver.empty(); - return TagResolver.resolver("item", Tag.selfClosingInserting(component)); + Component component; + if (Environment.PAPER.isPaper()) { + component = EventMessageUtils.displayNameOfItem(item); + } else { + String displayName = item.getItemMeta().getDisplayName(); + if (displayName == null) { + component = Component.empty(); + } else component = LegacyComponentSerializer.legacySection().deserialize(displayName); } + return TagResolver.resolver("item", Tag.selfClosingInserting(component)); + } } diff --git a/src/main/java/de/rexlmanu/fairychat/plugin/integration/types/MiniPlaceholdersIntegration.java b/src/main/java/de/rexlmanu/fairychat/plugin/integration/types/MiniPlaceholdersIntegration.java index 565ab5e..bda015d 100644 --- a/src/main/java/de/rexlmanu/fairychat/plugin/integration/types/MiniPlaceholdersIntegration.java +++ b/src/main/java/de/rexlmanu/fairychat/plugin/integration/types/MiniPlaceholdersIntegration.java @@ -6,6 +6,7 @@ import de.rexlmanu.fairychat.plugin.integration.chat.PlaceholderSupport; import io.github.miniplaceholders.api.MiniPlaceholders; import lombok.RequiredArgsConstructor; +import net.kyori.adventure.platform.bukkit.BukkitAudiences; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.bukkit.entity.Player; @@ -15,6 +16,7 @@ @RequiredArgsConstructor(onConstructor = @__(@Inject)) public class MiniPlaceholdersIntegration implements Integration, PlaceholderSupport { private final PluginManager pluginManager; + private final BukkitAudiences bukkitAudiences; @Override public boolean available() { @@ -23,12 +25,12 @@ public boolean available() { @Override public TagResolver resolvePlayerPlaceholderWithChatMessage(Player player, Component message) { - return MiniPlaceholders.getAudienceGlobalPlaceholders(player); + return MiniPlaceholders.getAudienceGlobalPlaceholders(bukkitAudiences.player(player)); } @Override public TagResolver resolvePlayerPlaceholder(Player player) { - return MiniPlaceholders.getAudienceGlobalPlaceholders(player); + return MiniPlaceholders.getAudienceGlobalPlaceholders(bukkitAudiences.player(player)); } @Override diff --git a/src/main/java/de/rexlmanu/fairychat/plugin/redis/RedisConnector.java b/src/main/java/de/rexlmanu/fairychat/plugin/redis/RedisConnector.java index a16a46b..e943bb4 100644 --- a/src/main/java/de/rexlmanu/fairychat/plugin/redis/RedisConnector.java +++ b/src/main/java/de/rexlmanu/fairychat/plugin/redis/RedisConnector.java @@ -22,7 +22,7 @@ import de.rexlmanu.fairychat.plugin.core.privatemessaging.redis.PrivateMessageData; import de.rexlmanu.fairychat.plugin.database.Connector; import de.rexlmanu.fairychat.plugin.redis.channel.MessageChannelHandler; -import de.rexlmanu.fairychat.plugin.utility.scheduler.PluginScheduler; +import de.rexlmanu.fairychat.plugin.paper.PluginScheduler; import java.util.HashMap; import java.util.Map; import java.util.concurrent.CompletableFuture; diff --git a/src/main/java/de/rexlmanu/fairychat/plugin/utility/event/SpigotEventHandler.java b/src/main/java/de/rexlmanu/fairychat/plugin/utility/event/SpigotEventHandler.java new file mode 100644 index 0000000..7e4f4a4 --- /dev/null +++ b/src/main/java/de/rexlmanu/fairychat/plugin/utility/event/SpigotEventHandler.java @@ -0,0 +1,77 @@ +package de.rexlmanu.fairychat.plugin.utility.event; + +import com.google.inject.Inject; +import de.rexlmanu.fairychat.plugin.paper.event.FairyAsyncChatEvent; +import de.rexlmanu.fairychat.plugin.paper.event.FairyEventHandler; +import java.util.Objects; +import java.util.stream.Collectors; +import lombok.RequiredArgsConstructor; +import net.kyori.adventure.audience.Audience; +import net.kyori.adventure.identity.Identity; +import net.kyori.adventure.platform.bukkit.BukkitAudiences; +import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; +import org.bukkit.Server; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.AsyncPlayerChatEvent; + +@RequiredArgsConstructor(onConstructor = @__(@Inject)) +public class SpigotEventHandler implements FairyEventHandler { + private final BukkitAudiences bukkitAudiences; + private final Server server; + + @EventHandler + public void handle(AsyncPlayerChatEvent event) { + FairyAsyncChatEvent chatEvent = + new FairyAsyncChatEvent( + event.isAsynchronous(), + event.getPlayer(), + event.getRecipients().stream() + .map(this.bukkitAudiences::player) + .collect(Collectors.toSet()), + (source, sourceDisplayName, message, viewer) -> { + String formattedMessage = + event + .getFormat() + .formatted( + source.getDisplayName(), + LegacyComponentSerializer.legacySection().serialize(message)); + + return LegacyComponentSerializer.legacySection().deserialize(formattedMessage); + }, + LegacyComponentSerializer.legacySection().deserialize(event.getMessage())); + + this.server.getPluginManager().callEvent(chatEvent); + + if (chatEvent.isCancelled()) { + event.setCancelled(chatEvent.isCancelled()); + return; + } + + event.getRecipients().clear(); + + event + .getRecipients() + .addAll( + chatEvent.viewers().stream() + .map( + audience -> { + return audience.get(Identity.UUID).map(this.server::getPlayer).orElse(null); + }) + .filter(Objects::nonNull) + .collect(Collectors.toSet())); + event.setMessage(LegacyComponentSerializer.legacySection().serialize(chatEvent.message())); + + event.setFormat( + LegacyComponentSerializer.legacySection() + .serialize( + chatEvent + .renderer() + .render( + event.getPlayer(), + LegacyComponentSerializer.legacySection() + .deserialize(event.getPlayer().getDisplayName()), + chatEvent.message(), + Audience.empty())) + .replace("%", "%%")); + } +} diff --git a/src/main/java/de/rexlmanu/fairychat/plugin/utility/scheduler/PaperPluginScheduler.java b/src/main/java/de/rexlmanu/fairychat/plugin/utility/scheduler/PaperPluginScheduler.java index 2dfcb45..c9a651e 100644 --- a/src/main/java/de/rexlmanu/fairychat/plugin/utility/scheduler/PaperPluginScheduler.java +++ b/src/main/java/de/rexlmanu/fairychat/plugin/utility/scheduler/PaperPluginScheduler.java @@ -2,6 +2,7 @@ import com.google.inject.Inject; import com.google.inject.Singleton; +import de.rexlmanu.fairychat.plugin.paper.PluginScheduler; import lombok.RequiredArgsConstructor; import net.kyori.adventure.util.Ticks; import org.bukkit.Server; diff --git a/src/main/java/de/rexlmanu/fairychat/plugin/utility/scheduler/PluginSchedulerModule.java b/src/main/java/de/rexlmanu/fairychat/plugin/utility/scheduler/PluginSchedulerModule.java index f73f786..6e56e52 100644 --- a/src/main/java/de/rexlmanu/fairychat/plugin/utility/scheduler/PluginSchedulerModule.java +++ b/src/main/java/de/rexlmanu/fairychat/plugin/utility/scheduler/PluginSchedulerModule.java @@ -1,6 +1,8 @@ package de.rexlmanu.fairychat.plugin.utility.scheduler; import com.google.inject.AbstractModule; +import de.rexlmanu.fairychat.plugin.paper.FoliaPluginScheduler; +import de.rexlmanu.fairychat.plugin.paper.PluginScheduler; public class PluginSchedulerModule extends AbstractModule { private static final String FOLIA_CLASS = "io.papermc.paper.threadedregions.RegionizedServer"; diff --git a/src/main/java/de/rexlmanu/fairychat/plugin/utility/update/UpdateChecker.java b/src/main/java/de/rexlmanu/fairychat/plugin/utility/update/UpdateChecker.java index 0080809..8fa2743 100644 --- a/src/main/java/de/rexlmanu/fairychat/plugin/utility/update/UpdateChecker.java +++ b/src/main/java/de/rexlmanu/fairychat/plugin/utility/update/UpdateChecker.java @@ -8,6 +8,7 @@ import com.google.inject.Provider; import com.google.inject.Singleton; import de.rexlmanu.fairychat.plugin.configuration.PluginConfiguration; +import de.rexlmanu.fairychat.plugin.paper.AdaptPluginMeta; import de.rexlmanu.fairychat.plugin.utility.annotation.PluginLogger; import java.net.URI; import java.net.http.HttpClient; @@ -16,6 +17,7 @@ import java.util.function.Consumer; import java.util.logging.Logger; import lombok.RequiredArgsConstructor; +import net.kyori.adventure.platform.bukkit.BukkitAudiences; import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import org.bukkit.entity.Player; @@ -31,6 +33,8 @@ public record Release(String version, String url) {} private final Provider configurationProvider; @PluginLogger private final Logger logger; private final MiniMessage miniMessage; + private final AdaptPluginMeta adaptPluginMeta; + private final BukkitAudiences bukkitAudiences; @Nullable private Release latestRelease; @@ -69,7 +73,7 @@ public void checkAndNotify() { this.logger.info("Checking for updates..."); this.fetchLatestVersion( release -> { - if (!this.plugin.getPluginMeta().getVersion().equals(release.version())) { + if (!this.adaptPluginMeta.version().equals(release.version())) { this.logger.warning( "A new version of FairyChat is available. You can download it at " + release.url()); } else { @@ -86,15 +90,17 @@ public void notifyPlayer(Player player) { this.fetchLatestVersion( release -> { - if (this.plugin.getPluginMeta().getVersion().equals(release.version())) { + if (this.adaptPluginMeta.version().equals(release.version())) { return; } - player.sendMessage( - this.miniMessage.deserialize( - this.configurationProvider.get().messages().updateNotification(), - Placeholder.parsed("url", release.url()), - Placeholder.parsed("version", release.version()))); + this.bukkitAudiences + .player(player) + .sendMessage( + this.miniMessage.deserialize( + this.configurationProvider.get().messages().updateNotification(), + Placeholder.parsed("url", release.url()), + Placeholder.parsed("version", release.version()))); }); } } diff --git a/src/main/resources/paper-plugin.yml b/src/main/resources/paper-plugin.yml deleted file mode 100644 index 6c343c6..0000000 --- a/src/main/resources/paper-plugin.yml +++ /dev/null @@ -1,28 +0,0 @@ -api-version: "$apiVersion" -name: $name -version: $version -main: de.rexlmanu.fairychat.plugin.FairyChatPlugin -loader: de.rexlmanu.fairychat.plugin.FairyChatLoader -description: $description -author: rexlManu -website: https://github.com/rexlManu/FairyChat -prefix: FairyChat -folia-supported: true -dependencies: - - name: LuckPerms - required: false - - name: MiniPlaceholders - required: false - - name: PlaceholderAPI - required: false - - name: UltraPermissions - required: false -load-before: - - name: LuckPerms - required: false - - name: MiniPlaceholders - required: false - - name: PlaceholderAPI - required: false - - name: UltraPermissions - required: false \ No newline at end of file