diff --git a/api/src/main/java/net/momirealms/customnameplates/api/AbstractCNPlayer.java b/api/src/main/java/net/momirealms/customnameplates/api/AbstractCNPlayer.java index 354e4b5..6ac45c7 100644 --- a/api/src/main/java/net/momirealms/customnameplates/api/AbstractCNPlayer.java +++ b/api/src/main/java/net/momirealms/customnameplates/api/AbstractCNPlayer.java @@ -18,7 +18,6 @@ package net.momirealms.customnameplates.api; import io.netty.channel.Channel; -import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import it.unimi.dsi.fastutil.objects.ObjectArrayList; import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; import net.momirealms.customnameplates.api.feature.Feature; @@ -56,13 +55,11 @@ public abstract class AbstractCNPlayer implements CNPlayer { private final TeamView teamView = new TeamView(); - // these two maps can be visited by other threads + // these maps might be visited by other threads through PlaceholderAPI private final Map> cachedValues = new ConcurrentHashMap<>(128); private final Map>> cachedRelationalValues = new ConcurrentHashMap<>(128); - - // these two maps can only be modified in the same thread - private final Map> cachedRequirements = new Int2ObjectOpenHashMap<>(32); - private final Map>> cachedRelationalRequirements = new Int2ObjectOpenHashMap<>(32); + private final Map> cachedRequirements = new ConcurrentHashMap<>(32); + private final Map>> cachedRelationalRequirements = new ConcurrentHashMap<>(32); private final Set activeFeatures = new CopyOnWriteArraySet<>(); private final Map> placeholder2Features = new ConcurrentHashMap<>(); diff --git a/api/src/main/java/net/momirealms/customnameplates/api/ConfigManager.java b/api/src/main/java/net/momirealms/customnameplates/api/ConfigManager.java index 9d246ec..ec2a530 100644 --- a/api/src/main/java/net/momirealms/customnameplates/api/ConfigManager.java +++ b/api/src/main/java/net/momirealms/customnameplates/api/ConfigManager.java @@ -112,6 +112,7 @@ public abstract class ConfigManager implements ConfigLoader, Reloadable { protected boolean chatAdvanced; protected boolean chatEss; protected boolean chatChatControlRed; + protected boolean chatChatty; protected String configVersion; @@ -191,6 +192,7 @@ public abstract class ConfigManager implements ConfigLoader, Reloadable { chatTR = config.getBoolean("integrations.chat.TrChat", false); chatVenture = config.getBoolean("integrations.chat.VentureChat", false); chatChatControlRed = config.getBoolean("integrations.chat.ChatControlRed", false); + chatChatty = config.getBoolean("integrations.chat.Chatty", false); // Packs generateOnStart = !config.getBoolean("resource-pack.disable-generation-on-start", false); @@ -417,6 +419,10 @@ public abstract class ConfigManager implements ConfigLoader, Reloadable { return instance.chatChatControlRed; } + public static boolean chatChatty() { + return instance.chatChatty; + } + @Override public YamlDocument loadConfig(String filePath) { return loadConfig(filePath, '.'); diff --git a/backend/src/main/java/net/momirealms/customnameplates/backend/requirement/AbstractRequirementManager.java b/backend/src/main/java/net/momirealms/customnameplates/backend/requirement/AbstractRequirementManager.java index c977bd9..b6a08c1 100644 --- a/backend/src/main/java/net/momirealms/customnameplates/backend/requirement/AbstractRequirementManager.java +++ b/backend/src/main/java/net/momirealms/customnameplates/backend/requirement/AbstractRequirementManager.java @@ -128,6 +128,13 @@ public abstract class AbstractRequirementManager implements RequirementManager { String regex = section.getString("regex", ""); return new RegexRequirement(interval, dynamicText1, regex); }, "regex"); + this.registerRequirement((args, interval) -> { + Section section = ConfigUtils.safeCast(args, Section.class); + if (section == null) return Requirement.empty(); + PreParsedDynamicText dynamicText1 = new PreParsedDynamicText(section.getString("papi", ""), true); + String regex = section.getString("regex", ""); + return new NotRegexRequirement(interval, dynamicText1, regex); + }, "!regex"); this.registerRequirement((args, interval) -> { Section section = ConfigUtils.safeCast(args, Section.class); if (section == null) return Requirement.empty(); diff --git a/backend/src/main/java/net/momirealms/customnameplates/backend/requirement/builtin/NotRegexRequirement.java b/backend/src/main/java/net/momirealms/customnameplates/backend/requirement/builtin/NotRegexRequirement.java new file mode 100644 index 0000000..68c962b --- /dev/null +++ b/backend/src/main/java/net/momirealms/customnameplates/backend/requirement/builtin/NotRegexRequirement.java @@ -0,0 +1,37 @@ +/* + * Copyright (C) <2024> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package net.momirealms.customnameplates.backend.requirement.builtin; + +import net.momirealms.customnameplates.api.feature.PreParsedDynamicText; + +public class NotRegexRequirement extends PlaceholderRequirement { + + public NotRegexRequirement(int refreshInterval, PreParsedDynamicText text, String any) { + super(refreshInterval, text, any); + } + + @Override + protected boolean checkArgument(String a1, String a2) { + return !a1.matches(a2); + } + + @Override + public String type() { + return "!regex"; + } +} diff --git a/backend/src/main/resources/config.yml b/backend/src/main/resources/config.yml index c9e2375..de8e755 100644 --- a/backend/src/main/resources/config.yml +++ b/backend/src/main/resources/config.yml @@ -34,6 +34,7 @@ integrations: AdvancedChat: false # Integration with AdvancedChat Essentials: false # Integration with Essentials chat ChatControlRed: false # Integration with ChatControlRed + Chatty: false # Integration with Chatty # Resource Pack Generation Settings: Configure resource pack generation behavior. resource-pack: diff --git a/gradle.properties b/gradle.properties index b663bcf..b4e40ef 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ # Project settings # Rule: [major update].[feature update].[bug fix] -project_version=3.0.14 +project_version=3.0.15 config_version=33 project_group=net.momirealms diff --git a/platforms/bukkit/compatibility/build.gradle.kts b/platforms/bukkit/compatibility/build.gradle.kts index bdcf70d..f640bd5 100644 --- a/platforms/bukkit/compatibility/build.gradle.kts +++ b/platforms/bukkit/compatibility/build.gradle.kts @@ -33,6 +33,8 @@ dependencies { compileOnly("net.william278.huskchat:huskchat-bukkit:3.0.4") compileOnly("net.essentialsx:EssentialsX:2.20.1") compileOnly("net.essentialsx:EssentialsXChat:2.20.1") +// compileOnly("com.github.Brikster:Chatty:v2.19.14") + compileOnly(files("libs/Chatty-3.0.0-SNAPSHOT.jar")) // Emoji compileOnly("com.github.LoneDev6:api-itemsadder:3.6.3-beta-14") compileOnly("io.th0rgal:oraxen:1.182.0") diff --git a/platforms/bukkit/compatibility/libs/Chatty-3.0.0-SNAPSHOT.jar b/platforms/bukkit/compatibility/libs/Chatty-3.0.0-SNAPSHOT.jar new file mode 100644 index 0000000..4d5a254 Binary files /dev/null and b/platforms/bukkit/compatibility/libs/Chatty-3.0.0-SNAPSHOT.jar differ diff --git a/platforms/bukkit/compatibility/src/main/java/net/momirealms/customnameplates/bukkit/compatibility/chat/ChatControlRedProvider.java b/platforms/bukkit/compatibility/src/main/java/net/momirealms/customnameplates/bukkit/compatibility/chat/ChatControlRedProvider.java index 0a50029..b6f0505 100644 --- a/platforms/bukkit/compatibility/src/main/java/net/momirealms/customnameplates/bukkit/compatibility/chat/ChatControlRedProvider.java +++ b/platforms/bukkit/compatibility/src/main/java/net/momirealms/customnameplates/bukkit/compatibility/chat/ChatControlRedProvider.java @@ -41,9 +41,7 @@ public class ChatControlRedProvider extends AbstractChatMessageProvider implemen @EventHandler(ignoreCancelled = true) public void onChat(ChatChannelEvent event) { - plugin.debug(() -> { - return "ChatChannelEvent triggered"; - }); + plugin.debug(() -> "ChatChannelEvent triggered"); final CommandSender sender = event.getSender(); if (!(sender instanceof Player player)) { return; diff --git a/platforms/bukkit/compatibility/src/main/java/net/momirealms/customnameplates/bukkit/compatibility/chat/ChattyProvider.java b/platforms/bukkit/compatibility/src/main/java/net/momirealms/customnameplates/bukkit/compatibility/chat/ChattyProvider.java new file mode 100644 index 0000000..db712e0 --- /dev/null +++ b/platforms/bukkit/compatibility/src/main/java/net/momirealms/customnameplates/bukkit/compatibility/chat/ChattyProvider.java @@ -0,0 +1,82 @@ +/* + * Copyright (C) <2022> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package net.momirealms.customnameplates.bukkit.compatibility.chat; + +import net.momirealms.customnameplates.api.CNPlayer; +import net.momirealms.customnameplates.api.CustomNameplates; +import net.momirealms.customnameplates.api.feature.chat.AbstractChatMessageProvider; +import net.momirealms.customnameplates.api.feature.chat.ChatManager; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.HandlerList; +import org.bukkit.event.Listener; +import ru.brikster.chatty.api.ChattyApi; +import ru.brikster.chatty.api.chat.Chat; +import ru.brikster.chatty.api.event.ChattyMessageEvent; + +import java.util.Objects; + +public class ChattyProvider extends AbstractChatMessageProvider implements Listener { + + public ChattyProvider(CustomNameplates plugin, ChatManager manager) { + super(plugin, manager); + } + + @EventHandler(ignoreCancelled = true) + public void onChat(ChattyMessageEvent event) { + final String message = event.getPlainMessage(); + final Player player = event.getSender(); + if (!player.isOnline()) return; + CNPlayer cnPlayer = plugin.getPlayer(player.getUniqueId()); + if (cnPlayer == null) return; + plugin.getScheduler().async().execute(() -> { + manager.onChat(cnPlayer, message, event.getChat().getId()); + }); + } + + @Override + public boolean hasJoinedChannel(CNPlayer player, String channelID) { + return true; + } + + @Override + public boolean canJoinChannel(CNPlayer player, String channelID) { + Chat chat = ChattyApi.instance().getChats().get(channelID); + if (chat == null) { + return false; + } + if (!chat.isPermissionRequired()) return true; + return chat.hasReadPermission((Player) player.player()); + } + + @Override + public boolean isIgnoring(CNPlayer sender, CNPlayer receiver) { + return false; + } + + @Override + public void register() { + Bukkit.getPluginManager().registerEvents(this, Objects.requireNonNull(Bukkit.getPluginManager().getPlugin("CustomNameplates"))); + } + + @Override + public void unregister() { + HandlerList.unregisterAll(this); + } +} \ No newline at end of file diff --git a/platforms/bukkit/src/main/java/net/momirealms/customnameplates/bukkit/BukkitChatManager.java b/platforms/bukkit/src/main/java/net/momirealms/customnameplates/bukkit/BukkitChatManager.java index 1137786..451a52d 100644 --- a/platforms/bukkit/src/main/java/net/momirealms/customnameplates/bukkit/BukkitChatManager.java +++ b/platforms/bukkit/src/main/java/net/momirealms/customnameplates/bukkit/BukkitChatManager.java @@ -54,6 +54,9 @@ public class BukkitChatManager extends AbstractChatManager { } else if (ConfigManager.chatChatControlRed() && Bukkit.getPluginManager().isPluginEnabled("ChatControlRed")) { this.chatProvider = new ChatControlRedProvider(plugin, this); plugin.getPluginLogger().info("ChatControlRed hooked!"); + } else if (ConfigManager.chatChatty() && Bukkit.getPluginManager().isPluginEnabled("Chatty")) { + this.chatProvider = new ChattyProvider(plugin, this); + plugin.getPluginLogger().info("Chatty hooked!"); } else { this.chatProvider = new AsyncChatProvider(plugin, this); }